Comment effectuer une OCR avec Tesseract, OpenCV et Python PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Comment OCR avec Tesseract, OpenCV et Python

Comment OCR avec Tesseract, OpenCV et Python

Dans ce billet de blog, nous allons essayer d'expliquer la technologie derrière le moteur Tesseract le plus utilisé, qui a été mis à niveau avec les dernières connaissances en matière de reconnaissance optique de caractères. Cet article servira également de guide / tutoriel sur la façon d'implémenter l'OCR en python à l'aide du moteur Tesseract. Nous allons parcourir les modules suivants:

  • Fonctionnalités Tesseract OCR
  • Prétraitement pour l'OCR à l'aide d'OpenCV
  • Exécution de Tesseract avec CLI et Python
  • Limitations du moteur Tesseract

Table des matières

Introduction

ROC = Reconnaissance optique de caractères. En d'autres termes, les systèmes OCR transforment une image bidimensionnelle de texte, qui pourrait contenir du texte imprimé par machine ou manuscrit à partir de sa représentation d'image en texte lisible par machine. L'OCR en tant que processus se compose généralement de plusieurs sous-processus à exécuter aussi précisément que possible. Les sous-processus sont :

  • Prétraitement de l'image
  • Localisation de texte
  • Segmentation des caractères
  • Reconnaissance des personnages
  • Poster traitement

Les sous-processus de la liste ci-dessus peuvent bien sûr différer, mais ce sont approximativement des étapes nécessaires pour aborder la reconnaissance automatique des caractères. Dans le logiciel OCR, son objectif principal est d'identifier et de capturer tous les mots uniques en utilisant différentes langues à partir de caractères de texte écrit.

Pendant près de deux décennies, les systèmes de reconnaissance optique de caractères ont été largement utilisés pour fournir une saisie de texte automatisée dans des systèmes informatisés. Pourtant, pendant tout ce temps, les systèmes OCR conventionnels (comme ROC zonale) n'ont jamais surmonté leur incapacité à lire plus qu'une poignée de polices de caractères et de formats de page. Les caractères à espacement proportionnel (qui comprennent pratiquement toutes les copies composées), les polices d'imprimante laser et même de nombreuses polices de machine à écrire non proportionnelles sont restées hors de portée de ces systèmes. Et par conséquent, l'OCR conventionnel n'a jamais eu plus qu'un impact marginal sur le nombre total de documents devant être convertis au format numérique.

Comment OCR avec Tesseract, OpenCV et Python
Processus de reconnaissance optique des caractères (avec la permission)

Les moteurs OCR de nouvelle génération traitent très bien ces problèmes mentionnés ci-dessus en utilisant les dernières recherches dans le domaine de l'apprentissage en profondeur. En tirant parti de la combinaison de modèles profonds et d'énormes ensembles de données accessibles au public, les modèles atteignent des précisions de pointe sur des tâches données. De nos jours, il est également possible de générer des données synthétiques avec différentes polices utilisant des réseaux contradictoires génératifs et quelques autres approches génératives.

La reconnaissance optique des caractères reste un problème difficile lorsque le texte apparaît dans des environnements sans contrainte, comme scènes naturelles, en raison de distorsions géométriques, d'arrière-plans complexes et de polices diverses. La technologie détient toujours un immense potentiel en raison des différents cas d'utilisation de l'OCR basé sur l'apprentissage profond comme


Vous avez un problème d'OCR en tête ? Vous souhaitez réduire les coûts de saisie de données de votre organisation ? Dirigez-vous vers nanonets et créer des modèles OCR pour extraire le texte des images or extraire des données de PDF basé sur l'IA OCR PDF!


Outils OCR open source

Il ya beaucoup de reconnaissance optique de caractères logiciel disponible. Je n'ai trouvé aucune comparaison de qualité entre eux, mais j'écrirai sur certains d'entre eux qui semblent être les plus conviviaux pour les développeurs.

Tesseract - un moteur OCR open source qui a gagné en popularité parmi les développeurs OCR. Même si cela peut parfois être pénible à mettre en œuvre et à modifier, il n'y avait pas trop d'alternatives OCR gratuites et puissantes sur le marché depuis très longtemps. Tesseract a commencé comme doctorant. projet de recherche dans HP Labs, Bristol. Il a gagné en popularité et a été développé par HP entre 1984 et 1994. En 2005, HP a publié Tesseract en tant que logiciel open source. Depuis 2006, il est développé par Google.

Comment OCR avec Tesseract, OpenCV et Python
comparaison des tendances google pour différents outils OCR open source

OCRopus - OCRopus est un système OCR open source permettant une évaluation et une réutilisation aisées des composants OCR par les chercheurs et les entreprises. Une collection de programmes d'analyse de documents, pas un système OCR clé en main. Pour l'appliquer à vos documents, vous devrez peut-être effectuer un prétraitement d'image et éventuellement former de nouveaux modèles. En plus des scripts de reconnaissance eux-mêmes, il existe plusieurs scripts pour l'édition et la correction de la vérité du terrain, la mesure des taux d'erreur, la détermination de matrices de confusion faciles à utiliser et à éditer.


Oculaire - Ocular fonctionne mieux sur les documents imprimés à l'aide d'une presse manuelle, y compris ceux écrits dans plusieurs langues. Il fonctionne en utilisant la ligne de commande. Il s'agit d'un système OCR historique de pointe. Ses principales caractéristiques sont:

  • Apprentissage non supervisé de polices inconnues: ne nécessite que des images de document et un corpus de texte.
  • Capacité à gérer les documents bruyants: encrage irrégulier, espacement, alignement vertical
  • Prise en charge des documents multilingues, y compris ceux dont la commutation de code au niveau des mots est considérable.
  • Apprentissage non supervisé des modèles de variation orthographique, y compris l'orthographe archaïque et la sténographie de l'imprimante.
  • Transcription simultanée et conjointe sous des formes diplomatiques (littérales) et normalisées.


SwiftOCR - Je mentionnerai également le moteur OCR écrit en Swift car il y a un énorme développement en cours pour faire progresser l'utilisation de Swift comme langage de programmation de développement utilisé pour l'apprentissage en profondeur. Check-out blogue pour en savoir plus pourquoi. SwiftOCR est une bibliothèque OCR simple et rapide qui utilise des réseaux de neurones pour la reconnaissance d'images. SwiftOCR affirme que leur moteur surpasse la bibliothèque Tessaract bien connue.

Dans cet article de blog, nous mettrons focus sur Tesseract OCR et découvrez comment il fonctionne et comment il est utilisé.


Tesseract OCR

Tesseract est un moteur de reconnaissance de texte (OCR) open source, disponible sous la licence Apache 2.0. Il peut être utilisé directement ou (pour les programmeurs) en utilisant une API pour extraire le texte imprimé des images. Il prend en charge une grande variété de langues. Tesseract n'a pas d'interface graphique intégrée, mais il en existe plusieurs disponibles sur le Page 3rdParty. Tesseract est compatible avec de nombreux langages de programmation et frameworks grâce à des wrappers qui peuvent être trouvés ici. Il peut être utilisé avec l'analyse de mise en page existante pour reconnaître le texte dans un document volumineux, ou il peut être utilisé en conjonction avec un détecteur de texte externe pour reconnaître le texte d'une image d'une seule ligne de texte.

Comment OCR avec Tesseract, OpenCV et Python
OCR Process Flow pour créer une API avec Tesseract à partir d'un blog récents

Tesseract 4.00 comprend un nouveau sous-système de réseau neuronal configuré comme un identificateur de ligne de texte. Il a ses origines dans LSTM basé sur Python d'OCRopus mais a été repensé pour Tesseract en C ++. Le système de réseau neuronal de Tesseract est antérieur à TensorFlow mais est compatible avec celui-ci, car il existe un langage de description de réseau appelé VGSL (Variable Graph Specification Language), également disponible pour TensorFlow.

Pour reconnaître une image contenant un seul caractère, nous utilisons généralement un réseau neuronal convolutionnel (CNN). Le texte de longueur arbitraire est une séquence de caractères, et de tels problèmes sont résolus en utilisant des RNN et LSTM est une forme populaire de RNN. Lisez cet article pour en savoir plus sur LSTM.


Technologie - Comment ça marche

Les LSTM sont parfaits pour l'apprentissage des séquences mais ralentissent beaucoup lorsque le nombre d'états est trop important. Il y a des résultats empiriques qui suggèrent qu'il vaut mieux demander à un LSTM d'apprendre une longue séquence plutôt qu'une courte séquence de nombreuses classes. Tesseract s'est développé à partir du modèle OCRopus en Python qui était un fork d'un LSMT en C ++, appelé CLSTM. CLSTM est une implémentation du modèle de réseau de neurones récurrent LSTM en C ++, utilisant la bibliothèque Eigen pour les calculs numériques.

Comment OCR avec Tesseract, OpenCV et Python
Processus OCR Tesseract 3 de papier

Legacy Tesseract 3.x dépendait du processus en plusieurs étapes où nous pouvons différencier les étapes:

  • Recherche de mots
  • Recherche de ligne
  • Classification des caractères

La recherche de mots a été effectuée en organisant les lignes de texte en taches, et les lignes et les régions sont analysées pour un texte à hauteur fixe ou proportionnelle. Les lignes de texte sont divisées en mots différemment selon le type d'espacement des caractères. La reconnaissance se déroule ensuite en deux étapes. Lors de la première passe, une tentative est faite pour reconnaître tour à tour chaque mot. Chaque mot satisfaisant est transmis à un classificateur adaptatif en tant que données d'apprentissage. Le classificateur adaptatif obtient alors une chance de reconnaître plus précisément le texte plus bas dans la page.

La modernisation de l'outil Tesseract a été un effort sur le nettoyage du code et l'ajout d'un nouveau modèle LSTM. L'image d'entrée est traitée dans des boîtes (rectangle) ligne par ligne alimentant le modèle LSTM et donnant la sortie. Dans l'image ci-dessous, nous pouvons visualiser comment cela fonctionne.

Comment OCR avec Tesseract, OpenCV et Python
Comment Tesseract utilise le modèle LSTM présentation

Après avoir ajouté un nouvel outil de formation et formé le modèle avec beaucoup de données et de polices, Tesseract obtient de meilleures performances. Pourtant, pas assez bon pour travailler sur du texte manuscrit et des polices étranges. Il est possible d'affiner ou de recycler les couches supérieures pour l'expérimentation.


Installation de Tesseract

L'installation de tesseract sur Windows est facile avec les binaires précompilés trouvés ici. N'oubliez pas de modifier la variable d'environnement «path» et d'ajouter le chemin tesseract. Pour une installation Linux ou Mac, il est installé avec quelques commandes.

Après l'installation, vérifiez que tout fonctionne en tapant la commande dans le terminal ou cmd:

$ tesseract --version

Et vous verrez la sortie similaire à:

tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE

Vous pouvez installer le wrapper python pour tesseract après cela en utilisant pip.
$ pip install pytesseract

La bibliothèque Tesseract est livrée avec un outil en ligne de commande pratique appelé tesseract. Nous pouvons utiliser cet outil pour effectuer l'OCR sur les images et la sortie est stockée dans un fichier texte. Si nous voulons intégrer Tesseract dans notre code C ++ ou Python, nous utiliserons l'API de Tesseract.


Exécution de Tesseract avec CLI

Appelez le moteur Tesseract sur l'image avec chemin_image et convertir l'image en texte, écrit ligne par ligne dans l'invite de commande en tapant ce qui suit:

$ tesseract image_path stdout

Pour écrire le texte de sortie dans un fichier:

$ tesseract image_path text_result.txt

Pour spécifier le nom du modèle de langue, écrivez le raccourci de langue après -l drapeau, par défaut, il prend la langue anglaise:

$ tesseract image_path text_result.txt -l eng

Par défaut, Tesseract attend une page de texte lorsqu'il segmente une image. Si vous cherchez simplement à ROC une petite région, essayez un mode de segmentation différent, en utilisant le –Psm argument. Il y a 14 modes disponibles qui peuvent être trouvés ici. Par défaut, Tesseract automatise entièrement la segmentation des pages mais n'effectue pas d'orientation et de détection de script. Pour spécifier le paramètre, tapez ce qui suit:

$ tesseract image_path text_result.txt -l eng --psm 6

