Contacts

Formation Tesseract. Tesseract-Ocr dans Visual Studio - Reconnaître une page de texte. Numérisation des images une par une

Tesseract est une plate-forme OCR gratuite que Google a offerte à la communauté en 2006. Si vous écrivez un logiciel d'OCR, vous avez probablement dû vous tourner vers les services de cette puissante bibliothèque. Et si elle n'a pas fait face à votre texte, vous n'avez qu'une seule issue - lui apprendre. Ce processus est assez compliqué et regorge d'actions pas évidentes et parfois carrément magiques. Il y a une description originale. Il m'a fallu presque une journée entière pour en comprendre toute la profondeur, alors je veux en enregistrer, je l'espère, une version plus compréhensible. Alors pour vous aider et aider les autres à aller plus vite la prochaine fois.

0. De quoi avons-nous besoin

  • Tesseract lui-même.
Il existe des assemblys de cette bibliothèque sous windows (vous pouvez télécharger l'installeur depuis le dépôt officiel) et sous linux. Pour la plupart des distributions Linux, tesseract peut être installé simplement via sudo apt-get install tesseract-ocr, pour mon système d'exploitation élémentaire à la mode, j'ai dû ajouter une source :
gedit /etc/apt/sources.list
deb http://notesalexp.net/debian/precise/ main précise
wget -O - http://notesalexp.net/debian/alexp_key.asc
apt-key ajouter alexp_key.asc
apt-get mise à jour
apt-get install tesseract-ocr
  • Image avec texte pour la formation
Il est souhaitable qu'il s'agisse d'un texte réel, qui devra ensuite être reconnu. Il est important que chaque caractère de la police apparaisse dans le fragment numérisé au moins 5 fois, et de préférence 20 fois. Format Tiff, pas de compression, de préférence pas multipage. Il doit y avoir des espaces clairement distinguables entre tous les caractères. Nous mettons notre image dans un répertoire séparé et l'appelons comme<код языка>.<имя шрифта>.exp<номер>.tif. Il peut y avoir plus d'une image et elles ne doivent différer que par le numéro dans le nom de fichier. Le format de nom de fichier est très important. Les fichiers avec des noms incorrects de l'utilitaire que nous utiliserons seront abusés par des erreurs de segmentation, etc. Pour plus de précision, nous supposerons que nous étudions le langage ccc et la police eee. C'est ainsi que nous nommons le fichier avec l'analyse de l'échantillon d'apprentissage ccc.eee.exp0.tif

1. Créer et modifier un fichier de boîte
Pour. pour marquer les caractères dans l'image et définir leur correspondance sur les caractères utf-8 dans les fichiers de zone de texte sont utilisés. Ce sont des fichiers texte ordinaires, dans lesquels chaque caractère correspond à une chaîne avec le caractère et les coordonnées du rectangle en pixels. Initialement, le fichier est généré par l'utilitaire à partir du package tesseract :
tesseract ccc.eee.exp0.tif ccc.eee.exp0 batch.nochop makebox
obtenu le fichier ccc.eee.exp0.box dans le répertoire courant. Jetons-y un coup d'œil. Les caractères au début de la ligne correspondent-ils exactement aux caractères du fichier ? Si tel est le cas, vous n'avez pas besoin de vous entraîner, vous pouvez dormir paisiblement. Dans notre cas, les symboles ne coïncideront probablement ni en essence ni en quantité. Ceux. tesseract avec le dictionnaire par défaut ne reconnaissait pas seulement les caractères, mais en comptait également certains comme deux ou plus. Peut-être que certains de nos personnages vont "se serrer les coudes", c'est-à-dire tombera dans la case générale et sera reconnu comme tel. Tout cela doit être corrigé avant de continuer. Le travail est fastidieux et minutieux, mais heureusement il y a un certain nombre de utilitaires tiers... Par exemple, j'ai utilisé pyTesseractTrainer-1.03. Nous ouvrons une image avec elle, et elle extraira un fichier de boîte du même nom.
Une demi-journée s'est écoulée... Vous fermez pyTesseractTrainer avec un profond sentiment de satisfaction (vous n'avez pas oublié de sauvegarder le résultat, n'est-ce pas ?) et vous avez le bon fichier box. Vous pouvez maintenant passer à l'étape suivante.

2. Former Tesseract
tesseract ccc.eee.exp0.tif ccc.eee.exp0 nobatch box.train
Nous obtenons beaucoup d'erreurs, mais regardez à la fin quelque chose comme "Found 105 good blobs". Si le chiffre est significativement supérieur au nombre de symboles « étudiés », alors il y a une chance que la formation dans son ensemble ait été un succès. Sinon, on revient au début. À la suite de cette étape, vous avez un fichier ccc.eee.exp0.tr

3. Extraire le jeu de caractères
unicharset_extractor ccc.eee.exp0.box
Nous obtenons un ensemble de caractères sous la forme d'un fichier unicharset dans le répertoire courant, où chaque caractère et ses caractéristiques sont situés sur une ligne distincte. Ici, notre tâche sera de vérifier et de corriger les caractéristiques des symboles (la deuxième colonne du fichier). Pour les petites lettres de l'alphabet, nous mettons le signe 3, pour les grands 5, pour les signes de ponctuation 10 pour les chiffres 8, tout le reste (comme + = -) nous marquons 0. Les caractères chinois et japonais nous marquons 1. Habituellement, tous les signes sont corrects, donc cette étape est beaucoup de temps, cela ne vous prendra pas.

4. Décrire le style de police
Créez un fichier ccc.font_properties avec une seule ligne : eee 0 0 0 0 0. Ici, d'abord, écrivez le nom de la police, puis avec le chiffre 1 ou 0 marquez la présence de symboles de style (respectivement, italique gras fixe serif fraktur ). Dans notre cas, il n'y a pas de styles, donc nous laissons tout à zéro.

5. Amas de figurines, prototypes et autres magies
Pour une étude plus approfondie, nous devons effectuer trois autres opérations. Vous pouvez essayer de comprendre leur signification à partir de la description officielle, je n'étais pas à la hauteur :). On fait juste :
regroupement de formes -F ccc.font_properties -U unicharset ccc.eee.exp0.tr
... le fichier shapetable apparaîtra
et alors:
mftraining -F ccc.font_properties -U unicharset -O ccc.unicharset ccc.eee.exp0.tr
... obtenir les fichiers ccc.unicharset, inttemp, pffmtable
et enfin:
formation ccc.eee.exp0.tr
... on obtient le fichier normproto.

6. Dictionnaires
En théorie, remplir des dictionnaires de mots fréquemment utilisés (et de mots en général) aide Tesseract à comprendre vos gribouillis. Il n'est pas nécessaire d'utiliser des dictionnaires, mais si vous le souhaitez soudainement, nous créons des fichiers liste_mots_frequents et liste_mots dans lesquels nous entrons (chacun avec nouvelle ligne), respectivement, des mots fréquemment utilisés et simplement des mots de la langue.
Pour convertir ces listes au format correct, procédez comme suit :
wordlist2dawg fréquent_mots_list ccc.freq-dawg ccc.unicharset

wordlist2dawg word_list ccc.word-dawg ccc.unicharset

7. Le dernier dossier mystérieux
Son nom est unicharambigs. En théorie, il devrait attirer l'attention de Tesseract sur des personnages similaires. il fichier texte chaque ligne délimitée par des tabulations décrit des paires de lignes qui peuvent être confuses lorsqu'elles sont reconnues. Le format de fichier est entièrement décrit dans la documentation, je n'en avais pas besoin et je l'ai laissé vide.

8. Dernière commande
Tous les fichiers doivent être renommés afin que leurs noms commencent par le nom de la langue. Ceux. nous n'aurons que des fichiers dans le répertoire :

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

Et enfin, nous exécutons :
combine_tessdata ccc.
(!) Le point est requis. En conséquence, nous obtenons le fichier ccc.traineddata, qui nous permettra de mieux reconnaître notre nouvelle langue mystérieuse.

9. Vérifiez si cela en valait la peine :)
Essayons maintenant de reconnaître notre échantillon à l'aide du Tesseract déjà formé :
sudo cp ccc.traineddata / usr / share / tesseract-ocr / tessdata /
tesseract ccc.tif sortie -l ccc
Maintenant, regardons output.txt et réjouissons-nous (ou contrarions, selon le résultat).

