Zephyrnet-Logo

Eine umfassende Anleitung zu OCR mit Tesseract, OpenCV und Python

Datum:

Einleitung

OCR = Optische Zeichenerkennung. Mit anderen Worten, OCR-Systeme transformieren ein zweidimensionales Textbild, das maschinell gedruckten oder handgeschriebenen Text aus seiner Bilddarstellung enthalten könnte, in maschinenlesbaren Text. OCR als Prozess besteht im Allgemeinen aus mehreren Unterprozessen, um eine möglichst genaue Leistung zu erzielen. Die Unterprozesse sind:

  • Vorverarbeitung des Bildes
  • Textlokalisierung
  • Zeichensegmentierung
  • Zeichenerkennung
  • Post Processing

Die Unterprozesse in der obigen Liste können natürlich unterschiedlich sein, aber dies sind ungefähr Schritte, die erforderlich sind, um sich der automatischen Zeichenerkennung zu nähern. In der OCR-Software besteht das Hauptziel darin, alle eindeutigen Wörter in verschiedenen Sprachen aus geschriebenen Textzeichen zu identifizieren und zu erfassen.

Seit fast zwei Jahrzehnten werden optische Zeichenerkennungssysteme häufig verwendet, um eine automatisierte Texteingabe in computergestützte Systeme zu ermöglichen. In all dieser Zeit haben herkömmliche OCR-Systeme jedoch nie ihre Unfähigkeit überwunden, mehr als eine Handvoll Schriftarten und Seitenformate zu lesen. Proportional beabstandete Schriftarten (die praktisch alle gesetzten Kopien enthalten), Laserdrucker-Schriftarten und sogar viele nicht proportionale Schreibmaschinen-Schriftarten sind für diese Systeme unerreichbar geblieben. Infolgedessen hat die konventionelle OCR nie mehr als einen geringfügigen Einfluss auf die Gesamtzahl der Dokumente erzielt, die in digitale Form konvertiert werden müssen.

Optischer Zeichenerkennungsprozess (mit freundlicher Genehmigung)

OCR-Engines der nächsten Generation bewältigen diese oben genannten Probleme sehr gut, indem sie die neuesten Forschungsergebnisse auf dem Gebiet des Deep Learning nutzen. Durch die Nutzung der Kombination aus tiefen Modellen und riesigen öffentlich verfügbaren Datensätzen erreichen Modelle bei bestimmten Aufgaben die neuesten Genauigkeiten. Heutzutage ist es auch möglich synthetische Daten generieren mit verschiedenen Schriftarten unter Verwendung generativer gegnerischer Netzwerke und weniger anderer generativer Ansätze.

Die optische Zeichenerkennung bleibt a herausforderndes Problem wenn Text in ungezwungenen Umgebungen auftritt, wie z natürliche Szenenaufgrund geometrischer Verzerrungen, komplexer Hintergründe und unterschiedlicher Schriftarten. Die Technologie birgt aufgrund der verschiedenen Anwendungsfälle von Deep Learning-basierten OCR-ähnlichen Möglichkeiten immer noch ein immenses Potenzial

In diesem Blogbeitrag werden wir versuchen, die Technologie hinter der am häufigsten verwendeten Tesseract Engine zu erläutern, die mit den neuesten Erkenntnissen zur optischen Zeichenerkennung aktualisiert wurde. Dieser Artikel dient auch als Anleitung / Tutorial zur Implementierung von OCR in Python mithilfe der Tesseract-Engine. Wir werden die folgenden Module durchgehen:

  • Tesseract OCR-Funktionen
  • Vorverarbeitung für OCR mit OpenCV
  • Ausführen von Tesseract mit CLI und Python
  • Einschränkungen der Tesseract-Engine


Haben Sie ein OCR-Problem im Sinn? Möchten Sie die Dateneingabekosten Ihres Unternehmens senken? Gehe rüber zu Nanonetze und bauen Sie OCR-Modelle kostenlos!



Es gibt eine Menge von optische Zeichenerkennung Software verfügbar. Ich habe keinen Qualitätsvergleich zwischen ihnen gefunden, aber ich werde über einige von ihnen schreiben, die am entwicklerfreundlichsten zu sein scheinen.

Tesseract - eine Open-Source-OCR-Engine, die bei OCR-Entwicklern an Beliebtheit gewonnen hat. Obwohl es manchmal schmerzhaft sein kann, zu implementieren und zu modifizieren, gab es lange Zeit nicht zu viele kostenlose und leistungsstarke OCR-Alternativen auf dem Markt. Tesseract begann als Ph.D. Forschungsprojekt in HP Labs, Bristol. Es gewann an Popularität und wurde von HP zwischen 1984 und 1994 entwickelt. 2005 veröffentlichte HP Tesseract als Open-Source-Software. Seit 2006 wird es von Google entwickelt.

