К списку статей
Автор: Игорь Власов
Обложка статьи

Tesseract по-русски

Искал я тут давеча 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й

 

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

  • Обложка статьи FreeBSD. Настраиваем файловые системы

    FreeBSD. Настраиваем файловые системы

    FreeBSD. Свободные записки о свободной системе. В качестве объекта для изучения был избран однодисковый вариант FreeBSD стабильной версии - 4.2

    Читать далее
  • Обложка статьи Поддерживаю РФ: Кириллические домены должны поддерживаться в российском ПО и сервисах

    Поддерживаю РФ: Кириллические домены должны поддерживаться в российском ПО и сервисах

    Поддержка российским ПО и отечественными сервисами кириллических доменов и адресов электронной почты станет ключевой задачей проекта Поддерживаю.РФ в 2021 году. По словам директора Координационного центра доменов .RU/.РФ Андрея Воробьева, национальный дом

    Читать далее
  • Обложка статьи Защищаем Apache 2. Шаг за шагом

    Защищаем Apache 2. Шаг за шагом

    В этой статье мы расскажем о пошаговой установке и конфигурировании Apache 2.0, чтобы снизить риск неавторизованного доступа или успешного взлома в случае применения новой уязвимости, обнаруженной в Apache Web сервере. В результате, можно будет пользовать

    Читать далее
  • Обложка статьи Защита ваших данных. PGP & Linux

    Защита ваших данных. PGP & Linux

    Эта статья написана для тех, кому необходимо сохранить некоторую информацию в секрете и кто пока не решил как это сделать....

    Читать далее
  • Обложка статьи DragonFlyBSD: загрузка и инициализация

    DragonFlyBSD: загрузка и инициализация

    В этом цикле статей я хочу рассказать об операционной системе, родившейся прямо на наших глазах - летом 2004 года. Имя ей - DragonFlyBSD, и являет она собой представителя славного племени BSD-систем. В сущности, исходно это fork (порождение) FreeBSD 4-й в

    Читать далее

Специальные предложения
интернет-магазина

  • Чехол для переноски Portable Hard Shell для Oculus Quest 2 VR
    3300 руб

    Чехол для переноски Portable Hard Shell для Oculus Quest 2 VR

  • Книга: Дронов В.А. "Laravel 9. Быстрая разработка веб-сайтов на PHP"
    1550 руб

    Книга: Дронов В.А. "Laravel 9. Быстрая разработка веб-сайтов на PHP"

  • №18 Патрон с впаянной лампой 2,5 V/ 0,3A
    212 руб

    №18 Патрон с впаянной лампой 2,5 V/ 0,3A

  • Книга: Аль-Халили Джим "Мир физики и физика мира. Простые законы мироздания"
    1000 руб

    Книга: Аль-Халили Джим "Мир физики и физика мира. Простые законы мироздания"

  • Набор выводных резисторов 0.25W (100 Ом—910 Ом), 24 номинала по 10 шт.
    275 руб

    Набор выводных резисторов 0.25W (100 Ом—910 Ом), 24 номинала по 10 шт.