Tesseract ocr как пользоваться на windows

Обновлено: 05.07.2024

Блог по web технологиям. Веб студия г. Воронеж. Создание и поддержка сайтов на заказ.

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

0. Что нам нужно

Сборки этой библиотеки есть под windows (можно скачать установщик отсюда) и под linux. Для большинства linux-дистрибутивов установить tesseract можно просто через sudo apt-get install tesseract-ocr.

  • Изображение с текстом для тренировки

Между всеми символами должны быть чётко различимые промежутки. Кладём наше изображение в отдельную директорию и называем в виде <код языка>.<имя шрифта>.exp<номер>.tif. Изображение может быть не одно и отличаться они должны только номером в наименовании файла. Формат наименований файлов очень важен. На файлы с неверными наименованиями утилиты, которые мы будем использовать будут ругаться ошибками сегментирования и т.п. Для определённости будем считать, что изучаем мы язык ссс и шрифт eee. Таким образом называем файл со сканом тренировочного образца ccc.eee.exp0.tif

1. Создаём и редактируем box-файл

Для того чтобы отметить символы на изображении и задать им соответствие utf-8 символам текста служат box-файлы. Это обычные текстовые файлы, в которых каждому символу соответствует строка с символом и координатами прямоугольника в пикселях. Первоначально файл генерируем утилитой из пакета tesseract:
tesseract ccc.eee.exp0.tif ccc.eee.exp0 batch.nochop makebox
получим файл

в текущей директории. Заглянем в него. Да, чуть не забыл, не забудьте прописать адрес установленной Tesseract-OCR в переменную среды Path в windows, иначе команда tesseract не будет работать в консоли.

Работа нудная и кропотливая, но к счастью для этого есть ряд сторонних утилит. Я например пользовался jTessBoxEditor. Открываем им изображение, box-файл с таким же именем он сам подтянет (главное чтобы всё лежало в одной папке).

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% при идеальном изображении, при плохом освещении/качестве картинки точность была


Vision + Tesseract OCR

Так как результат был неудовлетворителен, было решено использовать библиотеку от Apple — Vision. Мы использовали Vision для нахождения блоков текста, дальнейшего разделения изображения на отдельные блоки и их распознавания. Результат был лучше на

5%, но и появлялись ошибки из-за повторяющихся блоков.

Недостатками этого решения были:

  1. Скорость работы. Скорость работы уменьшилась >4 раза (возможно, существует вариант распоточивания)
  2. Некоторые блоки текста распознавались более 1 раза
  3. Текст распознается справа налево, из-за чего текст с правой части чека распознавался раньше, чем текст слева.


MLKit

Еще одним из методов определения текста является MLKit от Google, развернутый на Firebase. Данный метод показал наилучшие результаты (

90%), но главным недостатком этого метода является поддержка только латинских символов и сложная обработка разделенного текста в одной строке (наименование — слева, цена — справа).


В итоге можно сказать, что распознать текст на изображениях — задача выполнимая, но есть некоторые трудности. Основной проблемой является качество (размер, освещенность, контрастность) изображения, которую можно решить путем фильтрации изображения. При распознавании текста при помощи Vision или MLKit были проблемы с неверным порядком распознавания текста, обработкой разделенного текста.

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

Power Automate позволяет пользователям читать, извлекать и управлять данными в ассортименте файлов с помощью оптического распознавания символов (OCR).

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

снимок экрана извлечения текста путем распознавания.

Действие, в котором создается подсистема OCR, содержит параметры подсистемы. К ним относятся язык и множители ширины и высоты изображения. Переменная подсистемы OCR может использоваться в любом действии, содержащем возможности OCR.

Множители изображений увеличивают размер изображения, чтобы сделать поиск и извлечение текста более эффективным. Учтите, что установка значений больше 3 может привести к ошибочным результатам.

Действия OCR

Создать подсистему распознавания текста Tesseract

Создание подсистемы распознавания текста Tesseract

