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.
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“ zu finden.
Die spezifischen Systemanforderungen zur Anwendung von Deep
Learning-basierter Klassifikation können im HALCON
„Installation Guide“
eingesehen werden.
Die folgenden Abschnitte sind Einführungen zum generellen Ablauf einer Klassfikations-Anwendung mittels Deep Learning, Informationen zu den verwendeten Daten sowie Erklärungen zu den Evaluierungsmaßen.
Dieser Abschnitt beschreibt den generellen Ablauf einer Klassifikation
mittels Deep Learning.
Er ist unterteilt in die vier Bereiche
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.
Die HDevelop Beispiels-Reihe classify_pill_defects_deep_learning
zeigt eine mögliche Anwendung unterteilt in die einzelnen Bereiche.
Dieser Abschnitt behandelt die notwendigen Anpassungen des
Datensatzes.
Die einzelnen Schritte sind im HDevelop Beispiel
classify_pill_defects_deep_learning_1_preprocess.hdev
gezeigt.
Die Information, was auf welchem Bild des Trainings-Datensatzes gefunden werden soll, muss eingelesen und konvertiert werden. Dazu kann die Prozedur
read_dl_dataset_classification
verwendet werden. Dabei wird ein Dictionary
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.
DLDataset
Die Daten von
sollen in drei
getrennte Datensätze aufgeteilt werden. Dazu kann die Prozedur
DLDataset
split_dl_dataset
verwendet werden.
Die resultierende Aufteilung wird für jeden Sample Eintrag von
jeweils über den Schlüssel DLDataset
gespeichert.
split
Einlesen eines vortrainierten Klassifikators mit dem Operator
Dieser Operator wird auch dazu verwendet, um fertig trainierte
Klassifikatoren, die mit
geschrieben
wurden, einzulesen.
write_dl_model
Der Klassifikator stellt mehrere Anforderungen an die Bilder, wie die
Bilddimensionen und den Grauwertbereich. Die Defaultwerte sind in
aufgelistet. Mit diesen Werten wurden die
Netzwerke vortrainiert. Die Netzwerkarchitekturen erlauben
verschiedene Bilddimensionen, welche über
read_dl_model
gesetzt werden können.
Eine solche Änderung erfordert für gewisse Netzwerke aber ein
Nachtrainieren, siehe set_dl_model_param
.
Die aktuellen Werte können mit
read_dl_model
abgefragt werden.
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
zu speichern.
Zur Erzeugung dieses Dictionarys kann die Prozedur
DLPreprocessParam
create_dl_preprocess_param
verwendet werden.
Es wird empfohlen, dieses Dictionary
abzuspeichern, um während der späteren Inferenz-Phase Zugang zu
den Werten zu haben.
DLPreprocessParam
Dieser Abschnitt behandelt das Trainieren des Klassifikators.
Die einzelnen Schritte sind im HDevelop Beispiel
classify_pill_defects_deep_learning_2_train.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,
'TrainingParam'
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
classify_pill_defects_deep_learning_3_evaluate.hdev
gezeigt.
Die Evaluierung kann bequem mit der Prozedur
evaluate_dl_model
durchgeführt werden.
Das Dictionary
enthält die
angefragten Evaluierungsmaße.
Die Ergebnisse der Evaluierung können mit der Prozedur
EvaluationResults
dev_display_classification_evaluation
visualisiert werden.
Eine Heatmap kann für angegebene Samples generiert werden mit
dem Operator gen_dl_model_heatmap
der Prozedur gen_dl_model_classification_heatmap
Dieser Abschnitt behandelt die Inferenz auf neuen Bildern durch einen
Klassifikator.
Die einzelnen Schritte sind im HDevelop Beispiel
classify_pill_defects_deep_learning_4_infer.hdev
gezeigt.
Setzen der Parameter, wie z.B. 'batch_size'
über den Operator
Generieren des Dictionaries
für jedes
zu inferierende Bild.
Dafür kann die Prozedur
DLSample
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
gespeichert, kann es direkt als Eingabe
verwendet werden, um die Parameterwerte festzulegen.
DLPreprocessParam
Anwenden des Modells über den Operator
Die Resultate können aus dem Dictionary 'DLResultBatch'
abgerufen werden.
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 welcher Klasse 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 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 benötigt, um den 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 Labels, 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 Labels eines Bildes von der
Prozedur read_dl_dataset_classification
gelesen werden:
Als Name des letzten Ordners, der das Bild enthält
Als Dateiname.
Zum Trainieren eines Klassifikators wird eine Technik namens Transferlernen verwendet (siehe das Kapitel Deep Learning). Die Anzahl benötigter Bilder ist dabei geringer. 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 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 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 den ganzen Datensatz und damit auch der
Bilder kann mit Hilfe der Prozedur get_dl_model_param
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.
Als Trainingsausgabe gibt das Modell ein Dictionary
mit dem aktuellen Wert der Gesamt-Zielfunktion
sowie den Werten aller weiteren im Modell enthaltenen Zielfunktionen.
DLTrainResult
Als Inferenz- und Evaluations-Ausgabe gibt das Netzwerk für jedes Bild
ein Dictionary
zurück.
Im Falle der 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.
DLResult
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.
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)).