Il y a aussi un argument plus important, le mode moteur OCR (oem). Tesseract 4 dispose de deux moteurs OCR: le moteur Tesseract hérité et le moteur LSTM. Il existe quatre modes de fonctionnement choisis à l'aide de l'option –oem.
0 Moteur hérité uniquement.
1 Moteur LSTM des réseaux neuronaux uniquement.
2 moteurs Legacy + LSTM.
3 Par défaut, en fonction de ce qui est disponible.

Comment OCR avec Tesseract, OpenCV et Python
Résultat du moteur OCR Tesseract

OCR avec Pytesseract et OpenCV

Pytesseract est un wrapper pour Tesseract-OCR Engine. Il est également utile en tant que script d'invocation autonome pour tesseract, car il peut lire tous les types d'images pris en charge par les bibliothèques d'imagerie Pillow et Leptonica, y compris jpeg, png, gif, bmp, tiff et autres. Plus d'informations sur l'approche Python lire ici. Le code de ce didacticiel se trouve dans ce dépôt.

import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Prétraitement pour Tesseract

Pour éviter toutes les manières dont votre précision de sortie tesseract peut chuter, vous devez vous assurer que l'image est appropriée prétraité.

Cela comprend le rééchelonnement, la binarisation, l'élimination du bruit, le redressement, etc.

Pour prétraiter l'image pour OCR, utilisez l'une des fonctions python suivantes ou suivez les Documentation OpenCV.

import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) 

Travaillons avec un exemple pour mieux voir les choses. Voici à quoi ressemble notre image originale -

Comment OCR avec Tesseract, OpenCV et Python
Le système d'écriture Aurebesh

Après le prétraitement avec le code suivant

image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

et en traçant les images résultantes, nous obtenons les résultats suivants.

Comment OCR avec Tesseract, OpenCV et Python
L'image après prétraitement

La sortie de l'image originale ressemble à ceci -

GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED

Voici à quoi ressemble la sortie pour différentes images prétraitées -

Image de bord Canny (pas si bon) -

CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im

Image avec seuil -

GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH

Image d'ouverture -

GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH


Comment contourner le texte

En utilisant Pytesseract, vous pouvez obtenir les informations du cadre de sélection pour vos résultats d'OCR en utilisant les éléments suivants code.

Le script ci-dessous vous donnera des informations sur la boîte englobante pour chaque personnage détecté par tesseract pendant l'OCR.

import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Si vous voulez des cases autour des mots au lieu des caractères, la fonction image_to_data vous sera utile. Vous pouvez utiliser le image_to_data fonction avec le type de sortie spécifié avec pytesseract Output.

Comment OCR avec Tesseract, OpenCV et Python

Vous avez un problème d'OCR en tête? Vous souhaitez numériser des factures, des PDF ou des plaques d'immatriculation? Rendez-vous sur nanonets et construisez des modèles OCR gratuitement!


Nous utiliserons l'exemple de facture ci-dessus pour tester nos sorties tesseract.

import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())

Cela devrait vous donner la sortie suivante -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

En utilisant ce dictionnaire, nous pouvons obtenir chaque mot détecté, leurs informations de cadre englobant, le texte qu'ils contiennent et les scores de confiance pour chacun.

Vous pouvez tracer les cases en utilisant le code ci-dessous -

n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Voici à quoi cela ressemblerait pour l'image d'un exemple de facture.

Comment OCR avec Tesseract, OpenCV et Python


Correspondance de modèle de texte

Prenons l'exemple de la recherche d'une date dans une image. Ici, notre modèle sera un modèle d'expression régulière que nous associerons à nos résultats d'OCR pour trouver les zones de délimitation appropriées. Nous utiliserons le regex module et le image_to_data fonction pour cela.

import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Comme prévu, nous obtenons une case autour de la date de facturation dans l'image.

Comment OCR avec Tesseract, OpenCV et Python

Modes de segmentation de page

Il existe plusieurs façons d'analyser une page de texte. L'API Tesseract propose plusieurs modes de segmentation de page si vous souhaitez exécuter l'OCR uniquement sur une petite région ou dans des orientations différentes, etc.

Voici une liste des modes de segmentation de page pris en charge par tesseract –

