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.
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.
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.
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
gespeichert und anschließend mit write_dl_model eingelesen werden.
read_dl_model
Dieser Abschnitt behandelt die notwendigen Anpassungen des
Datensatzes.
Die einzelnen Schritte sind im HDevelop Beispiel
dl_multi_label_classification_workflow.hdev gezeigt.
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.
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.
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.
Dieser Abschnitt behandelt das Trainieren des Multi-Label-Klassifikators.
Die einzelnen Schritte sind im HDevelop Beispiel
dl_multi_label_classification_workflow.hdev gezeigt.
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.
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
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.
Dieser Abschnitt behandelt das Evaluieren eines Klassifikators.
Die einzelnen Schritte sind im HDevelop Beispiel
dl_multi_label_classification_workflow.hdev gezeigt.
Die Evaluierung kann bequem mit der Prozedur
evaluate_dl_model
durchgeführt werden.
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.
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.
Setzen der Parameter, wie z.B. 'batch_size'
über den Operator
Generieren des Dictionarys DLSample für jedes
zu inferierende Bild.
Dafür kann die Prozedur
gen_dl_samples_from_images
verwendet werden.
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.
Anwenden des Modells über den Operator
Die Resultate können aus dem Dictionary
abgerufen werden.
DLResultBatch
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. 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 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).
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 .
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 den ganzen Datensatz und damit auch der
Bilder kann mit Hilfe der Prozedur get_dl_model_parampreprocess_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.
Die Netzwerk Ausgabe hängt vom Arbeitsschritt ab:
Als Ausgabe gibt der Operator für
das Modell ein Dictionary train_dl_model_batch mit dem aktuellen
Wert der Gesamt-Zielfunktion sowie die Werte aller weiteren im Modell
enthaltenen Zielfunktionen zurück.
DLTrainResult
Als Ausgabe gibt der Operator für das Modell für
jedes Bild ein Dictionary apply_dl_model 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.
DLResult
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.
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 (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.