Аргумент Необязательная Принимает Значение по умолчанию Описание
Use other language Н/Д Логическое значение Ложь Указывает, следует ли использовать язык, не заданный в вариантах
Tesseract language Н/Д Английский, Немецкий, Испанский, Французский, Итальянский Английский Язык текста на изображении, распознаваемого подсистемой Tesseract
Language abbreviation Нет Текстовое значение Сокращение используемого языка для Tesseract. Например, если данные "eng.traineddata", введите "eng" в этом поле
Language data path: Нет Папка Путь к папке, содержащей данные Tesseract для указанного языка
Image width multiplier Да Числовое значение 1 Множитель ширины изображения
Image height multiplier Да Числовое значение 1 Множитель высоты изображения
Создаваемые переменные
Аргумент Тип Описание
OCREngine OCREngineObject Подсистема распознавания текста для использования с последующими действиями распознавания текста
Исключения
Исключение Описание
Не удалось создать подсистему распознавания текста. Указывает, что произошла ошибка при попытке создать подсистему распознавания текста.
Папка пути к данным не существует Указывает, что папка, заданная для данных языка, не существует.
Подготовьте потоки к предстоящему прекращению поддержки

Действие Создать подсистему распознавания текста Tesseract планируется удалить. Чтобы предотвратить сбой потоков после удаления, инициализируйте необходимые подсистемы Tesseract OCR непосредственно с помощью действий, которые их используют.

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

Параметры подсистемы Tesseract OCR в действии "Извлечь текст путем распознавания".

Создать подсистему распознавания текста MODI

Создание подсистемы распознавания текста MODI

Аргумент Необязательная Принимает Значение по умолчанию Описание
MODI language Н/Д Китайский (упрощенное письмо), Китайский (традиционное письмо), чешский, датский, нидерландский, английский, финский, французский, немецкий, греческий, венгерский, итальянский, японский, корейский, норвежский, польский, португальский, русский, испанский, шведский, турецкий Английский Язык текста изображения, распознаваемого подсистемой MODI
Image width multiplier Да Числовое значение 1 Множитель ширины изображения
Image height multiplier Да Числовое значение 1 Множитель высоты изображения
Создаваемые переменные
Аргумент Тип Описание
OCREngine OCREngineObject Подсистема распознавания текста для выполнения последующих действий распознавания текста
Исключения
Исключение Описание
Не удалось создать подсистему распознавания текста. Указывает, что произошла ошибка при попытке создать подсистему распознавания текста.
Подготовьте потоки к предстоящему прекращению поддержки

Подсистема MODI OCR будет удалена. Чтобы предотвратить сбой потоков после амортизации, замените инициализированные подсистемы MODI на подсистемы Tesseract.

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

Параметры подсистемы Tesseract OCR в действии "Извлечь текст путем распознавания".

Извлечь текст путем распознавания

Извлечение текста из заданного источника с помощью указанной подсистемы распознавания текста

Способность современных машин (вычислительных устройств) использовать камеры для получения информации об окружаем мире и способность интерпретировать/обрабатывать эти данные с каждым годом оказывает все большее влияние на жизнь современного общества. Сейчас уже никого не удивишь роботом доставщиком еды (например, Starship Robots) или автомобилем с функцией автопилота (например, Tesla) – эти устройства во время своего движения для принятия решений полагаются на информацию, получаемую от своих высоко технологичных камер. В данной статье мы рассмотрим основы технологии оптического распознавания символов (Optical Character Recognition, OCR), применяемой в современных электронных устройствах для распознавания отдельных символов на изображении.

Внешний вид проекта оптического распознавания символов в Raspberry Pi с помощью Tesseract

У этой технологии очень много возможностей для практического применения в современном мире: считывание информации с визиток, распознавание магазине по его названию, распознавание дорожных знаков и многое другое. Наверняка многие из вас уже слышали о таком приложении как Google Lens, которое представляет собой систему искусственного интеллекта, распознающую в режиме реального времени объекты на фотографии и предоставляющую имеющуюся по ним сведения в сети интернет. В данной статье мы рассмотрим похожий инструмент от компании Google для выполнения задачи оптического распознавания символов (OCR) под названием Tesseract-OCR Engine, работающий на основе языка python и библиотеки OpenCV. Данный инструмент позволяет распознавать/идентифицировать символы на изображениях с помощью платы Raspberry Pi.

