Multi-Label-Klassifikation

Liste der Abschnitte ↓

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

Deep Learning-basierte Multi-Label-Klassifikation ist eine Methode, bei der einem Bild mehrere Konfidenzwerte zugeordnet werden. Diese Konfidenzwerte geben an, wie wahrscheinlich das Bild zu jeder der unterschiedlichen Klassen gehört. Folglich bedeutet Multi-Label-Klassifikation, die Zuordnung mehrerer spezifischer Klassen zu einem Bild. Dies wird im folgenden Schema dargestellt.

image/svg+xml orange: 0.03 apple: 0.65 lemon: 0.82
Ein mögliches Beispiel zur Multi-Label-Klassifikation in dem das Netzwerk drei Klassen besitzt. Für das Eingabebild werden Konfidenzwerte für jede der drei zu Klassen bestimmt: 'apple' 0.65, 'lemon' 0.82, und 'orange' 0.03. Die besten Vorhersagen sagen uns, das Bild hat die Klassen 'apple' und 'lemon'.

Um Ihre spezifische Aufgabe zu erledigen, also Ihre vorliegenden Daten in die unterschiedlichen 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 Multi-Label-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“ zu finden.

In HALCON wird die Multi-Label-Klassifikation mit Deep Learning im Rahmen des allgemeineren Deep-Learning-Modells implementiert. Weitere Informationen zu letzterem finden Sie im Kapitel Deep Learning / Modell. Die spezifischen Systemvoraussetzungen zur Anwendung von Deep Learning können im HALCON „Installation Guide“ eingesehen werden.

Die folgenden Abschnitte sind Einführungen zum generellen Ablauf einer Multi-Label-Klassifikations-Anwendung mittels Deep Learning, Informationen zu den verwendeten Daten sowie Erklärungen zu den Evaluierungsmaßen.

Genereller Ablauf

Dieser Abschnitt beschreibt den generellen Ablauf einer Multi-Label-Klassifikation mittels Deep Learning. Er ist unterteilt in die fünf Bereiche Erstellen eines Models, Vorverarbeitung des Datensatzes, Trainieren des Modells, Evaluierung des trainierten Modells und Inferenz auf neuen Bildern. Dabei wird angenommen, dass der Datensatz bereits gelabelt ist, siehe den Absatz „Daten“ unten. Das HDevelop Beispiel dl_multi_label_classification_workflow.hdev zeigt eine mögliche Anwendung unterteilt in die einzelnen Bereiche.

Erstellen eines Multi-Label-Klassifikationsmodells

Dieser Abschnitt befasst sich mit der Erstellung eines Multi-Label-Klassifikationsmodells. Das Modell wird auf Grundlage eines Backbone-Modells erstellt. Die Erstellung kann mit der Prozedur

  • create_dl_model_multi_label_classification

durchgeführt werden. Dabei wird ein Modell DLModelHandle erstellt, wobei das Backbone als Feature Extractor dient, an welchen die notwendigen Layer für das Training hinzugefügt werden. Es ist grundsätzlich möglich, jedes Deep Learning-Modell als Backbone zu verwenden, in der Praxis empfehlen wir je nach Komplexität eines der Klassifikationsmodelle zu verwenden. Für weitere Informationen über das Backbone und welches Modell zu verwenden ist, wird auf die Prozedurendokumentation von create_dl_model_multi_label_classification verwiesen.

create_dl_model_multi_label_classification verwendet einen Docking Layer, um die notwendigen Layer für die Multi-Label-Klassifikation an den Backbone-Klassifikator anzudocken. Bei vortrainierten Klassifikatoren, die von HALCON zur Verfügung gestellt werden, sind die Docking Layer bereits spezifiziert. Wird ein selbsterstellter Klassifikator als Backbone verwendet, muss der Docking Layer spezifiziert werden.

Nach Erzeugung des Modells, kann dieses mit write_dl_modelwrite_dl_modelWriteDlModelWriteDlModelwrite_dl_model gespeichert und anschließend mit read_dl_modelread_dl_modelReadDlModelReadDlModelread_dl_model eingelesen werden.

Vorverarbeitung des Datensatzes