0 Orientation et détection de script (OSD) uniquement.
1 Segmentation automatique des pages avec OSD.
2 Segmentation automatique des pages, mais pas d'OSD, ni d'OCR.
3 Segmentation de page entièrement automatique, mais pas d'OSD. (Défaut)
4 Supposons une seule colonne de texte de tailles variables.
5 Supposons un seul bloc uniforme de texte aligné verticalement.
Supposons un seul bloc de texte uniforme.
7 Traitez l'image comme une seule ligne de texte.
8 Traitez l'image comme un seul mot.
9 Traitez l'image comme un seul mot dans un cercle.
10 Traitez l'image comme un seul caractère.
11 Texte fragmenté. Trouvez autant de texte que possible sans ordre particulier.
12 Texte fragmenté avec OSD.
13 Ligne brute. Traitez l'image comme une seule ligne de texte, en contournant les hacks spécifiques à Tesseract.

Pour changer votre mode de segmentation de page, changez le --psm dans votre chaîne de configuration personnalisée à l'un des codes de mode mentionnés ci-dessus.


Détecter l'orientation et le script

Vous pouvez détecter l'orientation du texte dans votre image ainsi que le script dans lequel il est écrit. L'image suivante -
Comment OCR avec Tesseract, OpenCV et Python
après avoir parcouru le code suivant -

osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)

imprimera la sortie suivante.

angle: 90
script: Latin

Détecter uniquement les chiffres

Prenons cette image par exemple -
Comment OCR avec Tesseract, OpenCV et Python
Le texte extrait de cette image ressemble à ceci.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

Vous ne pouvez reconnaître que les chiffres en modifiant la configuration comme suit

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

La sortie ressemblera à ceci.

-- . 43876324
172018
0 76496234

Liste blanche des personnages

Supposons que vous souhaitiez uniquement détecter certains caractères de l'image donnée et ignorer le reste. Vous pouvez spécifier votre liste blanche de caractères (ici, nous avons utilisé tous les caractères minuscules de a à z uniquement) en utilisant la configuration suivante.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

Production -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

Liste noire des personnages

Si vous êtes sûr que certains caractères ou expressions n'apparaîtront certainement pas dans votre texte (l'OCR retournera un texte incorrect à la place des caractères sur liste noire sinon), vous pouvez mettre ces caractères sur liste noire en utilisant la configuration suivante.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Production -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

Détecter dans plusieurs langues

Vous pouvez vérifier les langues disponibles en tapant ceci dans le terminal

$ tesseract --list-langs

Pour télécharger tesseract pour une langue spécifique

$ sudo apt-get install tesseract-ocr-LANG

où LANG est le code à trois lettres de la langue dont vous avez besoin. Vous pouvez trouver les valeurs LANG ici.

Vous pouvez télécharger le .traindata fichier pour la langue dont vous avez besoin ici et placez-le dans $TESSDATA_PREFIX répertoire (cela devrait être le même que celui où le tessdata est installé) et il doit être prêt à l'emploi.

Notes - Seules les langues qui ont un .traineddata le format de fichier est pris en charge par tesseract.

Pour spécifier la langue dans laquelle vous avez besoin de votre sortie OCR, utilisez le -l LANG dans la configuration où LANG est le code à 3 lettres de la langue que vous souhaitez utiliser.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Prenons cette image par exemple -
Comment OCR avec Tesseract, OpenCV et Python
Vous pouvez travailler avec plusieurs langues en modifiant le paramètre LANG en tant que tel -

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

et vous obtiendrez la sortie suivante -

Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Notes - La langue spécifiée en premier -l paramètre est la langue principale.

Malheureusement, tesseract n'a pas de fonction pour détecter automatiquement la langue du texte dans une image. Une autre solution est fournie par un autre module python appelé langdetect qui peut être installé via pip.

$ pip install langdetect

Encore une fois, ce module ne détecte pas la langue du texte à l'aide d'une image mais a besoin d'une entrée de chaîne pour détecter la langue. La meilleure façon de procéder consiste à utiliser d'abord tesseract pour obtenir du texte OCR dans toutes les langues que vous pourriez ressentir, en utilisant langdetect pour rechercher les langues incluses dans le texte OCR, puis réexécutez l'OCR avec les langues trouvées.

Disons que nous avons un texte que nous pensions être en anglais et en portugais.

custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)

Cela devrait produire une liste de langues dans le texte et leurs probabilités.

