Поскольку печатный текст создаётся с помощью вполне определённых шрифтов, для обучения неокогнитрона можно использовать эти же шрифты. В случае совпадения шрифта обучающей последовательности с шрифтом распознаваемого текста эффективность распознавания резко повысится (так как неокогнитрон распознаёт образы обучающей последовательности с почти 100%-й вероятностью). Для остальных шрифтов эффективность распознавания будет меньше, однако способность неокогнитрона к абстрагированию должна позволить ему распознавать текст, напечатанный любым шрифтом.
TRecS_PatternGen — консольное приложение, работа которого управляется с командной строки. В соответствии с принятыми правилами составления консольных программ, вызов TRecS_PatternGen с параметром '--help' показывает справку:
>TRecS_PatternGen.exe --help
Usage:
TRecS_PatternGen.exe [OPTION...]
Help Options:
-?, --help Show help options
--help-all Show all help options
--help-gtk Show GTK+ Options
Application Options:
-o, --output-dir=DIRNAME Output patterns to this directory
-f, --font-name=FONT Description of a font to use (if none - all fonts will be used)
-w, --width=WIDTH Maximum character width (in pixels)
-h, --height=HEIGHT Maximum character height (in pixels)
-s, --startchar=CODE First character
--endchar=CODE Last character
--display=DISPLAY X display to use
После прочтения справки становится очевидным, что TRecS_PatternGen принимает следующие аргументы:
--output-dir=DIRNAME (или -o DIRNAME) – указывает, что программа должна сохранять образы обучающей последовательности в директорию DIRNAME. DIRNAME – это строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся абсолютным или относительным путём в файловой системе.
--font-name=FONT (или -f FONT) – указывает, что программа должна использовать шрифт FONT для генерации образов. FONT – это строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся текстовым представлением описания шрифта для Pango.
--width=WIDTH (или -w WIDTH) – указывает, что программа должна генерировать образы шириной WIDTH. WIDTH – число, ширина изображения в пикселях.
--height=HEIGHT (или -h HEIGHT) – указывает, что программа должна генерировать образы высотой HEIGHT. HEIGHT – число, высота изображения в пикселях.
--startchar=CODE (или -s CODE) – указывает код CODE для первого символа в обучающей последовательности. CODE – десятеричное число, являющееся кодом символа в Unicode.
--endchar=CODE – указывает код CODE для последнего символа в обучающей последовательности. CODE – десятеричное число, являющееся кодом символа в Unicode.
Последовательность состоит из N символов, где N – разница между кодом последнего символа и кодом первого символа.
TRecS_PatternGen рисует каждый символ (образ) последовательности так, чтобы он соответствовал заданной пользователем ширине.
Файлы образов имеют имена следующего вида:
<код>_<шрифт>.png ,
где код — это код символа в Unicode, а шрифт — название использованного для генерации шрифта. Изображения сохраняются в формате PNG (Portable Network Graphic).
Программа TRecS занимается как обучением сети, так и распознаванием текста. Режим работы меняется в зависимости от заданных программе аргументов коммандной строки. В соответствии с принятыми правилами составления консольных программ, вызов TRecS с параметром '--help' показывает справку:
>TRecS.exe --help
Usage:
TReCS.exe [OPTION...]
Help Options:
-?, --help Show help options
--help-all Show all help options
--help-gtk Show GTK+ Options
Application Options:
-l, --load-net=FILENAME Load network from file
-s, --save-net=FILENAME Save network to file after it is used
-m, --mode=MODE Mode: 0 - learning, 1 - recognition, 4 - recognition (verbose)
-p, --pattern-dir=DIRNAME Directory name (without trailing slash) containing patterns
-i, --input-file=FILENAME Input file (an image)
-o, --output-file=FILENAME Output file
-a, --layout-analyze Perform layout analyze (don't assume that input file contains only one character)
-f, --finish-init Assume that loaded network is a skeleton and finish its initialization
-v, --verbose Print a lot of info
--display=DISPLAY X display to use
После прочтения справки становится очевидным, что TRecS принимает следующие аргументы:
--load-net=FILENAME (или -l FILENAME) – указывает, что программа должна загрузить нейронную сеть из файла FILENAME. FILENAME – строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся относительным или абсолютным именем файла в файловой системе.
--save-net=FILENAME (или -s FILENAME) – указывает, что после завершения предписанных операций программа должна сохранить нейронную сеть в файл FILENAME. FILENAME – строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся относительным или абсолютным именем файла в файловой системе.
--mode=MODE (или -m MODE) – указывает, что программа должна работать в режиме MODE. MODE – число, означающее режим. 0 — режим обучения, 1 — режим распознавания, 4 — режим распознавания с сохранением промежуточной информации на диск в виде изображений.
--pattern-dir=DIRNAME (или -p DIRNAME) – указывает, что программа должна загружать образы из директории DIRNAME. DIRNAME – это строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся абсолютным или относительным путём в файловой системе.
--input-file=FILENAME (или -i FILENAME) – указывает, что программа должна загрузить изображение для распознавания из файла FILENAME. FILENAME – строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся относительным или абсолютным именем файла в файловой системе. Файл должен являться изображением и иметь один из форматов, поддерживаемых GDK.
--output-file=FILENAME (или -o FILENAME) – указывает, что программа должна сохранить распознанный текст в файл FILENAME. FILENAME – строка (если она содержит пробелы, её следует заключить в двойные кавычки), являющаяся относительным или абсолютным именем файла в файловой системе. Файл будет текстовым, текст будет представлен в кодировке UTF-8.
--layout-analyze (или -a) – указывает, что программа должна провести анализ разметки изображения (то есть предполагается, что изображение содержит более одного символа).
--finish-init (или -f) – указывает, что программа должна произвести инициализацию загруженной из файла нейронной сети. Это требуется при обучении (когда загружаемая сеть является лишь скелетом будущей сети).
--verbose (или -v) – указывает, что программа должна выводить в консоль дополнительную информацию о ходе процесса.
Для обучения необходимо задать аргументы —load-net, --finish-init, --mode=0, --pattern-dir и —save-net. Для распознавания текста нужно задать аргументы —load-net, --mode=1, --input-file и —output-file.
Информация о неокогнитроне хранится в XML-файлах (структура этих файлов приведена в Приложении 2). Эти файлы содержат информацию о топологии сети (число слоёв, размеры плоскостей) и информацию для генерации необучаемых весовых коэффициентов (аргументы для генерирующих веса функций).
Программа сохраняет отладочную информацию в поддиректорию output в директории, из которой она была запущена. Если этой директории нет, её надо создать. Отладочная информация включает в себя:
· Изображение показывающее на какие знаки было разделено изображение в процессе анализа разметки.
· Изображение показывающее на какие строки было разделено изображение в процессе анализа разметки.
· Изображение каждого знака.
· Состояние нейронов S- и C-плоскостей всех слоёв (если сеть работает в режиме 4).
· Изображение содержащее среднюю яркость строк исходного изображения.
· Текстовый файл содержащий среднюю яркость строк исходного изображения.
Была создана программная реализация предложенной системы, способная производить минимально необходимый анализ разметки страницы, обучаться и распознавать символы. Также была создана программа для генерации обучающих и тестирующих последовательностей образов из шрифтов.
Для генерации обучающей последовательности были использованы шрифты Comic Sans MS, Liberation Mono, Freemono, Arial и Times New Roman. Символы включали в себя точку, запятую, тире, все кириллические буквы от «а» до «я» обеих регистров (исключая буквы «й», «ы» и «ё») а также латинская буква «I» (список команд к TrecS_PatternGen — в Приложении 3). Всего 320 образов.
Для генерации проверочной последовательности были использованы шрифты Courier, DejaVu Serif, Tahoma, Verdana и Impact, также 320 образов.
В результате прогона проверочной последовательности система распознала верно 233 образов из 320 (73%). Полностью неправильно были распознаны 47 образов (14%), а для оставшиеся 40 (13%) – неправильно был определён регистр символа. Неправильное определение регистра происходит из-за того, что все образы растягиваются до размеров входного слоя сети, поэтому символы, различающиеся регистром но сходные по форме, подаются на сеть в виде сходных образов.
Обзор отладочной информации указывает на то, что большая часть неправильно распознанных символов приходится на образы, набранные шрифтом Impact. Это объясняется тем, что символы этого шрифта значительно отличаются по форме от символов шрифтов, использованных для обучающей последовательности. Как и все нейросети, неокогнитрон требует хорошего покрытия обучающей последовательностью пространства входных образов для корректного обучения.
В результате проверки обучающей последовательностью из 256 образов (без шрифта Impact) система корректно распознала 223 символа (87%), некорректно распознала 1 символ (перепутала «ъ» с «ь») и некорректно определила регистр у 32 символов (13%).
В результате распознавания трёх изображений одного и того же текста, набранного тремя разными шрифтами, система дала следующие результаты:
Times New Roman:
Люблю грозу в начале Мая.
Когда весенниич первьIич гром
Как-бьI резвяся и играя
Грохочет в небе голубом.
Courier:
ЛЮблЮ грозу В начале Мая,
Когда ВесеннИИЗ перВьIиЗ гром