Nous avions besoin d'améliorer le flux de travail dans notre entreprise, tout d'abord, d'augmenter la vitesse de traitement des documents papier. Pour cela, nous avons décidé de développer solution logicielle basé sur l'une des bibliothèques OCR (reconnaissance optique de caractères).

L'OCR, ou Optical Character Recognition, est la conversion mécanique ou électronique d'images de texte imprimé en texte machine. L'OCR est un moyen de numériser du texte imprimé afin qu'il puisse être stocké, édité, affiché et appliqué électroniquement dans des processus machine tels que l'informatique cognitive, la traduction automatique et l'exploration de données.

De plus, l'OCR est utilisée comme méthode de saisie d'informations à partir de documents papier (y compris les dossiers financiers, Cartes de visite, factures et plus).

Avant d'implémenter l'application elle-même, nous avons effectué une analyse approfondie des trois bibliothèques OCR les plus populaires afin de déterminer l'option la plus appropriée pour résoudre nos problèmes.

Nous avons analysé les trois bibliothèques OCR les plus populaires :

- API de reconnaissance de texte Google

API de reconnaissance de texte Google

L'API de reconnaissance de texte Google est le processus de détection de texte dans les images et les flux vidéo et de reconnaissance du texte qu'il contient. Une fois détecté, le module de reconnaissance détermine le texte réel dans chaque bloc et le décompose en mots et en lignes. Il détecte le texte dans différentes langues (français, allemand, anglais, etc.) en temps réel.

