Как научить Tesseract читать ваш уникальный шрифт

В этой статье я хочу поделиться с вами, как создать простое распознавание текста с помощью Tesseract, «механизма оптического распознавания символов для различных операционных систем». Сам Tesseract - это бесплатное программное обеспечение, первоначально разработанное Hewlett-Packard до 2006 года, когда разработку взяла на себя Google. Это, пожалуй, лучший на сегодняшний день готовый механизм распознавания текста с поддержкой более 100 языков. Это один из самых популярных механизмов OCR, поскольку его легко установить и использовать.

Теперь предположим, что начальник дал вам задание преобразовать приведенное ниже изображение в машинный язык, или проще говоря: «Постройте модель OCR, чтобы иметь возможность читать эти шрифты на некоторых изображениях!». «Хорошо, без проблем», - сказали вы, но внезапно начальник сказал вам: «И я хочу, чтобы это было сделано сегодня, в следующие 3-5 часов».

«Уэлп, как я могу так быстро построить модель OCR?» ты сказал себе. Но не волнуйтесь, для этого и нужен Тессеракт! Первым делом вам необходимо установить его на свой компьютер.

  • Если вы используете операционную систему Windows, перейдите на https://github.com/UB-Mannheim/tesseract/wiki и установите Tesseract с помощью установщика (вы можете выбрать последнюю стабильную версию, или, в моем случае, я использовал Тессеракт 4.0.0). Следуй инструкциям. Затем перейдите в редактировать переменные среды и добавьте новый путь к папке установки tesseract, как показано на рисунке ниже.

Затем нажмите «ОК».

  • Если вы используете ОС Ubuntu, откройте терминал и запустите
    sudo apt-get install tesseract-ocr.

После успешной установки Tesseract на свой компьютер откройте командную строку для Windows или терминал, если вы используете Ubuntu, а затем запустите:

tesseract file_0.png stdout

Где f ile_0.png - имя файла на изображении выше. Мы хотим, чтобы Tesseract читал любые слова, найденные на изображении выше. Вы должны увидеть эти выходы в своем терминале:

Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 147
40293847 S565647386e2e91L0

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

Заявление об отказе от ответственности, как указано в вики Tesseract, рекомендуется использовать «язык» по умолчанию, который уже был обучен на таком большом количестве данных для tesseract, и обучать свой собственный язык в самом крайнем случае (означает, что вы должны попытаться предварительно обработать изображение, пороговое значение и другие методы предварительной обработки изображения, прежде чем переходить к обучению). Это было связано с тем, что сам Tesseract довольно точен на обычно чистых изображениях, и довольно сложно сделать более точным прогноз обучения Tesseract, ЗА ИСКЛЮЧЕНИЕМ, если ваш шрифт совершенно другой и уникальный (как в наших случаях) или если вы пытаетесь читать какой-то демонический язык.

Установка и подготовка данных

Чтобы обучить свой шрифт, вам необходимо:

  1. Установите Tesseract (вы не говорите)
  2. Установите jTessBoxEditor
    Этот инструмент используется для создания и редактирования достоверных данных для обучения Тессеракта. Обратите внимание, что вам нужна Java Runtime, чтобы иметь возможность открыть ее, которую вы можете загрузить https://www.java.com/en/download/. После установки Java установите jTessBoxEditor (не FX) на «https://sourceforge.net/projects/vietocr/files/jTessBoxEditor женщина/
    , вы можете открыть jTessBoxEditor, распаковав zip-файлы, и запустить train.bat, если вы используете Windows, или
    jTessBoxEditor.jar, если вы используете Ubuntu
  3. [необязательно] Рабочий Word Office (Windows) или LibreOffice (Ubuntu) и файл .tiff вашего шрифта. Например, в приведенном выше случае я использовал шрифт OCR-A Extended. Вы можете легко загрузить свой шрифт из Google (просто выполните поиск font_name .tiff download). Установите свой шрифт (просто дважды щелкните файл .tiff). Или лучше, если у вас есть набор изображений, которые вы хотите прогнозировать позже в качестве обучающих данных.

