Klassifikation

Liste der Abschnitte ↓

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“ 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.

Genereller Ablauf

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.

Vorverarbeitung des Datensatzes

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

  1. 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 DLDatasetDLDatasetDLDatasetDLDatasetDLDataset 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 DLDatasetDLDatasetDLDatasetDLDatasetDLDataset 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 DLDatasetDLDatasetDLDatasetDLDatasetDLDataset jeweils über den Schlüssel splitsplitsplitsplitsplit gespeichert.

  3. Einlesen eines vortrainierten Klassifikators mit dem Operator

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

    Der Klassifikator stellt mehrere Anforderungen an die Bilder, wie die Bilddimensionen und den Grauwertbereich. Die Defaultwerte sind in read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModel aufgelistet. Mit diesen Werten wurden die Netzwerke vortrainiert. Die Netzwerkarchitekturen erlauben verschiedene Bilddimensionen, welche über set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParam gesetzt werden können. Eine solche Änderung erfordert für gewisse Netzwerke aber ein Nachtrainieren, siehe read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModel. Die aktuellen Werte können mit

    abgefragt werden.

  4. 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 DLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParam zu speichern. Zur Erzeugung dieses Dictionarys kann die Prozedur

    • create_dl_preprocess_param

    verwendet werden. Es wird empfohlen, dieses Dictionary DLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParam abzuspeichern, um während der späteren Inferenz-Phase Zugang zu den Werten zu haben.

Trainieren des Modells

Dieser Abschnitt behandelt das Trainieren des Klassifikators. Die einzelnen Schritte sind im HDevelop Beispiel classify_pill_defects_deep_learning_2_train.hdev gezeigt.

  1. Setzen der Trainingsparameter und Abspeichern derselben im Dictionary 'TrainParam'"TrainParam""TrainParam""TrainParam""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, DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandle

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

    • das Dictionary mit den Trainingsparametern, 'TrainingParam'"TrainingParam""TrainingParam""TrainingParam""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.

Evaluierung des trainierten Modells

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

  1. Die Evaluierung kann bequem mit der Prozedur

    • evaluate_dl_model

    durchgeführt werden.

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

    • dev_display_classification_evaluation

    visualisiert werden.

  3. Eine Heatmap kann für angegebene Samples generiert werden mit

Inferenz auf neuen Bildern

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.

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

  2. Generieren des Dictionaries DLSampleDLSampleDLSampleDLSampleDLSample 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 DLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParamDLPreprocessParam 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 'DLResultBatch'"DLResultBatch""DLResultBatch""DLResultBatch""DLResultBatch" 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 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 DLSampleDLSampleDLSampleDLSampleDLSample und gibt die Ausgabe über das Dictionary DLResultDLResultDLResultDLResultDLResult, bzw. DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResult 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 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:

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).

Bilder

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 read_dl_modelread_dl_modelReadDlModelReadDlModelReadDlModel. Für ein eingelesenes Netzwerk können die Werte mit get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParam 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

Als Trainingsausgabe gibt das Modell ein Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResult mit dem aktuellen Wert der Gesamt-Zielfunktion sowie den Werten aller weiteren im Modell enthaltenen Zielfunktionen.

Als Inferenz- und Evaluations-Ausgabe gibt das Netzwerk für jedes Bild ein Dictionary DLResultDLResultDLResultDLResultDLResult 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.

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 Abschnitte