Il convient de noter que, en général, cette OCR a fait face à la tâche. Nous avons la possibilité de reconnaître du texte à la fois en temps réel et à partir d'images prêtes à l'emploi de documents texte. Au cours de l'analyse de cette bibliothèque, nous avons identifié à la fois les avantages et les inconvénients de son utilisation.

Avantages:

- Capacité de reconnaître du texte en temps réel

- Possibilité de reconnaître du texte à partir d'images ;

- Petite taille de la bibliothèque ;

- Haute vitesse de reconnaissance.

Désavantages:

- Grande taille de fichiers avec des données entraînées (~ 30Mb).

Tesseract

Tesseract est une bibliothèque OCR open source pour divers systèmes d'exploitation... Est libre Logiciel, publié sous la licence Apache, version 2.0, prend en charge plusieurs langues.

Le développement de Tesseract a été financé par par Google depuis 2006, une époque où elle était considérée comme l'une des bibliothèques OCR open source les plus précises et les plus efficaces.

Quoi qu'il en soit, à l'époque, nous n'étions pas très satisfaits des résultats de la mise en œuvre de Tesseract, car la bibliothèque est incroyablement grande et ne permet pas la reconnaissance de texte en temps réel.

Avantages:

- Possède un code source ouvert ;

- Par conséquent, il est assez facile d'entraîner l'OCR à reconnaître les polices souhaitées et à améliorer la qualité des informations reconnues. Après réglages rapides la bibliothèque et la qualité d'apprentissage des résultats de reconnaissance ont explosé.

Désavantages:

- Précision de reconnaissance insuffisante, qui est éliminée par la formation et l'apprentissage de l'algorithme de reconnaissance ;

- Pour la reconnaissance de texte en temps réel, un traitement supplémentaire de l'image résultante est nécessaire ;

- Faible précision de reconnaissance lors de l'utilisation de fichiers standard avec des données sur les polices, les mots et les symboles.

N'importe quelle ligne

Anyline fournit un SDK multiplateforme qui permet aux développeurs d'intégrer facilement la fonctionnalité OCR dans les applications. Cette bibliothèque OCR nous a séduits par les nombreuses possibilités de personnalisation des paramètres de reconnaissance et les modèles fournis pour résoudre des problèmes spécifiques appliqués. Il est à noter que la bibliothèque est payante et est destinée à un usage commercial.