Dieser Abschnitt behandelt die notwendigen Anpassungen des Datensatzes. Die einzelnen Schritte sind im HDevelop Beispiel dl_multi_label_classification_workflow.hdev gezeigt.

  1. Die Information, was auf einem Bild des Trainings-Datensatzes gefunden werden soll, muss eingelesen und konvertiert werden. Dazu kann die Prozedur

    • read_dl_dataset_multi_label_classification

    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. Die resultierende Aufteilung wird für jeden Sample Eintrag von DLDataset jeweils über den Schlüssel split gespeichert.

  3. Der Datensatz kann nun vorverarbeitet werden. Dazu kann die Prozedur

    • preprocess_dl_dataset

    verwendet werden. Für die Implementierung einer selbst erstellten Vorverarbeitung kann man sich an dieser Prozedur orientieren.

    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

    verwendet werden. Es wird empfohlen, dieses 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 des Multi-Label-Klassifikators. Die einzelnen Schritte sind im HDevelop Beispiel dl_multi_label_classification_workflow.hdev gezeigt.

  1. Setzen der Trainingsparameter und Abspeichern derselben im Dictionary TrainParam. Diese Parameter beinhalten:

    • die Hyperparameter. Für eine Übersicht wird auf das Kapitel Deep Learning verwiesen.

    • Parameter zur eventuellen Datenanreicherung (optional).

    • Parameter zur Evaluierung während des Trainings.

    • Parameter zur Visualisierung von Trainingsergebnissen.

    • Parameter zur Serialisierung.

    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, DLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle

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

    • das Dictionary mit den Trainingsparametern, TrainParam

    • die Angabe, über wie viele Epochen trainiert werden soll.

    Wird die Prozedur train_dl_model verwendet, werden die Gesamt-Zielfunktion sowie optionale Evaluierungsmaße visualisiert.

Evaluierung des trainierten Modells

Dieser Abschnitt behandelt das Evaluieren eines Klassifikators. Die einzelnen Schritte sind im HDevelop Beispiel dl_multi_label_classification_workflow.hdev gezeigt.

  1. Die Evaluierung kann bequem mit der Prozedur

    • evaluate_dl_model

    durchgeführt werden.

  2. Das Dictionary EvaluationResult enthält die angefragten Evaluierungsmaße. Die Ergebnisse der Evaluierung können mit der Prozedur

    • dev_display_multi_label_classification_evaluation

    visualisiert werden.

Inferenz auf neuen Bildern

Dieser Abschnitt behandelt die Inferenz auf neuen Bildern durch einen Multi-Label-Klassifikator. Die einzelnen Schritte sind im HDevelop Beispiel dl_multi_label_classification_workflow.hdev gezeigt.

  1. Setzen der Parameter, wie z.B. 'batch_size'"batch_size""batch_size""batch_size""batch_size" über den Operator

  2. Generieren des Dictionarys DLSample für jedes zu inferierende Bild. Dafür kann die Prozedur

    • gen_dl_samples_from_images

    verwendet werden.

  3. Jedes Bild muss auf dieselbe Art und Weise wie die Trainingsbilder vorverarbeitet werden. Es wird empfohlen, dafür die Prozedur

    • preprocess_dl_samples

    zu verwenden. Wurde während der Vorverarbeitung das Dictionary DLPreprocessParam gespeichert, kann es direkt als Eingabe verwendet werden, um die Parameterwerte festzulegen.

  4. Anwenden des Modells über den Operator

  5. Die Resultate können aus dem Dictionary DLResultBatchDLResultBatchDLResultBatchDLResultBatchdlresult_batch abgerufen werden.

Daten

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

Ein Grundgedanke der Datenhandhabung: Das Modell interagiert mit den Daten über Dictionarys. Dies bedeutet, das Modell erhält die Eingabedaten über das Dictionary DLSample und gibt die Ausgabe über das Dictionary DLResult, bzw. DLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_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 eine spezifische Aufgabe zu trainieren. Mit Hilfe dieser Daten kann das Netzwerk lernen, welche Klassen es unterscheiden soll, wie deren Vertreter aussehen und wie es diese findet. Die dafür notwendigen Informationen werden dadurch gegeben, dass für jedes Bild die Klasse jedes Objekts im Bild als Label angegeben wird. Es gibt verschiedene Arten, wie diese Informationen gespeichert und abgerufen werden können. 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 DLDataset als Datenbank der Informationen, die von den Trainings- und Evaluierungs-Prozeduren benötigt werden.