Google Trends Vergleich für verschiedene Open Source OCR-Tools

OCRopus - OCRopus ist ein Open-Source-OCR-System, mit dem Forscher und Unternehmen die OCR-Komponenten einfach bewerten und wiederverwenden können. Eine Sammlung von Dokumentenanalyseprogrammen, kein schlüsselfertiges OCR-System. Um es auf Ihre Dokumente anzuwenden, müssen Sie möglicherweise einige Bildvorverarbeitungen durchführen und möglicherweise auch neue Modelle trainieren. Zusätzlich zu den Erkennungsskripten selbst gibt es verschiedene Skripte zur Bearbeitung und Korrektur von Grundwahrheiten, zur Messung von Fehlerraten und zur Bestimmung von Verwirrungsmatrizen, die einfach zu verwenden und zu bearbeiten sind.


Okular - Ocular eignet sich am besten für Dokumente, die mit einer Handpresse gedruckt wurden, einschließlich solcher, die in mehreren Sprachen geschrieben wurden. Es arbeitet über die Kommandozeile. Es ist ein historisches OCR-System auf dem neuesten Stand der Technik. Seine Hauptmerkmale sind:

  • Unbeaufsichtigtes Erlernen unbekannter Schriftarten: Erfordert nur Dokumentbilder und einen Textkorpus.
  • Fähigkeit, mit verrauschten Dokumenten umzugehen: inkonsistente Farbgebung, Abstände, vertikale Ausrichtung
  • Unterstützung für mehrsprachige Dokumente, einschließlich solcher mit erheblichem Code-Switching auf Wortebene.
  • Unüberwachtes Lernen von orthografischen Variationsmustern, einschließlich archaischer Schreibweisen und Druckerkürzel.
  • Gleichzeitige gemeinsame Transkription in diplomatische (wörtliche) und normalisierte Formen.


SwiftOCR - Ich werde auch die in Swift geschriebene OCR-Engine erwähnen, da große Fortschritte gemacht werden, um die Verwendung des Swift als Entwicklungsprogrammiersprache für tiefes Lernen voranzutreiben. Auschecken Blog um mehr darüber herauszufinden warum. SwiftOCR ist eine schnelle und einfache OCR-Bibliothek, die neuronale Netze zur Bilderkennung verwendet. SwiftOCR behauptet, dass ihre Engine die bekannte Tessaract-Bibliothek übertrifft.

In diesem Blogbeitrag werden wir setzen Fokus auf Tesseract OCR und erfahren Sie mehr darüber, wie es funktioniert und wie es verwendet wird.


Tesserakt OCR

Tesseract ist eine Open Source Texterkennungs-Engine (OCR), die unter der Apache 2.0-Lizenz verfügbar ist. Es kann direkt oder (für Programmierer) mithilfe einer API verwendet werden, um gedruckten Text aus Bildern zu extrahieren. Es unterstützt eine Vielzahl von Sprachen. Tesseract verfügt nicht über eine integrierte Benutzeroberfläche, es stehen jedoch mehrere zur Verfügung 3rdParty Seite. Tesseract ist mit vielen Programmiersprachen und Frameworks über Wrapper kompatibel, die gefunden werden können hier. Es kann mit der vorhandenen Layoutanalyse verwendet werden, um Text in einem großen Dokument zu erkennen, oder es kann in Verbindung mit einem externen Textdetektor verwendet werden, um Text aus einem Bild einer einzelnen Textzeile zu erkennen.

OCR-Prozessablauf zum Erstellen einer API mit Tesseract aus a Blog-Post

Tesseract 4.00 enthält ein neues neuronales Netzwerk-Subsystem, das als Textzeilenerkennung konfiguriert ist. Es hat seinen Ursprung in OCRopus 'Python-basiertes LSTM Implementierung, wurde jedoch für Tesseract in C ++ neu gestaltet. Das neuronale Netzwerksystem in Tesseract datiert TensorFlow vor, ist jedoch damit kompatibel, da es eine Netzwerkbeschreibungssprache namens Variable Graph Specification Language (VGSL) gibt, die auch für TensorFlow verfügbar ist.

Um ein Bild zu erkennen, das ein einzelnes Zeichen enthält, verwenden wir normalerweise ein Convolutional Neural Network (CNN). Text beliebiger Länge ist eine Folge von Zeichen, und solche Probleme werden mit RNNs gelöst, und LSTM ist eine beliebte Form von RNN. Lesen Sie diesen Beitrag, um mehr darüber zu erfahren LSTM.


