Logo Peef

×
À propos de Peef Conditions d'utilisation Voir toutes les communautés Envoyez-nous un feedback sur Twitter
S'inscrire Se connecter

Comment met-on en place un OCR sur une image ?

nasser 30/08/2022 (22:18) GMT

Nous développons des applications de plus en plus complexes qui notamment doivent traiter des données venues de sources extérieures comme des images. Un exemple précis pour éclaircir ce cas est une application qui permet à l’utilisateur de charger une image comme celle d’une facture et d’en extraire les données de ladite image à savoir le nom du produit, sa quantité et son prix. C'est pourquoi je vous propose dans cet article une méthode qui permet d’extraire les données dans une image par OCR avec Python.


Un OCR (Optical Character Recognition) est une méthode qui permet d’extraire les données dans une image. Pour ce faire, on peut utiliser des outils tels que Tesseract.

Tesseract est un outil qui contient un OCR Engine, libtesseract et un programme de ligne de commande, tesseract. Pour l’installer, il faut d’abord tapez la commande

sudo apt install tesseract-ocr  # si vous êtes sur Linux

Puis installer pytessaract

pip install pytesseract

Installation faites, vous pouvez maintenant passer une image et récupérer tout son contenu dans un texte.

 
>>> from PIL import Image
>>> import pytesseract
>>> print(pytesseract.image_to_string(Image.open('photo1661431181.jpeg')))

Avec ce bout de code, Tesseract va reconnaitre les textes et va les afficher intégralement.

Considérons maintenant que vous vouliez récupérer un contenu précis et l’enregistrer dans la BD

Il faut pour celà utiliser la méthode pytesseract.image_to_data() tout en précisant le type de données en sortie. Dans notre cas nous allons choisir un dictionnaire

 
>>> from PIL import Image # pour permettre de charger l'image
>>> import pytesseract
>>> from pytesseract import Output
>>> results = pytesseract.image_to_data(Image.open('photo1661431181.jpeg'), output_type=Output.DICT)

Si vous n’utilisez pas l’argument output_type, vous obtiendrez le résultat suivant qui n’est pas du tout digeste.

 
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	960	1280	-1	
2	1	1	0	0	0	135	146	295	14	-1	
3	1	1	1	0	0	135	146	295	14	-1	
4	1	1	1	1	0	135	146	295	14	-1	
5	1	1	1	1	1	126	137	66	28	85	YourCompany

Bien sûr, vous pouvez l’insérer dans un fichier csv pour exploitation plus tard.

En obtenant un dictionnaire en sortie, vous pouvez vous amuser avec les results.keys(), results.items(), etc… pour organiser vos données et surtout récupérer celles dont vous avez besoins. 

 
>>> results.keys()
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

À partir de ce résultat, on comprend très bien que nos données sont placées dans une matrice dont la première ligne décrit chaque donnée avec notamment:

text: pour le mot reconnu dans le document

conf: le pourcentage représentant le niveau de confiance pour que le mot soit correctement reconnu. Dans notre résultat, le mot YourCompany a un niveau de confiance de 85%

level: nous situe sur la nature du contenu de la ligne

1- une page

2- un bloc

3- un paragrahe

4- une ligne

5- un mot

Dans notre exemple, le résultat YourCompany a pour level 5, c’est donc un mot.

page_num est la page sur laquelle le mot a été trouvé. Dans notre cas c'est 1, c’est-à-dire une seule page

block_num indique le bloc de mise en page détecté dans la page actuelle. Par exemple un bloc peut contenir une adresse

par_num indique le numéro de paragraphe dans le bloc de mise en page

line_num indique le numéro de ligne dans le paragraphe.

word_num indique le numéro du mot dans la ligne

left, top, width, height représentent les coordonnées du contenu (text)

Si nous voulons alors cibler un contenu précis comme les mots dont le niveau de confiance est supérieur à 80 on peut juste écrire ceci:

 
n_boxes = len(results['text'])
for i in range(n_boxes):
    if int(results['level'][i]) == 5 and int(results['conf'][i]) > 80:
        (x, y, w, h) = (results['left'][i], results['top'][i], results['width'][i], results['height'][i])
        print(results['text'][i])
        # Utiliser la librairie OpenCV pour encadrer les mots ou récupérer ces mots et les mettre en BD

Pour en savoir plus sur l'OCR, je vous invite à consulter la page de pytesseract sur https://pypi.org/project/pytesseract/ et aussi consulter la documentation de tesseract elle même sur https://tesseract-ocr.github.io/


Veuillez-vous connecter pour poster un commentaire

À propos de la communauté

caparledev

Communauté de développeurs qui partagent leurs expériences et leurs découvertes


Créé le 18/10/2020