Любой, кто когда-либо хотел использовать оптическое распознавание символов (OCR), наверняка слышал о Tesseract.

Почему? Ну, во-первых, он был разработан Google; во-вторых, это по последнему слову техники, и что еще? Это бесплатно!

Так зачем мы вообще пишем этот пост? Почему вы вообще это читаете? Дело в том, что даже у Tesseract есть серьезные недостатки.

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

Это то, что мы подразумеваем под приведенным выше утверждением. Tesseract процветает, когда есть постоянный размер / тип шрифта, постоянный интервал между строками / словами, отсутствие специальных символов: все это делает Tesseract идеальным сценарием для работы. Но во многих случаях OCR необходимо выполнять для изображений, которые не так хорошо организованы. У них несколько шрифтов и их размер, неравный межстрочный интервал, специальные символы и т. Д. Вот где Tesseract может выйти из строя.

Стандартный подход: EAST API вместе с Tesseract

Обнаружение текста: E fficient и A ccurate S cene T ext Detector это лучший алгоритм обнаружения текста, доступный на сегодняшний день. Обученный на тысячах изображений, он, как известно, обеспечивает быстрое и точное обнаружение текста в естественных сценах. Он создает ограничивающую рамку вокруг обнаруженного текста.

Распознавание текста. Pytesseract - это оболочка Python для Google Tesseract-OCR Engine. Он переводит текст изображения в символы.

Адриан Роузброк написал прекрасное руководство о том, как реализовать EAST вместе с Tesseract.

Мы реализовали эту комбинацию на некоторых изображениях. Пример результатов испытаний:

Совершенно очевидно, что если на наших изображениях меньше шума или если тип и размер шрифта согласованы, EAST + Tesseract работает хорошо (первые два изображения).

Но, как вы видите, Tessearct + EAST дает бредовые результаты для двух последних изображений.

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

Мы подумали о полном удалении ограничивающего прямоугольника из уравнения, то есть об исключении EAST.

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

Тонкая настройка Tesseract

В другом своем блоге Адриан Роузброк объяснил, как использовать только Tesseract для распознавания текста. Если вы еще не установили Tesseract в своей системе, сразу приступайте к делу!

Команда Pytesseract выглядит примерно так:

Параметры в разделе «config» можно изменить в соответствии с вариантом использования.

Основные правила, о которых следует помнить при работе с Tesseract:

  • Язык
    Tesseract может определять более 130 языков и более 35 скриптов. Не забудьте указать язык, который вы хотите обнаружить, в команде config. Если ничего не указано, предполагается английский. Можно указать несколько языков, разделенных знаком плюса. Tesseract использует трехсимвольные языковые коды ISO 639–2.
  • Режимы движка OCR
    В Tesseract есть несколько режимов движка с разной производительностью и скоростью. Tesseract 4.0 представил дополнительный режим нейронной сети LSTM, который часто работает лучше всего. Убедитесь, что вы используете этот режим!

  • Режим сегментации страницы
    Знайте данные, которые вы хотите протестировать. Настройте Tesseract так, чтобы он запускал только часть анализа макета и принимал определенную форму изображения.
    Поверьте, простая настройка действительно улучшает результаты!

Только цифры
Все ли ваши изображения состоят только из цифр? Вы можете заставить Tesseract определять именно это с помощью этого кода:

Хотя в нашем случае использовались только цифры, эта модификация не показалась чудесной для результатов.

Пробуя изображение только на тессеракте, оно сразу показало многообещающие результаты. Изображения, которые вообще не были обнаружены в Tesseract + EAST, в некоторой степени были обнаружены с помощью tesseract. Это был определенно лучший подход :)

Настройка изображений

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

  • Бинаризация
  • Обивка

Обивка

На некоторых изображениях числа охватывают большую часть областей, как на изображении ниже. Поэтому, чтобы поместить числа в центр изображения, мы решили использовать отступы. Это действительно повысило производительность, но количество отступов, которые нужно было использовать для каждого изображения (чтобы изображение было обнаружено), было переменным.

Бинаризация

Мы решили использовать бинаризацию, так как она увеличивает контраст между текстом и фоном.
Как такое возможно?
Преобразовывая наши цветные изображения в черно-белые изображения.

Skimage (здесь код) имеет более 10 типов бинаризации. Вы можете попробовать пару и выбрать тот, который лучше всего подходит для вашего случая использования.
(Бинаризации лучше всего работают с изображениями в оттенках серого, поэтому в первую очередь преобразуйте изображение в оттенки серого).

Взгляните на них всех на образце изображения здесь !:

Алгоритм бинаризации, который работает с одним изображением, может не работать с другим. Мы действительно рекомендуем вам попробовать каждый тип бинаризации в ваших сценариях использования.

Совершенно очевидно, что глобальный порог работает на первом изображении, но не на втором. Все зависит от того, насколько у вас исходное цветное изображение.

В некоторых случаях результаты немного лучше:

Совершенно очевидно, что основная цена, $ 5,99, не была обнаружена в обоих приведенных ниже случаях, скорее всего, из-за неравного размера шрифта. «3,00 доллара за литр», несмотря на то, что это мелкий шрифт, было точно определено в бинаризованной версии!

Но опять же, бинаризация работает не всегда:

Заключение

Хотя Tesseract имеет встроенные команды для предварительной обработки изображений, выполнение бинаризации и заполнения перед отправкой в ​​модель иногда дает улучшенные результаты.

Но опять же, эти методы не являются полностью надежными.
Возможно, невозможно использовать предварительно обученный Tesseract (с EAST или без него) для получения согласованных результатов на зашумленных изображениях.

Испытывали ли вы аналогичные проблемы с Tesseract? Вы придумали свой собственный способ борьбы с этим?

Будем рады услышать об этом в комментариях!

Этот блог написали Никита и Найтик.