Установка Tesseract на Raspberry Pi

Для выполнения задачи оптического распознавания символов (OCR) в Raspberry Pi нам необходимо установить на нее Tesseract OCR engine. Чтобы сделать это нам сначала нужно сконфигурировать Debian Package (dpkg), который затем поможет нам установить Tesseract OCR. Для конфигурирования Debian Package выполните следующую команду:

Далее мы можем приступить к установке Tesseract OCR (Optical Character Recognition) с помощью опции apt-get. Выполните для этого команду:

После этого в окне терминала вы должны увидеть примерно следующую картину:

Процесс установки Tesseract OCR

Процесс установки Tesseract OCR займет около 5-10 минут.

Теперь, когда у нас Tesseract OCR установлен, нам необходимо установить еще пакет PyTesseract с помощью установщика пакетов pip. Pytesseract – это python оболочка для Tesseract OCR engine, которая позволяет использовать возможности Tesseract из языка python. Для установки PyTesseract выполните следующую команду:

Прежде чем продолжать далее убедитесь в том, что на вашей плате установлена библиотека pillow. О том, как ее установить, можно прочитать в статье про распознавание лиц с помощью платы Raspberry Pi. После завершения установки pytesseract вы в окне терминала должны увидеть примерно следующую картину:

Процесс установки pytesseract завершен

Tesseract 4.0 на Windows/Ubuntu

Проект оптического распознавания символов изначально начинал разрабатываться компанией Hewlett Packard в 1980 году. Затем он был выкуплен компанией Google, которая и осуществляет его поддержку вплоть до настоящего времени. Многие годы Tesseract хорошо работал только на изображениях определенного формата. К примеру, если фон изображения был сильно зашумлен или объект для распознавания был не в фокусе, то Tesseract работал не очень хорошо.

Для преодоления этой проблемы последние версии tesseract (к примеру, версия Tesseract 4.0) стали использовать технологии машинного обучения (Deep Learning) для улучшения распознавания символов и даже почерка. Tesseract 4.0 использует Long Short-Term Memory (LSTM) и рекуррентную нейронную сеть (Recurrent Neural Network, RNN) для повышения точности распознавания символов. К сожалению, на момент написания оригинала данной статьи (август 2019 г., ссылка на оригинал в конце статьи) Tesseract 4.0 был доступен для использования только в операционных системах Windows и Ubuntu, а для Raspberry Pi он находился в стадии бета тестирования. Поэтому в оригинале данной статьи автор использовал ее версию Tesseract 3.04 на Raspberry Pi. На момент прочтения вами данной статьи, скорее всего, будут доступны уже и более свежие версии Tesseract для Raspberry Pi. Но мы надеемся, что после прочтения данной статьи у вас их применение не вызовет никаких затруднений.

Простое распознавание символов в Raspberry Pi

В предыдущем пункте статьи мы уже установили на плату Raspberry Pi библиотеку Tesseract OCR и пакет Pytesseract. Поэтому в данном разделе статьи мы напишем небольшую программу чтобы проверить как работает распознавание символов на тестовом изображении. В качестве тестового изображения мы будем использовать следующее:

Тестовое изображение для распознавания символов

Текст используемой нами программы будет очень простой. Как видите, он даже не использует пакеты библиотеки OpenCV.

В представленной программе мы пытаемся прочитать текст с изображения под названием ‘1.jpg’, которое расположено в том же самом каталоге, что и наша программа. Для открытия этого изображения используется пакет Pillow, после чего оно сохраняется в переменной img . Затем мы используем метод image_to_string из пакета pytesseract для обнаружения любого текста на изображении и сохраняем его в переменной text . И, наконец, мы выводим значение переменной text на экран чтобы проверить результат работы программы.

