Comment utiliser la reconnaissance optique de caractères avec trois bibliothèques
OCR signifie Reconnaissance Optique de Caractères. Il s’agit d’une technologie qui convertit les documents numérisés et les images en texte modifiable et consultable. L’OCR peut être utilisé pour extraire du texte d’images, de fichiers PDF et d’autres documents, et il peut être utile dans divers scénarios. Ce guide présentera trois bibliothèques Python (EasyOCR, pytesseract et ocrmac) et vous donnera un exemple minimum et ce à quoi vous pouvez vous attendre. Pour référence, le système de test que j’utilise est un mac Apple M1 avec Python exécuté dans conda.
Un cas test
De nombreux cas d’utilisation d’OCR traitent d’images du monde réel, telles que la lecture de panneaux de signalisation. C’est souvent très difficile car il faut faire face à des distorsions et à un éclairage inégal. Par souci de démonstration, nous simplifions les choses et prenons une capture d’écran de la page d’accueil de Wikipedia. Cela a l’avantage de montrer plusieurs langues et de donner une idée de la performance dans les langues avec des caractères différents.
Comme le nom le suggère, EasyOCR est un outil OCR prêt à l’emploi. Il a plus de 80 langues prises en charge et son utilisation est particulièrement facile. Il est basé sur l’apprentissage en profondeur et peut être accéléré par GPU avec CUDA. Pas encore sur Mac, malheureusement. L’installation se fait avec pip install easyocr
. Il est basé sur l’apprentissage en profondeur et nous pouvons même former ou personnaliser des modèles. Pour l’utiliser avec les modèles existants, nous initialisons le Reader
classe avec la langue de notre choix et utiliser le readtext
méthode sur notre image.
import easyocr
reader = easyocr.Reader(['en'])
result = reader.readtext('wikipedia_test.png')
La sortie est une zone de délimitation, du texte et une confiance. Voici à quoi cela ressemble :
[([[207, 21], [377, 21], [377, 57], [207, 57]],
'WIKIPEDIA',
0.9981687424632799),
([[214, 59], [372, 59], [372, 85], [214, 85]],
'The Free Encyclopedia',
0.8303901464668506),
([[128, 106], [192, 106], [192, 130], [128, 130]],
'English',
0.9999840948818256),
...
Avec une certaine matplotlibnous pouvons visualiser les résultats :
import matplotlib.pyplot as plt im = plt.imread('wikipedia_test.png')
fig = plt.figure(figsize=(15,15))
plt.imshow(im)
for _ in result:
x = [n[0] for n in _[0]]
y = [n[1] for n in _[0]]
plt.fill(x,y, facecolor='none', edgecolor='red')
plt.text(x[0],y[0], _[1], color='red', fontsize=15)
plt.axis('off')
plt.savefig('output_easyocr.png')
plt.show()
En termes de vitesse, l’exécution ci-dessus de readtext
prend 1,24 s ± 22,7 ms par boucle pour une image 570×571, on est donc loin du temps réel. A noter que l’on tourne sur CPU et GPU avec CUDA qui est sensé être bien plus rapide.
Notez que pour les caractères latins, les choses fonctionnent assez bien, mais l’OCR a des problèmes pour détecter les caractères spéciaux, comme dans Français
, Português
ou alors Español
. En chargeant un modèle de langage différent, nous pouvons personnaliser la détection, par exemple, Russian
reader = easyocr.Reader([‘ru’])
et nous allons maintenant détecter précisément la partie russe :
([[70, 172], [141, 172], [141, 193], [70, 193]], ‘Русский’, 0.9999923853785443),
La langue doit être fournie dans ISO 639 format, et tous les modèles de langue ne peuvent pas être combinés, par exemple, le chinois simplifié ne fonctionne qu’avec l’anglais.
Un autre outil que nous pouvons utiliser est le bien établi Tesseract. Au moment de la rédaction, il compte plus de 48 000 étoiles sur GitHub. Ses origines remontent à 1985 chez Hewlett-Packard et ont ensuite été développées par Google. La version stable actuelle est la 5, et depuis la version 4, un moteur OCR basé sur LSTM a été ajouté. Pour l’utiliser avec Python, nous utiliserons le wrapper python pytesseract.
Pour que les choses fonctionnent, vous devrez commencer par installer Tesseract. Pour Ubuntu, cela signifie sudo apt install tesseract-ocr
et pour Mac, vous pouvez utiliser homebrew et exécuter brew install tesseract
et pour Windows, vous pouvez utiliser un Installateur. Pour des instructions d’installation plus détaillées, cliquez sur ici.
Ensuite, installez pytesseract dans votre environnement Python, qui fonctionne avec pip install pytesseract
.
Vous pouvez ensuite faire de l’OCR sur une image comme ceci :
from PIL import Image
import pytesseractresult = pytesseract.pytesseract.image_to_data(Image.open('wikipedia_test.png'))
Ce qui donne une chaîne délimitée par des tabulations :
level page_num block_num par_num line_num word_num left top width height conf text
1 1 0 0 0 0 0 0 571 570 -1
2 1 1 0 0 0 208 25 168 25 -1
3 1 1 1 0 0 208 25 168 25 -1
4 1 1 1 1 0 208 25 168 25 -1
5 1 1 1 1 1 208 25 168 25 75.300156 WIKIPEDIA
2 1 2 0 0 0 216 65 151 16 -1
3 1 2 1 0 0 216 65 151 16 -1
4 1 2 1 1 0 216 65 151 16 -1
5 1 2 1 1 1 216 65 26 12 89.134109 ‘The
5 1 2 1 1 2 246 66 29 11 93.340363 Free
5 1 2 1 1 3 279 65 88 16 96.194649 Encyclopedia
[...]
A noter que nous avons utilisé image_to_data
. Cette option détaillée comprend les cases, les confidences, les numéros de ligne et de page. Ici, des options supplémentaires, telles que image_to_string
exister.
Encore une fois, avec certains Matplotlib, nous pouvons visualiser les résultats. Comme la chaîne délimitée par des tabulations est un peu lourde, je l’ai transformée en une trame de données Pandas.
import matplotlib.pyplot as plt im = plt.imread('wikipedia_test.png')
print(im.shape)
fig = plt.figure(figsize=(15,15))
plt.imshow(im)
for i in range(len(result_df)):
row = result_df.iloc[i]
if row['conf'] > 0:
x = [row['left'], row['left']+row['width'], row['left']+row['width'], row['left'], row['left']]
y = [row['top'], row['top'], row['top']+row['height'], row['top']+row['height'], row['top']]
plt.fill(x,y, facecolor='none', edgecolor='red')
plt.text(x[0],y[0], row['text'], color='red', fontsize=15)
plt.axis('off')
plt.savefig('output_pytesseract.png')
plt.show()po
L’examen visuel des résultats montre les limites. Les caractères spéciaux sont bâclés : Français
devient Frangais
et Español
devient Espafiol
. De plus, les mots plus longs présentent des limites : Wikipédia est découpé en wil
etdia
.
En termes de vitesse, l’exécution ci-dessus de image_to_data
est beaucoup plus rapide et ne prend que 284 ms ± 18,5 ms par boucle, ce serait donc un compromis clair entre temps et précision.
un petit garçon
Enfin, je veux parler de un petit garçon. C’est un emballage que j’ai écrit moi-même. Lors du test des outils ci-dessus, je n’ai pas particulièrement apprécié qu’EasyOCR en ait pris beaucoup car il me manquait l’accélération GPU sur mon Mac. Pour tesseract, je n’étais pas satisfait des résultats.
Cependant, j’étais curieux : ces jours-ci, si vous cliquez quelque part dans une image sur un système Mac, vous verrez que vous pouvez copier et sélectionner le texte des images. Apple fait donc de l’OCR ici, et cette fonctionnalité OCR intégrée est en fait assez bonne.
Après quelques recherches, j’ai découvert que Vision Framework d’Apple fournit des fonctionnalités pour cela : VNRecognizeTextRequest
. Malheureusement, c’est dans Swift, mais heureusement, un wrapper Python existe, nommépyobjc-framework-Vision
. ocrmac
utilise ce wrapper et fournit une interface facile à utiliser pour l’OCR.
Comme EasyOCR et pytesseeract, il est installable via pip (pip install ocrmac
) et l’utilisation de base est la suivante :
from ocrmac import ocrmac
annotations = ocrmac.OCR('wikipedia_test.png').recognize()
print(annotations)
Cela produit une liste en sortie avec le texte, la confiance et la boîte englobante, comme ceci :
[('WIKIPEDIA', 0.5, [0.3629201253255208, 0.910361484707338, 0.30281183454725474, 0.04670013973642184]),
('The Free Encyclopedia', 1.0, [0.3776041682700163, 0.8577661432809773, 0.2743055539522059, 0.031413612390924994]),
('English', 1.0, [0.22883804639180502, 0.7780029137097104, 0.10055181715223524, 0.029768685811893292]),
('6 585 000+ articles', 1.0, [0.17447916668216765, 0.7425828970518573, 0.2135416664775546, 0.022687609056345148]),
('845', 0.30000001192092896, [0.7050324016147189, 0.7806914830499087, 0.08343235651652026, 0.02685377776726794]),
('1 354 000+ 523', 0.5, [0.6571180555555556, 0.7425828970543127, 0.17361111093750003, 0.02268760905388978]),
[...]
Il existe également des fonctions utilitaires pour utiliser directement les images PIL et les annoter en tant qu’images PIL ou matplotlib. Voici un exemple :
ocrmac.OCR('wikipedia_test.png',recognition_level='accurate').annotate_PIL()
Notez que pour les caractères latins, les choses fonctionnent assez bien, et il n’a aucun problème à détecter Français
, Português
ou alors Español
. Русский
est mal interprété comme PyccKMü
, et les langues arabe et asiatique ne fonctionnent pas du tout. Mais dans l’ensemble, je pense que cela donne des résultats assez convaincants, comme on aurait pu s’y attendre pour l’intégration OCR native dans Mac.
En termes de vitesse, l’exécution ci-dessus prend 95,8 ms ± 1,97 ms par boucle, c’est donc la plus rapide de cette comparaison. Dans les paramètres par défaut, ocrmac utilise un accurate
— mode. Il y a aussi fast
mode, donc vous pourriez en principe, aller plus vite. Cependant, j’ai trouvé l’augmentation de la vitesse (~ 20% ne vaut pas la perte de précision).
L’inconvénient d’ocrmac est qu’il ne fonctionne que sur les systèmes Mac. N’hésitez pas à le consulter sur GitHub et si vous le trouvez utile, laissez une étoile pour booster sa visibilité. Le dépôt contient également un carnet avec tout le code utilisé ici.
Nous avons présenté trois outils qui vous permettent de faire de l’OCR sur des images. À mon avis, il est très simple de faire un OCR efficace de nos jours, et on peut obtenir des résultats très utilisables avec seulement quelques lignes de code. Je vois beaucoup d’applications pratiques où cela peut être utilisé. Quel serait votre cas d’utilisation préféré ?
Personnellement, j’aime l’OCR car je le considère comme une technologie de transition très importante pour les applications d’IA. Supposons que vous souhaitiez créer un agent IA qui effectue une tâche pour vous. Que diriez-vous d’un bot qui joue le Jeu wikic’est-à-dire commencer sur une page au hasard et atteindre une page de fin souhaitée en cliquant sur des liens dans l’article.
Vous utiliseriez probablement le HTML directement et utiliseriez des outils comme Sélénium pour automatiser cela. Vous pouvez faire la même chose pour n’importe quelle application si vous pouvez lire la mémoire et en extraire des valeurs. Cependant, c’est là que les choses pourraient devenir plus complexes. Un OCR puissant pourrait découpler cela : nous pourrions travailler sur la sortie de l’écran et n’utiliser que ce qu’un humain verrait. En fin de compte, cela pourrait nous permettre de construire des agents d’IA qui remplacent réellement l’humain assis devant l’écran.