Знахідки програміста: Навчаємо Tesseract. Tesseract-Ocr у Visual Studio - розпізнаємо сторінку тексту Оцифровка невеликими пакетами

Знахідки програміста: Навчаємо Tesseract. Tesseract-Ocr у Visual Studio - розпізнаємо сторінку тексту Оцифровка невеликими пакетами

Tesseract-ocr – вільна бібліотека для розпізнавання тексту. Для того щоб її підключити необхідно завантажити наступні компоненти:
Leptonica - http://code.google.com/p/leptonica/downloads/detail?name=leptonica-1.68-win32-lib-include-dirs.zip
Остання версія tesseract-ocr (на даний момент 3.02) - https://code.google.com/p/tesseract-ocr/downloads/detail?name=tesseract-3.02.02-win32-lib-include-dirs.zip&can= 2&q=
Дані навчання російській мові - https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.rus.tar.gz
Все можна збирати самостійно, завантаживши вихідні коди, але ми цим не займатимемося.

Створивши новий проект, підключаємо шляхи до lib та h файлів. І пишемо простенький код.
#include #include int main() ( tesseract::TessBaseAPI *myOCR = новий tesseract::TessBaseAPI(); printf("Tesseract-ocr version: %s\n", myOCR->Version()); printf("Leptonica version: %s \n", getLeptonicaVersion()); if (myOCR->Init(NULL, "rus")) ( fprintf(stderr, "Could not initialize tesseract.\n"); exit(1); ) Pix *pix = pixRead ("test.tif"); myOCR->SetImage(pix); char outText; lstrcpy(outText, myOCR->GetUTF8Text()); printf("OCR output:\n\n"); ->Clear(); myOCR->End(); pixDestroy(&pix); return 0;

Підключаємо lib-файли:
libtesseract302.lib
liblept168.lib

Компілюємо – програма успішно створюється. Як приклад візьмемо таку картинку:

Запускаємо програму, щоб інформація вивелася у файл (оскільки UTF-8 у консолі хаос буде):
test > a.txt

Вміст файлу нижче:
Tesseract-ocr version: 3.02
Leptonica version: leptonica-1.68 (Mar 14 2011, 10:47:28)
OCR output:

