Распознавание текста с помощью OCR

Tesseract — это движок оптического распознавания символов (OCR) с открытым исходным кодом, является самой популярной и качественной OCR-библиотекой.

OCR использует нейронные сети для поиска и распознавания текста на изображениях.

Tesseract ищет шаблоны в пикселях, буквах, словах и предложениях. Tesseract использует двухэтапный подход, называемый адаптивным распознаванием. Требуется один проход по данным для распознавания символов, затем второй проход, чтобы заполнить любые буквы, в которых он не был уверен, буквами, которые, скорее всего, соответствуют данному слову или контексту предложения.
Tesseract OCR
Основной задачей было распознавание чеков с фотографий.

Инструментом для распознавания был использован Tesseract OCR. Плюсами данной библиотеки можно отметить обученные языковые модели (>192), разные виды распознавания (изображение как слово, блок текста, вертикальный текст), легкая настройка. Т. к. Tesseract OCR написан на языке C++, был использован сторонний wrapper c github.

Различиями между версиями являются разные обученные модели (версия 4 имеет большую точность, поэтому я использовал её).

Для распознавания нам потребуются файлы с данными для распознавания текста, для каждого языка свой файл. Скачать данные можно по ссылке.

Чем лучше качество исходного изображения (имеют значение размер, контрастность, освещение), тем лучше получается результат распознавания.

Также был найден способ обработки изображения для его дальнейшего распознавания путем использования библиотеки OpenCV. Т. к. OpenCV написан на языке C++ и не существует оптимального для нашего решения написанного wrapper'а, было решено написать собственный wrapper для этой библиотеки с необходимыми для нас функциями обработки изображения. Основной сложностью является подбор значений для фильтра для корректной обработки изображения. Также есть возможность нахождения контуров чеков/текста, но не изучено до конца. Результат получился лучше (на 5-10%).
Параметры:
language - язык текста с картинки, можно выбрать несколько путем их перечисления через "+".

pageSegmentationMode - тип расположения текста на картинке.

charBlacklist - символы, которые будут игнорироваться ignoring characters.

Использование только Tesseract дало точность ~70% при идеальном изображении, при плохом освещении/качестве картинки точность была ~30%.
Vision + Tesseract OCR
Т. к. результат был неудовлетворителен, было решено использовать библиотеку от Apple - Vision. Я использовал Vision для нахождения блоков текста, дальнейшего разделения изображения на отдельные блоки и их распознавания. Результат был лучше на ~5%, но и появлялись ошибки из-за повторяющихся блоков.
Недостатками этого решения были:

1) Скорость работы. Скорость работы уменьшилась >4 раза (возможно, существует вариант распоточивания).
2) Некоторые блоки текста распознавались более 1 раза.
3) Текст распознается справа налево, из-за чего текст с правой части чека распознавался раньше, чем текст слева.
MLKit
Еще одним из методов определения текста является MLKit от Google, развернутый на Firebase. Данный метод показал наилучшие результаты (~90%), но главным недостатком этого метода является поддержка только латинских символов и сложная обработка разделенного текста в одной строке (наименование - слева, цена - справа).
В итоге можно сказать, что распознать текст на изображениях - задача выполнимая, но есть некоторые трудности. Основной проблемой при распознавании текста с изображения является качество (размер, освещенность, контрастность) изображения, которую можно решить путем фильтрации изображения. При распознавании текста при помощи Vision или MLKit были проблемы с неверным порядком распознавания текста, обработкой разделенного текста. Распознанный текст может быть в ручную откорректирован и пригоден к использованию; в большинстве случаев при распознавании текста с чеков итоговая сумма распознается хорошо и не нуждается в корректировках.
Спасибо за внимание!