Klassifikation

Liste der Operatoren ↓

Dieses Kapitel beschreibt, wie Deep Learning-basierte Klassifikation in der Trainings- und Inferenzphase genutzt wird.

Deep Learning-basierte Klassifikation ist eine Methode, bei der einem Bild eine Menge an Konfidenzwerten zugeordnet werden. Diese Konfidenzwerte geben an, wie wahrscheinlich das Bild zu jeder der zu unterscheidenden Klassen gehört. Folglich bedeutet Klassifikation, soweit nur die beste Vorhersage berücksichtigt wird, die Zuordnung einer spezifischen Klasse aus einer Menge an Klassen zu einem Bild. Dies wird im folgenden Schema dargestellt.

image/svg+xml orange: 0.03 apple: 0.85 lemon: 0.12
Ein mögliches Beispiel zur Klassifikation in dem das Netzwerk zwischen drei Klassen unterscheidet. Für das Eingabebild werden Konfidenzwerte für jede der drei zu unterscheidenden Klassen bestimmt: 'apple' 0.85, 'lemon' 0.03, und 'orange' 0.12. Die beste Vorhersage sagt uns, dass das Bild als 'apple' erkannt wird.

Um Ihre spezifische Aufgabe zu erledigen, also Ihre vorliegende Daten in die zu unterscheidenden Klassen einzuteilen, muss der Klassifikator entsprechend trainiert werden. In HALCON wird eine Technik verwendet, die Transferlernen genannt wird (siehe auch das Kapitel Deep Learning). Dabei werden vortrainierte Netzwerke (Klassifikatoren) zur Verfügung gestellt, welche mit einer riesigen Anzahl gelabelter Bilddaten trainiert wurden. Diese Klassifikatoren wurden trainiert und getestet um industrielle Bildklassifikationsaufgaben gut zu lösen. Ein solcher Klassifikator, der bereits für allgemeine Klassifikation trainiert wurde, wird nun für die geforderte Aufgabe nachtrainiert. Dafür muss der Klassifikator wissen, welche Klassen unterschieden werden müssen und wie Beispiele dieser Klassen aussehen. Diese Informationen erhält er aus Ihrem Datensatz, d.h. aus Ihren Bildern und den von Ihnen vergebenen Ground Truth Labels, den Ground Truth Klassenzugehörigkeiten. Weitere Informationen zu den Anforderungen an die Daten sind im Abschnitt „Daten für die Klassifikation“ zu finden.

Die spezifischen Systemanforderungen zur Anwendung von Deep Learning-basierter Klassifikation können im HALCON „Installation Guide“ eingesehen werden.

Ablauf

Für einen kurzen und einfachen Überblick kann das HDevelop Beispiel classify_fruit_deep_learning.hdev herangezogen werden. Das Beispiel classify_pill_defects_deep_learning.hdev zeigt einen komplexeren Ablauf. Beide Beispiele können unter examples/hdevelop/Deep-Learning/Classification/ gefunden werden und bieten Anleitungen, wie die verschiedenen Teile zusammen verwendet werden können.

Vorbereitung des Netzwerks und der Daten
  1. Erst muss ein vortrainierter Klassifikator mit dem Operator

    eingelesen werden. Dieser Operator wird auch dazu verwendet, um fertig trainierte Klassifikatoren, die mit write_dl_classifierwrite_dl_classifierWriteDlClassifierWriteDlClassifierWriteDlClassifier geschrieben wurden, einzulesen.

  2. Um die Daten für das Deep Learning Klassifikationstraining zu laden, steht die Prozedur

    • read_dl_classifier_data_set

    zur Verfügung. Diese Prozedur gibt eine Liste von Pfaden der Bilddateien, eine Liste der zugehörigen Ground Truth Labels (wahren Klassen) sowie eine Liste aller vorkommenden Klassen zurück.

  3. Der Klassifikator stellt mehrere Anforderungen an die Bilder, wie die Bilddimensionen und den Grauwertbereich. Die Defaultwerte sind in read_dl_classifierread_dl_classifierReadDlClassifierReadDlClassifierReadDlClassifier aufgelistet. Mit diesen Werten wurden die Netzwerke vortrainiert. Die Netzwerkarchitekturen erlauben verschiedene Bilddimensionen, welche über set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam gesetzt werden können, aber je nach Netzwerk macht eine Änderung ein Nachtrainieren notwendig. Die aktuellen Werte können mit

    abgefragt werden.

    Die Prozedur preprocess_dl_classifier_images hilft bei der Implementierung einer entsprechenden Vorverarbeitung. Wir empfehlen, alle für das Training benötigten Bilder vor dem Training vorzuverarbeiten und abzuspeichern, was das Trainieren signifikant beschleunigt.

  4. Als nächstes wird empfohlen die Daten in drei getrennte Datensätze zu teilen, die für Training, Validierung und Testen verwendet werden (siehe Abschnitt „Daten“ im Kapitel Deep Learning). Dazu kann die Prozedur

    • split_dl_classifier_data_set.

    verwendet werden.

  5. Dem Klassifikator muss mitgeteilt werden, welche Klassen er unterscheiden soll. Dazu werden die zuvor mit read_dl_classifier_data_set eingelesenen Klassen mit dem Operator

    und dem Parameter 'classes'"classes""classes""classes""classes" gesetzt.

    Dieser Operator kann auch verwendet werden, um Hyperparameter, die für das Training wichtig sind (z.B. 'batch_size'"batch_size""batch_size""batch_size""batch_size" und 'learning_rate'"learning_rate""learning_rate""learning_rate""learning_rate"), zu setzen. Für eine detailliertere Erklärung siehe das Kapitel Deep Learning und die Dokumentation von set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam.