Technologie - wie es funktioniert

LSTMs eignen sich hervorragend zum Lernen von Sequenzen, verlangsamen sich jedoch erheblich, wenn die Anzahl der Zustände zu groß ist. Es gibt empirische Ergebnisse, die darauf hindeuten, dass es besser ist, einen LSTM zu bitten, eine lange Sequenz zu lernen, als eine kurze Sequenz vieler Klassen. Tesseract wurde aus dem OCRopus-Modell in Python entwickelt, das eine Abzweigung eines LSMT in C ++ namens CLSTM war. CLSTM ist eine Implementierung des wiederkehrenden neuronalen LSTM-Netzwerkmodells in C ++ unter Verwendung der Eigenbibliothek für numerische Berechnungen.

Tesseract 3 OCR-Prozess von Krepppapier

Legacy Tesseract 3.x war abhängig von dem mehrstufigen Prozess, bei dem wir Schritte unterscheiden können:

  • Wortfindung
  • Linienfindung
  • Zeichenklassifizierung

Die Wortsuche wurde durchgeführt, indem Textzeilen in Blobs organisiert wurden, und die Linien und Regionen werden auf festen Abstand oder proportionalen Text analysiert. Textzeilen werden je nach Art des Zeichenabstands unterschiedlich in Wörter unterteilt. Die Erkennung erfolgt dann in zwei Durchgängen. Im ersten Durchgang wird versucht, jedes Wort der Reihe nach zu erkennen. Jedes zufriedenstellende Wort wird als Trainingsdaten an einen adaptiven Klassifikator übergeben. Der adaptive Klassifizierer erhält dann die Möglichkeit, Text weiter unten auf der Seite genauer zu erkennen.

Die Modernisierung des Tesseract-Tools war ein Aufwand für die Codebereinigung und das Hinzufügen eines neuen LSTM-Modells. Das Eingabebild wird zeilenweise in Kästchen (Rechteck) verarbeitet, in das LSTM-Modell eingespeist und ausgegeben. Im Bild unten können wir uns vorstellen, wie es funktioniert.

Wie Tesseract das LSTM-Modell verwendet presentation

Nach dem Hinzufügen eines neuen Schulungswerkzeugs und dem Trainieren des Modells mit vielen Daten und Schriftarten erzielt Tesseract eine bessere Leistung. Trotzdem nicht gut genug, um an handgeschriebenem Text und seltsamen Schriftarten zu arbeiten. Es ist möglich, die obersten Schichten für Experimente zu optimieren oder neu zu trainieren.


Tesseract installieren

Die Installation von tesseract unter Windows ist mit den gefundenen vorkompilierten Binärdateien einfach hier. Vergessen Sie nicht, die Umgebungsvariable "Pfad" zu bearbeiten und einen Tesseract-Pfad hinzuzufügen. Für die Linux- oder Mac-Installation wird es mit installiert wenige Befehle.

Stellen Sie nach der Installation sicher, dass alles funktioniert, indem Sie den Befehl in das Terminal oder cmd eingeben:

$ tesseract --version

Und Sie werden die Ausgabe ähnlich sehen wie:

tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE

Anschließend können Sie den Python-Wrapper für tesseract mit pip installieren.
$ pip install pytesseract

Die Tesseract-Bibliothek wird mit einem praktischen Befehlszeilentool namens Tesseract geliefert. Wir können dieses Tool verwenden, um OCR für Bilder durchzuführen, und die Ausgabe wird in einer Textdatei gespeichert. Wenn wir Tesseract in unseren C ++ - oder Python-Code integrieren möchten, verwenden wir die Tesseract-API.


Ausführen von Tesseract mit CLI

Rufen Sie die Tesseract-Engine auf dem Bild mit auf Bildpfad und konvertieren Sie das Bild zeilenweise in Text in der Eingabeaufforderung, indem Sie Folgendes eingeben:

$ tesseract image_path stdout

So schreiben Sie den Ausgabetext in eine Datei:

$ tesseract image_path text_result.txt

Um den Namen des Sprachmodells anzugeben, schreiben Sie eine Sprachverknüpfung nach -l flag, standardmäßig wird die englische Sprache verwendet:

$ tesseract image_path text_result.txt -l eng

Standardmäßig erwartet Tesseract eine Textseite, wenn ein Bild segmentiert wird. Wenn Sie nur eine kleine Region OCR-fähig machen möchten, versuchen Sie es mit einem anderen Segmentierungsmodus –PSm Streit. Es stehen 14 Modi zur Verfügung hier. Standardmäßig automatisiert Tesseract die Seitensegmentierung vollständig, führt jedoch keine Orientierungs- und Skripterkennung durch. Geben Sie Folgendes ein, um den Parameter anzugeben:

$ tesseract image_path text_result.txt -l eng --psm 6

Es gibt noch ein weiteres wichtiges Argument, den OCR-Engine-Modus (OEM). Tesseract 4 verfügt über zwei OCR-Engines - Legacy Tesseract Engine und LSTM Engine. Mit der Option –oem können vier Betriebsarten ausgewählt werden.
0 Nur Legacy-Engine.
1 Nur neuronale Netze LSTM-Motor.
2 Legacy + LSTM-Motoren.
3 Standard, basierend auf dem, was verfügbar ist.

Ergebnis der Tesseract OCR Engine

OCR mit Pytesseract und OpenCV

Pytesseract ist ein Wrapper für die Tesseract-OCR Engine. Es ist auch als eigenständiges Aufrufskript für tesseract nützlich, da es alle von den Bildbibliotheken Pillow und Leptonica unterstützten Bildtypen lesen kann, einschließlich JPEG, PNG, GIF, BMP, TIFF und andere. Weitere Informationen zum Python-Ansatz finden Sie unter hier. Den Code für dieses Tutorial finden Sie hier Quelle.

import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Vorverarbeitung für Tesseract

Um zu vermeiden, dass die Genauigkeit Ihrer Tesseract-Ausgabe sinkt, müssen Sie sicherstellen, dass das Bild angemessen ist vorverarbeitet.

Dies umfasst die Neuskalierung, Binärisierung, Rauschunterdrückung, Entschwebung usw.

Verwenden Sie eine der folgenden Python-Funktionen oder folgen Sie den Anweisungen, um das Bild für OCR vorzuverarbeiten OpenCV-Dokumentation.

import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) 

Lassen Sie uns mit einem Beispiel arbeiten, um die Dinge besser zu sehen. So sieht unser Originalbild aus -

Das Aurebesh-Schriftsystem

Nach der Vorverarbeitung mit dem folgenden Code

image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

Wenn Sie die resultierenden Bilder zeichnen, erhalten Sie die folgenden Ergebnisse.

Das Bild nach der Vorverarbeitung

Die Ausgabe für das Originalbild sieht folgendermaßen aus:

GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED

So sieht die Ausgabe für verschiedene vorverarbeitete Bilder aus:

Canny Edge Image (nicht so gut) -

CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im

Schwellenwertbild -

GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH

Eröffnungsbild -

GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH


Felder um Text herum bekommen

Mit Pytesseract können Sie die Begrenzungsrahmeninformationen für Ihre OCR-Ergebnisse wie folgt abrufen Code.

Das folgende Skript gibt Ihnen Informationen zum Begrenzungsrahmen für jedes Zeichen, das von tesseract während der OCR erkannt wurde.

import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Wenn Sie Kästchen um Wörter anstelle von Zeichen möchten, wird die Funktion image_to_data wird sich als nützlich erweisen. Du kannst den ... benutzen image_to_data Funktion mit dem mit pytesseract angegebenen Ausgabetyp Output.


Haben Sie ein OCR-Problem im Sinn? Möchten Sie Rechnungen, PDFs oder Nummernschilder digitalisieren? Gehe rüber zu Nanonetze und bauen Sie OCR-Modelle kostenlos!


Wir werden das obige Beispielrechnungsbild verwenden, um unsere Tesseract-Ausgaben zu testen.

import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())

Dies sollte Ihnen die folgende Ausgabe geben -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Mit diesem Wörterbuch können wir jedes Wort erkennen, seine Begrenzungsrahmeninformationen, den darin enthaltenen Text und die Konfidenzwerte für jedes.

Sie können die Felder mit dem folgenden Code zeichnen -

n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

So würde dies für das Bild einer Musterrechnung aussehen.


Textvorlagen-Matching

Nehmen Sie das Beispiel, in dem versucht wird, herauszufinden, wo sich ein Datum in einem Bild befindet. Hier ist unsere Vorlage ein Muster für reguläre Ausdrücke, das wir mit unseren OCR-Ergebnissen abgleichen, um die entsprechenden Begrenzungsrahmen zu finden. Wir werden die verwenden regex Modul und die image_to_data Funktion dafür.

import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Wie erwartet erhalten wir eine Box um das Rechnungsdatum im Bild.


Seitensegmentierungsmodi

Es gibt verschiedene Möglichkeiten, eine Textseite zu analysieren. Die Tesseract-API bietet mehrere Seitensegmentierungsmodi, wenn Sie OCR nur in einem kleinen Bereich oder in unterschiedlichen Ausrichtungen usw. ausführen möchten.

Hier ist eine Liste der unterstützten Seitensegmentierungsmodi nach tesseract -