После того, как вы подготовили все шаги по установке, описанные выше, вы готовы обучать свой Tesseract. Tesseract использует «язык» в качестве модели для распознавания текста. Существует множество языков по умолчанию, например eng (английский), ind (индонезийский) и т. Д. Мы пытаемся создать новый язык для Tesseract, чтобы он мог предсказывать наш шрифт, создавая некоторые обучающие данные, состоящие из случайных чисел, с использованием нашего шрифта. Есть два способа сделать это. Во-первых, если у вас есть коллекция изображений, состоящая только из ваших шрифтов, вы можете использовать это или, второй способ, то есть ввести любое число (или символ), которое вы хотите в слове, используя свой шрифт, и использовать инструменты для обрезки (окна ) или Shift + PrintScreen (Ubuntu), чтобы захватить и сохранить его в папке.

По моему опыту, 10–15 данных было достаточно для создания точной (субъективно) модели, которая достаточно точна как для чистых, так и для некоторых зашумленных изображений. Обратите внимание, что вы должны попытаться создать как можно более сбалансированные данные и как можно более близкие к реальному случаю. Если вы хотите предсказать некоторые изображения с синим фоном и красным шрифтом, вам следует создать обучающие данные с синим фоном и красным шрифтом.

Обучение Тессеракта

В общем, этап обучения Tesseract:

  1. Объедините данные обучения с файлом .tiff с помощью jTessBoxEditor
  2. Создайте обучающую метку, создав файлы .box, содержащие предсказания Тессеракта, из файла .tiff и исправьте каждое неточное предсказание.
  3. Обучите тессеракт

Шаг 1. Объедините данные обучения

После того, как вы закончите создание данных, откройте jTessBoxEditor. На верхней панели выберите «Инструменты» → «Объединить Tiff» (или вы можете просто использовать сочетание клавиш Ctrl + M). Перейдите в папку, в которой вы сохранили свои тренировочные изображения. Измените фильтр на PNG (или любое расширение, которое есть у ваших изображений), выберите все изображения и нажмите «ОК». Затем на панели выбора введите font_name.font.exp0, где font_name - любое желаемое имя (это будет имя вашего собственного нового языка Tesseract).

Шаг 2. Создайте ярлык обучения

Откройте терминал, перейдите в папку, в которой вы сохранили свои обучающие изображения и файл .tiff. Теперь, когда у нас есть данные обучения, как получить метку обучения? Боюсь, что нет, вам не следует маркировать каждое изображение вручную, поскольку мы можем использовать Tesseract и jTessBoxEditor, чтобы помочь нам. В терминале выполните команду ниже:

tesseract --psm 6 --oem 3 font_name.font.exp0.tif font_name.font.exp0 makebox

Постойте, а почему вдруг появляются psm и oem? Что произойдет, когда я введу указанную выше команду? Если вы запустите:

tesseract --help-psm
#or
tesseract --help-oem

Вы увидите, что psm означает режимы сегментации страниц, то есть то, как тессеракт обрабатывает изображение. Если вы хотите, чтобы тессеракт обрабатывал каждое изображение, которое он видит, как одно слово, вы можете выбрать psm 8. В нашем случае, поскольку наши изображения в файле .tiff представляют собой набор однострочного текста, мы выбираем psm 6. Что касается OEM , это означает режимы Ocr Engine, а для tesseract существует устаревший движок, который работает, распознавая шаблоны символов или используя механизмы нейронных сетей и LTSM (если вы хотите использовать LTSM, установите версию tesseract ›4.0.0).

Используя указанную выше команду, мы хотим, чтобы тессеракт создавал ограничивающие прямоугольники и предсказание каждого изображения в файле .tiff и сохранял его в текстовом файле font_name.font.exp0.box. Если вы не знали, файл .tiff, который мы создали ранее, содержит ваши обучающие изображения, сегментированные по «страницам». Используя указанную выше команду, он создаст файл .box, содержащий прогноз и ограничивающую рамку для каждого слова в файле .tiff. с именем font_name.font.exp0.box

Теперь откройте jTessBoxEditor, перейдите на вкладку редактора блоков, нажмите «Открыть» и выберите файл .tiff. Вы должны увидеть, что каждое изображение на каждой странице имеет свои ограничивающие рамки и прогнозы. Теперь ваша задача - исправить каждую ограничивающую рамку и ее предсказание символов в файле .box. (да, это самая скучная часть)

Шаг 3. Обучение тессеракта

После того, как вы создали уже исправленный файл .box и .tiff. Создать новый текстовый документ содержит

font 0 0 0 0 0

Сохраните его как font_properties в той же папке, что и файл .tiff и файл .box. Теперь вы готовы приступить к тренировочному процессу! (наконец). Внутри папки у вас должны быть все эти файлы:

Теперь запустите эту команду на терминале:

# Create a .tr file (training file)
tesseract num.font.exp0.tif font_name.font.exp0 nobatch box.train
# Create a unicharset file
unicharset_extractor font_name.font.exp0.box
# Create a shapetable file
shapeclustering -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.tr
# Create a pffmtable, intemp file
mftraining -F font_properties -U unicharset -O font_name.unicharset font_name.font.exp0.trecho Clustering..
# Create a normproto file
cntraining font_name.font.exp0.tr

Если вы столкнулись с ошибкой, вам может потребоваться использовать tesseract.exe, unicharset_extractor.exe и cntraining.exe (для пользователей Windows). Вы увидите некоторые выходные данные в своем терминале и, что наиболее важно, в части кластеризации формы. Если ваши обучающие изображения содержат все необходимые символы, вы увидите, что количество фигур = {количество классов, которые вы хотите}. Например, если я хочу обучить тессеракт правильно читать число цифр, то количество фигур будет равно 10 (что составляет 0,1,2,3,…, 9).

Master shape_table:Number of shapes = 10 max unichars = 1 number with multiple unichars = 0

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

Если вы все сделали правильно, вы увидите в своей папке 4 основных файла. shapetable, normproto, intemp и pffmtable. Переименуйте эти файлы в font_name.shapetable, font_name.normproto, font_name.intemp, font_name.pffmtable.

Затем запустите:

combine_tessdata font_name.

После того, как вы запустите всю указанную выше команду, вы увидите эти файлы в своей папке.

Теперь скопируйте font_name.traineddata в:

C:/Program Files x86/tesseract/4.0/tessdata  # Windows
sudo cp /usr/shared/tesseract/4.0/tessdata # ubuntu

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

tesseract -l font_name file0.png

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

Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 147
10293847 565647382910

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

Чтобы дополнительно проверить результат модели, вы можете создать другой файл .tiff, используя другое изображение или предыдущий файл .tiff. Откройте терминал и снова запустите:

tesseract -l font_name --psm 6 --oem 3 font_name.font.exp0.tif font_name.font.exp0 makebox

Теперь откройте jTessBoxEditor → оконный редактор → откройте и выберите файл .tiff. Проверьте, дает ли ваша модель более точный прогноз, чем предыдущая. Вы должны увидеть, что прогноз значительно улучшился.

Последние мысли

«Но разве Tesseract - единственный выход, если вам нужен нестандартный и быстрый движок OCR?» вы можете спросить. Ну, конечно, нет, существует масса поставщиков OCR API, если вы готовы выручить немного денег. По моему честному мнению, Tesseract хорош, если ваши изображения действительно очень чистые (например, текстовый документ, счет кассира и т. Д.). Если данные ваших изображений содержат много шумов, вы можете использовать пороговое значение, чтобы различать фон и шум от самого шрифта. По моему опыту, используя всего 10–20 данных, Tesseract был в состоянии конкурировать даже с самой современной моделью обнаружения объектов, такой как Faster R-CNN, которая была обучена с использованием гораздо большего количества данных (с много дополнений). НО если в данных ваших изображений есть шумы (случайные точки, грязные отметки) с тем же цветом, что и у вашего шрифта, Tesseract не сможет правильно предсказать ваши изображения. Я говорю вам следует использовать Tesseract , если вы хотите построить модель OCR как можно быстрее или у вас ограниченный объем обучающих данных.

Одна из основных слабых сторон (я думаю) Тессеракта в том, что он довольно нестабилен. Я мог бы получить другой результат, просто используя большую часть того же изображения. Также по какой-то причине, если я использую более 50 данных, Tesseract работает хуже. Ну, я тоже все еще учусь. Если вы обнаружите в этой статье ошибки или заблуждения, не стесняйтесь обращаться ко мне. Спасибо за чтение, удачного обучения!

Ссылки: