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 für die Klassifikation“ zu finden.
Die spezifischen Systemanforderungen zur Anwendung von Deep
Learning-basierter Klassifikation können im HALCON
„Installation Guide“
eingesehen werden.
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.
Erst muss ein vortrainierter Klassifikator mit dem Operator
eingelesen werden. Dieser Operator wird auch dazu verwendet, um fertig
trainierte Klassifikatoren, die mit
geschrieben wurden, einzulesen.
write_dl_classifier
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.
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_classifier
gesetzt werden können, aber je
nach Netzwerk macht eine Änderung ein Nachtrainieren notwendig. Die
aktuellen Werte können mit
set_dl_classifier_param
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.
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.
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'
gesetzt.
Dieser Operator kann auch verwendet werden, um Hyperparameter, die
für das Training wichtig sind (z.B. 'batch_size'
und
'learning_rate'
), zu setzen. Für eine detailliertere
Erklärung siehe das Kapitel Deep Learning und die
Dokumentation von
.
set_dl_classifier_param
Sobald der Klassifikator und der Datensatz vorbereitet sind, kann der Klassifikator für die neue Aufgabe nachtrainiert werden.
Setzen der Hyperparameter, die für das Training verwendet werden, mit dem Operator
Für einen Überblick über mögliche Hyperparameter siehe
. Zusätzliche Erklärungen können im
Kapitel Deep Learning gefunden werden.
set_dl_classifier_param
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
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_batch
zu trainieren. Dieser Prozess wird
für so viele Epochen wiederholt, bis das Trainingsergebnis
zufriedenstellend ist.
train_dl_classifier_batch
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.
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.
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.
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.
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.
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:
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 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
abgefragt werden. Eine Anleitung zur
Implementierung einer entsprechenden Vorverarbeitung gibt die Prozedur
get_dl_classifier_param
preprocess_dl_classifier_images
.
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)).
apply_dl_classifier
clear_dl_classifier
clear_dl_classifier_result
clear_dl_classifier_train_result
deserialize_dl_classifier
get_dl_classifier_param
get_dl_classifier_result
get_dl_classifier_train_result
read_dl_classifier
serialize_dl_classifier
set_dl_classifier_param
train_dl_classifier_batch
write_dl_classifier