Avantages:

- Joli installation facile reconnaissance des polices requises;

- Reconnaissance de texte en temps réel ;

- Réglage simple et pratique des paramètres de reconnaissance ;

- La bibliothèque peut reconnaître les codes-barres et les codes QR ;

- Fournit modules prêts à l'emploi pour résoudre divers problèmes.

Désavantages:

- Faible vitesse de reconnaissance ;

- Pour obtenir des résultats satisfaisants, il est nécessaire la configuration initiale polices pour la reconnaissance.

Au cours de l'analyse, pour résoudre nos problèmes, nous nous sommes installés sur l'API Google Text Recognition, qui combine une vitesse de travail élevée, personnalisation facile et des résultats de reconnaissance élevés.

La solution que nous avons développée permet de numériser des documents papier, de les numériser automatiquement et de les enregistrer dans une base de données unique. La qualité des informations reconnues est d'environ 97%, ce qui est un très bon résultat.

Du fait de la mise en place du système développé, l'interne (notamment le traitement des documents, leur création et leur échange entre services, etc.) a été accéléré de 15 %.

Il m'a fallu pour obtenir les valeurs des nombres enregistrés. Les nombres volé de l'écran.

J'ai pensé, devrais-je essayer l'OCR ? J'ai essayé Tesseract.

Ci-dessous, je vais vous dire comment j'ai essayé d'adapter Tesseract, pourquoi je l'ai entraîné et ce qu'il en est advenu. Dans le projet sur github, il y a un script cmd qui automatise au maximum le processus de formation, et les données sur lesquelles j'ai effectué la formation. En un mot, il y a tout ce dont vous avez besoin pour enseigner à Tesseract quelque chose d'utile dès le départ.

Préparation

Cloner le référentiel ou télécharger archive zip (~ 6 Mo). Installez tesseract 3.01 depuis le site officiel. S'il n'y est pas déjà, alors depuis le sous-répertoire zip-archive/distros.

Allez dans le dossier des exemples, exécutez montage_all.cmd
Ce script créera l'image finale échantillons / total.png, vous ne pouvez pas exécuter le script, car Je l'ai déjà placé dans le dossier racine de mon projet.

Pourquoi s'entrainer ?

Peut-être que le résultat sera bon même sans entraînement ? Allons vérifier.
./exp1 - tel quel> tesseract ../total.png total

Mettons le résultat corrigé dans un fichier modèle_total.txt comparer les résultats de la reconnaissance avec lui. Un astérisque marque les valeurs incorrectes.

modèle_total.txt Reconnaissance
défaut
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

erreurs de reconnaissance par défaut

On voit qu'il y a beaucoup d'erreurs. Si vous regardez attentivement, vous remarquerez que la virgule n'est pas reconnue, les chiffres 6 et 8 sont reconnus comme 5. L'entraînement vous aidera-t-il à vous débarrasser des erreurs ?

Entraînement

La formation Tesseract vous permet de l'entraîner à reconnaître des images de textes sous la forme sous laquelle vous lui fournirez des images similaires lors du processus de reconnaissance.
Vous transférez les images d'entraînement vers tesseract, corrigez les erreurs de reconnaissance et transférez ces modifications vers tesseract. Et il ajuste les coefficients dans ses algorithmes afin d'éviter les erreurs que vous avez trouvées à l'avenir.

Pour terminer la course d'entraînement. / Exp2 -trained> train.cmd

Quel est le processus de formation ? Et le fait est que tesseract traite l'image d'entraînement et forme ce qu'on appelle. boîtes de caractères - extrait des caractères individuels du texte en créant une liste de rectangles de délimitation. Ce faisant, il devine quel symbole est limité au rectangle.

Les résultats de ce travail sont écrits dans le fichier total.box, qui ressemble à ceci :
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

Ici, dans la première colonne se trouve un symbole et dans 2 à 5 colonnes les coordonnées du coin inférieur gauche du rectangle, sa hauteur et sa largeur.

