PyTesseract: Simple Reconnaissance optique de caractères Python

Introduction

Les humains peuvent comprendre le contenu d’une image simplement en regardant. Nous percevons le texte sur l’image comme du texte et pouvons le lire.

Les ordinateurs ne fonctionnent pas de la même manière. Ils ont besoin de quelque chose de plus concret, organisé d’une manière qu’ils peuvent comprendre.

C’est là que la Reconnaissance optique de caractères (OCR) entre en jeu. Qu’il s’agisse de la reconnaissance des plaques de voiture à partir d’un appareil photo ou de documents écrits à la main qui doivent être convertis en copie numérique, cette technique est très utile. Bien que ce ne soit pas toujours parfait, il est très pratique et facilite et accélère considérablement la tâche de certaines personnes.

Dans cet article, nous allons approfondir la Reconnaissance Optique de caractères et ses domaines d’application. Nous allons également créer un script simple en Python qui nous aidera à détecter les caractères des images et à les exposer via une application Flask pour un support d’interaction plus pratique.

Qu’est-ce que la Reconnaissance optique de caractères ?

La reconnaissance optique de caractères implique la détection du contenu textuel sur les images et la traduction des images en texte codé que l’ordinateur peut facilement comprendre. Une image contenant du texte est numérisée et analysée afin d’en identifier les caractères. Lors de l’identification, le caractère est converti en texte codé par machine.

Comment est-ce vraiment réalisé? Pour nous, le texte sur une image est facilement discernable et nous sommes capables de détecter des caractères et de lire le texte, mais pour un ordinateur, tout cela est une série de points.

L’image est d’abord numérisée et le texte et les éléments graphiques sont convertis en un bitmap, qui est essentiellement une matrice de points noirs et blancs. L’image est ensuite prétraitée où la luminosité et le contraste sont ajustés pour améliorer la précision du processus.

L’image est maintenant divisée en zones identifiant les zones d’intérêt telles que l’emplacement des images ou du texte, ce qui permet de lancer le processus d’extraction. Les zones contenant du texte peuvent maintenant être décomposées en lignes, mots et caractères et le logiciel est désormais capable de faire correspondre les caractères grâce à la comparaison et à divers algorithmes de détection. Le résultat final est le texte dans l’image qu’on nous donne.

Le processus peut ne pas être précis à 100% et nécessiter une intervention humaine pour corriger certains éléments qui n’ont pas été scannés correctement. La correction d’erreur peut également être obtenue à l’aide d’un dictionnaire ou même d’un Traitement du langage naturel (PNL).

La sortie peut désormais être convertie en d’autres supports tels que des documents Word, des PDF ou même du contenu audio via des technologies de synthèse vocale.

Utilisations de l’OCR

Auparavant, la numérisation des documents était réalisée en tapant manuellement le texte sur l’ordinateur. Grâce à l’OCR, ce processus est facilité car le document peut être numérisé, traité et le texte extrait et stocké sous une forme modifiable telle qu’un document Word.

Si vous avez un scanner de documents sur votre téléphone, tel qu’Adobe Scan, vous avez probablement rencontré la technologie OCR utilisée.

Les aéroports peuvent également utiliser la ROC pour automatiser le processus de reconnaissance des passeports et d’extraction d’informations à partir de ceux-ci.

Les autres utilisations de l’OCR comprennent l’automatisation des processus de saisie des données, la détection et la reconnaissance des plaques d’immatriculation des voitures.

Ce que nous utiliserons

Pour ce projet OCR, nous utiliserons la bibliothèque Python-Tesseract, ou simplement PyTesseract, qui est un wrapper pour le moteur Tesseract-OCR de Google.

J’ai choisi ceci car il est entièrement open-source et développé et maintenu par le géant qu’est Google. Suivez ces instructions pour installer Tesseract sur votre machine, car PyTesseract en dépend.

Nous utiliserons également le framework web Flask pour créer notre serveur OCR simple où nous pourrons prendre des photos via la webcam ou télécharger des photos à des fins de reconnaissance de caractères.

Nous allons également utiliser Pipenv car il gère également la configuration de l’environnement virtuel et la gestion des exigences.

En plus de ceux-ci, nous utiliserons également la bibliothèque Pillow qui est un fork de la Bibliothèque d’imagerie Python (PIL) pour gérer l’ouverture et la manipulation d’images dans de nombreux formats en Python.

Dans cet article, nous allons nous concentrer sur PyTesseract bien qu’il existe d’autres bibliothèques Python qui peuvent vous aider à extraire du texte à partir d’images telles que:

  • Textract: qui peut extraire des données à partir de PDF mais est un paquet lourd.
  • Pyocr : offre plus d’options de détection telles que des phrases, des chiffres ou des mots.

Setup

Commencez par installer Pipenv en utilisant la commande suivante via Pip (Au cas où vous auriez besoin de le configurer, reportez-vous à ceci).

$ pip install pipenv

Créez le répertoire du projet et lancez le projet en exécutant la commande suivante:

$ mkdir ocr_server && cd ocr_server && pipenv install --three

Nous pouvons maintenant activer notre environnement virtuel et commencer à installer nos dépendances:

$ pipenv shell$ pipenv install pytesseract Pillow 

Si vous n’utilisez pas Pipenv, vous pouvez toujours utiliser l’approche Pip et Environnement virtuel. Suivez la documentation officielle pour vous aider à démarrer avec Pip et l’environnement virtuel :

Remarque: Dans ce cas, au lieu de pipenv install Pillow, la commande sera pip install Pillow.

Implémentation

Nous allons mettre en œuvre ce projet en 2 phases. Dans le premier, nous allons créer le script, et dans le suivant, nous allons créer une application Flask pour agir comme une interface.

Script OCR

Une fois la configuration terminée, nous pouvons maintenant créer une fonction simple qui prend une image et renvoie le texte détecté dans l’image – ce sera le cœur de notre projet:

try: from PIL import Imageexcept ImportError: import Imageimport pytesseractdef ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return textprint(ocr_core('images/ocr_example_1.png'))

La fonction est assez simple, dans les 5 premières lignes, nous importons Image à partir du Pillowbibliothèque et notre PyTesseractbibliothèque.

Nous créons ensuite et ocr_corefonction qui prend un nom de fichier et renvoie le texte contenu dans l’image.

Voyons comment le script se comporte avec une image simple contenant du texte:

Et lors de l’exécution du morceau de code, nous sommes accueillis avec ceci:

Notre script OCR simple fonctionne! Évidemment, c’était un peu facile car il s’agit d’un texte numérique, parfait et précis, contrairement à l’écriture manuscrite. Il y a beaucoup plus que nous pouvons faire avec la bibliothèque PyTesseract, mais plus à ce sujet plus tard dans le post.

Intégrons d’abord ce script dans une application Flask, pour faciliter le téléchargement d’images et les opérations de reconnaissance de caractères.

Interface Web Flask

Notre script peut être utilisé via la ligne de commande, mais une application Flask le rendrait plus convivial et polyvalent. Par exemple, nous pouvons télécharger des photos via le site Web et obtenir le texte extrait affiché sur le site Web ou nous pouvons capturer des photos via la caméra Web et effectuer une reconnaissance de caractères sur celles-ci.

Si vous n’êtes pas familier avec le framework Flask, c’est un bon tutoriel pour vous mettre au courant.

Commençons par installer le package Flask :

$ pipenv install Flask

Maintenant, définissons un itinéraire de base:

from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()

Enregistrez le fichier et exécutez:

$ python3 app.py

Si vous ouvrez votre navigateur et dirigez-vous vers 127.0.0.1:5000 ou localhost:5000 vous devriez voir « Bonjour le monde! » sur la page. Cela signifie que notre application Flask est prête pour les prochaines étapes.

Nous allons maintenant créer un dossier templates pour héberger nos fichiers HTML. Allons de l’avant et créons un simple index.html:

<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>

Ajustons également notre app.py pour rendre notre nouveau modèle:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()

Avis que nous avons maintenant importé render_template et utilisé pour rendre le fichier HTML. Si vous redémarrez votre application Flask, vous devriez toujours voir  » Bonjour le monde ! » sur la page d’accueil.

Cela suffit sur le cours intensif Flask, intégrons maintenant notre script OCR sur l’application web.

Tout d’abord, nous allons ajouter une fonctionnalité pour télécharger des images sur notre application Flask et les transmettre à la fonction ocr_core que nous avons écrite ci-dessus. Nous rendrons ensuite l’image à côté du texte extrait sur notre application Web comme suit:

import osfrom flask import Flask, render_template, request# import our OCR functionfrom ocr_core import ocr_core# define a folder to store and later serve the imagesUPLOAD_FOLDER = '/static/uploads/'# allow files of a specific typeALLOWED_EXTENSIONS = set()app = Flask(__name__)# function to check the file extensiondef allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS# route and function to handle the home [email protected]('/')def home_page(): return render_template('index.html')# route and function to handle the upload [email protected]('/upload', methods=)def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html')if __name__ == '__main__': app.run()

Comme nous pouvons le voir dans notre fonction upload_page(), nous recevrons l’image via POST et rendrons le code HTML de téléchargement si la demande est GET.

Nous vérifions si l’utilisateur a vraiment téléchargé un fichier et utilisons la fonction allowed_file() pour vérifier si le fichier est d’un type acceptable.

Après avoir vérifié que l’image est du type requis, nous la transmettons ensuite au script de reconnaissance de caractères que nous avons créé précédemment.

La fonction détecte le texte dans l’image et le renvoie. Enfin, en réponse au téléchargement de l’image, nous rendons le texte détecté à côté de l’image pour que l’utilisateur puisse voir les résultats.

Le fichier upload.html gère l’affichage de l’image et le rendu du résultat à l’aide du moteur de templating Jinja, qui est livré avec Flask par défaut:

<!DOCTYPE html><html> <head> <title>Upload Image</title> </head> <body> {% if msg %} <h1>{{ msg }}</h1> {% endif %} <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <p><input type=file name=file> <input type=submit value=Upload> </form> <h1>Result:</h1> {% if img_src %} <img src="{{ img_src }}"> {% endif %} {% if extracted_text %} <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p> {% else %} The extracted text will be displayed here {% endif %} </body></html>

Le modèle Jinja nous permet d’afficher du texte dans des scénarios spécifiques via les balises {% if %} {% endif %}. Nous pouvons également transmettre des messages de notre application Flask à afficher sur la page Web dans les balises {{ }}. Nous utilisons un formulaire pour télécharger l’image sur notre application Flask.

Le résultat est:

télécharger la page initiale

Maintenant, si nous allons de l’avant et téléchargeons notre image depuis plus tôt:

télécharger le résultat de la page

Oui! Notre application Flask a pu intégrer la fonctionnalité OCR et afficher le texte sur le navigateur. Cela facilite le traitement des images au lieu d’exécuter des commandes sur la CLI chaque fois que nous avons une nouvelle image à traiter.

Attachons quelques images supplémentaires pour explorer davantage les limites de notre script OCR simple car il ne fonctionnera pas dans toutes les situations.

Par exemple, essayons d’extraire du texte de l’image suivante et le résultat a été mis en surbrillance sur l’image:

chansons de couverture de scan échouées

Ceci est la preuve que l’OCR n’est pas toujours précise à 100% et peut nécessiter une intervention humaine de temps en temps.

J’ai également testé le script OCR contre mon écriture manuscrite pour voir comment il fonctionnerait, et c’est le résultat:

mon écriture manuscrite

Comme vous pouvez le voir, il ne peut pas tout à fait extraire du texte de mon écriture manuscrite comme il l’a fait avec d’autres images que nous avons vues auparavant. J’ai décidé de lui donner un autre essai, cette fois avec une image de cette source, et ce sont les résultats:

manuscrit téléchargé

La reconnaissance des caractères sur cette image est bien meilleure que celle où j’ai utilisé ma propre écriture. Comme vous pouvez le voir, les lignes de l’image téléchargée sont plus épaisses et il y a un meilleur contraste entre le texte et l’arrière-plan, ce qui pourrait expliquer la mauvaise détection de mon écriture.

C’est un domaine à explorer davantage, vous pouvez obtenir des notes manuscrites d’amis ou de collègues et voir à quel point le script sera capable de détecter les caractères. Vous pouvez même obtenir des affiches pour des événements et essayer de les scanner pour trouver du texte, les possibilités sont nombreuses.

Autres options de PyTesseract

Python-Tesseract a plus d’options que vous pouvez explorer. Par exemple, vous pouvez spécifier la langue en utilisant un drapeau lang :

pytesseract.image_to_string(Image.open(filename), lang='fra')

Ceci est le résultat de la numérisation d’une image sans l’indicateur lang :

Et maintenant avec l’indicateur lang:

Le framework est également optimisé pour mieux détecter les langues comme on le voit dans les captures d’écran. (Source de l’image).

Sans le drapeau lang, le script a manqué quelques mots français, mais après avoir introduit le drapeau, il a pu détecter tout le contenu français. La traduction n’est pas possible mais cela reste impressionnant. La documentation officielle de Tesseract inclut les langues prises en charge dans cette section.

L’orientation et la détection de script font également partie des capacités de PyTesseract, ce qui facilite la détection des polices utilisées et l’orientation du texte sur l’image donnée. Si nous pouvons nous référer à l’image manuscrite que nous avons téléchargée précédemment:

print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))

Il n’y avait pas d’informations de numéro de page sur l’image, cela n’a donc pas été détecté. Le moteur Tesseract est capable d’extraire des informations sur l’orientation du texte dans l’image et la rotation. La confiance en orientation est une figure de la certitude du moteur sur l’orientation détectée pour servir de guide et montrer également qu’elle n’est pas toujours précise à 100%. La section script indique le système d’écriture utilisé dans le texte et est également suivie du marqueur de confiance.

Si nous recherchions les caractères reconnus et leurs limites de boîte, PyTesseract y parvient via pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

Ce sont quelques-unes des fonctionnalités de PyTesseract parmi d’autres telles que la conversion du texte extrait en une sortie PDF consultable ou HOCR.

Ce que nous n’avons pas fait

Nous avons beaucoup accompli dans ce post, mais il reste encore beaucoup à faire pour affiner notre projet et le préparer au monde réel. Tout d’abord, nous pouvons ajouter du style à notre site Web et le rendre plus attrayant pour l’utilisateur final en utilisant CSS. Nous pouvons également ajouter la possibilité de télécharger et de numériser plusieurs images à la fois et d’afficher toutes leurs sorties à la fois. Cela ne rendrait-il pas plus pratique de numériser plusieurs documents?

Le navigateur nous permet de puiser dans la caméra d’une machine et de capturer des images, avec la permission de l’utilisateur, bien sûr. Cela peut être d’une grande aide, en particulier sur les appareils mobiles. Au lieu que l’utilisateur doive capturer et enregistrer l’image puis la télécharger sur le site Web, si nous ajoutons la fonctionnalité de caméra, nous pouvons permettre à l’utilisateur d’effectuer les opérations directement à partir de l’application Web Flask. Cela rendra le processus de numérisation plus rapide.

Supposons qu’une application Flask ne soit pas ce que vous aviez l’intention d’exposer votre scanner OCR, vous pouvez également créer un outil CLI. L’outil vous permettrait d’exécuter une commande comprenant l’emplacement de l’image, puis d’imprimer la sortie du scanner sur votre terminal ou de l’envoyer à une base de données ou à une API. Si vous avez choisi ce chemin, Docopt est un outil fantastique pour créer des outils de ligne de commande en utilisant Python.

Conclusion

Grâce à Tesseract et à la bibliothèque Python-Tesseract, nous avons pu numériser des images et en extraire du texte. Il s’agit de la reconnaissance optique des caractères et elle peut être d’une grande utilité dans de nombreuses situations.

Nous avons construit un scanner qui prend une image et renvoie le texte contenu dans l’image et l’intègre dans une application Flask comme interface. Cela nous permet d’exposer la fonctionnalité sur un support plus familier et d’une manière qui peut servir plusieurs personnes simultanément.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *