Deep OCR

Liste der Operatoren ↓

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

image/svg+xml
Ein mögliches Beispiel für Deep OCR: In einem Bild werden Wörter lokalisiert und erkannt.

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 mit get_deep_ocr_paramget_deep_ocr_paramGetDeepOcrParamGetDeepOcrParamGetDeepOcrParamget_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.
image/svg+xml 'lemon'
Die Erkennungs-Komponente kann besser auf die Anwendung abgestimmt werden indem das Deep OCR-Modell mit eigenen Daten nachtrainiert wird.
In den folgenden Abschnitten werden der allgemeine Workflow, sowie das Nachtrainieren erläutert.

Allgemeiner Workflow der Deep OCR Inferenz

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.

Erstellen des Deep OCR-Modells

Mit create_deep_ocrcreate_deep_ocrCreateDeepOcrCreateDeepOcrCreateDeepOcrcreate_deep_ocr wird ein Deep OCR-Modell erstellt, das aus einer oder beiden der folgenden Modell-Komponenten besteht:

Um die nachtrainierte Modellkomponente anstatt der zur Verfügung gestellten zu verwenden kann sie im erstellten Modell als 'recognition_model'"recognition_model""recognition_model""recognition_model""recognition_model""recognition_model" mittels

gesetzt werden.

Inferenz

Mit set_deep_ocr_paramset_deep_ocr_paramSetDeepOcrParamSetDeepOcrParamSetDeepOcrParamset_deep_ocr_param können Modellparameter gesetzt werden, beispielsweise bezüglich der verwendeten Hardware-Einheit, der Bilddimensionen oder Mindest-Scores.

Das Deep OCR-Modell wird mit apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr auf die aufgenommenen Bilder angewandt. Die Ergebnisse der Inferenz sind von den verwendeten Modell-Komponenten abhängig. Siehe apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr für Details zu den Dictionary-Einträgen der jeweiligen Modellzusammensetzungen.

Die Ergebnisse der Inferenz können aus dem Dictionary DeepOCRResultDeepOCRResultDeepOCRResultDeepOCRResultdeepOCRResultdeep_ocrresult abgefragt werden. Zur Visualisierung der Ergebnisse und Scores stehen einige Prozeduren zur Verfügung:

Training und Evaluierung der Erkennungs-Komponente

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.

Vorverarbeitung des Datensatzes

Dieser Abschnitt behandelt die notwendigen Anpassungen des Datensatzes.

  1. 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.

  2. Die Daten von DLDataset sollen in drei getrennte Datensätze aufgeteilt werden. Dazu kann die Prozedur

    • split_dl_dataset

    verwendet werden.

  3. 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

  4. 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.

Trainieren des Modells

Dieser Abschnitt behandelt das Trainieren der Erkennungs-Komponente eines Deep OCR-Modells.

  1. Setzen der Trainingsparameter und Abspeichern derselben im Dictionary TrainParam. Für dies kann die Prozedur

    • create_dl_train_param

    verwendet werden.

  2. Trainieren des Modells. Dafür kann die Prozedur

    • train_dl_model

    verwendet werden. Diese Prozedur benötigt:

    • das Handle des Modells, DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle

    • das Dictionary mit den Informationen über den Datensatz, DLDataset

    • das Dictionary mit den Trainingsparametern, TrainParam

Evaluierung des trainierten Modells

Dieser Abschnitt behandelt das Evaluieren eines Deep OCR-Modells.

  1. Setzen aller Modellparameter, welche die Evaluieren beeinflussen können.

  2. Die Evaluierung kann bequem mit der Prozedur

    • evaluate_dl_model

    durchgeführt werden. Diese Prozedur erwartet ein Dictionary GenParamEval mit den Evaluierungsparametern.

  3. 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“).

Daten

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 DLSampleDLSampleDLSampleDLSampleDLSampledlsample und gibt die Ausgabe über das Dictionary DLResultDLResultDLResultDLResultDLResultdlresult, bzw. DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result zurück. Für weitere Informationen zur Datenhandhabung wird auf das Kapitel Deep Learning / Modell verwiesen.

Daten für das Training und die Evaluierung

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 DLDatasetDLDatasetDLDatasetDLDatasetDLDatasetdldataset als Datenbank der Informationen, die von den Trainings- und Evaluierungs-Prozeduren benötigt werden.

Die Daten für DLDatasetDLDatasetDLDatasetDLDatasetDLDatasetdldataset können auf zwei Arten zur Verfügung gestellt werden. In beiden Fällen kann der Datensatz mit read_dl_dataset_ocr_recognition eingelesen und den Anforderungen entsprechend konvertiert werden.

Datensatz basierend auf Bilder mit gelabelten Wörtern

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

Datensatz basierend Bildern, die auf ein Wort zugeschnitten sind

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.

Bilder

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 read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModelread_dl_model. Für ein eingelesenes Netzwerk können die Werte mit get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 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 preprocess_dl_samples durchgeführt werden.

Anforderungen an Bilder die zur Inferenz verwendet werden sind in apply_deep_ocrapply_deep_ocrApplyDeepOcrApplyDeepOcrApplyDeepOcrapply_deep_ocr beschrieben.

Netzwerk Ausgabe

Die Netzwerk Ausgabe hängt vom Arbeitsschritt ab:

Training

Als Ausgabe gibt das Modell ein Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result mit dem aktuellen Wert der Gesamt-Zielfunktion sowie den Werten aller weiteren im Modell enthaltenen Zielfunktionen zurück.

Inferenz und Evaluierung

Als Ausgabe gibt das Netzwerk für jedes Bild ein Dictionary DLResultDLResultDLResultDLResultDLResultdlresult zurück. In diesem Dictionary ist das erkannte Wort, sowie die Kandidaten und deren Konfidenzen für jedes Zeichen dieses Wortes, enthalten


Liste der Operatoren

apply_deep_ocrApplyDeepOcrapply_deep_ocrApplyDeepOcrapply_deep_ocr
Anwenden eines Deep OCR-Modells auf mehreren Bildern.
create_deep_ocrCreateDeepOcrcreate_deep_ocrCreateDeepOcrcreate_deep_ocr
Erstellen eines Deep OCR-Modells.
get_deep_ocr_paramGetDeepOcrParamget_deep_ocr_paramGetDeepOcrParamget_deep_ocr_param
Auslesen der Parameter des Deep OCR-Modells.
read_deep_ocrReadDeepOcrread_deep_ocrReadDeepOcrread_deep_ocr
Lesen eines Deep OCR-Modells aus einer Datei.
set_deep_ocr_paramSetDeepOcrParamset_deep_ocr_paramSetDeepOcrParamset_deep_ocr_param
Setzen der Parameter des Deep OCR-Modells.
write_deep_ocrWriteDeepOcrwrite_deep_ocrWriteDeepOcrwrite_deep_ocr
Abspeichern eines Deep OCR-Modells in eine Datei.