[en:0.714282468983554, es:0.2857145605644145]

Les codes de langue utilisés par langdetect suivre les codes ISO 639-1. Pour comparer, veuillez cocher this ainsi que this. Nous constatons que la langue utilisée dans le texte est à la place l'anglais et l'espagnol.

Nous récupérons le texte en changeant la configuration en

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

Notes – Tesseract fonctionne mal lorsque, dans une image avec plusieurs langues, les langues spécifiées dans la configuration sont erronées ou ne sont pas mentionnées du tout. Cela peut également induire en erreur le module langdetect.


Utilisation de tessdata_fast

Si la vitesse est une préoccupation majeure pour vous, vous pouvez remplacer vos modèles de langage tessdata par des modèles tessdata_fast qui sont des versions entières 8 bits des modèles tessdata.

Selon le tessdata_fast github -

Ce référentiel contient des versions entières rapides de modèles formés pour le Moteur OCR Open Source Tesseract.

Ces modèles ne fonctionnent qu'avec le moteur OCR LSTM de Tesseract 4.

  • Il s'agit d'un compromis vitesse/précision quant à ce qui offrait le meilleur "rapport qualité-prix" en termes de vitesse par rapport à la précision.
  • Pour certaines langues, c'est encore mieux, mais pour la plupart non.
  • La configuration réseau "meilleur rapport qualité-prix" a ensuite été entierisée pour plus de rapidité.
  • La plupart des utilisateurs voudront utiliser ces fichiers traineddata pour effectuer l'OCR et ceux-ci seront livrés dans le cadre des distributions Linux, par exemple. Ubuntu 18.04.
  • Un réglage fin / une formation incrémentielle ne pas être possible à partir de ces fast modèles, car ils sont des nombres entiers de 8 bits.
  • Lorsque vous utilisez les modèles dans ce référentiel, seul le nouveau moteur OCR basé sur LSTM est pris en charge. L'héritage tesseract Le moteur n'est pas pris en charge avec ces fichiers, donc les modes OEM '0' et '2' de Tesseract ne fonctionneront pas avec eux.

Utiliser tessdata_fast modèles au lieu de tessdata, il vous suffit de télécharger votre tessdata_fast fichier de données de langue de ici et placez-le à l'intérieur de votre $TESSDATA_PREFIX répertoire.


Besoin de numériser des documents, des reçus ou des factures mais trop paresseux pour coder? Rendez-vous sur nanonets et construisez des modèles OCR gratuitement!


Formation Tesseract sur les données personnalisées

Tesseract 4.00 comprend un nouveau moteur de reconnaissance basé sur un réseau de neurones qui offre une précision considérablement plus élevée sur les images de documents. Les réseaux de neurones nécessitent beaucoup plus de données d'entraînement et s'entraînent beaucoup plus lentement que le Tesseract de base. Pour les langues à base latine, les données de modèle existantes fournies ont été formées sur environ 400000 4500 lignes de texte couvrant environ XNUMX XNUMX polices.

Pour exécuter avec succès le didacticiel de formation LSTM Tesseract 4.0, vous devez disposer d'une installation fonctionnelle des outils de formation Tesseract 4 et Tesseract 4 et également disposer des scripts de formation et des fichiers de données formés requis dans certains répertoires. Visite dépôt github pour les fichiers et les outils.

Tesseract 4.00 prend de quelques jours à quelques semaines pour s'entraîner à partir de zéro. Même avec toutes ces nouvelles données d'entraînement, voici donc quelques options d'entraînement:

  • Affiner - En commençant par une langue déjà formée, entraînez-vous sur vos données supplémentaires spécifiques. Par exemple, une formation sur un ensemble de données manuscrites et des polices supplémentaires.
  • Coupez la couche supérieure – du réseau et recycler une nouvelle couche supérieure en utilisant les nouvelles données. Si le réglage fin ne fonctionne pas, il s'agit probablement de la meilleure option suivante. L'analogie pourquoi est-ce utile, prenez pour une instance des modèles formés sur l'ensemble de données ImageNet. L'objectif est de construire un classificateur de chat ou de chien, les couches inférieures du modèle sont bonnes pour l'abstraction de bas niveau comme les coins, les lignes horizontales et verticales, mais les couches supérieures du modèle combinent ces caractéristiques et détectent les oreilles, les yeux, le nez du chat ou du chien etc. En réentraînant uniquement les couches supérieures, vous utilisez les connaissances des couches inférieures et les combinez avec votre nouvel ensemble de données différent.
  • Se recycler à partir de zéro - Il s'agit d'une approche très lente, sauf si vous disposez d'un ensemble de formation très représentatif et suffisamment large pour votre problème. La meilleure ressource pour la formation à partir de zéro est de suivre ceci dépôt github.