0 Nur Orientierung und Skripterkennung (OSD).
1 Automatische Seitensegmentierung mit OSD.
2 Automatische Seitensegmentierung, jedoch kein OSD oder OCR.
3 Vollautomatische Seitensegmentierung, jedoch kein OSD. (Standard)
4 Nehmen Sie eine einzelne Textspalte variabler Größe an.
5 Nehmen Sie einen einzelnen einheitlichen Block vertikal ausgerichteten Textes an.
6 Nehmen Sie einen einzelnen einheitlichen Textblock an.
7 Behandeln Sie das Bild als einzelne Textzeile.
8 Behandeln Sie das Bild als ein einzelnes Wort.
9 Behandeln Sie das Bild als ein einzelnes Wort in einem Kreis.
10 Behandeln Sie das Bild als einzelnes Zeichen.
11 Spärlicher Text. Finde so viel Text wie möglich in keiner bestimmten Reihenfolge.
12 Sparse Text mit OSD.
13 Rohlinie. Behandeln Sie das Bild als einzelne Textzeile und umgehen Sie Tesseract-spezifische Hacks.

Um den Seitensegmentierungsmodus zu ändern, ändern Sie die --psm Argument in Ihrer benutzerdefinierten Konfigurationszeichenfolge für einen der oben genannten Moduscodes.


Orientierung und Skript erkennen

Sie können die Ausrichtung von Text in Ihrem Bild und auch das Skript erkennen, in dem er geschrieben ist. Das folgende Bild -

nach dem Durchlaufen des folgenden Codes -

osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)

druckt die folgende Ausgabe.

angle: 90
script: Latin

Nur Ziffern erkennen

Nehmen Sie dieses Bild zum Beispiel -

Der aus diesem Bild extrahierte Text sieht folgendermaßen aus.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

Sie können nur Ziffern erkennen, indem Sie die Konfiguration wie folgt ändern

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

Die Ausgabe sieht folgendermaßen aus.

-- . 43876324
172018
0 76496234

Whitelisting-Zeichen

Angenommen, Sie möchten nur bestimmte Zeichen aus dem angegebenen Bild erkennen und den Rest ignorieren. Sie können Ihre Whitelist mit Zeichen angeben (hier haben wir nur alle Kleinbuchstaben von a bis z verwendet), indem Sie die folgende Konfiguration verwenden.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

Ausgabe -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

Charaktere auf die schwarze Liste setzen

Wenn Sie sicher sind, dass einige Zeichen oder Ausdrücke definitiv nicht in Ihrem Text auftauchen (die OCR gibt ansonsten falschen Text anstelle von Zeichen auf der schwarzen Liste zurück), können Sie diese Zeichen mithilfe der folgenden Konfiguration auf die schwarze Liste setzen.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Ausgabe -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

In mehreren Sprachen erkennen

Sie können die verfügbaren Sprachen überprüfen, indem Sie dies in das Terminal eingeben

$ tesseract --list-langs

Zum Herunterladen von tesseract für eine bestimmte Sprache

$ sudo apt-get install tesseract-ocr-LANG

Dabei ist LANG der dreistellige Code für die Sprache, die Sie benötigen. Sie können die LANG-Werte herausfinden hier.

Ist Sie können die .traindata Datei für die Sprache, aus der Sie benötigen hier und legen Sie es in $TESSDATA_PREFIX Verzeichnis (dies sollte das gleiche sein wie wo das tessdata Verzeichnis ist installiert) und sollte einsatzbereit sein.

Note - Nur Sprachen mit a .traineddata Dateiformat werden von tesseract unterstützt.

Verwenden Sie die, um die Sprache anzugeben, in der Sie Ihre OCR-Ausgabe benötigen -l LANG Argument in der Konfiguration, wobei LANG der 3-Buchstaben-Code für die Sprache ist, die Sie verwenden möchten.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Nehmen Sie dieses Bild zum Beispiel -

Sie können mit mehreren Sprachen arbeiten, indem Sie den Parameter LANG als solchen ändern.

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

und Sie erhalten die folgende Ausgabe -

Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Note - Die Sprache, die zuerst für die angegeben wurde -l Parameter ist die Primärsprache.

Leider verfügt tesseract nicht über eine Funktion zum automatischen Erkennen der Sprache des Textes in einem Bild. Eine alternative Lösung bietet ein anderes Python-Modul namens langdetect die über pip installiert werden kann.

$ pip install langdetect

Dieses Modul erkennt die Sprache des Texts nicht anhand eines Bildes, benötigt jedoch eine Zeichenfolgeneingabe, um die Sprache zu erkennen. Der beste Weg, dies zu tun, besteht darin, zuerst tesseract zu verwenden, um OCR-Text in den Sprachen abzurufen, in denen Sie sich möglicherweise befinden langdetect Um herauszufinden, welche Sprachen im OCR-Text enthalten sind, führen Sie OCR erneut mit den gefundenen Sprachen aus.

Angenommen, wir haben einen Text in Englisch und Portugiesisch.

custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)

Dies sollte eine Liste der Sprachen im Text und ihrer Wahrscheinlichkeiten ausgeben.

[en:0.714282468983554, es:0.2857145605644145]

Die von verwendeten Sprachcodes langdetect Befolgen Sie die ISO 639-1-Codes. Zum Vergleich bitte überprüfen fehlen uns die Worte. und fehlen uns die Worte.. Wir stellen fest, dass die im Text verwendete Sprache stattdessen Englisch und Spanisch ist.

Wir erhalten den Text erneut, indem wir die Konfiguration auf ändern

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

Note - Tesseract funktioniert schlecht, wenn in einem Bild mit mehreren Sprachen die in der Konfiguration angegebenen Sprachen falsch sind oder überhaupt nicht erwähnt werden. Dies kann das langdetect-Modul ebenfalls ziemlich irreführen.


Verwenden von tessdata_fast

Wenn Geschwindigkeit ein wichtiges Anliegen für Sie ist, können Sie Ihre Tessdata-Sprachmodelle durch tessdata_fast-Modelle ersetzen, bei denen es sich um 8-Bit-Ganzzahlversionen der Tessdata-Modelle handelt.

Nach dem tessdata_fast github -

Dieses Repository enthält schnelle Ganzzahlversionen trainierter Modelle für die Tesseract Open Source OCR-Engine.

Diese Modelle funktionieren nur mit der LSTM OCR-Engine von Tesseract 4.

  • Dies ist ein Kompromiss zwischen Geschwindigkeit und Genauigkeit in Bezug auf das beste „Preis-Leistungs-Verhältnis“ in Bezug auf Geschwindigkeit und Genauigkeit.
  • Für einige Sprachen ist dies immer noch am besten, für die meisten jedoch nicht.
  • Die Netzwerkkonfiguration mit dem besten Preis-Leistungs-Verhältnis wurde dann für weitere Geschwindigkeit integerisiert.
  • Die meisten Benutzer möchten diese trainierten Datendateien für OCR verwenden. Diese werden im Rahmen von Linux-Distributionen ausgeliefert, z. Ubuntu 18.04.
  • Feinabstimmung / inkrementelles Training wird NICHT von diesen möglich sein fast Modelle, da sie 8-Bit-Ganzzahlen sind.
  • Bei Verwendung der Modelle in diesem Repository wird nur die neue LSTM-basierte OCR-Engine unterstützt. Das Vermächtnis tesseract Die Engine wird mit diesen Dateien nicht unterstützt, daher funktionieren die OEM-Modi '0' und '2' von Tesseract nicht mit ihnen.

So verwenden Sie tessdata_fast Modelle statt tessdataAlles, was Sie tun müssen, ist Ihre tessdata_fast Sprachdatendatei von hier und platziere es in deinem $TESSDATA_PREFIX Verzeichnis.


Müssen Sie Dokumente, Quittungen oder Rechnungen digitalisieren, aber zu faul zum Codieren? Gehe rüber zu Nanonetze und bauen Sie OCR-Modelle kostenlos!


Training Tesseract zu benutzerdefinierten Daten

Tesseract 4.00 enthält eine neue Erkennungs-Engine auf der Basis eines neuronalen Netzwerks, die eine deutlich höhere Genauigkeit für Dokumentbilder bietet. Neuronale Netze erfordern deutlich mehr Trainingsdaten und trainieren viel langsamer als Base Tesseract. Für lateinische Sprachen wurden die vorhandenen Modelldaten in ungefähr 400000 Textzeilen mit ungefähr 4500 Schriftarten trainiert.

Um das Tesseract 4.0 LSTM-Schulungsprogramm erfolgreich ausführen zu können, benötigen Sie eine funktionierende Installation der Tesseract 4- und Tesseract 4-Schulungstools sowie die Schulungsskripte und erforderlichen trainierten Datendateien in bestimmten Verzeichnissen. Besuch Github Repo für Dateien und Tools.