Bien sûr, l'éditer manuellement est difficile et peu pratique, c'est pourquoi des utilitaires graphiques ont été créés par des passionnés pour faciliter ce travail. J'ai utilisé celui écrit en JAVA.

Après avoir démarré. / Exp2 - entraîné> java -jar jTessBoxEditor-0.6jTessBoxEditor.jar, ouvrez le fichier. / Exp2 - entraîné / total.png, et le fichier. / Exp2 - entraîné / total.box et les rectangles qui y sont définis s'ouvrir automatiquement sera superposé à l'image d'entraînement.

A gauche se trouve le contenu du fichier total.box, à droite se trouve l'image d'entraînement. La ligne active du fichier total.box est située au-dessus de l'image.

Les cases sont représentées en bleu et la case correspondant à la ligne active est représentée en rouge.

J'ai corrigé tous les mauvais 5 pour les bons 6 et 8, ajouté des lignes avec les définitions de tous les points décimaux dans le fichier et enregistré total.box

Une fois l'édition terminée, le script doit continuer à fonctionner, vous devez fermer jTessBoxEditor. De plus, toutes les actions sont exécutées par le script automatiquement sans intervention de l'utilisateur. Le script écrit les résultats de l'entraînement sous le code ttn

Pour utiliser les résultats de l'entraînement pour la reconnaissance, vous devez exécuter tesseract avec le commutateur -l ttn
./exp2 -trained /> tesseract ../total.png total-trained -l ttn

On peut voir que tous les chiffres ont commencé à être reconnus correctement, mais la virgule décimale n'est toujours pas reconnue.

modèle_total.txt Reconnaissance
défaut
Reconnaissance
après l'entraînement
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

erreurs d'apprentissage

Agrandissement de l'image

Vous pouvez l'augmenter de différentes manières, j'ai essayé deux manières : redimensionner et redimensionner

total-scaled.png (extrait) total-resized.png (extrait)
convertir total.png total-scaled.png -scale "208x1920" convertir total.png total-resized.png -redimensionner "208x1920"

Étant donné que les images de symboles ont grandi avec les images elles-mêmes, les données d'apprentissage sous le code ttn sont obsolètes. Par conséquent, j'ai reconnu ttn sans le commutateur -l.

On peut voir que dans l'image total-scaled.png tesseract confond 7-ka avec 2-ka, et ne le confond pas sur total-resized.png. Le point décimal est correctement identifié dans les deux images. La reconnaissance d'image total-resized.png est presque parfaite. Il n'y a que trois erreurs - un espace entre les chiffres des nombres 21, 114 et 61.

Mais cette erreur n'est pas critique, puisque il peut être facilement corrigé en supprimant simplement les espaces des lignes.

erreurs de reconnaissance total-scaled.png

erreurs de reconnaissance total-resized.png

modèle_total.txt Reconnaissance
défaut
Reconnaissance
après l'entraînement
total-scaled.png total-redimensionné.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

Numérisation des images une par une

Ok, et si vous voulez numériser des images une par une en temps réel ?

J'essaye un à la fois.
./exp5 - un par un> pour / r% i dans (* .png) faire tesseract "% i" "% i"
Les nombres à deux et trois chiffres ne sont pas du tout détectés !

625.05
1740.10

Numérisation en petits paquets

Et si vous avez besoin de numériser des images par lots de plusieurs images (6 ou 10 par lot) ? J'en essaie dix.
./exp6 - dix en ligne> tesseract teninline.png teninline

Reconnu, et même sans espace dans le nombre 61.

conclusions

En général, je m'attendais aux pires résultats, car les petites polices bitmap sont un cas limite en raison de leur petite taille, de leur granularité et de leur cohérence distinctes - différentes images un caractère correspond complètement. Et la pratique a montré que les nombres artificiellement assombris dont la taille augmente sont mieux reconnus.

Le prétraitement de l'image a un effet plus important que l'apprentissage. Augmentation avec anti-aliasing : convert -resize ...

La reconnaissance des numéros "courts" à deux et trois chiffres séparés n'est pas satisfaisante - les numéros doivent être collectés dans des emballages.