Sind die Daten bereits für Multi-Label-Klassifikation gelabelt, kann die Prozedur read_dl_dataset_multi_label_classification verwendet werden. Sie formatiert die Daten und erstellt ein Dictionary DLDataset. Die Prozedur kann auch dazu verwendet werden, um ein DLDataset für Multi-Label-Klassifikation aus Objekterkennungs-, Segmentierungs- oder Klassifikationsdaten zu erstellen.

Zum Trainieren eines Multi-Label-Klassifikators wird eine Technik namens Transferlernen verwendet (siehe das Kapitel Deep Learning). Die Anzahl benötigter Bilder ist dabei geringer. Während der Multi-Label-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 von einander unabhängig und gleich verteilt sind (siehe 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 eingelesen Backbone-Netzwerk selbst ab, für die spezifischen Werte der verschiedenen Backbones siehe die Dokumentation von read_dl_modelread_dl_modelReadDlModelReadDlModelread_dl_model. Für ein eingelesenes Netzwerk können die Werte mit get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamget_dl_model_param abgefragt werden. Um diese Anforderungen zu erfüllen, müssen die Bilder eventuell vorverarbeitet werden. Die Standard-Vorverarbeitung für den ganzen Datensatz und damit auch der Bilder kann mit Hilfe der Prozedur preprocess_dl_dataset durchgeführt werden, bzw. preprocess_dl_samples für ein einzelnes Sample. Für eine selbst erstellte Vorverarbeitung liefert diese Prozedur eine Anleitung für die Implementierung.

Netzwerk Ausgabe

Die Netzwerk Ausgabe hängt vom Arbeitsschritt ab:

Training

Als Ausgabe gibt der Operator train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch für das Modell ein Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result mit dem aktuellen Wert der Gesamt-Zielfunktion sowie die Werte aller weiteren im Modell enthaltenen Zielfunktionen zurück.

Inferenz und Evaluierung

Als Ausgabe gibt der Operator apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelapply_dl_model für das Modell für jedes Bild ein Dictionary DLResultDLResultDLResultDLResultdlresult zurück. Im Falle der Multi-Label-Klassifikation beinhaltet dieses Dictionary für jedes Bild ein Tupel mit den Konfidenzwerten zu jeder unterschiedenen Klasse in absteigender Reihenfolge, sowie ein Tupel mit den dazugehörigen Klassen-IDs. Weitere Informationen zum Ausgabe-Dictionary können im Kapitel Deep Learning / Modell gefunden werden.

Interpretation der Multi-Label-Klassifikationsergebnisse

Bei der Multi-Label-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.

Precision, Recall, und F-Score

Bei der Multi-Label-Klassifikation werden ganze Bilder klassifiziert. Um zu überprüfen, wie gut das trainierte Netz funktioniert, werden Precision und Recall berechnet.

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.

Mean Average Precision

Mean Average Precision (mAP), und Average Precision (AP) einer Klasse für einen gegebenen Threshold.

Die Größe AP ist ein Mittelwert maximaler Precision-Werte für verschiedene Recall-Werte. In einfachen Worten besagt dieses Maß, ob die für die Bilder vorhergesagten Klassen weitgehend richtige Vorhersagen sind oder nicht. Dabei erhalten Vorhersagen mit hoher Konfidenz ein höheres Gewicht. Je höher der Wert desto besser.

Als Resultate können folgenden Werte erhalten werden: Die spezifischen AP-Werte, die Mittelung über alle Klassen, die Mittelung über die Schwellenwerte sowie die Mittelung über sowohl alle Klassen als auch die Schwellenwerte. Letzteres ist die Größe mAP, ein Maß zur Bestimmung wie gut die Bilder klassifiziert wurden.


Liste der Abschnitte