Почему OCR выдаёт мусор и как это исправить
Разрешение, контраст и режим сегментации страницы решают, получите вы чистый текст или шум. Что менять — и в каком порядке это действительно работает.
Когда я первый раз скормил скриншот инструменту Картинка в текст (OCR), на выходе получилось что-то вроде Нас:ройки. Вывод был простой: распознавание в браузере — игрушка. Вывод оказался неверным. Я переснял тот же экран при масштабе браузера 200%, и тот же самый движок прочитал всё до последнего слова.
В программе не изменилось ничего. У букв просто стало втрое больше пикселей.
Пиксели на букву решают почти всё
Tesseract рассчитывает на заглавную букву высотой около 30 пикселей. Скан в 300 dpi текста кеглем 10 pt даёт ему примерно 42 — поэтому со сканера и выходит 98–99% верных символов. Скриншот веб-страницы при масштабе 100% на мониторе 1080p даёт около 11. На таком размере перекладина у «е» и разрыв у «с» — это одни и те же один-два пикселя, и модель уже угадывает.
Поэтому раньше всех прочих настроек:
- снимайте экран при масштабе браузера 200% или на экране с высокой плотностью точек;
- фотографируйте страницу фронтально и так, чтобы она занимала весь кадр, а не всю книгу целиком;
- если картинка уже готова и другой нет, оставьте включённым увеличение. Оно помогает: пересчёт пикселей частично восстанавливает форму штриха — но придумать то, чего в кадре не было, не может.
Настройка, которую почти никто не трогает
Второй рычаг — режим сегментации страницы, и он важнее, чем кажется. По умолчанию запускается полный анализ вёрстки: найти колонки, найти блоки, прочитать их по порядку. Для книжной страницы это ровно то, что нужно. Для скриншота, где по диалоговому окну разбросаны шесть слов, Tesseract ищет колонки, которых нет, решает, что большая часть кадра — картинка, и иногда возвращает пустую строку.
Для всего экранного переключайтесь на разреженный текст. Никакого анализа вёрстки, просто поиск слов там, где они есть. А для одной строки — серийного номера, автомобильного номера — берите режим одной строки и избавьте движок от догадок вовсе.
Контраст и ловушка тёмной темы
Tesseract бинаризует изображение сам, и делает это хорошо, так что выкручивание контраста спасает реже, чем на него надеются. Но два исключения знать стоит.
Светлый текст на тёмном фоне читается плохо. Инверсия ничего не стоит и обычно снимает проблему целиком, одним щелчком. А фотография выцветшего чека на термобумаге — это уже настоящая беда с контрастом: краска и бумага там два оттенка одного серого, и растянуть этот диапазон — единственный способ их разделить.
Второй тихий вредитель — JPEG. Пересохранение скриншота в JPEG рассыпает по краям каждого глифа звон артефактов, а распознавание читает их как знаки препинания. Для всего, где есть текст, берите PNG.
Переносы строк — это не ошибка
OCR отдаёт по строке текста на каждую строку страницы. Откуда ему знать, какие переносы поставил автор, а какие просто пришлись на правое поле. Отсюда и рваный вид сырого вывода.
Переключатель «склеить перенесённые строки» приклеивает строку к следующей, если она не кончилась точкой, двоеточием или закрывающей кавычкой и если следующая не начинается с маркера списка. Абзацы снова текут, списки сохраняют вид. Остальное добирает удаление переносов: слово, разорванное как распозна- / вание, собирается обратно.
Когда пора остановиться
Рукописный курсив не получится. В стандартных языковых файлах модели рукописного ввода нет, и настройками это не лечится. Таблицы выйдут визуально выровненными, но настоящими ячейками не станут. А если в вашем PDF уже есть текстовый слой — то есть почти во всём, что вышло из Word, браузера или бухгалтерской программы, — обойдитесь без OCR и просто скопируйте текст: это точно, а не «на 98% верно».
Во всех остальных случаях порядок такой: сначала больше пикселей, потом правильный режим сегментации, потом инверсия, если она нужна. Прогоните свой худший файл через распознавание текста и посмотрите на уверенность, которую он напишет: если меньше 75, возвращайтесь править картинку, а не текст. Остальное в основном выловит быстрый проход через проверку орфографии.