Training des Klassifikators und Auswertung des Trainingsfortschritts

Sobald der Klassifikator und der Datensatz vorbereitet sind, kann der Klassifikator für die neue Aufgabe nachtrainiert werden.

  1. Setzen der Hyperparameter, die für das Training verwendet werden, mit dem Operator

    Für einen Überblick über mögliche Hyperparameter siehe set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam. Zusätzliche Erklärungen können im Kapitel Deep Learning gefunden werden.

  2. Zum Trainieren des Klassifikators steht der Operator

    zur Verfügung. Zwischenergebnisse des Trainings werden im Ausgabehandle dieses Operators gespeichert.

    Wie der Name suggeriert, verarbeitet der Operator train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatch einen Batch von Trainingsdaten (Bilder und Ground Truth Label) in einem Schritt. Dafür wird über die Trainingsdaten iteriert, um den Klassifikator sukzessiv mit train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatch zu trainieren. Dieser Prozess wird für so viele Epochen wiederholt, bis das Trainingsergebnis zufriedenstellend ist.

  3. Um den Trainingsfortschritt zu veranschaulichen, wird die Prozedur

    • plot_dl_classifier_training_progress

    bereitgestellt. Damit kann der Klassifikationsfehler während des Trainings visualisiert werden. Die zur Darstellung notwendigen Eingaben können über die Prozeduren

    • select_percentage_dl_classifier_data,

    • apply_dl_classifier_batchwise und

    • evaluate_dl_classifier

    erhalten werden. Mit diesen Prozeduren kann die Anzahl der Bilder für die Evaluierung verringert werden, der Klassifikator auf die ausgewählten Daten angewendet werden und zum Beispiel der Top-1 Fehler berechnet werden. Das HDevelop Beispiel classify_pill_defects_deep_learning.hdev zeigt, wie diese Prozeduren zusammen verwendet werden können.

Anwenden und Evaluieren des finalen Klassifikators

Nun ist der Klassifikator für die spezifische Anwendung trainiert und bereit zur Anwendung. Doch zuvor sollte noch evaluiert werden, wie gut sich der Klassifikator auf den Testdaten verhält.

  1. Um den Klassifikator auf einer beliebigen Anzahl Bilder anzuwenden, wird der Operator

    verwendet. Die Laufzeit dieses Operators hängt von der Anzahl von Batches ab, die für den gegebenen Bilddatensatz benötigt werden.

    Die Ergebnisse werden in einem Handle gespeichert.

    Die vorausgesagten Klassen und Konfidenzen werden mit dem Operator

    abgefragt.

  2. Jetzt können die Ergebnisse ausgewertet werden. Die Leistung des Klassifikators kann während des Trainings mit der Prozedur evaluate_dl_classifier ausgewertet werden.

    Um die Qualität des Klassifikators zu analysieren und zu visualisieren, ist die Konfusionsmatrix ein nützliches Hilfsmittel (für eine Erklärung wird auf das Kapitel Deep Learning verwiesen). Dafür können die Prozeduren

    • gen_confusion_matrix

    • gen_interactive_confusion_matrix.

    verwendet werden. Die interaktive Prozedur ermöglicht es, Beispiele einer spezifischen Kategorie auszuwählen, funktioniert aber nicht mit exportiertem Code.

    Zusätzlich kann, nachdem der Klassifikator auf einen Datensatz angewandt wurde, die Prozedur

    • get_dl_classifier_image_results

    verwendet werden, um Bilder nach bestimmten Kriterien zu selektieren und anzuzeigen, zum Beispiel Bilder die falsch klassifiziert wurden. Weiter kann dies als Eingabe für die Prozedur

    • dev_display_dl_classifier_heatmap,

    verwendet werden, um eine Heatmap für ein Bild anzuzeigen. Mit dieser Heatmap kann analysiert werden, welche Bildregionen für das Klassifikationsergebnis ausschlaggebend sind.

