Ключевые слова:ocr, rus, lang, translate, (найти похожие документы)
From: Игорь Власов <igorvlassov@narod.ru.>
Newsgroups: email
Date: Mon, 4 Sep 2007 14:31:37 +0000 (UTC)
Subject: Как научить OCR Tesseraсt русскому языку.
Искал я тут недавно OCR для одного англоязычного проекта. И попутно
ознакомился с состоянием дел относительно родного языка. Свободной OCR,
способной распознавать родную речь, я не обнаружил. Зато наткнулся на
проект tesseract. Это бывшая
коммерческая многоплатформенная OCR, разработанная Hewlett Packard.
Теперь она, во-первых, распространяется под лицензией Apache версии 2.0. А во-вторых,
ее можно попытаться обучить какому-нибудь новому языку, что мы и
попробуем сделать. Итак, читаем мануал под названием
TrainingTesseract:
Первым шагом должно быть определение полного набора символов, который
будет использован, и создания текстового файла или файла текстового
процессора с примерами.
При подготовке тренировочного файла надо помнить следующее:
- требуется минимальное количество примеров каждого символа. 10 -
хорошо, но 5 - достаточно для редких символов, а для часто
встречающихся надо хотя бы 20;
- нельзя группировать небуквенные символы все вместе, надо делать текст
более реалистичным, например:
в чащах юга жил-был цитрус да но фальшивый экземпляр. 0123456789
!@#$%^&(),.[]{}<>/? - ужасно.
Гораздо лучше:
в чащах {юга} жил-(был) цитрус, да! но? <фальшивый> $3456.78 экземпляр #90
"апельсин"/помидор' 12.5%
- неплохо бы растянуть текст с помощью увеличения межстрочного и
межсимвольного интервалов;
- тренировочные данные должны умещаться на
одной странице;
- нет необходимости тренироваться на нескольких размерах, достаточно на
шрифте размером 10. Но для высоты текста меньше 15 пикселов нужно
тренировать отдельно или увеличить изображение до распознавания.
Далее надо напечатать и отсканировать или использовать какой-нибудь
другой метод для получения картинки тренировочной страницы. Может быть
до 32 страниц использовано. Лучше всего создавать страницы со смешением
шрифтов и стилей, включая жирный и наклонный.
Я попробую сделать это только для шрифта Thorndale AMT, который на моем
десктопе под SUSE10 в OpenOffice выглядит точно как Times New Roman под
Виндой. Итак, делаю отдельный файлик с выше приведенным текстом про
цитрус fontfile.odt, с помощью GIMPа фоткаю его с экрана, правлю и
сохраняю в черно-белый 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й
Конечно, не супер, но для первого раза, и столь скудных образца и
словаря, я думаю, неплохо!
Как видите, реализовать OCR для родного языка можно даже своими силами.
Удачи!
в версии 3.01 собирается из всех файлов один , к примеру rus.trainddata , есть ли возможность дообучить существующий язык? Тоесть получить filename.tr из этого файла и уже добавить к нему свой ,тем самым расширить словарь или добавить новые шрифты.