Tesseract 4.00 benötigt einige Tage bis einige Wochen, um von Grund auf zu trainieren. Trotz all dieser neuen Trainingsdaten gibt es hier nur wenige Optionen für das Training:

  • Feinabstimmung - Beginnen Sie mit einer vorhandenen geschulten Sprache und trainieren Sie Ihre spezifischen zusätzlichen Daten. Zum Beispiel Schulungen zu einem handgeschriebenen Datensatz und einigen zusätzlichen Schriftarten.
  • Schneiden Sie die oberste Schicht ab - aus dem Netzwerk und trainieren Sie eine neue oberste Schicht mit den neuen Daten. Wenn die Feinabstimmung nicht funktioniert, ist dies höchstwahrscheinlich die nächstbeste Option. Die Analogie, warum dies nützlich ist, nehmen Sie für eine Instanz Modelle, die auf ImageNet-Dataset trainiert wurden. Das Ziel ist es, einen Katzen- oder Hundeklassifikator zu erstellen. Niedrigere Schichten im Modell eignen sich gut für die Abstraktion auf niedriger Ebene als Ecken, horizontale und vertikale Linien. Höhere Schichten im Modell kombinieren diese Merkmale und erkennen Katzen- oder Hundeohren, Augen und Nase und so weiter. Indem Sie nur die obersten Ebenen neu trainieren, nutzen Sie das Wissen aus den unteren Ebenen und kombinieren es mit Ihrem neuen unterschiedlichen Datensatz.
  • Von Grund auf neu trainieren - Dies ist ein sehr langsamer Ansatz, es sei denn, Sie verfügen über ein sehr repräsentatives und ausreichend umfangreiches Trainingsset für Ihr Problem. Die beste Ressource für das Training von Grund auf ist dies Github Repo.

Eine Anleitung zum Trainieren und Erstellen Ihrer benutzerdefinierten Daten .traineddata Dateien können gefunden werden hier, hier und hier.

Wir werden den Code für das Training mit Tesseract in diesem Blog-Beitrag nicht behandeln.

Einschränkungen von Tesseract

Tesseract funktioniert am besten, wenn der Vordergrundtext vom Hintergrund sauber segmentiert wird. In der Praxis kann es äußerst schwierig sein, diese Art der Einrichtung zu gewährleisten. Es gibt verschiedene Gründe, warum Tesseract möglicherweise keine qualitativ hochwertige Ausgabe liefert, z. B. wenn das Bild im Hintergrund Rauschen aufweist. Je besser die Bildqualität (Größe, Kontrast, Blitz) ist, desto besser ist das Erkennungsergebnis. Es erfordert ein wenig Vorverarbeitung, um die OCR-Ergebnisse zu verbessern, Bilder müssen entsprechend skaliert werden, so viel Bildkontrast wie möglich aufweisen und der Text muss horizontal ausgerichtet sein. Tesseract OCR ist ziemlich leistungsfähig, weist jedoch die folgenden Einschränkungen auf.

In der Liste zusammengefasste Tesseract-Einschränkungen.

  • Die OCR ist nicht so genau wie einige kommerzielle Lösungen, die uns zur Verfügung stehen.
  • Geeignet nicht für Bilder, die von Artefakten betroffen sind, einschließlich teilweiser Okklusion, verzerrter Perspektive und komplexem Hintergrund.
  • Es ist nicht in der Lage, Handschriften zu erkennen.
  • Es kann Kauderwelsch finden und dies als OCR-Ausgabe melden.
  • Wenn ein Dokument Sprachen enthält, die nicht in den Argumenten -l LANG angegeben sind, sind die Ergebnisse möglicherweise schlecht.
  • Es ist nicht immer gut, die natürliche Lesereihenfolge von Dokumenten zu analysieren. Beispielsweise wird möglicherweise nicht erkannt, dass ein Dokument zwei Spalten enthält, und es wird möglicherweise versucht, Text spaltenübergreifend zu verknüpfen.
  • Scans von schlechter Qualität können zu OCR von schlechter Qualität führen.
  • Es werden keine Informationen darüber angezeigt, zu welchem ​​Text der Schriftfamilie gehört.


Es gibt natürlich eine bessere, viel einfachere und intuitivere Möglichkeit, OCR-Aufgaben auszuführen.


OCR mit Nanonets

Das Nanonets OCR-API Mit dieser Funktion können Sie problemlos OCR-Modelle erstellen. Sie müssen sich nicht um die Vorverarbeitung Ihrer Bilder oder um die Übereinstimmung von Vorlagen oder das Erstellen regelbasierter Engines kümmern, um die Genauigkeit Ihres OCR-Modells zu erhöhen.

Sie können Ihre Daten hochladen, mit Anmerkungen versehen, das Modell auf Training einstellen und warten, bis Vorhersagen über eine browserbasierte Benutzeroberfläche abgerufen werden, ohne eine einzige Codezeile zu schreiben, sich um GPUs zu kümmern oder die richtigen Architekturen für Ihre Deep-Learning-Modelle zu finden. Sie können auch die JSON-Antworten jeder Vorhersage abrufen, um sie in Ihre eigenen Systeme zu integrieren und maschinell lernfähige Apps zu erstellen, die auf modernsten Algorithmen und einer starken Infrastruktur basieren.

Verwenden der GUI: https://app.nanonets.com/

Sie können die Nanonets-OCR-API auch verwenden, indem Sie die folgenden Schritte ausführen: ‌

Schritt 1: Klonen Sie das Repo, installieren Sie Abhängigkeiten

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

Schritt 2: Holen Sie sich Ihren kostenlosen API-Schlüssel
Holen Sie sich Ihren kostenlosen API-Schlüssel von http://app.nanonets.com/#/keys

Nummernschild-Erkennungs-GIF

Schritt 3: Legen Sie den API-Schlüssel als Umgebungsvariable fest

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Schritt 4: Erstellen Sie ein neues Modell

python ./code/create-model.py

Hinweis: Dadurch wird eine MODEL_ID generiert, die Sie für den nächsten Schritt benötigen

Schritt 5: Modell-ID als Umgebungsvariable hinzufügen

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Hinweis: Sie erhalten YOUR_MODEL_ID aus dem vorherigen Schritt

Schritt 6: Laden Sie die Trainingsdaten hoch
Die Trainingsdaten finden Sie in images (Bilddateien) und annotations (Anmerkungen zu den Bilddateien)

python ./code/upload-training.py

Schritt 7: Zugmodell
Beginnen Sie nach dem Hochladen der Bilder mit dem Training des Modells

python ./code/train-model.py

Schritt 8: Modellstatus abrufen
Das Modell benötigt ca. 2 Stunden zum Trainieren. Sie erhalten eine E-Mail, sobald das Modell trainiert ist. In der Zwischenzeit überprüfen Sie den Zustand des Modells

python ./code/model-state.py

Schritt 9: Vorhersage machen
Sobald das Modell trainiert ist. Mit dem Modell können Sie Vorhersagen treffen

python ./code/prediction.py ./images/151.jpg


Nanonette und Menschen in der Schleife

‌‌Der Bildschirm "Moderat" unterstützt die Korrektur- und Eingabevorgänge und reduziert die Arbeitsbelastung des manuellen Prüfers um fast 90% und die Kosten für das Unternehmen um 50%.

Eigenschaften umfassen

  1. Verfolgen Sie die richtigen Vorhersagen
  2. Verfolgen Sie, welche falsch sind
  3. Nehmen Sie Korrekturen an den ungenauen vor
  4. Löschen Sie diejenigen, die falsch sind
  5. Füllen Sie die fehlenden Vorhersagen aus
  6. Filtern Sie Bilder mit Datumsbereichen
  7. Holen Sie sich die Anzahl der moderierten Bilder gegen die nicht moderierten

Alle Felder sind in einer benutzerfreundlichen Benutzeroberfläche strukturiert, die es dem Benutzer ermöglicht, die OCR-Technologie zu nutzen und sie im Laufe der Zeit zu verbessern, ohne Code eingeben oder die Funktionsweise der Technologie verstehen zu müssen.


Zusammenfassung

So wie tiefes Lernen nahezu alle Facetten des Computer-Sehens beeinflusst hat, gilt dies auch für die Zeichen- und Handschrifterkennung. Deep-Learning-basierte Modelle haben es geschafft, eine beispiellose Genauigkeit der Texterkennung zu erzielen, die weit über herkömmliche Ansätze zur Merkmalsextraktion und zum maschinellen Lernen hinausgeht.

Tesseract funktioniert gut, wenn Dokumentbilder den nächsten Richtlinien folgen:

  • Bereinigen Sie die Segmentierung des Vordergrundtextes vom Hintergrund
  • Horizontal ausgerichtet und entsprechend skaliert
  • Hochwertiges Bild ohne Unschärfe und Rauschen

Die neueste Version von Tesseract 4.0 unterstützt Deep Learning-basierte OCR, die wesentlich genauer ist. Die OCR-Engine selbst basiert auf einem LSTM-Netzwerk (Long Short-Term Memory), einer Art RNN (Recurrent Neural Network).

Tesseract eignet sich perfekt zum Scannen sauberer Dokumente und bietet eine ziemlich hohe Genauigkeit und Variabilität der Schriftarten, da die Schulung umfassend war. Ich würde sagen, dass Tesseract eine gute Wahl ist, wenn Sie Bücher, Dokumente und gedruckten Text auf einem sauberen weißen Hintergrund scannen möchten.


Weiterführende Literatur


Quelle: https://nanonets.com/blog/ocr-with-tesseract/

spot_img

Neueste Intelligenz

spot_img