OCR mit Tesseract, OpenCV und Python PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

OCR mit Tesseract, OpenCV und Python

OCR mit Tesseract, OpenCV und Python

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

Inhaltsverzeichnis

Einleitung

OCR = Optical Character Recognition. Mit anderen Worten, OCR-Systeme wandeln ein zweidimensionales Textbild, das maschinengedruckten oder handgeschriebenen Text enthalten könnte, von seiner Bilddarstellung in maschinenlesbaren Text um. OCR als Prozess besteht im Allgemeinen aus mehreren Teilprozessen, um sie so genau wie möglich durchzuführen. Die Teilprozesse 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 weithin verwendet, um eine automatisierte Texteingabe in computergestützte Systeme bereitzustellen. Doch in all dieser Zeit haben herkömmliche OCR-Systeme (wie zonale OCR) haben nie ihre Unfähigkeit überwunden, mehr als eine Handvoll Schriftarten und Seitenformate zu lesen. Schriften mit proportionalem Abstand (die praktisch alle Schriftsätze umfassen), Laserdrucker-Fonts und sogar viele nichtproportionale Schreibmaschinen-Fonts blieben außerhalb der Reichweite dieser Systeme. Und als Ergebnis hat die herkömmliche OCR nie mehr als einen marginalen Einfluss auf die Gesamtzahl der Dokumente, die in digitale Form konvertiert werden müssen.

OCR mit Tesseract, OpenCV und Python
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


Haben Sie ein OCR-Problem im Sinn? Möchten Sie die Dateneingabekosten Ihres Unternehmens senken? Geh 'rüber zu Nanonetze und bauen Sie OCR-Modelle auf Extrahieren Sie Text aus Bildern or Daten aus PDFs extrahieren mit KI-basiert PDF OCR!


Open-Source-OCR-Tools

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.

OCR mit Tesseract, OpenCV und Python
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-Engine zur Texterkennung (OCR), die unter der Apache 2.0-Lizenz verfügbar ist. Es kann direkt oder (für Programmierer) mit einer API verwendet werden, um gedruckten Text aus Bildern zu extrahieren. Es unterstützt eine Vielzahl von Sprachen. Tesseract hat keine eingebaute GUI, aber es gibt mehrere von der 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 mit Tesseract, OpenCV und Python
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 Python-basiertes LSTM von OCRopus 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.

OCR mit Tesseract, OpenCV und Python
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.

OCR mit Tesseract, OpenCV und Python
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 es ein Bild segmentiert. Wenn Sie nur einen kleinen Bereich mit OCR versehen möchten, versuchen Sie es mit einem anderen Segmentierungsmodus, indem Sie den verwenden –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.

OCR mit Tesseract, OpenCV und Python
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 –

OCR mit Tesseract, OpenCV und Python
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.

OCR mit Tesseract, OpenCV und Python
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.

OCR mit Tesseract, OpenCV und Python

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.

OCR mit Tesseract, OpenCV und Python


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.

OCR mit Tesseract, OpenCV und Python

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 -
OCR mit Tesseract, OpenCV und Python
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 -
OCR mit Tesseract, OpenCV und Python
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 -
OCR mit Tesseract, OpenCV und Python
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 performt schlecht, wenn in einem Image mit mehreren Sprachen die in der Konfiguration angegebenen Sprachen falsch sind oder gar nicht erwähnt werden. Dies kann das langdetect-Modul auch ziemlich in die Irre fü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 Geschwindigkeits-/Genauigkeitskompromiss hinsichtlich des besten "Preis-Leistungs-Verhältnisses" 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 engine wird mit diesen Dateien nicht unterstützt, daher funktionieren Tesseracts OEM-Modi '0' und '2' 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 einen neuen Top-Layer 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 einem ImageNet-Datensatz 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 wie Ecken, horizontale und vertikale Linien, aber höhere Schichten im Modell kombinieren diese Merkmale und erkennen Katzen- oder Hundeohren, Augen und Nase und so weiter. Indem Sie nur die oberen Schichten neu trainieren, verwenden Sie das Wissen aus den unteren Schichten und kombinieren es mit Ihrem neuen, anderen 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.

OCR mit Tesseract, OpenCV und Python

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.
  • Funktioniert nicht gut mit Bildern, die von Artefakten wie teilweiser Okklusion, verzerrter Perspektive und komplexem Hintergrund betroffen sind.
  • 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

OCR mit Tesseract, OpenCV und Python

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

OCR mit Tesseract, OpenCV und Python

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 Eingabeprozesse und reduziert die Arbeitsbelastung des manuellen Prüfers um fast 90 % und die Kosten für die Organisation um 50 %.

OCR mit Tesseract, OpenCV und Python

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.


Haben Sie ein OCR-Problem im Sinn? Möchten Sie die Dateneingabekosten Ihres Unternehmens senken? Geh 'rüber zu Nanonetze und bauen Sie OCR-Modelle auf Extrahieren Sie Text aus Bildern or Daten aus PDFs extrahieren!


Zusammenfassung

So wie sich Deep Learning auf nahezu alle Facetten der Computer Vision ausgewirkt hat, gilt dies auch für die Zeichenerkennung und die Handschrifterkennung. Auf Deep Learning basierende Modelle haben es geschafft, eine beispiellose Texterkennungsgenauigkeit zu erreichen, die weit über die herkömmliche hinausgeht Informationsextraktion und Bildverarbeitung durch maschinelles Lernen Ansätze.

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

Update:
Viele Leute haben uns gefragt, wie sie das Datum in Form von Text erhalten oder verwenden können, wenn es ein Datum oder andere spezifische Daten erkennt, damit sie es an die Liste anhängen können.
Hier ist die Antwort:
Im Code zum Zeichnen eines Begrenzungsrahmens um das Datumsfeld werden Sie eine Linie bemerken, die dem Regex-Muster entspricht d['text']. Es zeichnet nur dann ein Kästchen, wenn das Muster übereinstimmt. Sie könnten die Werte einfach extrahieren d['text'] Sobald das Muster übereinstimmt, und sie an eine Liste anhängen.

Update 2:
Um Fragen zu nicht-englischer OCR zu beantworten, haben wir weitere Literaturlisten aktualisiert.

Zeitstempel:

Mehr von KI & Maschinelles Lernen