Un guide sur la façon de vous entraîner sur vos données personnalisées et de créer .traineddata les fichiers peuvent être trouvés ici, ici ainsi que ici.

Nous ne couvrirons pas le code de formation à l'utilisation de Tesseract dans cet article de blog.

Comment OCR avec Tesseract, OpenCV et Python

Limitations de Tesseract

Tesseract fonctionne mieux lorsqu'il existe une segmentation nette du texte de premier plan par rapport à l'arrière-plan. En pratique, il peut être extrêmement difficile de garantir ces types de configuration. Il y a plusieurs raisons pour lesquelles vous ne pouvez pas obtenir une sortie de bonne qualité de Tesseract comme si l'image a du bruit en arrière-plan. Meilleure est la qualité de l'image (taille, contraste, foudre) meilleur est le résultat de la reconnaissance. Cela nécessite un peu de prétraitement pour améliorer les résultats de l'OCR, les images doivent être mises à l'échelle de manière appropriée, avoir autant de contraste d'image que possible et le texte doit être aligné horizontalement. Tesseract OCR est assez puissant mais présente les limitations suivantes.

Limitations de Tesseract résumées dans la liste.

  • L'OCR n'est pas aussi précis que certaines solutions commerciales à notre disposition.
  • Ne convient pas aux images affectées par des artefacts, notamment une occlusion partielle, une perspective déformée et un arrière-plan complexe.
  • Il n'est pas capable de reconnaître l'écriture manuscrite.
  • Il peut trouver du charabia et le signaler comme sortie OCR.
  • Si un document contient des langues autres que celles indiquées dans les arguments -l LANG, les résultats peuvent être médiocres.
  • Il n'est pas toujours bon d'analyser l'ordre de lecture naturel des documents. Par exemple, il peut ne pas reconnaître qu'un document contient deux colonnes et peut essayer de joindre du texte sur plusieurs colonnes.
  • Des numérisations de mauvaise qualité peuvent produire une OCR de mauvaise qualité.
  • Il n'expose pas d'informations sur l'appartenance du texte de la famille de polices.


Il existe bien sûr un meilleur moyen, beaucoup plus simple et plus intuitif, d'effectuer des tâches d'OCR.


OCR avec Nanonets

Comment OCR avec Tesseract, OpenCV et Python

Les API OCR Nanonets vous permet de créer facilement des modèles OCR. Vous n'avez pas à vous soucier du prétraitement de vos images ni à vous soucier de la correspondance des modèles ou de créer des moteurs basés sur des règles pour augmenter la précision de votre modèle OCR.

Vous pouvez télécharger vos données, les annoter, configurer le modèle pour qu'il s'entraîne et attendre d'obtenir des prédictions via une interface utilisateur basée sur un navigateur sans écrire une seule ligne de code, sans vous soucier des GPU ou trouver les bonnes architectures pour vos modèles d'apprentissage en profondeur. Vous pouvez également acquérir les réponses JSON de chaque prédiction pour l'intégrer à vos propres systèmes et créer des applications basées sur l'apprentissage automatique basées sur des algorithmes de pointe et une infrastructure solide.

Utilisation de l'interface graphique: https://app.nanonets.com/

Vous pouvez également utiliser l'API Nanonets-OCR en suivant les étapes ci-dessous: ‌

Étape 1: cloner le référentiel, installer les dépendances

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

Étape 2: Obtenez votre clé API gratuite
Obtenez votre clé API gratuite sur http://app.nanonets.com/#/keys

Comment OCR avec Tesseract, OpenCV et Python

Étape 3: définir la clé API comme variable d'environnement

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Étape 4: créer un nouveau modèle

python ./code/create-model.py

