Dieses Kapitel beschreibt, wie Deep Learning-basierte OCR (Deep OCR) genutzt wird.
Mit Deep OCR wird Text in einem Bild lokalisiert und/oder erkannt. Deep OCR findet und erkennt verbundene Zeichen, welche fortan als 'Wörter' bezeichnet werden (im Gegensatz zu OCR-Methoden, die genutzt werden um Zeichen einzeln zu lesen).
Ein Deep OCR-Modell kann aus zwei Komponenten bestehen, welche jeweils unterschiedliche Aufgaben abdecken, nämlich die Lokalisierung von Wörtern und das Erkennen von Wörtern. Standardmäßig wird ein Modell mit beiden Komponenten erstellt, allerdings kann das Modell auch auf eine der Aufgaben reduziert werden.
HALCON stellt bereits vortrainierte Komponenten bereit, welche ohne weiteres Training für eine Vielzahl von Anwendungsfällen geeignet sind, da das erstellte Modell bereits auf einem vielfältigen Datensatz trainiert worden ist und daher mit vielen verschiedenen Schriftarten umgehen kann. Informationen zum verfügbaren Zeichensatz und den Modellparametern können mitget_deep_ocr_param
abgefragt werden.
Um das Lesen von Wörtern auf eine spezifische Aufgabe auszurichten, kann die
für die Erkennung zuständige Komponente (recognition_model
)
des Modells für einen gegebenen Anwendungsbereich mit Deep
Learning-Operatoren nachtrainiert werden.
Dieser Abschnitt beschreibt den Ablauf des Lokalisieren und Erkennens
von Wörtern mit einem Deep OCR-Modell.
Siehe auch das HDevelop-Beispiel
deep_ocr_workflow.hdev
für einen Anwendungsfall.
Mit
wird ein Deep OCR-Modell erstellt, das
aus einer oder beiden der folgenden Modell-Komponenten besteht:
create_deep_ocr
detection_model
und
recognition_model
.
Um die nachtrainierte Modellkomponente anstatt der zur Verfügung gestellten
zu verwenden kann sie im erstellten Modell als
'recognition_model'
mittels
gesetzt werden.
Mit
können Modellparameter gesetzt werden,
beispielsweise bezüglich der verwendeten Hardware-Einheit, der
Bilddimensionen oder Mindest-Scores.
set_deep_ocr_param
Das Deep OCR-Modell wird mit
auf die
aufgenommenen Bilder angewandt. Die Ergebnisse der Inferenz
sind von den verwendeten Modell-Komponenten abhängig. Siehe
apply_deep_ocr
für Details zu den Dictionary-Einträgen
der jeweiligen Modellzusammensetzungen.
apply_deep_ocr
Die Ergebnisse der Inferenz können aus dem Dictionary
abgefragt werden. Zur Visualisierung der
Ergebnisse und Scores stehen einige Prozeduren zur Verfügung:
DeepOCRResult
Anzeigen der Position und/oder des erkannten Wortes mit
dev_display_deep_ocr_results
.
Anzeigen der Position (und, falls inferiert, des erkannten Wortes)
mit dev_display_deep_ocr_results_preprocessed
(nur falls die
Modellkomponente detection_model
enthalten ist).
Visualisierung der Scores mit
dev_display_deep_ocr_score_maps
(nur falls die
Modellkomponente detection_model
enthalten ist).
Dieser Abschnitt beschreibt das Nachtrainieren und die Evaluierung der
für das Erkennen von Wörtern zuständige Komponente eines Deep OCR Modells
mit eigenen Daten.
Siehe auch das HDevelop-Beispiel
deep_ocr_recognition_training_workflow.hdev
für ein Anwendungsbeispiel.
Dieser Abschnitt behandelt die notwendigen Anpassungen des Datensatzes.
Die Informationen des Datensatzes müssen eingelesen werden. Dazu kann die Prozedur
read_dl_dataset_ocr_recognition
verwendet werden.
Dabei wird ein Dictionary DLDataset
erstellt, welches als Datenbank dient und alle notwendigen
Informationen über die Daten abspeichert.
Für mehr Information zu den Daten und wie sie
übergeben werden, wird auf den unteren Absatz „Daten“ und das
Kapitel Deep Learning / Modell verwiesen.
Die Daten von DLDataset
sollen in drei
getrennte Datensätze aufgeteilt werden. Dazu kann die Prozedur
split_dl_dataset
verwendet werden.
Das Netzwerk stellt mehrere Anforderungen an die Bilder (wie z.B. die Bilddimensionen und den Grauwertbereich). Diese Werte können mit
abgefragt werden. Dafür muss das Modell erst eingelesen werden mittels
Der Datensatz kann nun vorverarbeitet werden. Dazu kann die Prozedur
preprocess_dl_dataset
verwendet werden.
Um diese Prozedur zu verwenden, müssen die Vorverarbeitungsparameter
wie z.B. die Bildgröße festgelegt werden.
Die Parameter und ihre Werte sind im Dictionary
DLPreprocessParam
zu speichern.
Zur Erzeugung dieses Dictionarys kann die Prozedur
create_dl_preprocess_param_from_model
.
verwendet werden.
Es wird empfohlen, das Dictionary DLPreprocessParam
abzuspeichern, um während der späteren Inferenz-Phase Zugang zu
den Werten zu haben.
Dieser Abschnitt behandelt das Trainieren der Erkennungs-Komponente eines Deep OCR-Modells.
Setzen der Trainingsparameter und Abspeichern derselben im
Dictionary TrainParam
.
Für dies kann die Prozedur
create_dl_train_param
verwendet werden.
Trainieren des Modells. Dafür kann die Prozedur
train_dl_model
verwendet werden. Diese Prozedur benötigt:
das Handle des Modells, DLModelHandle
das Dictionary mit den Informationen über den Datensatz,
DLDataset
das Dictionary mit den Trainingsparametern, TrainParam
Dieser Abschnitt behandelt das Evaluieren eines Deep OCR-Modells.
Setzen aller Modellparameter, welche die Evaluieren beeinflussen können.
Die Evaluierung kann bequem mit der Prozedur
evaluate_dl_model
durchgeführt werden.
Diese Prozedur erwartet ein Dictionary GenParamEval
mit den
Evaluierungsparametern.
Das Dictionary EvaluationResults
enthält die
angefragten Evaluierungsmaße.
Um einen Eindruck von der Leistung des nachtrainierten Modells
im Verhältnis zum bereits vortrainierten Modell zu erhalten können
deren Genauigkeitsmaße verglichen werden.
Nach einer erfolgreichen Evaluierung kann das nachtrainierte Modell für die Inferenz verwendet werden (siehe weiter oben, im Abschnitt „Allgemeiner Workflow der Deep OCR Inferenz“).
Dieser Abschnitt enthält Informationen bezüglich Daten, die für die den verschiedenen Schritten der Deep OCR benötigt werden.
Es wird zwischen den Daten für Training und Evaluierung versus Daten für Inferenz unterschieden. Letztere bestehen ausschließlich aus Bildern. Wie die Daten zur Verfügung gestellt werden müssen, wird in den entsprechenden Abschnitten weiter unten erläutert.
Ein Grundgedanke der Datenhandhabung: Das Modell interagiert mit den Daten
über Dictionaries.
Dies bedeutet, das Modell erhält die Eingabedaten über das Dictionary
und gibt die Ausgabe über das Dictionary
DLSample
, bzw. DLResult
zurück.
Für weitere Informationen zur Datenhandhabung wird auf das Kapitel
Deep Learning / Modell verwiesen.
DLTrainResult
Der Datensatz besteht aus Bildern und den dazugehörigen Informationen. Damit das Modell diese verarbeiten kann, müssen sie bestimmte Anforderungen erfüllen. Informationen zu den Bildanforderungen finden sich im unteren Abschnitt „Bilder“.
Die Trainingsdaten werden dazu genutzt, ein Netzwerk für ein spezifisches Szenario zur Erkennung von Wörtern zu trainieren. Mit Hilfe dieser Daten kann das Netzwerk lernen Beispieltexte zu erkennen, welche Wörtern ähneln die während der Inferenz auftreten können. Dafür notwendig ist, dass das abgebildete Wort für jedes Trainings- und Evaluierungsbild zur Verfügung gestellt wird.
Wie die Daten in HALCON für ein DL Modell vorliegen müssen, wird
im Kapitel Deep Learning / Modell erklärt.
Kurz gefasst fungiert ein Dictionary
als Datenbank
der Informationen, die von den Trainings- und Evaluierungs-Prozeduren
benötigt werden.
DLDataset
Die Daten für
können auf zwei Arten zur Verfügung
gestellt werden. In beiden Fällen kann der Datensatz mit
DLDataset
read_dl_dataset_ocr_recognition
eingelesen und den
Anforderungen entsprechend konvertiert werden.
In diesem Fall müssen Bilder zur Verfügung gestellt werden, auf denen die enthaltenen Wörter mit orientierten umschließenden Rechtecken gelabelt sind. Die Bilder können direkt mit Hilfe des MVTec Deep Learning Tools gelabelt werden (erhältlich auf der MVTec Webseite). Der Datensatz muss folgendermaßen aufgebaut sein:
'class_ids'
: IDs der Klassen
'class_names'
: Namen der Klassen (Muss eine Klasse 'word'
enthalten. Alle weiteren Klassen werden ignoriert.)
'image_dir'
: Pfad zum Bilderverzeichnis
'samples'
: Dictionary mit allen Samples
'image_file_name'
: Name der Bilddatei
'image_id'
: Bild-ID
'bbox_col'
: Spaltenkoordinate des
umschließenden Rechtecks
'bbox_row'
: Zeilenkoordinate des
umschließenden Rechtecks
'bbox_phi'
: Winkel des
umschließenden Rechtecks
'bbox_length1'
: Länge der ersten Halbachse des
umschließenden Rechtecks
'bbox_length2'
: Länge der zweiten Halbachse des
umschließenden Rechtecks
'label_custom_data'
: Liste
'text'
zu lesendes Wort
In diesem Fall müssen Bilder auf jeweils ein Wort zugeschnitten sein. Der Datensatz muss folgendermaßen aufgebaut sein:
'image_dir'
: Pfad zum Bilderverzeichnis
'samples'
: Dictionary mit allen Samples
'image_file_name'
: Name der Bilddatei
'image_id'
: Bild-ID
'word'
: zu lesendes Wort
Das Beispielprogramm deep_ocr_prelabel_dataset.hdev
kann zum
zum Vorlabeln der Daten verwendet werden.
Die Trainingsdaten müssen den ganzen Zeichensatz, der bei der Inferenz
auftreten kann abdecken. Falls ein Zeichen gar nicht oder nur sehr
selten im Traningsdatensatz vorkommt kann das Modell dieses Zeichen
nur ungenügend lernen. Um einen Überblick über die Häufigkeit
der Zeichen innerhalb eines Datensatzes zu erhalten kann die Prozedur
gen_dl_dataset_ocr_recognition_statistics
zur Erzeugung von
Statistiken verwendet werden.
Es sollten genügend Trainingsdaten vorliegen um diese in die drei Untermengen aufzuteilen, welche für das Training, die Evaluierung und das Testen des Netzwerks verwendet werden. Diese Untermengen sind idealerweise unabhängig und gleich verteilt, siehe den Abschnitt „Daten“ im Kapitel Deep Learning.
Unabhängig von der Anwendung stellt das Netzwerk Anforderungen an die
Bilder wie z.B. die Bilddimensionen.
Die spezifischen Werte hängen vom Netzwerk selbst ab, für die
spezifischen Werte der verschiedenen Netzwerke siehe die Dokumentation
von
.
Für ein eingelesenes Netzwerk können die Werte mit
read_dl_model
abgefragt werden.
Um diese Anforderungen zu erfüllen, müssen die Bilder eventuell
vorverarbeitet werden.
Die Standard-Vorverarbeitung für das ganze Sample und damit auch für das
Bild kann mit Hilfe der Prozedur get_dl_model_param
preprocess_dl_samples
durchgeführt werden.
Anforderungen an Bilder die zur Inferenz verwendet werden sind in
beschrieben.
apply_deep_ocr
Die Netzwerk Ausgabe hängt vom Arbeitsschritt ab:
Als Ausgabe gibt das Modell ein Dictionary
mit
dem aktuellen Wert der Gesamt-Zielfunktion sowie den Werten aller
weiteren im Modell enthaltenen Zielfunktionen zurück.
DLTrainResult
Als Ausgabe gibt das Netzwerk für jedes Bild ein Dictionary
zurück.
In diesem Dictionary ist das erkannte Wort, sowie die Kandidaten und
deren Konfidenzen für jedes Zeichen dieses Wortes, enthalten
DLResult
apply_deep_ocr
create_deep_ocr
get_deep_ocr_param
read_deep_ocr
set_deep_ocr_param
write_deep_ocr