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


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


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


На одном из проектов стояла задача распознать чеки с фотографий.


Инструментом для распознавания был использован 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 были проблемы с неверным порядком распознавания текста, обработкой разделенного текста.


Распознанный текст может быть в ручную откорректирован и пригоден к использованию; в большинстве случаев при распознавании текста с чеков итоговая сумма распознается хорошо и не нуждается в корректировках.

Комментарии (9)


  1. loginsin
    15.10.2019 15:08

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

    Прям таки интеллект… Может, все же нейронные сети?


    1. BytePace Автор
      16.10.2019 06:50

      Поправил. Искусственный интеллект это конечно громко сказано.


  1. aTwice
    15.10.2019 15:25

    Название статьи вроде «Поисковая оптимизация с помощью SEO» или Соединённые Штаты США.


  1. nikolay_karelin
    15.10.2019 20:59

    А на чем тестировали качество?
    Интересует виды изображений, размер выборки, мера качества.


    1. BytePace Автор
      17.10.2019 13:44

      Тестировали на чеках, выборка маленькая около десятка чеков.
      Мера качества — процент распознавания текста.


  1. SeaMan75
    16.10.2019 06:45

    Ну вот один в один я точно также прошел такой же путь. Tesseract изначально делался для распознавания сканированного текста, который сканировали именно с отдельных листов. Он и заточен под четкий ровный текст. А у чеков замятия. С камеры прилетит чек под наклоном, тенями, разными артефактами. И никакие фильтры OpenCV не помогут. И в разных местах замятый чек будет иметь разный наклон букв. Бинаризация, выравнивание, медленная обработка… Так что tesseract не для таких задач…


  1. akimovpro
    16.10.2019 08:49

    А ABBYY Mobile Capture не тестировали?
    https://www.abbyy.com/mobile-capture-sdk/


    1. BytePace Автор
      17.10.2019 13:42

      нет


  1. maragn
    18.10.2019 08:04

    когдато пришлось заниматься подобным вопросом, моей задачей было поддержание распознования текстов с ироглифами и tesseract справлялся с этой задачей лучше других. Даже коммерческие продукты такой поддержкой не удасужились, либо с низким качеством распознования. Правда, это было лет 5 назад и возможно сейчас все по другому.
    И вот насколько помню, тессерак предоставлял несколько опций распознования, построчно, побуквенно, всем текстом. И почемуто временами распознование всего текста было качественней чем побуквенно (это я о обычных буквенных языках), но если циклично проганять текст через построчную и побуквенное распознование, то качество улучшалось. А вот применение OpenCV для предподготовки изображения особой эффективности не давало, так как тессерак сам проводит подобную подготовку перед распознованием.