,Підставивши цей вираз у (63), бачимо, що оги-
біюча односмугового сигналу промодульована
та глибина модуляції дорівнює а.
7 Огинає ХО) первинного сигналу безпосеред-
На осцилографі спостерігати не можна, так у
Як цей сигнал не є вузькосмуговим, а в цьому
'випадок «наочність» огинаючої відсутня, Але
при односмугової модуляції формується вузько-
Тяжкий сигнал з тією ж огинаючою, і тут вона
«і проявляється в явному вигляді і іноді (як в опі-
„санному випадку) вносить сум'яття в уми малодосвід-
та інших дослідників.
6,4. «ФОРМУЛА КОСТАСА»
г у
З появою ОМ у підручниках, журнальних
Єстаттях та монографіях дебатувалося питання про
тому, який виграш дає перехід від амплітудної
модуляції до односмугової. Було висловлено багато,
суперечливих думок. На початку 60-х років аме-
риканський вчений Дж. Костас писав, що, просмо-
трев обширну журнальну літературу з ОМ, він
виявив у кожній статті свою оцінку енергетики.
“Вічного виграшу щодо АМ-від двох до,
кількох десятків. В результаті він встановив,
-що виграш, що вказується в кожній статті, з-
ставить приблизно (З-К-И!) дБ, де М-число зі- ' г
› авторів цієї статті.
11 Якщо цей жарт і неточний, він все ж таки керує
Нот відображає той різнобій, який існував
; у роки. Крім того, що різні автори ви-
Д вадили порівняння в різних умовах і по-роз-м
У ньому визначали енергетичний виграш, вони так- 1
“ж допускали чимало різних помилок. 4"
‚` Ось приклади деяких міркувань. ",
1. При звичайній АМ, вважаючи потужність несучої

Tesseract– вільна платформа для оптичного розпізнавання тексту, вихідники якої Google подарував спільноті у 2006 році. Якщо ви пишіть софт для розпізнавання тексту, то вам, напевно, доводилося звертатися до послуг цієї потужної бібліотеки. І якщо вона не впоралася з вашим текстом, то вихід у вас залишається один – навчити її. Процес цей досить складний і рясніє не очевидними, а іноді й магічними діями. Оригінальний опис є. Мені знадобився майже цілий день на розуміння всієї його глибини, тому тут я хочу зберегти, сподіваюся, зрозуміліший його варіант. Так щоб допомогти собі та іншим пройти цей шлях наступного разу швидше.

0. Що нам потрібно

  • Tesseract власне.
Складання цієї бібліотеки є під windows (можна завантажити установник з офіційного репозиторію) і під linux. Для більшості linux-дистрибутивів встановити tesseract можна просто через sudo apt-get install tesseract-ocr, мені для мого модного Еlementary OS довелося додати джерело:
gedit /etc/apt/sources.list
deb http://notesalexp.net/debian/precise/ precise main
wget -O - http://notesalexp.net/debian/alexp_key.asc
apt-key add alexp_key.asc
apt-get update
apt-get install tesseract-ocr
  • Зображення з текстом для тренування
Бажано, щоб це був реальний текст, який потім доведеться розпізнавати. Важливо, щоб кожен символ шрифту зустрічався у сканованому фрагменті щонайменше 5 разів, а бажано – 20 разів. Формат tiff, без стиснення, бажано не багатосторінковий. Між усіма символами мають бути чітко помітні проміжки. Кладемо наше зображення в окрему директорію і називаємо у вигляді<код языка>.<имя шрифта>.exp<номер>.tif. Зображення може бути не одне і відрізнятися вони повинні лише номером у найменуванні файлу. Формат найменувань файлів дуже важливий. На файли з невірними найменуваннями утиліти, які ми будемо використовувати, будуть лаятися помилками сегментування тощо. Для певності будемо вважати, що ми вивчаємо мову ссс і шрифт eee. Таким чином називаємо файл зі сканом тренувального зразка ccc.eee.exp0.tif

1. Створюємо та редагуємо box-файл
Для того. щоб відзначити символи на зображенні та задати їх відповідність utf-8 символам тексту служать box-файли. Це звичайні текстові файли, у яких кожному символу відповідає рядок із символом та координатами прямокутника в пікселях. Спочатку файл генеруємо утилітою з пакета tesseract:
tesseract ccc.eee.exp0.tif ccc.eee.exp0 batch.nochop makebox
отримали файл ccc.eee.exp0.box у поточній директорії. Заглянемо до нього. Символи на початку рядка повністю відповідають символам у файлі? Якщо це так, тренувати нічого не потрібно, ви можете спати спокійно. У нашому випадку швидше за все символи не збігатимуться ні по суті, ні за кількістю. Тобто. tesseract зі словником за умовчанням не розпізнав не лише символи, але й порахував деякі з них за два або більше. Можливо, частина символів у нас "злипнеться", тобто. потрапить до загальної коробки і буде розпізнано як один. Це все потрібно виправити перш ніж йти далі. Робота нудна і копітка, але на щастя для цього є ряд сторонніх утиліт. Наприклад, я користувався pyTesseractTrainer-1.03 . Відкриваємо їм зображення, box-файл із таким самим ім'ям він сам підтягне.
Пройшло півдня... Ви з почуттям глибокого задоволення закриваєте pyTesseractTrainer (адже ви не забули зберегти результат, вірно?) і у вас є коректний box-файл. Тепер можна переходити до наступного етапу.

2. Тренуємо Tesseract
tesseract ccc.eee.exp0.tif ccc.eee.exp0 nobatch box.train
Отримуємо багато помилок, але шукаємо наприкінці щось на зразок "Found 105 good blobs". Якщо цифра істотно більша за кількість "вивчених" символів, тобто шанс, що тренування в цілому вдалося. Інакше – повертаємось на початок. Внаслідок цього кроку у вас з'явився файл ccc.eee.exp0.tr.

3. Виймаємо набір символів
unicharset_extractor ccc.eee.exp0.box
Отримуємо набір символів у вигляді файлу unicharset у поточній директорії, де кожен символ та його характеристики розташовуються в окремому рядку. Тут нашим завданням буде перевірити та поправити характеристики символів (друга колонка у файлі). Для маленьких букв алфавіту ставимо ознаку 3, для великих 5, для розділових знаків 10 для цифр 8, все інше (типу +=-) помічаємо 0. Китайські та японські ієрогліфи помічаємо 1. Зазвичай всі ознаки стоять правильно, так що цей етап багато часу у вас не займе.

4. Описуємо стиль шрифту
Створюємо файл ccc.font_properties з єдиним рядком: eee 0 0 0 0 0. Тут спочатку пишемо ім'я шрифту, потім числом 1 або 0 позначаємо наявність символів стилю (відповідно italic bold fixed serif fraktur). У нашому випадку стилів немає, тому залишаємо все по нулях.

5. Кластери фігур, прототипи та інша магія
Для подальшого навчання нам доведеться виконати ще три операції. Можете спробувати зрозуміти їхній зміст із офіційного опису, мені було не до того:). Просто виконуємо:
shapeclustering -F ccc.font_properties -U unicharset ccc.eee.exp0.tr
...з'явиться файл shapetable
а потім:
mftraining -F ccc.font_properties -U unicharset -O ccc.unicharset ccc.eee.exp0.tr
...отримаємо файли ccc.unicharset, inttemp, pffmtable
і наприкінці:
cntraining ccc.eee.exp0.tr
...отримаємо файл normproto.

6. Словники
Теоретично заповнення словників слів, що часто використовуються (і слів взагалі), допомагає Tesseract-у розбиратися у ваших каракулях. Словники використовувати необов'язково, але якщо раптом захочеться, робимо файли frequent_words_list і words_list в які вписуємо (кожне з нового рядка) відповідно часто використовуються і слова мови.
Щоб конвертувати ці списки у правильний формат, виконуємо:
wordlist2dawg frequent_words_list ccc.freq-dawg ccc.unicharset

wordlist2dawg words_list ccc.word-dawg ccc.unicharset

7. Останній загадковий файл
Ім'я йому - unicharambigs. За ідеєю він повинен звернути увагу Tesseract на схожі символи. Це текстовий файл у кожному рядку з роздільниками табуляцією описуються пари рядків, які можуть бути сплутані під час розпізнавання. Повністю формат файлу описаний у документації, мені він був не потрібен, і я залишив його порожнім.

8. Остання команда
Усі файли потрібно перейменувати так, щоб їх імена починалися з імені мови. Тобто. у нас в директорії залишаться лише файли:

ccc.box
ccc.inttemp
ccc.pffmtable
ccc.tif
ccc.font_properties
ccc.normproto
ccc.shapetable
ccc.tr
ccc.unicharset

І, нарешті, виконуємо:
combine_tessdata ccc.
(!) Крапка обов'язкова. В результаті отримуємо файл ccc.traineddata, який і дозволить нам далі розпізнавати нашу загадкову нову мову.

9. Перевіряємо, чи коштувало воно того:)
Тепер спробуємо розпізнати наш зразок за допомогою вже навченого Tesseract-а:
sudo cp ccc.traineddata /usr/share/tesseract-ocr/tessdata/
tesseract ccc.tif output -l ccc
Тепер дивимося в output.txt і радіємо (або засмучуємось, залежно від результату).

У статті розглядається процедура навчання російської мови відкритої OCR-системи Tesseract, яку розробляє компанія Hewlett-Packard.

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

Шукав я тут недавно OCR для одного англомовного проекту. І принагідно ознайомився зі станом справ щодо рідної мови. Вільної OCR, здатної розпізнавати рідну мову, я не виявив. Зате натрапив на проект tesseract. Це колишня багатоплатформна комерційна OCR, розроблена Hevlet Packard. Тепер вона по-перше поширюється під ліцензією Apache v.2. А по-друге, її можна спробувати навчити якійсь новій мові, що ми й спробуємо зробити. Отже, читаємо мануал під назвою TrainingTesseract:

Першим кроком має бути визначення повного набору символів, який буде використаний, та створення текстового файлу або файлу текстового процесора з прикладами.

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

    потрібна мінімальна кількість прикладів кожного символу. 10 – добре, але 5 – достатньо для рідкісних символів, а для часто зустрічаються треба хоча б 20;

    не можна групувати небуквенні символи всі разом, треба робити текст більш реалістичним, наприклад:
    у хащах півдня жив-був цитрус та але фальшивий екземпляр. 0123456789 [email protected]#$%^&(),.{}<>/? - Жахливо. Набагато краще:у хащах (півдня) жив-(був) цитрус, так! але?<фальшивый> $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

Ось що у мене там:

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.

Опс, схоже, щ замінилося двома символами:

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 наведені шаблони "%" - target is 2

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 або шістнадцяткова

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

7 – просто цифра. Маска 1000 або шістнадцяткова 8.

Ь – велика літера. Маска 0101 або шістнадцяткова 5

у мене всі букви маленькі. Змінюю їм маску на 3.

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

wordlist2dawg frequent_words_list freq-dawg

wordlist2dawg words_list word-dawg

Я спочатку просто набив у кожен по 5 довільних слів.

Третій файл, user-words зазвичай є порожнім.

Останній файл, який треба зробити, називається DangAmbigs У ньому описуються випадки помилкової заміни одного файлу на інший, наприклад

перша цифра - кількість символів у першій групі, 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й

Звичайно, не супер, але для першого разу, і настільки мізерні зразка і словника, я думаю, непогано!

Власов Ігор (igorvlassov at narod dot ru) - Tesseract російською

Нам потрібно було покращити документообіг у нашій компанії, насамперед збільшити швидкість обробки паперових документів. Для цього ми вирішили розробити програмне рішення на базі однієї з бібліотек OCR (optical character recognition).

OCR, або оптичне розпізнавання тексту, є механічним або електронним перетворенням зображень надрукованого тексту в машинний. OCR – це спосіб оцифровування друкованого тексту, щоб він міг бути в електронному вигляді збережений, відредагований, відображений та застосований у таких машинних процесах як когнітивні обчислення, машинний переклад та інтелектуальний аналіз даних.

Крім того, OCR використовується як метод введення інформації з паперових документів (включаючи фінансові записи, візитні картки, рахунки-фактури та багато іншого).

Перш ніж реалізовувати саму програму, ми провели ретельний аналіз трьох найбільш популярних OCR бібліотек з метою визначити найбільш підходящий варіант для вирішення наших завдань.

Ми проаналізували три найбільш популярні бібліотеки OCR:

— Google Text Recognition API

Google Text Recognition API

Google Text Recognition API — це процес виявлення тексту у зображеннях і відео потоках і розпізнавання тексту, що міститься в ньому. Після виявлення розпізнавач визначає фактичний текст у кожному блоці та розбиває його на слова та рядки. Він виявляє текст різних мов (французька, німецька, англійська тощо) як реального часу.

Варто відзначити, що, загалом, дана OCR із поставленим завданням упоралася. Ми отримали можливість розпізнавати текст як у реальному часі, так і з готових зображень текстових документів. У ході аналізу цієї бібліотеки ми виявили як переваги, так і недоліки її використання.

Переваги:

— Можливість розпізнавання тексту у реальному часі

- Можливість розпізнавання тексту із зображень;

- Невеликий розмір бібліотеки;

- Висока швидкість розпізнавання.

Недоліки:

— Великий розмір файлів із навченими даними (~30Mb).

Tesseract

Tesseract — це бібліотека OCR з відкритим вихідним кодом для різних операційних систем. Є безкоштовним програмним забезпеченням, випущеним під ліцензією Apache, версія 2.0, підтримує різні мови.

Розробка Tesseract фінансувалася компанією Google з 2006 року, час, коли вона вважалася однією з найточніших та найефективніших OCR бібліотек з відкритим вихідним кодом.

Як би там не було на той момент, результатами застосування Tesseract ми залишилися не дуже задоволені, т.к. бібліотека є неймовірно об'ємною і не дозволяє розпізнавати текст у реальному часі.

Переваги:

- має відкритий вихідний код;

— Відповідно, досить легко навчити OCR розпізнавати потрібні шрифти і підвищити якість інформації, що розпізнається. Після швидких налаштувань бібліотеки та навчання якість результатів розпізнавання стрімко зросла.

Недоліки:

- Недостатня точність розпізнавання, що усувається шляхом тренування та навчання алгоритму розпізнавання;

— Для розпізнавання тексту в реальному часі потрібна додаткова обробка зображення;

— Невелика точність розпізнавання при використанні стандартних файлів з даними про шрифти, слова та символи.

Anyline

Anyline надає багатоплатформний SDK, який дозволяє розробникам легко інтегрувати функції OCR у додатки. Ця бібліотека OCR залучила нас до численних можливостей налаштування параметрів розпізнавання та наданих моделей для вирішення конкретних прикладних завдань. Варто зазначити, що бібліотека платна та призначена для комерційного використання.

Переваги:

- Досить просте налаштування розпізнавання потрібних шрифтів;

- Розпізнавання тексту в реальному часі;

- Легке та зручне налаштування параметрів розпізнавання;

- Бібліотека може розпізнавати штрих-коди та QR-коди;

— Надає готові модулі для вирішення різних завдань.

Недоліки:

- Невисока швидкість розпізнавання;

— Для отримання задовільних результатів потрібне початкове налаштування шрифтів для розпізнавання.

У ході проведеного аналізу для вирішення наших завдань ми зупинилися на Google Text Recognition API, яка поєднує в собі високу швидкість роботи, легке налаштування і високі результати розпізнавання.

Розроблене рішення дозволяє сканувати паперові документи, автоматично оцифровувати їх і зберігати в єдину базу даних. Якість інформації, що розпізнається, становить близько 97%, що є дуже хорошим результатом.

За рахунок впровадження розробленої системи внутрішній (включаючи обробку документів, їх створення та обмін між відділами та ін.) було прискорено на 15%.

Якщо є готові рішення, немає сенсу винаходити милиці та велосипеди. З особливим цинізмом це твердження довели автори криптолокера, який користувався CryptoAPI:). Справедливо воно і для вирішення нашого сьогоднішнього завдання – розшифровки капчі (з освітніми цілями, зрозуміло). Вперед запускаємо Visual Studio!

Вступ

Весь процес майбутньої роботи можна умовно поділити на кілька етапів:

  • скачати картинки;
  • прибрати шуми та інші штучні спотворення;
  • виділити області зв'язаності (символи), зберегти їх;
  • навчити нейромережу або створити словник;
  • розпізнати.

У цьому нам допоможуть:

  • AForgeNet - бібліотеки комп'ютерного зору та штучного інтелекту;
  • Tesseract – програма для розпізнавання текстів;
  • Fanndotnetwrapper - обгортка.NET нейромережі FANN;
  • алгоритм пошуку пов'язаності CCLA від Omar Gameel Salem

Вихідник на dvd.сайт

Не забудь скачати сабж, він знадобиться тобі при прочитанні цієї статті. Жодної малварі, жодного екстремізму - тільки чиста наука, тільки OCR-технології, тільки хардкор!

Підготовчий етап

Запускаємо Visual Studio та створюємо новий віконний проект мовою C#. Відкриємо його у провіднику, щоб скопіювати туди необхідні файли.


Для навчання нейромережі FANN використана частина коду з Tesseract, відмінність полягає в тому, що ми створюємо один текстовий файл train.tr, в якому перший рядок – кількість картинок, кількість точок у кожній (ширина, помножена на висоту) та кількість виходів (літер, які ми шукаємо). Сама картинка до всього цього проходить обов'язкову бінаризацію, щоб виділити всього два стани кожної точки (1 - чорний, 0 - білий колір), і зберігається далі в цьому ж файлі у всіх наступних рядках. Для зручності та можливості використовувати різні заздалегідь створені навчені ann-файли було створено додатковий текстовий файл CONFIG.txt. Він складається з одного рядка і вказує кількість точок та виходів із їх значеннями, випадково запустити перевірку captcha на іншому ann-файлі не вдасться.

String a = File.ReadAllText(SaveFilesPath + "CONFIG.txt"); string b = a.Split(" "); int SumPix = Convert.ToInt32(b); int Outpt = Convert.ToInt32(b.Length); uint layers = ((uint)SumPix, (uint)layerS, (uint)Outpt); net.CreateStandardArray(layers); net.RandomizeWeights(-0.1, 0.1); net.SetLearningRate(0.7f); TrainingData data = New TrainingData(); data.ReadTrainFromFile(SaveFilesPath + "train.tr"); net.TrainOnData(data, 1000, 0, 0.001f); net.Save(SaveFilesPath + "FANNLearning.ann");

Отримуємо конфіг, читаємо параметри, число шарів (layers) за рекомендацією Вікіпедії задано рівним 120, все інше було вибрано випадково або підглянуто в Мережі. Швидкість навчання залежить від потужності твого заліза та того, що написано вище. Наприклад, i7-4702MQ при 6500 картинок одним ядром був зайнятий хвилин 20-30.

Крок шостий. Розпізнавання

На заключному етапі реалізовано два підходи, але використовується той, навчання якого було проведено. Tesseract 3.02 та FANN знаходяться у нижній лівій частині головного вікна. Перший вміє шукати по англійському (вибираємо символи з списку), російському, Math і словнику користувача. Пошук словника відбувається автоматично, і у підказці tooltip висвічуються всі доступні. Другий розпізнає текст за кнопкою FANNOCR та виводить у лог (ліва частина вікна) результат аналізу для кожного вибраного символу. Дуже зручно дивитися, чому нейронна мережа обрала той чи інший вихід. Розглянемо, як це працює у разі нейронної мережі.

Private string OCR(Bitmap img) ( ... ( int whx = img.Width * img.Height; if (SUMMPIX != whx) ( /* Виводимо помилку, не зійшлося кількість пікселів */) double input = GetPix(img) ; double result = net.Run(input); if (tempanswer.Length != result.Length) ( /* Виводимо помилку, різну кількість виходів */) int maxN = FindMax(result); answer = Convert.ToString(tempanswer) ; if (ToLogEvent != null) ToLogEvent(result, tempanswer, answer); ... ) )

Отримали картинку від public-методу, де реалізований net.CreateFromFile(SaveFilesPath + "FANNLearning.ann") та читання конфіг файлу, tempanswer - це змінна, рівна b, в ній перераховані літери, які ми шукаємо. Порівнюємо число пікселів, записуємо їх у масив і проганяємо через навчений ann, вишукуючи максимально високий відсоток збігу, потім спрямовуємо результат у подію, обравши один вихід і отримавши букву, закріплену за ним.

Обговорюємо результати

Мої результати тестування сильно залежали від кількості та якості картинок для навчання, а у випадку з нейромережею FANN – і кількості виходів теж. У середньому captcha, що піддалася фільтрам, мала ~80% правильного розпізнавання, тут багато залежить від посидючості та бажання - чого навчиш, те й отримаєш. Головне – це працює.

Висновок

Все описане у статті можна застосувати для вирішення багатьох інших завдань. Наприклад, при пошуку інформації для статті зустрівся докладний розбір розпізнавання образу автомобіля на стоянці. Включай фантазію та Visual Studio! 🙂

 

 

Це цікаво: