PyTesseract: Einfache optische Zeichenerkennung in Python

Einführung

Menschen können den Inhalt eines Bildes einfach durch Betrachten verstehen. Wir nehmen den Text auf dem Bild als Text wahr und können ihn lesen.

Computer funktionieren nicht auf die gleiche Weise. Sie brauchen etwas Konkreteres, das so organisiert ist, dass sie es verstehen können.

Hier setzt die optische Zeichenerkennung (OCR) an. Ob es sich um die Erkennung von Autokennzeichen von einer Kamera oder um handschriftliche Dokumente handelt, die in eine digitale Kopie konvertiert werden sollen, diese Technik ist sehr nützlich. Obwohl es nicht immer perfekt ist, ist es sehr praktisch und macht es für manche Menschen viel einfacher und schneller, ihre Arbeit zu erledigen.

In diesem Artikel werden wir uns mit der Tiefe der optischen Zeichenerkennung und ihren Anwendungsbereichen befassen. Wir werden auch ein einfaches Skript in Python erstellen, mit dem wir Zeichen aus Bildern erkennen und über eine Flask-Anwendung für ein bequemeres Interaktionsmedium verfügbar machen können.

Was ist optische Zeichenerkennung?

Die optische Zeichenerkennung umfasst die Erkennung von Textinhalten auf Bildern und die Übersetzung der Bilder in codierten Text, den der Computer leicht verstehen kann. Ein Bild, das Text enthält, wird gescannt und analysiert, um die darin enthaltenen Zeichen zu identifizieren. Bei der Identifizierung wird das Zeichen in maschinencodierten Text umgewandelt.

Wie wird es wirklich erreicht? Für uns ist Text auf einem Bild leicht erkennbar und wir können Zeichen erkennen und den Text lesen, aber für einen Computer ist alles eine Reihe von Punkten.

Das Bild wird zuerst gescannt und die Text- und Grafikelemente werden in eine Bitmap umgewandelt, die im Wesentlichen eine Matrix aus schwarzen und weißen Punkten ist. Das Bild wird dann vorverarbeitet, wo die Helligkeit und der Kontrast angepasst werden, um die Genauigkeit des Prozesses zu verbessern.

Das Bild wird nun in Zonen unterteilt, die die Bereiche von Interesse identifizieren, z. B. wo sich die Bilder oder der Text befinden, und dies hilft, den Extraktionsprozess zu starten. Die Bereiche, die Text enthalten, können nun weiter in Zeilen, Wörter und Zeichen unterteilt werden, und jetzt kann die Software die Zeichen durch Vergleich und verschiedene Erkennungsalgorithmen abgleichen. Das Endergebnis ist der Text im Bild, den wir erhalten.

Der Prozess ist möglicherweise nicht 100% genau und erfordert möglicherweise menschliches Eingreifen, um einige Elemente zu korrigieren, die nicht korrekt gescannt wurden. Die Fehlerkorrektur kann auch mit einem Wörterbuch oder sogar Natural Language Processing (NLP) erreicht werden.

Die Ausgabe kann jetzt über Text-to-Speech-Technologien in andere Medien wie Word-Dokumente, PDFs oder sogar Audioinhalte konvertiert werden.

Verwendung von OCR

Bisher wurde die Digitalisierung von Dokumenten durch manuelles Eingeben des Textes auf dem Computer erreicht. Durch OCR wird dieser Prozess erleichtert, da das Dokument gescannt, verarbeitet und der Text extrahiert und in einer bearbeitbaren Form wie einem Word-Dokument gespeichert werden kann.

Wenn Sie einen Dokumentenscanner auf Ihrem Telefon haben, z. B. Adobe Scan, sind Sie wahrscheinlich auf die OCR-Technologie gestoßen.

Flughäfen können OCR auch verwenden, um den Prozess der Passerkennung und Extraktion von Informationen aus ihnen zu automatisieren.

Weitere Anwendungen von OCR sind die Automatisierung von Dateneingabeprozessen, die Erkennung und Erkennung von Autokennzeichen.

Was wir verwenden werden

Für dieses OCR-Projekt verwenden wir die Python-Tesseract-Bibliothek oder einfach PyTesseract, die ein Wrapper für Googles Tesseract-OCR-Engine ist.

Ich habe das gewählt, weil es komplett Open Source ist und vom Riesen Google entwickelt und gepflegt wird. Befolgen Sie diese Anweisungen, um Tesseract auf Ihrem Computer zu installieren, da PyTesseract davon abhängt.

Wir werden auch das Flask-Webframework verwenden, um unseren einfachen OCR-Server zu erstellen, auf dem wir Bilder über die Webcam aufnehmen oder Fotos zur Zeichenerkennung hochladen können.

Wir werden auch Pipenv verwenden, da es auch die Einrichtung der virtuellen Umgebung und das Anforderungsmanagement übernimmt.

Neben diesen verwenden wir auch die Pillow-Bibliothek, eine Abzweigung der Python Imaging Library (PIL), um das Öffnen und Bearbeiten von Bildern in vielen Formaten in Python zu handhaben.

In diesem Beitrag konzentrieren wir uns auf PyTesseract obwohl es andere Python-Bibliotheken gibt, mit denen Sie Text aus Bildern extrahieren können, z. B .:

  • Textract: kann Daten aus PDFs extrahieren, ist aber ein schweres Paket.
  • Pyocr: bietet mehr Erkennungsoptionen wie Sätze, Ziffern oder Wörter.

Setup

Installieren Sie zunächst Pipenv mit dem folgenden Befehl über Pip (falls Sie es einrichten müssen, lesen Sie hierzu).

$ pip install pipenv

Erstellen Sie das Projektverzeichnis und starten Sie das Projekt, indem Sie den folgenden Befehl ausführen:

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

Wir können jetzt unsere virtuelle Umgebung aktivieren und mit der Installation unserer Abhängigkeiten beginnen:

$ pipenv shell$ pipenv install pytesseract Pillow 

Falls Sie Pipenv nicht verwenden, können Sie immer den Pip- und Virtual Environment-Ansatz verwenden. Befolgen Sie die offizielle Dokumentation, um Ihnen den Einstieg in Pip und die virtuelle Umgebung zu erleichtern:

Hinweis: In diesem Fall lautet der Befehl anstelle von pipenv install Pillowpip install Pillow.

Umsetzung

Wir werden dieses Projekt in 2 Phasen umsetzen. Im ersten erstellen wir das Skript und im nächsten erstellen wir eine Flask-Anwendung, die als Schnittstelle fungiert.

OCR-Skript

Nach Abschluss des Setups können wir jetzt eine einfache Funktion erstellen, die ein Bild aufnimmt und den im Bild erkannten Text zurückgibt – dies wird der Kern unseres Projekts sein:

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'))

Die Funktion ist recht einfach, in den ersten 5 Zeilen importieren wir Image aus dem Pillow Bibliothek und unsere PyTesseract Bibliothek.

Wir erstellen dann eine ocr_core Funktion, die einen Dateinamen aufnimmt und den im Bild enthaltenen Text zurückgibt.

Mal sehen, wie das Skript mit einem einfachen Bild abschneidet, das etwas Text enthält:

Und wenn wir den Code ausführen, werden wir mit Folgendem begrüßt:

Unser einfaches OCR-Skript funktioniert! Offensichtlich war dies etwas einfach, da dies digitaler Text ist, perfekt und präzise, im Gegensatz zur Handschrift. Mit der PyTesseract-Bibliothek können wir noch viel mehr tun, aber dazu später im Beitrag mehr.

Lassen Sie uns dieses Skript zuerst in eine Flask-Anwendung integrieren, um das Hochladen von Bildern und das Ausführen von Zeichenerkennungsoperationen zu vereinfachen.

Flask Web Interface

Unser Skript kann über die Befehlszeile verwendet werden, aber eine Flask-Anwendung würde es benutzerfreundlicher und vielseitiger machen. Zum Beispiel können wir Fotos über die Website hochladen und den extrahierten Text auf der Website anzeigen lassen oder wir können Fotos über die Webkamera aufnehmen und die Zeichenerkennung durchführen.

Wenn Sie mit dem Flask-Framework nicht vertraut sind, ist dies ein gutes Tutorial, um Sie auf den neuesten Stand zu bringen.

Beginnen wir mit der Installation des Flask-Pakets:

$ pipenv install Flask

Definieren wir nun eine grundlegende Route:

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

Speichern Sie die Datei und führen Sie sie aus:

$ python3 app.py

Wenn Sie Ihren Browser öffnen und zu 127.0.0.1:5000 oder localhost:5000 Sie sollten „Hello World!“ auf der Seite. Damit ist unsere Flask App bereit für die nächsten Schritte.

Wir erstellen nun einen templates Ordner, um unsere HTML-Dateien zu hosten. Lassen Sie uns ein einfaches index.html erstellen:

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

Lassen Sie uns auch unsere app.py optimieren, um unsere neue Vorlage zu rendern:

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

Beachten Sie, dass wir jetzt render_template und verwendete es, um die HTML-Datei zu rendern. Wenn Sie Ihre Flask-App neu starten, sollte weiterhin „Hallo Welt!“ auf der Homepage.

Das ist genug auf dem Flask-Crashkurs, lassen Sie uns nun unser OCR-Skript in die Webanwendung integrieren.

Zuerst fügen wir Funktionen zum Hochladen von Bildern in unsere Flask-App hinzu und übergeben sie an die ocr_core Funktion, die wir oben geschrieben haben. Wir rendern dann das Bild neben dem extrahierten Text in unserer Web-App als Ergebnis:

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()

Wie wir in unserer upload_page() Funktion sehen können, erhalten wir das Bild per POST und rendern den Upload-HTML-Code, wenn die Anforderung GET lautet.

Wir prüfen, ob der Benutzer wirklich eine Datei hochgeladen hat und verwenden die Funktion allowed_file(), um zu überprüfen, ob die Datei von einem akzeptablen Typ ist.

Nachdem wir überprüft haben, ob das Bild vom erforderlichen Typ ist, übergeben wir es an das zuvor erstellte Zeichenerkennungsskript.

Die Funktion erkennt den Text im Bild und gibt ihn zurück. Als Antwort auf den Bild-Upload rendern wir schließlich den erkannten Text neben dem Bild, damit der Benutzer die Ergebnisse sehen kann.

Die upload.html -Datei übernimmt das Posten des Bildes und das Rendern des Ergebnisses mithilfe der Jinja Templating Engine, die standardmäßig mit Flask ausgeliefert wird:

<!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>

Mit Jinja Templating können wir Text in bestimmten Szenarien über die {% if %} {% endif %} -Tags anzeigen. Wir können auch Nachrichten von unserer Flask-App übergeben, die auf der Webseite innerhalb der {{ }} -Tags angezeigt werden. Wir verwenden ein Formular, um das Bild in unsere Flask-App hochzuladen.

Das Ergebnis ist:

upload page initial

Nun, wenn wir weitermachen und unser Bild von früher hochladen:

upload page result

Ja! Unsere Flask-Anwendung konnte die OCR-Funktionalität integrieren und den Text im Browser anzeigen. Dies erleichtert die Verarbeitung von Images, anstatt jedes Mal, wenn ein neues Image verarbeitet werden muss, Befehle auf der CLI auszuführen.

Lassen Sie uns noch ein paar Bilder anhängen, um die Grenzen unseres einfachen OCR-Skripts weiter zu erkunden, da es nicht in allen Situationen funktioniert.

Versuchen wir beispielsweise, Text aus dem folgenden Bild zu extrahieren, und das Ergebnis wurde im Bild hervorgehoben:

Dies ist ein Beweis dafür, dass OCR nicht immer 100% genau ist und von Zeit zu Zeit ein menschliches Eingreifen erforderlich sein kann.

Ich habe das OCR-Skript auch gegen meine Handschrift getestet, um zu sehen, wie es funktionieren würde, und dies ist das Ergebnis:

meine Handschrift

Wie Sie sehen können, kann es nicht ganz Text aus meiner Handschrift extrahieren, wie es bei anderen Bildern der Fall war, die wir zuvor gesehen haben. Ich beschloss, es noch einmal zu versuchen, diesmal mit einem Bild aus dieser Quelle, und dies waren die Ergebnisse:

heruntergeladen handgeschrieben

Die Zeichenerkennung auf diesem Bild ist viel besser als die, wo ich meine eigene Handschrift verwendet. Wie Sie sehen können, sind die Linien im heruntergeladenen Bild dicker und es gibt einen besseren Kontrast zwischen dem Text und dem Hintergrund, und dies könnte der Grund für die schlechte Erkennung meiner Handschrift sein.Sie können handschriftliche Notizen von Freunden oder Kollegen erhalten und sehen, wie gut das Skript Zeichen erkennen kann. Sie können sogar Poster zu Veranstaltungen bekommen und versuchen, sie nach Text zu scannen, die Möglichkeiten sind vielfältig.

Andere PyTesseract-Optionen

Python-Tesseract bietet weitere Optionen, die Sie erkunden können. Sie können die Sprache beispielsweise mit einem lang -Flag angeben:

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

Dies ist das Ergebnis des Scannens eines Bildes ohne das lang -Flag:

Und jetzt mit dem lang Flag:

Das Framework ist auch optimiert, um Sprachen besser zu erkennen, wie in den Screenshots zu sehen. (Bildquellen).

Ohne das lang -Flag vermisste das Skript einige französische Wörter, aber nachdem es das Flag eingeführt hatte, konnte es den gesamten französischen Inhalt erkennen. Übersetzung ist nicht möglich, aber das ist immer noch beeindruckend. Die offizielle Dokumentation von Tesseract enthält die unterstützten Sprachen in diesem Abschnitt.

Die Orientierungs- und Skripterkennung gehört ebenfalls zu den Funktionen von PyTesseract und hilft bei der Erkennung der verwendeten Schriftarten und der Ausrichtung des Textes auf dem angegebenen Bild. Wenn wir uns auf das handgeschriebene Bild beziehen, das wir zuvor heruntergeladen haben:

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

Das Bild enthielt keine Seitenzahlinformationen, sodass dies nicht erkannt wurde. Die Tesseract-Engine kann Informationen über die Ausrichtung des Textes im Bild und die Drehung extrahieren. Das Orientierungsvertrauen ist eine Zahl der Sicherheit des Motors über die erkannte Orientierung, um als Leitfaden zu dienen und auch zu zeigen, dass es nicht immer 100% genau ist. Der Skriptabschnitt bezeichnet das im Text verwendete Schriftsystem, gefolgt von der Vertrauensmarkierung.

Wenn wir nach den erkannten Zeichen und ihren Boxgrenzen wären, erreicht PyTesseract dies durch pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')) .

Dies sind einige der Funktionen von PyTesseract, unter anderem die Konvertierung des extrahierten Textes in eine durchsuchbare PDF- oder HOCR-Ausgabe.

Was wir noch nicht getan haben

Wir haben in diesem Beitrag viel erreicht, aber es gibt noch mehr zu tun, um unser Projekt zu verfeinern und für die reale Welt vorzubereiten. Erstens können wir unserer Website mithilfe von CSS Stil hinzufügen und sie für den Endbenutzer attraktiver machen. Wir können auch die Option hinzufügen, mehrere Bilder gleichzeitig hochzuladen und zu scannen und alle ihre Ausgaben gleichzeitig anzuzeigen. Wäre es nicht bequemer, mehrere Dokumente zu scannen?

Der Browser ermöglicht es uns, die Kamera einer Maschine anzuzapfen und Bilder aufzunehmen, natürlich mit Erlaubnis des Benutzers. Dies kann besonders auf mobilen Geräten eine große Hilfe sein. Anstatt dass der Benutzer das Bild aufnehmen und speichern und dann auf die Website hochladen muss, können wir es dem Benutzer ermöglichen, die Vorgänge direkt über die Flask-Webanwendung auszuführen, wenn wir die Kamerafunktion hinzufügen. Dadurch wird der Scanvorgang schneller.Angenommen, eine Flask-Anwendung ist nicht das, was Sie für Ihren OCR-Scanner vorgesehen haben, können Sie auch ein CLI-Tool erstellen. Mit dem Tool können Sie einen Befehl ausführen, der den Speicherort des Bildes enthält, und dann die Ausgabe des Scanners auf Ihrem Terminal drucken oder an eine Datenbank oder API senden. Wenn Sie diesen Pfad gewählt haben, ist Docopt ein fantastisches Tool zum Erstellen von Befehlszeilentools mit Python.

Fazit

Durch Tesseract und die Python-Tesseract-Bibliothek konnten wir Bilder scannen und Text daraus extrahieren. Dies ist die optische Zeichenerkennung und kann in vielen Situationen von großem Nutzen sein.

Wir haben einen Scanner gebaut, der ein Bild aufnimmt und den im Bild enthaltenen Text zurückgibt und ihn als Schnittstelle in eine Flask-Anwendung integriert. Dies ermöglicht es uns, die Funktionalität in einem vertrauteren Medium und auf eine Weise verfügbar zu machen, die mehrere Personen gleichzeitig bedienen kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.