Inferenzphase

Ist der Klassifikator trainiert und seine Leistung zufriedenstellend, kann er für die Klassifikation neuer Bilder verwendet werden. Dafür müssen die Bilder entsprechend den Anforderungen des Klassifikators vorverarbeitet werden (d.h. auf dieselbe Art und Weise wie für das Training). Danach können sie mit

klassifiziert werden.

Daten für die Klassifikation

Es wird zwischen Daten für Training und Inferenz unterschieden. Letztere bestehen ausschließlich aus Bildern. Für Erstere ist jedoch bereits bekannt zu welcher Klasse die Bilder gehören. Die entsprechenden Informationen werden über die Labels zur Verfügung gestellt.

Die Trainingsdaten werden dazu genutzt einen Klassifikator für eine spezifische Aufgabe zu trainieren. Mit Hilfe dieser Daten kann der Klassifikator lernen, welche Klassen zu unterscheiden sind und wie deren Vertreter aussehen. Bei der Klassifikation wird das Bild als Ganzes klassifiziert. Daher bestehen die Trainingsdaten aus Bildern und deren Ground Truth Labeln, also die Klasse zu dem das Bild gehört. Zu beachten ist hierbei, dass die Bilder möglichst repräsentativ für die spätere Aufgabe sein sollten. Es gibt verschiedene Möglichkeiten, wie die Ground Truth Klassen als Label gespeichert und abgerufen werden können. Auf folgende Weisen können die Ground Truth Label eines Bildes von der Prozedur read_dl_classifier_data_set gelesen werden:

Zum Trainieren eines Klassifikators wird eine Technik namens Transferlernen verwendet (siehe das Kapitel Deep Learning). Die Anzahl benötigter Bilder ist dabei zwar geringer, für einen geeigneten Datensatz wird üblicherweise aber immer noch eine Anzahl in den Hundertern bis Tausendern pro Klasse benötigt. Während der Klassifikator generell verlässlicher ist, wenn er mit einem größeren Datensatz trainiert wurde, hängt die Anzahl benötigter Bilder auch von der Komplexität der Aufgabe ab. Es sollten außerdem genug Trainingsdaten vorliegen um diese in die drei Untermengen aufzuteilen, welche idealerweise unabhängig und gleich verteilt sind (siehe Abschnitt „Daten“ im Kapitel Deep Learning).

Unabhängig von der Anwendung, stellt der Klassifikator Anforderungen an die Bilder bezüglich Bilddimensionen, Grauwertbereich und Bildtyp. Die spezifischen Werte sind abhängig vom Klassifikator selbst und können mit get_dl_classifier_paramget_dl_classifier_paramGetDlClassifierParamGetDlClassifierParamGetDlClassifierParam abgefragt werden. Eine Anleitung zur Implementierung einer entsprechenden Vorverarbeitung gibt die Prozedur preprocess_dl_classifier_images.

Interpretation der Klassifikationsergebnisse

Bei der Klassifikation eines Bildes wird eine Menge von Konfidenzwerten erhalten, welche die Zugehörigkeit des Bildes zu jeder Klasse angibt. Es können außerdem die folgenden Werte berechnet werden.

Konfusionsmatrix, Precision, Recall, und F-score

Bei der Klassifikation werden ganze Bilder klassifiziert. Daher sind die Instanzen der Konfusionsmatrix Bilder. Für weitere Informationen zur Konfusionsmatrix wird auf das Kapitel Deep Learning verwiesen.

Eine Konfusionsmatrix kann mit Hilfe der Prozeduren gen_confusion_matrix und gen_interactive_confusion_matrix generiert werden. Die interaktive Prozedur ermöglicht es, Beispiele einer spezifischen Kategorie auszuwählen, funktioniert aber nicht mit exportiertem Code.

Mehrere Bewertungsmaße können aus der Konfusionsmatrix abgeleitet werden: Die Precision ist das Verhältnis aller korrekt vorhergesagten Positivinstanzen zu allen positiv vorhergesagten Instanzen. Es stellt ein Maß dafür dar, wie viele positive Vorhersagen tatsächlich positiv sind.

Der Recall (auch als "True-Positive-Rate" bezeichnet) ist das Verhältnis aller korrekt vorhergesagten Positivinstanzen zu allen Ground Truth Positivinstanzen. Es ist also ein Maß dafür, wie viele tatsächlich positive Instanzen korrekt vorhergesagt wurden.

Ein Klassifikator mit hohem Recall, aber geringer Precision findet die meisten Elemente der Positivinstanzen einer Klasse (also die tatsächlichen Instanzen der Klasse), klassifiziert für diese Klasse allerdings auch viele falsche Instanzen. Ein Klassifikator mit hoher Precision und geringem Recall ist genau das Gegenteil, er klassifiziert nur wenige Instanzen als positiv, die meisten dieser Vorhersagen sind aber korrekt. Ein idealer Klassifikator mit hoher Precision und hohem Recall wird viele Instanzen als positiv mit hoher Genauigkeit klassifizieren.

Um dies mit einer einzigen Zahl auszudrücken, wird der F1-Score berechnet, das harmonische Mittel von Precision und Recall. Dies ist ein Maß für die Genauigkeit des Klassifikators.

Für das Beispiel mit der im Kapitel Deep Learning gezeigten Konfusionsmatrix ergibt sich für die Klasse 'apple' die Precision: 1.00 (= 68/(68+0+0)), der Recall: 0.74 (= 68/(68+21+3)) und der F1-Score: 0.85 (=2*(1.0*0.74)/(1.0+0.74)).


Liste der Operatoren

apply_dl_classifierApplyDlClassifierApplyDlClassifierapply_dl_classifier
Klassifizieren einer Menge an Bildern durch einen Deep Learning-basierten Klassifikator.
clear_dl_classifierClearDlClassifierClearDlClassifierclear_dl_classifier
Löschen eines Deep Learning-basierten Klassifikators.
clear_dl_classifier_resultClearDlClassifierResultClearDlClassifierResultclear_dl_classifier_result
Löscht das Handle mit den Resultaten der Deep Learning-basierten Klassifikation.
clear_dl_classifier_train_resultClearDlClassifierTrainResultClearDlClassifierTrainResultclear_dl_classifier_train_result
Löschen eines Handles von einem Trainingschritt eines Deep Learning-basierten Klassifikators und Freigabe des verwendeten Speichers.
deserialize_dl_classifierDeserializeDlClassifierDeserializeDlClassifierdeserialize_dl_classifier
Deserialisiert einen Deep Learning-basierten Klassifikator.
get_dl_classifier_paramGetDlClassifierParamGetDlClassifierParamget_dl_classifier_param
Auslesen der Parameter eines Deep Learning-basierten Klassifikators.
get_dl_classifier_resultGetDlClassifierResultGetDlClassifierResultget_dl_classifier_result
Abrufen der Inferenz-Ergebnisse eines Deep Learning-basierten Klassifikators.
get_dl_classifier_train_resultGetDlClassifierTrainResultGetDlClassifierTrainResultget_dl_classifier_train_result
Auslesen der Resultate eines Trainingsschrittes des Deep Learning-basierten Klassifikators.
read_dl_classifierReadDlClassifierReadDlClassifierread_dl_classifier
Lesen eines Deep Learning-basierten Klassifikators aus einer Datei.
serialize_dl_classifierSerializeDlClassifierSerializeDlClassifierserialize_dl_classifier
Serialisiert einen Deep Learning-basierten Klassifikator.
set_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamset_dl_classifier_param
Setzen der Parameter des Deep Learning-basierten Klassifikators.
train_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchtrain_dl_classifier_batch
Ausführen eines Trainingsschrittes eines Deep Learning-basierten Klassifikators auf Basis eines Batches von Bildern.
write_dl_classifierWriteDlClassifierWriteDlClassifierwrite_dl_classifier
Abspeichern eines Deep Learning-basierten Klassifikators in eine Datei.