Mais en général, tesseract a fait face à la tâche presque parfaitement, malgré le fait qu'il ait été affiné pour d'autres tâches - reconnaissance d'inscriptions sur des photos et des vidéos, numérisations de documents.

Tesseract est une plate-forme OCR gratuite que Google a offerte à la communauté en 2006. Si vous écrivez un logiciel d'OCR, vous avez probablement dû vous tourner vers les services de cette puissante bibliothèque. Et si elle n'a pas fait face à votre texte, vous n'avez qu'une seule issue - lui apprendre. Ce processus est assez compliqué et regorge d'actions pas évidentes et parfois carrément magiques. Il y a une description originale. Il m'a fallu presque une journée entière pour en comprendre toute la profondeur, alors je veux en enregistrer, je l'espère, une version plus compréhensible. Alors pour vous aider et aider les autres à aller plus vite la prochaine fois.

0. De quoi avons-nous besoin

  • Tesseract lui-même.
Il existe des assemblys de cette bibliothèque sous windows (vous pouvez télécharger l'installeur depuis le dépôt officiel) et sous linux. Pour la plupart des distributions Linux, tesseract peut être installé simplement via sudo apt-get install tesseract-ocr, pour mon système d'exploitation élémentaire à la mode, j'ai dû ajouter une source :
gedit /etc/apt/sources.list
deb http://notesalexp.net/debian/precise/ main précise
wget -O - http://notesalexp.net/debian/alexp_key.asc
apt-key ajouter alexp_key.asc
apt-get mise à jour
apt-get install tesseract-ocr
  • Image avec texte pour la formation
Il est souhaitable qu'il s'agisse d'un texte réel, qui devra ensuite être reconnu. Il est important que chaque caractère de la police apparaisse dans le fragment numérisé au moins 5 fois, et de préférence 20 fois. Format Tiff, pas de compression, de préférence pas multipage. Il doit y avoir des espaces clairement distinguables entre tous les caractères. Nous mettons notre image dans un répertoire séparé et l'appelons comme<код языка>.<имя шрифта>.exp<номер>.tif. Il peut y avoir plus d'une image et elles ne doivent différer que par le numéro dans le nom de fichier. Le format de nom de fichier est très important. Les fichiers avec des noms incorrects de l'utilitaire que nous utiliserons seront abusés par des erreurs de segmentation, etc. Pour plus de précision, nous supposerons que nous étudions le langage ccc et la police eee. C'est ainsi que nous nommons le fichier avec l'analyse de l'échantillon d'apprentissage ccc.eee.exp0.tif

1. Créer et modifier un fichier de boîte
Pour. pour marquer les caractères dans l'image et définir leur correspondance sur les caractères utf-8 dans les fichiers de zone de texte sont utilisés. Ce sont des fichiers texte ordinaires, dans lesquels chaque caractère correspond à une chaîne avec le caractère et les coordonnées du rectangle en pixels. Initialement, le fichier est généré par l'utilitaire à partir du package tesseract :
tesseract ccc.eee.exp0.tif ccc.eee.exp0 batch.nochop makebox
obtenu le fichier ccc.eee.exp0.box dans le répertoire courant. Jetons-y un coup d'œil. Les caractères au début de la ligne correspondent-ils exactement aux caractères du fichier ? Si tel est le cas, vous n'avez pas besoin de vous entraîner, vous pouvez dormir paisiblement. Dans notre cas, les symboles ne coïncideront probablement ni en essence ni en quantité. Ceux. tesseract avec le dictionnaire par défaut ne reconnaissait pas seulement les caractères, mais en comptait également certains comme deux ou plus. Peut-être que certains de nos personnages vont "se serrer les coudes", c'est-à-dire tombera dans la case générale et sera reconnu comme tel. Tout cela doit être corrigé avant de continuer. Le travail est fastidieux et minutieux, mais heureusement, il existe un certain nombre d'utilitaires tiers pour cela. Par exemple, j'ai utilisé pyTesseractTrainer-1.03. Nous ouvrons une image avec, il extraira un fichier de boîte du même nom.
Une demi-journée s'est écoulée... Vous fermez pyTesseractTrainer avec un profond sentiment de satisfaction (vous n'avez pas oublié de sauvegarder le résultat, n'est-ce pas ?) et vous avez le bon fichier box. Vous pouvez maintenant passer à l'étape suivante.

2. Former Tesseract
tesseract ccc.eee.exp0.tif ccc.eee.exp0 nobatch box.train
Nous obtenons beaucoup d'erreurs, mais regardez à la fin quelque chose comme "Found 105 good blobs". Si le chiffre est significativement supérieur au nombre de symboles « étudiés », alors il y a une chance que la formation dans son ensemble ait été un succès. Sinon, on revient au début. À la suite de cette étape, vous avez un fichier ccc.eee.exp0.tr

3. Extraire le jeu de caractères
unicharset_extractor ccc.eee.exp0.box
Nous obtenons un ensemble de caractères sous la forme d'un fichier unicharset dans le répertoire courant, où chaque caractère et ses caractéristiques sont situés sur une ligne distincte. Ici, notre tâche sera de vérifier et de corriger les caractéristiques des symboles (la deuxième colonne du fichier). Pour les petites lettres de l'alphabet, nous mettons le signe 3, pour les grands 5, pour les signes de ponctuation 10 pour les chiffres 8, tout le reste (comme + = -) nous marquons 0. Les caractères chinois et japonais nous marquons 1. Habituellement, tous les signes sont corrects, donc cette étape est beaucoup de temps, cela ne vous prendra pas.

4. Décrire le style de police
Créez un fichier ccc.font_properties avec une seule ligne : eee 0 0 0 0 0. Ici, d'abord, écrivez le nom de la police, puis avec le chiffre 1 ou 0 marquez la présence de symboles de style (respectivement, italique gras fixe serif fraktur ). Dans notre cas, il n'y a pas de styles, donc nous laissons tout à zéro.

5. Amas de figurines, prototypes et autres magies
Pour une étude plus approfondie, nous devons effectuer trois autres opérations. Vous pouvez essayer de comprendre leur signification à partir de la description officielle, je n'étais pas à la hauteur :). On fait juste :
regroupement de formes -F ccc.font_properties -U unicharset ccc.eee.exp0.tr
... le fichier shapetable apparaîtra
et alors:
mftraining -F ccc.font_properties -U unicharset -O ccc.unicharset ccc.eee.exp0.tr
... obtenir les fichiers ccc.unicharset, inttemp, pffmtable
et enfin:
formation ccc.eee.exp0.tr
... on obtient le fichier normproto.

6. Dictionnaires
En théorie, remplir des dictionnaires de mots fréquemment utilisés (et de mots en général) aide Tesseract à comprendre vos gribouillis. Il n'est pas nécessaire d'utiliser des dictionnaires, mais si vous le souhaitez soudainement, nous créons des fichiers liste_mots_frequents et liste_mots dans lesquels on entre (chacun sur une nouvelle ligne), respectivement, les mots fréquemment utilisés et simplement les mots de la langue.
Pour convertir ces listes au format correct, procédez comme suit :
wordlist2dawg fréquent_mots_list ccc.freq-dawg ccc.unicharset

wordlist2dawg word_list ccc.word-dawg ccc.unicharset

7. Le dernier dossier mystérieux
Son nom est unicharambigs. En théorie, il devrait attirer l'attention de Tesseract sur des personnages similaires. Il s'agit d'un fichier texte, chaque ligne délimitée par des tabulations décrit des paires de lignes qui peuvent se confondre lorsqu'elles sont reconnues. Le format de fichier est entièrement décrit dans la documentation, je n'en avais pas besoin et je l'ai laissé vide.

8. Dernière commande
Tous les fichiers doivent être renommés afin que leurs noms commencent par le nom de la langue. Ceux. nous n'aurons que des fichiers dans le répertoire :

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

Et enfin, nous exécutons :
combine_tessdata ccc.
(!) Le point est requis. En conséquence, nous obtenons le fichier ccc.traineddata, qui nous permettra de mieux reconnaître notre nouvelle langue mystérieuse.

9. Vérifiez si cela en valait la peine :)
Essayons maintenant de reconnaître notre échantillon à l'aide du Tesseract déjà formé :
sudo cp ccc.traineddata / usr / share / tesseract-ocr / tessdata /
tesseract ccc.tif sortie -l ccc
Maintenant, regardons output.txt et réjouissons-nous (ou contrarions, selon le résultat).