Как вы можете видеть, тестовое изображение содержит текст Explain that Stuff! 01234567890”, а в результате работы нашей небольшой программы мы получили текст “Explain that stuff! Sdfiosiefoewufv”. Это означает, что наша программа не смогла распознать цифры на изображении. Для преодоления этой проблемы обычно используют библиотеку OpenCV чтобы удалить шум (зашумленность) из программы и затем настраивают Tesseract OCR engine чтобы получить более впечатляющие результаты. Но помните о том, что не стоит ожидать 100% точности распознавания от Tesseract OCR Python.

Настройка Tesseract OCR для улучшения результатов

Pytesseract позволяет нам производить настройку Tesseract OCR engine при помощи установки флагов (flags), которые влияют на способ поиска символов на изображении. Для настройки Tesseract OCR используется 3 основных флага:

  • language (-l) (язык);
  • OCR Engine Mode (--oem) (режим работы "движка" распознавания символов);
  • Page Segmentation Mode (- -psm) (режим сегментации страниц).

Кроме английского языка (по умолчанию) Tesseract также поддерживает множество других языков: Hindi, Турецкий, Французский и др. Мы в нашем проекте будем использовать только английский язык (English), но вы можете скачать соответствующие обучающие пакеты со страницы на github и добавить их в свой пакет чтобы иметь возможность распознавать символы на других языках. Также возможно производить распознавание двух или более языков на одном и том же изображении. Язык распознавания устанавливается с помощью флага language, значение этого флага –l соответствует английскому языку (English), для других языков необходимо использовать другие значения этого флага.

Следующим флагом является OCR Engine Mode, с помощью которого можно использовать 4 различных режима распознавания. Каждый режим использует свой собственный алгоритм для распознавания символов на изображении. По умолчанию используется алгоритм, который устанавливается вместе с пакетом. Но мы можем изменить его чтобы использовать LSTM или Neural nets (нейронные сети). 4 доступных режима OCR Engine Mode показаны на следующем рисунке. Этот флаг устанавливается с помощью префикса --oem, то есть чтобы использовать mode 1 (режим 1), необходимо ввести -- oem 1.

Возможные значения флага OCR Engine Mode

И, наконец, один из самых значимых флагов, которые используются для настройки Tesseract OCR – это флаг режима сегментации страниц (page segmentation mode flag). Этот флаг очень полезен когда фон вашего изображения имеет много незначащих деталей (шум) или символы на изображении написаны в различной ориентации и с различными размерами. Всего доступно 14 различных режимов сегментации страниц, которые представлены на рисунке ниже. Флаг устанавливается с помощью префикса –psm, в нашем случае мы будем использовать –psm 11.

Возможные значения флага режима сегментации страниц

Использование флагов oem и psm в Tesseract на Raspberry Pi для улучшения результатов распознавания

Проверим эффективность рассмотренных режимов. На представленном ниже рисунке мы сделали попытку распознавания символов на дорожном знаке, обозначающем ограничение скорости. На знаке написано “SPEED LIMIT 35”. Как вы можете видеть из представленного рисунка, число 35 на нем значительно большего размера, чем все остальные символы. Это обстоятельство существенно затрудняет работу Tesseract, поэтому он смог распознать с этого изображения “SPEED LIMIT”, а цифры не распознал.

Распознавание знака ограничения скорости

Чтобы преодолеть эту проблему, мы попробуем настроить флаги. В ранее рассмотренной программе флаг настройки пуст (config=’’), исправим это. Текст на изображении на английском языке, поэтому используем флаг –l eng, флаг oem оставим в режиме по умолчанию, то есть –oem 3 (режим 3). Теперь нам осталось только настроить флаг psm, нам необходимо найти больше символов на изображении, поэтому мы будем использовать режим 11, то есть получим флаг –psm 11. Окончательная настройка флагов будет выглядеть следующим образом:

Читайте также: