Tesseract по-русски

В статье рассматривается процедура обучения русскому языку открытой OCR-системы Tesseract, разрабатываемой комапнией Hewlett-Packard.

[Власов Игорь (igorvlassov at narod dot ru)]

 

        Искал я тут давеча OCR для одного англоязычного проекта. И попутно ознакомился с состоянием дел относительно родного языка. Свободной OCR, способной распознавать родную речь, я не обнаружил. Зато наткнулся на проект tesseract. Это бывшая коммерческая многоплатформенная OCR, разработанная Hevlet Packard. Теперь она, во-первых, распространяется под лицензией Apache v.2. А во-вторых, ее можно попытаться обучить какому-нибудь новому языку, что мы и попробуем сделать. Итак, читаем мануал под названием TrainingTesseract:

 

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

При подготовке тренировочного файла надо помнить следующее: 

  • требуется минимальное количество примеров каждого символа. 10 - хорошо, но 5 - достаточно для редких символов, а для часто встречающихся надо хотя бы 20;  

  • нельзя группировать небуквенные символы все вместе, надо делать текст более реалистичным, например:
    в чащах юга жил-был цитрус да но фальшивый экземпляр. 0123456789 !@#$%^&(),.[]{}<>/? - ужасно. Гораздо лучше: в чащах {юга} жил-(был) цитрус, да! но? <фальшивый> $3456.78 экземпляр #90 <апельсин>/помидор' 12.5%

  • неплохо бы растянуть текст с помощью увеличения межстрочного и межсимвольного интервалов;

  • тренировочные данные должны умещаться на одной странице;

  • нет необходимости тренироваться на нескольких размерах, достаточно на шрифте размером 10. Но для высоты текста меньше 15 пикселов нужно тренировать отдельно или увеличить изображение до распознавания.

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

Я попробую сделать это только для шрифта Thorndale AMT, который на моем десктопе под SUSE10 в OpenOffice выглядит почти как Times New Roman под Виндой. Итак, делаю отдельный файлик с выше приведенным текстом про цитрус fontfile.odt, печатаю, сканирую и сохраняю в черно-белый BMP fontfile.bmp.  

 

Следующий шаг - это создание файла с координатами прямоугольников, в которых заключен каждый символ. К счастью, tesseract может сделать файл требуемого формата, хоть набор символов и не будет соответствовать нашему. Поэтому потом надо будет поправить файл вручную, введя правильные символы. Итак, делаем: 

 

tesseract fontfile.bmp fontfile batch.nochop makebox 

 

В результате получился файл fontfile.txt, который надо переименовать в fontfile.box 

Вот что у меня там: 

B 13 137 29 154 

Y 46 142 56 154 

I 54 137 63 154 

Z 67 137 82 154 

M 85 132 111 154 

Z 114 137 130 154 

X 133 137 150 154

{ 170 130 180 162 

m 186 137 210 154 

r 214 137 228 154 

a 233 137 248 154 

} 254 130 264 162 

M 284 137 306 154 

и т.д.  

        Теперь самая суровая часть - надо этот файлик отредактировать в редакторе, в котором можно заменить неправильные символы на нужные. Я использую Kate.

Опс, похоже, щ заменилось 2-мя символами: 

Z 67 137 82 154 

M 85 132 111 154 

в этом случае надо объединить описывающие прямоугольники следующим образом: 

  • Первый номер (левый) должен быть минимальным из 2-х строк (67)  

  • Второй номер (низ) должен быть минимальным из 2-х строк (132)  

  • Третий номер (правый) должен быть максимальным из 2-х строк (111)  

  • Четвертый номер (верх) должен быть максимальным из 2-х строк (154) 

 итак: щ 67 132 111 154

 

Замечание: координатная система, используемая в этом файле, начинается с (0,0) и направлена снизу вверх и слева направо.

 

Фух, кажется, поправил. Теперь запускаем tesseract в обучающем режиме: 

 

tesseract fontfile.bmp junk nobatch box.train 

 

и смотрим stderr (или tesseract.log под Виндой). Если есть ошибки вида FATALITY, 

это значит что tesseract не нашел ни одного образца символа, указанного в координатном файле. У меня он выдал ошибку: 

APPLY_BOXES: FATALITY - 0 labelled samples of "%" - target is 2 

APPLY_BOXES: 

   Boxes read from boxfile:      89

   Initially labelled blobs:     87 in 3 rows

   Box failures detected:                    2

   Duped blobs for rebalance:     0

   "%" has fewest samples:     0

                                Total unlabelled words:        1

                                Final labelled words:         87

Generating training data 

TRAINING ... Font name = UnknownFont. 

Generated training data for 87 blobs 

 

Однако fontfile.tr сгенерился. Ладно, обойдусь пока без знака % Вообще надо было сделать побольше всех символов, хотя бы повторить эту фразу пяток раз. 

По идее я должен повторять эту процедуру для разных шрифтов и получить несколько разных файлов, а затем создать прототипы с помощью команд вида: 

 

mftraining fontfile_1.tr fontfile_2.tr ... 

в результате должны получиться 2 файла: inttemp (прототипы форм) и pffmtable, затем

cntraining fontfile_1.tr fontfile_2.tr ... 

создаст normproto файл (прототипы для нормализации символов?).

Делаю это над одним моим файлом. Что-то получилось. Теперь надо указать tesseract'у множество символов, которое он может вывести. Используем команду unicharset_extractor чтобы сгенерить файл unicharset: 

unicharset_extractor fontfile_1.box fontfile_2.box ... 

Делаем. В полученном файле необходимо указать тип символа с помощью маски, маска такая: если буква - 1,  если маленькая буква - 1, если большая буква - 1, если цифра -1, иначе 0.

Например,  

б - маленькая буква. Еее маска 0011 или шестнадцатеричная 3 

; - не буква, не цифра. Маска = 0 

7 - просто цифра. Маска 1000 или шестнадцатеричная 8. 

Ь - большая буква. Маска 0101 или шестнадцатеричная 5 

и т.д. 

у меня все буквы маленькие. Меняю им маску на 3.  

Теперь надо где-то взять два списка, один - часто встречающихся слов, второй - остальных слов и преобразовать их в DAWG-формат с помощью еще одной утилитки: 

wordlist2dawg frequent_words_list freq-dawg  

wordlist2dawg words_list word-dawg 

Я для начала просто набил в каждый по 5 произвольных слов.  

Третий файл, user-words обычно пустой. 

Последний файл, который надо сделать, называется DangAmbigs В нем описываются случаи ошибочной замены одного файла на другой, например 

1 Ш 2 1И 

первая цифра - количество символов в первой группе, 2-я - кол-во символов во 2-й. 

Эта строка показывает, что 1И может иногда распознаваться неправильно как Ш. 

Этот файл тоже м.б. пустым. 

Теперь все собираем вместе. Файлы 

  • freq-dawg

  • word-dawg

  • user-words

  • inttemp

  • normproto

  • pffmtable

  • unicharset

  • DangAmbigs

снабжаем префиксом rus и помещаем в туда, где остальные словари, у меня это /usr/local/share/tessdata

Все!!!

Пробуем распознать какой-нибудь файлик. Я попробую для начала свой про цитрус:

tesseract image.bmp output -l rus

Вот что у меня получилось:

в чыаьах {юга} жшл-(был) цштрус, да! но?

<(1ьалвьшвый> $3456.78 экземпляр #90

капелвсшнм/помшдор' 12.5й

 

Конечно, не супер, но для первого раза, и столь скудных образца и словаря, я думаю,  неплохо!

[ опубликовано 27/09/2006 ]

Власов Игорь (igorvlassov at narod dot ru) - Tesseract по-русски   Версия для печати