Remarque: Cela génère un MODEL_ID dont vous avez besoin pour l'étape suivante

Étape 5: ajouter l'ID de modèle en tant que variable d'environnement

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Remarque: vous obtiendrez YOUR_MODEL_ID de l'étape précédente

Étape 6: télécharger les données de formation
Les données de formation se trouvent dans images (fichiers image) et annotations (annotations pour les fichiers image)

python ./code/upload-training.py

Étape 7: modèle de train
Une fois les images téléchargées, commencez à former le modèle

python ./code/train-model.py

Étape 8: obtenir l'état du modèle
Le modèle prend environ 2 heures pour s'entraîner. Vous recevrez un e-mail une fois le modèle formé. En attendant, vous vérifiez l'état du modèle

python ./code/model-state.py

Étape 9: Faire une prédiction
Une fois le modèle formé. Vous pouvez faire des prédictions en utilisant le modèle

python ./code/prediction.py ./images/151.jpg


Nanonets et humains dans la boucle

‌‌L'écran "Modéré" facilite les processus de correction et de saisie et réduit la charge de travail du réviseur manuel de près de 90 % et réduit les coûts de 50 % pour l'organisation.

Comment OCR avec Tesseract, OpenCV et Python

Les caractéristiques comprennent

  1. Suivre les prédictions qui sont correctes
  2. Identifiez les erreurs
  3. Corrigez les inexactes
  4. Supprimez ceux qui sont faux
  5. Remplissez les prédictions manquantes
  6. Filtrer les images avec des plages de dates
  7. Obtenez le nombre d'images modérées par rapport à celles non modérées

Tous les champs sont structurés en une interface graphique facile à utiliser qui permet à l'utilisateur de tirer parti de la technologie OCR et de l'aider à l'améliorer au fur et à mesure, sans avoir à taper de code ou à comprendre le fonctionnement de la technologie.


Vous avez un problème d'OCR en tête ? Vous souhaitez réduire les coûts de saisie de données de votre organisation ? Dirigez-vous vers nanonets et créer des modèles OCR pour extraire le texte des images or extraire des données de PDF!


Conclusion

Tout comme l'apprentissage en profondeur a eu un impact sur presque toutes les facettes de la vision par ordinateur, il en va de même pour la reconnaissance des caractères et la reconnaissance de l'écriture manuscrite. Les modèles basés sur l'apprentissage en profondeur ont réussi à obtenir une précision de reconnaissance de texte sans précédent, bien au-delà des méthodes traditionnelles. extraction d'informations ainsi que traitement d'images par apprentissage automatique approches.

Tesseract fonctionne bien lorsque les images de document suivent les directives suivantes:

  • Nettoyer la segmentation du texte de premier plan de l'arrière-plan
  • Aligné horizontalement et mis à l'échelle de manière appropriée
  • Image de haute qualité sans flou ni bruit

La dernière version de Tesseract 4.0 prend en charge l'OCR basé sur l'apprentissage en profondeur qui est nettement plus précis. Le moteur OCR lui-même est construit sur un réseau de mémoire à court terme à long terme (LSTM), une sorte de réseau neuronal récurrent (RNN).

Tesseract est parfait pour numériser des documents propres et est livré avec une précision et une variabilité de police assez élevées car sa formation était complète. Je dirais que Tesseract est un outil incontournable si votre tâche consiste à numériser des livres, des documents et du texte imprimé sur un fond blanc propre.


Lectures complémentaires

Mettre à jour:
Beaucoup de gens nous ont demandé comment ils pouvaient obtenir la date sous forme de texte ou utiliser quand il détectait la date ou toute autre donnée spécifique afin qu'ils puissent l'ajouter à la liste.
Voici la réponse:
Dans le code pour dessiner une zone de délimitation autour de la zone de date, vous remarquerez une ligne qui correspond au modèle de regex avec d['text']. Il ne dessine une boîte que si le motif correspond. Vous pouvez simplement extraire les valeurs de d['text'] une fois que le motif correspond et ajoutez-les à une liste.

Mise à jour 2:
Pour répondre aux questions concernant l'OCR non anglaise, nous avons mis à jour d'autres listes de lectures.

Horodatage:

Plus de AI et apprentissage automatique