Tesseract-ocr est une bibliothèque de reconnaissance de texte gratuite. Pour le connecter, vous devez télécharger les composants suivants :
Leptonica - http://code.google.com/p/leptonica/downloads/detail?name=leptonica-1.68-win32-lib-include-dirs.zip
Le dernier tesseract-ocr (sur ce moment 3.02) - https://code.google.com/p/tesseract-ocr/downloads/detail?name=tesseract-3.02.02-win32-lib-include-dirs.zip&can=2&q=
Données de formation en russe - https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.rus.tar.gz
Vous pouvez tout collecter vous-même en téléchargeant codes sources, mais nous ne le ferons pas.

Après avoir créé un nouveau projet, incluez les chemins des fichiers lib et h. Et nous écrivons un code simple.
#inclure #inclure int main () (tesseract :: TessBaseAPI * myOCR = nouveau tesseract :: TessBaseAPI (); printf ("Tesseract-ocr version:% s \ n", myOCR-> Version ()); printf (" Leptonica version:% s \ n ", getLeptonicaVersion ()); if (myOCR-> Init (NULL," rus ")) (fprintf (stderr," Impossible d'initialiser 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 -> Effacer (); myOCR-> End (); pixDestroy (& pix); return 0;)

Nous incluons les fichiers lib :
libtesseract302.lib
liblept168.lib

Compiler - le programme est créé avec succès. Prenons l'image suivante comme exemple :

Nous lançons le programme pour que les informations soient sorties dans un fichier (puisque UTF-8 sera chaotique dans la console):
test> un.txt

Le contenu du fichier est ci-dessous :
Version Tesseract-ocr : 3.02
Version leptonique : leptonique-1.68 (14 mars 2011, 10:47:28)
Sortie OCR :

En substituant cette expression en (63), on voit que le
signal à bande latérale unique modulé
et la profondeur de modulation est a.
7 Enveloppe XO) du signal primaire
il est impossible d'observer sur l'oscilloscope, donc à
Comment ce signal n'est pas à bande étroite, mais dans ce
« Au cas où il n'y aurait pas de « clarté » de l'enveloppe, mais
avec modulation à bande latérale unique, une bande étroite
‘Perte de signal avec la même enveloppe, et le voici
« Et se manifeste explicitement et parfois (comme dans la description
« Luge affaire) confond les esprits des inexpérimentés
et d'autres chercheurs...
6.4. "FORMULE COSTASA"
r y
Avec l'avènement de l'OM dans les manuels, le magazine `
Des articles et des monographies ont débattu de la question de
le gain donné par la transition de l'amplitude
modulation à bande latérale unique. Beaucoup a été dit
opinions contradictoires. Au début des années 60, un-
L'érudit ricain J. Costas a écrit que,
travaillant une abondante littérature de revues sur l'OM, ​​il
trouve dans chaque article sa propre évaluation de l'énergie
"Le gain iical par rapport à l'AM-de deux à,
plusieurs douzaines. En conséquence, il a trouvé
-que les gains indiqués dans chaque article sont
met approximativement (Z-K-Y!) dB, où M est le nombre co- ‘g
›Les auteurs de cet article.
Yo, '11 Si cette blague est inexacte, elle est toujours correcte
'La note reflète l'incohérence qui existait
; dans ces années-là. Outre le fait que différents auteurs ont produit
D a fait des comparaisons dans différentes conditions et dans différentes tailles
Ils ont déterminé le gain d'énergie, ils étaient 1
'' A fait beaucoup d'erreurs différentes. quatre "
Voici des exemples de raisonnement. ",
1. Avec AM conventionnel, en supposant la puissance de la porteuse



Vous avez aimé l'article ? Partagez-le