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/