Контакти

Tesseract навчання. Tesseract-Ocr в Visual Studio - розпізнаємо сторінку тексту. Оцифровка зображень по одному

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 (optical character recognition) бібліотек.

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

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

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

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

- Google Text Recognition API

Google Text Recognition API

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

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

переваги:

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

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

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

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

недоліки:

- Великий розмір файлів з навченими даними (~ 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%.

Знадобилося мені отримати значення забітмапленних чисел. числа грабувалисяз екрану.

Я подумав, а чи не спробувати мені OCR? Спробував Tesseract.

Нижче я розповім як я намагався пристосувати Tesseract, навіщо я його тренував, і що з цього вийшло. У проекті на гітхабе лежить cmd-скрипт, що автоматизує наскільки можливо процес тренування, і дані, на яких я проводив тренування. Словом, є всі що потрібно, щоб з місця в кар'єр навчити Tesseract чогось корисного.

підготовка

Клонуємо репозитарій або завантажуємо zip-архів (~ 6Mb). Встановлюємо tesseract 3.01 з Оф.сайт. Якщо його там вже немає, то з підкаталогу zip-архів / distros.

Переходимо в папку samples, запускаємо montage_all.cmd
Цей скрипт створить підсумкове зображення samples / total.png, Можна скрипт не запускати, тому що я вже помістив його в кореневу папку проекту.

Навіщо тренувати?

Бути може і без тренування результат буде хороший? Перевіримо.
./exp1 - as is> tesseract ../total.png total

Помістимо виправлений результат в файл model_total.txt, Щоб порівнювати з ним результати распознаваний. Зірочка маркує неправильні значення.

model_total.txt розпізнавання
за замовчуванням
27
33
39
625.05
9
163
1,740.10
15
36
45
72
324
468
93
453
1,200.10
80.10
152.25
158.25
176.07
97.50
170.62
54
102
162
78
136.50
443.62
633.74
24
1,579.73
1,576.73
332.23
957.69
954.69
963.68
1,441.02
1,635.34
50
76
168
21
48
30
42
108
126
144
114
462
378
522
60
240
246
459.69
456.69
198
61
255
27
33
39
525 05*
9
153*
1,740 10*
15
35*
45
72
324
455*
93
453
1,200 10*
50 10*
152 25*
155 25*
175 07*
97 50*
170 52*
54
102
152*
75*
135 50*
443 52*
533 74*
24
1,579 73*
1,575 73*
332 23*
957 59*
954 59*
953 55*
1,441 02*
1,535 34*
50
75*
155*
21
45*
30
42
105*
125*
144
114
452*
375*
522
50*
240
245*
459 59*
455 59*
195*
51*
255

помилки розпізнавання за замовчуванням

Видно, що помилок багато. Якщо придивитися, то можна помітити, що не розпізнає десяткова точка, цифри 6 і 8 розпізнаються як 5. Чи допоможе тренування позбутися помилок?

Тренування

Тренування tesseract дозволяє натискати його на розпізнавання зображень текстів в тому вигляді, в якому ви будете згодовувати йому аналогічні зображення в процесі розпізнавання.
Ви передаєте tesseract тренувальні зображення, виправляєте помилки розпізнавання і передаєте ці правки tesseract-у. А він коригує коефіцієнти в своїх алгоритмах, щоб надалі не допускати знайдених вами помилок.

Щоб виконати тренування треба запустити. / Exp2 - trained> train.cmd

У чому полягає процес тренування? А в тому, що tesseract обробляє тренувальне зображення і формує т.зв. бокси символів - виділяє з тексту окремі символи створюючи список обмежують прямокутників. При цьому він робить припущення щодо того, який саме символ обмежений прямокутником.

Результати цієї роботи записує в файл total.box, який виглядає так:
2 46 946 52 956 0
7 54 946 60 956 0
3 46 930 52 940 0
3 54 930 60 940 0
3 46 914 52 924 0
9 53 914 60 924 0
6 31 898 38 908 0
2 40 898 46 908 0
5 48 898 54 908 0
0 59 898 66 908 0

Тут в певом стовпці символ, а в 2 - 5 шпальтах координати лівого нижнього кута прямокутника, його висота і ширина.

Звичайно редагувати його вручну складно і незручно, тому ентузіастами були створені графічні утиліти, що полегшують цю роботу. Я скористався, написаної на JAVA.

Після запуску. / Exp2 - trained> java -jar jTessBoxEditor-0.6jTessBoxEditor.jar треба відкрити файл. / Exp2 - trained / total.png, при цьому буде автоматично відкритий файл. / Exp2 - trained / total.box і певні в ньому прямокутники будуть накладені на тренувальне зображення.

У лівій частині наведено вміст файлу total.box, праворуч розташоване тренувальне зображення. Над зображенням розташована активна рядок файлу total.box

Синім зображені бокси, а червоним - бокс, відповідний активної рядку.

Я виправив всі неправильні 5-ки на правильні 6-ки і 8-ки, додав рядки з визначеннями всіх десяткових точок, наявних у файлі і зберіг total.box

Після завершення редагування треба, щоб скрипт продовжив роботу, треба закрити jTessBoxEditor. Далі всі дії виконуються скриптом автоматично без участі користувача. Скрипт записує результати навчання під кодом ttn

Щоб використовувати результати навчання при розпізнаванні треба запустити tesseract c ключем -l ttn
./exp2 - trained /> tesseract ../total.png total-trained -l ttn

Видно, що всі цифри стали розпізнаватися правильно, однак десяткова точка як і раніше ніяк не розпізнає.

model_total.txt розпізнавання
за замовчуванням
розпізнавання
після тренування
27
33
39
625.05
9
163
1,740.10
15
36
45
72
324
468
93
453
1,200.10
80.10
152.25
158.25
176.07
97.50
170.62
54
102
162
78
136.50
443.62
633.74
24
1,579.73
1,576.73
332.23
957.69
954.69
963.68
1,441.02
1,635.34
50
76
168
21
48
30
42
108
126
144
114
462
378
522
60
240
246
459.69
456.69
198
61
255
27
33
39
525 05*
9
153*
1,740 10*
15
35*
45
72
324
455*
93
453
1,200 10*
50 10*
152 25*
155 25*
175 07*
97 50*
170 52*
54
102
152*
75*
135 50*
443 52*
533 74*
24
1,579 73*
1,575 73*
332 23*
957 59*
954 59*
953 55*
1,441 02*
1,535 34*
50
75*
155*
21
45*
30
42
105*
125*
144
114
452*
375*
522
50*
240
245*
459 59*
455 59*
195*
51*
255
27
33
39
625 05*
9
163
1,740 10*
15
36
45
72
324
468
93
453
1,200 10*
80 10*
152 25*
158 25*
176 07*
97 50*
170 62*
54
102
162
78
136 50*
443 62*
633 74*
24
1,579 73*
1,576 73*
332 23*
957 69*
954 69*
963 68*
1,441 02*
1,635 34*
50
76
168
21
48
30
42
108
126
144
114
462
378
522
60
240
246
459 69*
456 69*
198
61
255

помилки розпізнавання з навчанням

збільшення зображення

Збільшувати можна по-різному, я спробував два способи: scale і resize

total-scaled.png (фрагмент) total-resized.png (фрагмент)
convert total.png total-scaled.png -scale "208x1920" convert total.png total-resized.png -resize "208x1920"

Так як зображення символів збільшилися разом з самими зображеннями, дані тренування під кодом ttn застаріли. Тому далі я розпізнавав без ключа -l ttn.

Видно, що на зображенні total-scaled.png tesseract плутає 7-ку з 2-кою, а на total-resized.png чи не плутає. На обох зображеннях коректно визначається десяткова крапка. Розпізнавання зображення total-resized.png майже ідеально. Є тільки три помилки - пробіл між цифрами в числах 21, 114 і 61.

Але ця помилка не критична, тому що її просто виправити простим видаленням з рядків прогалин.

помилки розпізнавання total-scaled.png

помилки розпізнавання total-resized.png

model_total.txt розпізнавання
за замовчуванням
розпізнавання
після тренування
total-scaled.png total-resized.png
27
33
39
625.05
9
163
1,740.10
15
36
45
72
324
468
93
453
1,200.10
80.10
152.25
158.25
176.07
97.50
170.62
54
102
162
78
136.50
443.62
633.74
24
1,579.73
1,576.73
332.23
957.69
954.69
963.68
1,441.02
1,635.34
50
76
168
21
48
30
42
108
126
144
114
462
378
522
60
240
246
459.69
456.69
198
61
255
27
33
39
525 05*
9
153*
1,740 10*
15
35*
45
72
324
455*
93
453
1,200 10*
50 10*
152 25*
155 25*
175 07*
97 50*
170 52*
54
102
152*
75*
135 50*
443 52*
533 74*
24
1,579 73*
1,575 73*
332 23*
957 59*
954 59*
953 55*
1,441 02*
1,535 34*
50
75*
155*
21
45*
30
42
105*
125*
144
114
452*
375*
522
50*
240
245*
459 59*
455 59*
195*
51*
255
27
33
39
625 05*
9
163
1,740 10*
15
36
45
72
324
468
93
453
1,200 10*
80 10*
152 25*
158 25*
176 07*
97 50*
170 62*
54
102
162
78
136 50*
443 62*
633 74*
24
1,579 73*
1,576 73*
332 23*
957 69*
954 69*
963 68*
1,441 02*
1,635 34*
50
76
168
21
48
30
42
108
126
144
114
462
378
522
60
240
246
459 69*
456 69*
198
61
255
22*
33
39
625.05
9
163
1,240.10*
15
36
45
22*
324
468
93
453
1,200.10
80.10
152.25
158.25
126.02*
92.50*
120.62*
54
102
162
28*
136.50
443.62
633.24*
24
1,529.23*
1,526.23*
332.23
952.69*
954.69
963.68
1,441.02
1,635.34
50
26*
168
2 1*
48
30
42
108
126
144
1 14*
462
328*
522
60
240
246
459.69
456.69
198
6 1*
255
27
33
39
625.05
9
163
1,740.10
15
36
45
72
324
468
93
453
1,200.10
80.10
152.25
158.25
176.07
97.50
170.62
54
102
162
78
136.50
443.62
633.74
24
1,579.73
1,576.73
332.23
957.69
954.69
963.68
1,441.02
1,635.34
50
76
168
2 1*
48
30
42
108
126
144
1 14*
462
378
522
60
240
246
459.69
456.69
198
6 1*
255

Оцифровка зображень по одному

Ок, що якщо потрібно оцифровувати зображення одне за іншим в режимі реального вренені?

Пробую по одному.
./exp5 - one by one> for / r% i in (* .png) do tesseract "% i" "% i"
Двох і тризначні числа не визначаються зовсім!

625.05
1740.10

Оцифровка невеликими пакетами

А якщо потрібно оцифровувати зображення пакетами по кілька зображень (6 або 10 в пакеті)? Пробую по десять.
./exp6 - ten in line> tesseract teninline.png teninline

Розпізнаються, і навіть без пробілу в числі 61.

висновки

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

Попередня обробка зображення має більший ефект, ніж навчання. Збільшуйте зі згладжуванням: convert -resize ...

Розпізнавання окремо розташованих «коротких» двох і тризначних чисел незадовільно - числа треба збирати в пакети.

Але в цілому tesseract майже ідеально впорався із завданням, не дивлячись на те, що він заточений під інші завдання - розпізнавання написів на фото і відео, сканах документів.

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 і радіємо (або засмучуємося, в залежності від результату).

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 = new 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"); printf (outText); myOCR -> 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. «ФОРМУЛА Костас»
г у
З появою ОМ в підручниках, журнальних `
YOстатьях і монографіях дебатувалося питання про
те, який виграш дає перехід від амплітудної
модуляції до однополосной. Було висловлено багато,
суперечливих думок. Спочатку 60-х років аме-
ріканський вчений Дж. Костас писав, що, просмо-
трив велику журнальну літературу по ОМ, він
виявив в кожній статті свою оцінку енерге-
"Чеського виграшу щодо АМ-від двох до,
декількох десятків. В результаті він встановив,
-що виграш, що вказується в кожній статті, з-
ставлять приблизно (З-К-И!) дБ, де М-число з- 'г
> Авторів даної статті.
Е, '11 Якщо цей жарт і не точна, вона все ж пра-
'Нот відображає той різнобій, який існував
; в ті роки. Крім того, що різні автори ви-
Д водили порівняння в різних умовах і по-раз-м
,, Ному визначали енергетичний виграш, вони так-1
', `Же допускали чимало різних помилок. 4 "
, `Ось приклади деяких міркувань. ",
1. При звичайній АМ, вважаючи потужність 'несучої



Сподобалася стаття? поділіться їй