KlassenKlassen | | Operatoren

Klassifikation

Liste der Operatoren ↓

Dieses Kapitel beschreibt Operatoren für Deep Learning-basierte Klassifikation, sowohl für die Inferenz als auch für das Training.

Der Begriff Deep Learning bezieht sich auf eine Familie von Verfahren des maschinellen Lernens, welche unter anderem für Klassifikation verwendet werden. Klassifikationsaufgaben setzen Wissen über Merkmale, welche die Klassen unterscheiden, voraus. Bei Deep Learning Verfahren wird ein Netzwerk nur mit Hilfe von Ein- und Ausgabe trainiert. Das wird auch als End-to-End Lernen bezeichnet. Der Trainingsalgorithmus passt das Netzwerk mit gelabelten Bildern so an, dass es in der Lage ist, die Klassen passend zu unterscheiden. Für den Anwender hat dies den Vorteil, dass er nicht händisch Merkmale angeben muss. Stattdessen müssen geeignete Daten ausgewählt und gesammelt werden. Convolutional Neural Networks (CNNs) sind ein für Bildverarbeitung geeignetes Deep Learning-Verfahren. Eine kurze Einführung findet sich im „Solution Guide on Classification“.

image/svg+xml Input ... ... ... ... Hidden Layers Input Layer Output Layer Output
Ein neuronales Netzwerk, wie es für Deep Learning verwendet wird, besteht aus mehreren Layern. Potentiell können dies sehr viele sein, was den Begriff 'Deep' Learning geprägt hat. Mehr Informationen dazu können im „Solution Guide on Classification“ gefunden werden.

Um diese Technik nutzbar zu machen, mussten drei technologische Voraussetzungen erfüllt werden.

Ablauf

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.

Vorbereitung des Netzwerks und der Daten

  1. Erst muss ein vortrainierter Klassifikator mit dem Operator

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

  2. Es ist notwendig zu wissen, welches Problem der Klassifikator lösen soll, d.h., welche Klassen unterschieden werden müssen und wie Beispiele dieser Klassen aussehen. Das wird durch den Datensatz repräsentiert, das heißt den Bildern mit den zugehörigen Labels. 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 Labels sowie eine Liste aller vorkommenden Klassen zurück.

  3. Der Klassifikator stellt mehrere Anforderungen an die Bilder, wie die Bilddimensionen und der Grauwertbereich. Die Defaultwerte sind in read_dl_classifierread_dl_classifierReadDlClassifierReadDlClassifierReadDlClassifier gelistet. Mit diesen Werten wurden die Neuronalen Netzwerke vortrainiert. Die Netzwerkarchitekturen erlauben verschiedene Bilddimensionen, welche über set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam gesetzt werden können, aber je nach Netzwerk macht eine Änderung ein Nachtrainieren notwendig. Die aktuellen Werte können mit

    abgefragt werden.

    Die Prozedur preprocess_dl_classifier_images hilft, bei der Implementierung einer entsprechenden Vorverarbeitung. Wir empfehlen, alle fürs Training benötigten Bilder vor dem Training vorzuverarbeiten und abzuspeichern. Damit kann während des Trainings direkt auf die vorverarbeiteten Bilder zugegriffen werden, was das Training signifikant beschleunigt.

  4. Als nächstes wird empfohlen die Daten in drei getrennte Datensätze zu teilen, die für Training, Validierung und Testen verwendet werden. Dafür kann die Prozedur

    • split_dl_classifier_data_set

    verwendet werden. Mit diesem Ansatz wird der Trainings-Datensatz als direkte Eingabe für das Training verwendet. Der Validierungs-Datensatz wird zum Testen des Klassifikators während des Trainings genutzt, um den Trainingsfortschritt zu verfolgen. Der Test-Datensatz wird für eine unabhängige Auswertung nach dem Training verwendet.

  5. 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'"classes""classes""classes""classes" gesetzt.

    Dieser Operator kann auch verwendet werden, um Hyperparameter, die für das Training wichtig sind (z.B. 'batch_size'"batch_size""batch_size""batch_size""batch_size" und 'learning_rate'"learning_rate""learning_rate""learning_rate""learning_rate"), zu setzen. Eine detailliertere Erklärung befindet sich weiter unten in dieser Kapitelreferenz und in der Dokumentation von set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam.

Training des Klassifikators und Auswertung des Trainingsfortschritts

Sobald der Klassifikator und der Datensatz vorbereitet sind, kann der Klassifikator für die neue Aufgabe nachtrainiert werden.

  1. 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 train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatch einen Batch von Trainingsdaten in einem Schritt. Ein Batch ist eine Menge von Daten, wobei die Batchgröße, d.h., die Anzahl Daten dem Parameter 'batch_size'"batch_size""batch_size""batch_size""batch_size" entspricht. Die Batchgröße wird über den Operator set_dl_classifier_paramset_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamSetDlClassifierParam gesetzt. Für ein erfolgreiches Training sollte der gesamte Trainings-Datensatz verwendet werden. Dafür wird über die Trainingsdaten iteriert und der Klassifikator sukzessive mit train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatch trainiert. Ein Durchlauf über den ganzen Trainings-Datensatz wird als Epoche bezeichnet. Dabei muss berücksichtigt werden, dass ein Batch immer vollständig gefüllt sein muss. Dementsprechend kann es vorkommen, dass manche Bilder in einer Epoche nicht verwendet werden, wenn nicht mehr genügend Bilder verfügbar sind, um einen Batch zu füllen.

    Dieser Prozess wird für so viele Epochen wiederholt, bis das Trainingsergebnis zufriedenstellend ist.

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

Anwenden und Evaluieren des finalen Klassifikators

Nun ist der Klassifkator für die spezifische Anwendung trainiert und bereit zur Anwendung. Doch davor sollte noch evaluiert werden, wie gut sich der Klassifikator auf den Testdaten verhält.

  1. Um den Klassifikator auf einer beliebigen Anzahl Bildern anzuwenden, wird der Operator

    verwendet. Die Ergebnisse werden in einem Handle gespeichert.

    Die vorausgesagten Klassen und Konfidenzen werden mit dem Operator

    abgefragt.

  2. 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 (weiter unten findet sich eine Erklärung). Dafür kann die Prozedur

    • gen_confusion_matrix.

    verwendet werden. 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.

Inferenzphase

Ist der Klassifikator trainiert und seine Leistung zufriedenstallend, 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.

Systemvoraussetzungen

Die Systemvoraussetzungen von Deep Learning mit CNNs hängen von der gewünschten Funktionalität ab.

Trainieren des Klassifikators ist für die Ausführung auf NVIDIA GPUs implementiert und setzt zusätzlich die Bibliotheken cuDNN und cuBLAS voraus. Mehr Informationen zu diesen speziellen Voraussetzungen befinden sich im Installation Guide. Um den Trainingsprozess zu beschleunigen, empfehlen wir eine schnelle Festplatte. Solid-State-Drives (SSD) sind konventionellen Festplatten (HDD) vorzuziehen.

Inferenz mit einem Deep Learning-basierten Klassifikator kann auf NVIDIA GPUs ausgeführt werden, wofür die gleichen Anforderungen wie beim Training gelten. Alternativ kann die Inferenz auch auf einer x86 oder x64 CPU ausgeführt werden.

Mehr Informationen zu diesen speziellen Voraussetzungen befinden sich im im HALCON Installation Guide.

Daten für das Training

In HALCON wird eine Technik verwendet, die Transferlernen genannt wird (siehe oben). Dafür werden vortrainierte Klassifikatoren bereitgestellt, die auf einer sehr großen Anzahl an klassifizierten Trainingsbildern trainiert wurden. Diese Klassifikatoren wurden trainiert und getestet, um industrielle Bildklassifikationsaufgaben gut zu lösen. Ein solcher vortrainierter Klassifikator wird für eine neue, spezifische Aufgabe nachtrainiert, damit er die geforderten Klassen unterscheiden kann. Dafür wird ein geeigneter Datensatz benötigt, üblicherweise in der Größe von hunderten oder tausenden von gelabelten Bildern pro Klasse. Obwohl der Klassifikator grundsätzlich zuverlässiger sein sollte, wenn er auf einem größeren Datensatz trainiert wurde, hängt die Anzahl der benötigten Daten von der Komplexität der Aufgabe ab.

Für das Training wird der Datensatz in drei Teilmengen aufgespalten, die unabhängig und gleichverteilt sein sollten. Das bedeutet, dass die Teilmengen auf keine Art und Weise voneinander abhängen sollten und jede Klasse die gleiche Verteilung von Bildern enthalten sollten. Diese Aufteilung kann bequem mit der Prozedur split_dl_classifier_data_set vorgenommen werden. Die größte Teilmenge wird für das Nachtrainieren verwendet. Zu bestimmten Zeitpunkten wird die Leistung des Klassifkators überprüft, um festzustellen ob es sich lohnt die Optimierung des Klassifikators fortzusetzen. Für diese Validierung wird die zweite Teilmenge des Datensatzes verwendet. Auch wenn diese Teilmenge disjunkt zur ersten Menge ist, hat sie Einfluss auf die Optimierung des Klassifikators. Deshalb wird für die Vorhersage der Leistung des Klassifikators in der Applikation die dritte Teilmenge verwendet. Für eine repräsentative Validierung des Klassifikators sollten die zweite und die dritte Teilmenge statistisch relevante Daten enthalten, was eine untere Schranke für die benötigte Menge an Daten darstellt.

Der Klassifikator stellt Anforderungen an die Bilder betreffend der passenden Dimensionen, dem Grauwertbereich und dem Bildtyp. Diese Voraussetzungen hängen vom verwendeten Netzwerk ab und können mit get_dl_classifier_paramget_dl_classifier_paramGetDlClassifierParamGetDlClassifierParamGetDlClassifierParam abgefragt werden. Darüber hinaus müssen die Bilder die für das Training verwendet werden, mit Labeln versehen worden sein. Außerdem sollten die Bilder repräsentativ sein, das heißt denen der späteren Applikation entsprechen und nicht "perfekten" Bildern. Ansonsten kann der Klassifikator Probleme auf nicht-"perfekten" Bildern haben.

Setzen der Trainingsparameter

Das Neuronale Netzwerk beschreibt eine Funktion, welche die Eingabedaten auf Klassen abbildet. Ein solches Netzwerk besteht aus Layern und damit verbundenen Gewichten. Diese Gewichte sind die freien Parameter, welche beim Training verändert werden. Dies ist jedoch kein reines Optimierungsproblem: Maschinelles Lernen wirkt sich üblicherweise indirekt aus. Das bedeutet, dass eine präzise Vorhersage gesucht wird, aber nicht direkt die Abbildungsfunktion, welche die Klassen vorhersagt, optimiert wird. Anstelle dessen wird eine Zielfunktion (auch Loss genannt) eingeführt, die die Abweichung zwischen vorhergesagter und wahrer Klasse bestraft. Diese Funktion wird nun optimiert, in der Hoffnung dass dies auch die Klassifikationsrate verbessert.

Um das Netzwerk also für eine spezielle Klassifikationsaufgabe zu trainieren, wird die Minimierung der Zielfunktion (eine Funktion des Fehlers) angestrebt. In der Praxis wird diese Optimierung durch die Berechnung des Gradienten und der entsprechenden Anpassung der Parameter (Gewichte) bei mehrfacher Iteration über den Trainings-Datensatz erreicht.

Der vollständige Datensatz ist im Allgemeinen zu groß, um vollständig im RAM verarbeitet werden zu können. Um dieses Problem zu umgehen, wird der Datensatz in relativ kleine Teilmengen unterteilt, welche idealerweise zufällig ausgewählt werden. Eine solche Teilmenge wird als Batch oder Minibatch bezeichnet. Die Batchgröße ('batch_size'"batch_size""batch_size""batch_size""batch_size") bestimmt die Anzahl der Daten, die einen Batch bilden und deshalb simultan verarbeitet werden. Größere Batches sollten dabei zu einer genaueren Schätzung des Gradienten führen, benötigen aber auch mehr Speicher.

Um die Zielfunktion zu optimieren, wird der Gradient für einen Batch (mit dem stochastischen Gradientenabstiegsverfahren SGD) berechnet. Es gibt zwei Hyperparameter, die für die Anpassung der Abbildungsfunktion wichtig sind: Die Lernrate 'learning_rate'"learning_rate""learning_rate""learning_rate""learning_rate", die den Einfluss des Gradienten auf die Anpassung der Parameter beschreibt und das Momentum im Intervall , das den Einfluss früherer Anpassungen festlegt. Mehr Informationen dazu befinden sich in der Dokumentation von train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatch. In einfachen Worten gesagt: Bei der Anpassung der Parameter erinnert man sich an den Schritt, den man für die letzt Anpassung gemacht hat. Jetzt wird ein Schritt in die Richtung des Gradienten mit einer Länge entsprechend der Lernrate gemacht und zusätzlich wird der Schritt der letzten Anpassung wiederholt, aber nur mit einer Länge entsprechend dem Momentum. Dies wird in der folgenden Grafik illustriert. Eine zu hohe Lernrate kann dazu führen, dass der Algorithmus divergiert, eine zu kleine Lernrate führt zu unnötig vielen Schritten. Daher startet man üblicherweise mit einer höheren Lernrate und reduziert sie während dem Training. Mit einem Momentum , hat das Momentum Verfahren keinen Einfluss, so dass nur der Gradient den Anpassungsvektor bestimmt.

Skizze eines Lernschrittes: der Anpassungsvektor v (v - durchgezogene Linie), der Gradientenschritt: die Lernrate multipliziert mit dem Gradienten g ( g - gestrichelte Linie) und der Momentumschritt: das Momentum multipliziert mit dem vorherigen Anpassungsvektor v ( v - gepunktete Linie). Der hochgestellte Index bezeichnet die Iteration.

Regularisierung kann verwendet werden, um Überanpassung an die Trainingsdaten zu reduzieren (siehe auch den Abschnitt "Risiko von Überanpassung und Unteranpassung" weiter unten). Der entsprechende Hyperparameter 'weight_prior'"weight_prior""weight_prior""weight_prior""weight_prior" muss vor dem Training gesetzt werden. Die Wahl des Wertes ist ein Kompromiss zwischen der Fähigkeit des Modells zur Generalisierung, Überanpassung und Unteranpassung. Ist der Wert für 'weight_prior'"weight_prior""weight_prior""weight_prior""weight_prior" zu klein, kann Überanpassung auftreten, ist er zu groß, kann das Modell seine Fähigkeit, sich an die Daten anzupassen, verlieren, da alle Gewichte effektiv Null sind.

Die Anzahl von Epochen bestimmt, wie oft der vollständige Trainings-Datensatz für das Training verwendet wird. Diese Anzahl bestimmt direkt, wie oft der Trainingsalgorithmus über den Trainings-Datensatz iteriert. Dabei muss berücksichtigt werden, dass ein Batch immer voll gefüllt sein muss. Dementsprechend kann es vorkommen, dass manche Bilder in einer Epoche nicht verwendet werden, wenn nicht mehr genügend Bilder verfügbar sind, um einen Batch zu füllen.

Mit den Daten und den Hyperparametern gibt es viele Einflussfaktoren auf das Resultat des Trainingsalgorithmus. Im Allgemeinen helfen mehr Daten, die Leistung des Klassifikators zu verbessern. Ob mehr Daten immer eine gute Lösung für Verbesserungen sind, hängt davon ab, wie einfach es ist, diese Daten zu sammeln. Üblicherweise hat eine kleine zusätzliche Menge an Daten kaum merklichen Einfluss auf die Gesamtleistung.

Interpretation der Klassifikationsergebnisse

Evaluierung während des Trainings

Bei der Evaluierung der Leistung des Klassifikators muss beachtet werden, dass es sich nicht um ein reines Optimierungsproblem handelt (siehe Abschnitt über 'Setzen der Trainingsparameter' weiter oben).

Um den Trainingsfortschritt zu beobachten ist es meistens nützlich, den Fehler (das bedeutet der mittlere Fehler für alle Elemente eines Batches) zu visualisieren. Da sich die Elemente unterscheiden, sind manche einfacher zu klassifizieren als andere. Deshalb kann es sein, dass der Klassifikator bei den Elementen eines Batches besser oder schlechter abschneidet als bei den Elementen eines anderen Batches. Es ist also normal, dass sich der Fehler nicht glatt über die Iterationen verändert. Insgesamt sollte er aber sinken. Die Anpassung der Hyperparameter Lernrate 'learning_rate'"learning_rate""learning_rate""learning_rate""learning_rate" und Momentum 'momentum'"momentum""momentum""momentum""momentum" kann helfen, den Fehler weiter zu verringern. Die folgende Grafik zeigt ein mögliches Beispiel.

image/svg+xml decreased learning rate
Skizze des Fehlers beim Training.

Risiko von Unteranpassung und Überanpassung

Unteranpassung tritt auf, wenn das Modell die Komplexität der Aufgabe nicht wiedergeben kann. Das spiegelt sich direkt im Trainingsfehler wieder, der in diesem Fall hoch bleibt.

Überanpassung tritt dann auf, wenn das Modell anfängt, sich die Trainingsdaten zu merken, statt generelle Regeln zur Aufgabe zu lernen. In diesem Fall bleibt der Trainingsfehler niedrig oder sinkt weiter, während sich der Fehler auf dem Validierungsdatensatz erhöht. In diesem Fall kann Regularisierung helfen. Regulariserung ist eine Methode um Überanpassung von Neuronalen Netzwerken zu vermeiden durch Addition eines Strafterms zur Zielfunktion. Dieser Regularisierungs-Term schiebt die Gewichte gegen Null und bestraft dabei insbesondere große Gewichte. Einfach gesagt führt dies dazu, das einfachere Modelle bevorzugt werden, die sich weniger an Rauschen in den Daten anpassen und besser generalisieren. Es ist zu beachten, dass ein ähnlicher Effekt auftritt, wenn die Kapazität des Models im Verhältnis zum Trainings-Datensatz zu hoch ist.

image/svg+xml generalization gap
Skizze von möglicher Überanpassung, sichtbar durch die Generalisierungslücke.

Konfusionsmatrix, Precision, Recall und F-Score

Eine Konfusionsmatrix ist eine Tabelle, die verwendet werden kann, um die Leistung eines Klassifikators auf einem bekannten Datensatz zu visualisieren. Für jedes Bild ist also bekannt, zu welcher Klasse es gehört. Die Tabelle zeigt, wie der Klassifikator die Bilder klassifiziert hat (im Sinne von Klasse mit jeweils größtem Konfidenzwert), das heißt wie viele Bilder einer gegebenen Klasse auf welche Klasse abgebildet wurden. Zum Beispiel zeigt sie, wie viele Bilder mit der wahren Klasse 'apple' als 'apple' und wie viele als 'peach' oder 'pear' klassifiziert wurden. Jede Spalte repräsentiert die wahren (gelabelten) Instanzen einer Klasse und jede Zeile die Instanzen der vom Klassifikator vorhergesagten Klasse. Anhand dieser Tabelle kann man sehr einfach sehen, wie gut der Klassifikator für jede Klasse funktioniert. Bei Klassifikationsaufgaben mit mehr als zwei Klassen kann man entweder alle Klassen anzeigen oder diese auf ein binäres Problem reduzieren (positiv: gehört zur ausgewählten Klasse gegenüber negativ: gehört zu einer anderen Klasse). Für binäre Klassifikationsprobleme reduziert sich die Konfusionsmatrix auf die vier Einträge 'True Positives' (TP: positiv vorhergesagt, positiv gelabelt), 'True Negatives' (TN: negativ vorhergesagt, negativ gelabelt), 'False Positives' (FP: positiv vorhergesagt, negativ gelabelt) und 'False Negatives' (FN: negativ vorhergesagt, positiv gelabelt).

image/svg+xml image/svg+xml TP FP FN TN
(1) (2)
(1) Links, eine Konfusionsmatrix für drei Objekte. Es scheint als ob der Klassifikator Äpfel und Pfirsiche öfters 'verwechselt' als andere Kombinationen. (2) Rechts, die Konfusionsmatrix ist auf das binäre Problem bezüglich der Klasse 'apple' reduziert. In diesem Beispiel wurden 68 Bilder einese Apfels als solcher klassifiziert (TP), 60 Bilder die keinen Apfel zeigen wurden korrekt als Pfirsich (30) oder Birne (30) klassifiziert (TN), kein Bild, das einen Pfirsich oder eine Birne zeigt, wurde als Apfel klassifiziert (FP) und 24 Bilder eines Apfels wurden fälschlicherweise als Pfirsich (21) oder Birne (3) klassifiziert (FN).

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 korrekten vorhergesagten Positivinstanzen zu allen wahren 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), zulasten der Klassifikation vieler falscher Instanzen als diese Klasse. 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 oben 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.7)/(1.0+0.7)).

Glossar

Im Folgenden beschreiben wir die wichtigsten Begriffe, welche wir im Kontext von Deep Learning verwenden:

Batchgröße - Hyperparameter 'batch_size'"batch_size""batch_size""batch_size""batch_size"

Der Datensatz wird in kleinere Untergruppen, genannt Batches, unterteilt. Die Batchgröße bestimmt die Anzahl Bilder eines einzelnen Batches und somit die Anzahl Bilder, welche simultan verarbeitet werden.

Convolutional Neural Networks (CNNs)

Convolutional Neural Networks sind Netzwerke, die in Deep Learning verwendet werden und mindestens einen Convolutional Layer (Faltungs-Layer) beinhalten. CNNs sind besonders erfolgreich bei der Klassifizierung von Bildern.

Daten

Im Kontext von Deep Learning verwenden wir den Begriff Daten für die zu klassifizierenden Objekte (z.B. Bilder) mit ihren zugehörigen Klassen (die Labels).

Datensatz: Trainings-, Validierungs- und Test-Datensatz

Der Datensatz bezeichnet die komplette Menge an Daten (Bilder und zugehörige Label), welche für das Training verwendet werden. Der Datensatz wird in drei disjunkte Untermengen aufgeteilt:

Deep Learning

Der Begriff "Deep Learning" wurde ursprünglich für das Training Neuronaler Netzwerke mit mehreren verborgenen Layer verwendet. Heutzutage wird der Begriff mehr als allgemeiner Begriff für verschiedene Methoden des Maschinellen Lernens verwendet. In HALCON verwenden wir den Begriff für Klassifikationsmethoden mit einem Neuronalen Netzwerk, welches mehrere verborgene Layer beinhaltet.

Epoche

Im Kontext von Deep learning bedeutet Epoche eine einzelne Trainingsiteration über den ganzen Trainings-Datensatz, d.h. über sämtliche Batches. Eine solche Trainingsiteration über Epochen ist nicht zu verwechseln mit einer Iteration über einen einzelnen Batch (d.h., innerhalb einer Epoche).

Fehler

Im Kontext von Deep Learning verwenden wir den Begriff Fehler, wenn für ein Bild die vom Klassifikator zugeordnete Klasse nicht mit der eigentlichen Klasse (dem Label des Bildes) übereinstimmt. Dabei meinen wir jeweils den top-1 Fehler (siehe top-k Fehler).

Gewichte

Gewichte sind die freien Parameter des Klassifikators, die während des Trainings zwecks Optimierung der Zielfunktion geändert werden. Ein Layer mit Gewichten multipliziert oder addiert diese mit seinen Eingabewerten. Im Gegensatz zu Hyperparametern werden Gewichte während des Trainings optimiert und werden somit geändert.

Hyperparameter

Jede Methode des Maschinellen Lernens, und somit auch CNNs, ist eine Umsetzung von Formeln mit mehreren Parametern. Während der Trainingsphase lernt das Modell von den Daten im Sinne von Optimierung der Parameter für die gegebene Aufgabe. Solche Modelle können aber auch noch weitere Parameter haben, deren Wert während der Trainingsphase nicht direkt erlernt wird. Die Werte dieser Parameter werden vor Trainingsbeginn festgelegt. Wir bezeichnen diese letzteren Parameter als Hyperparameter, um sie von jenen Netzwerk-Parametern (den Gewichten) zu unterscheiden, welche während der Trainingsphase optimiert werden. Aus einem anderen Blickpunkt betrachtet sind Hyperparameter Solver-spezifische Parameter.

Prominente Beispiele für Hyperparameter sind die initiale Lernrate oder die Batchgröße.

Inferenzphase

Die Inferenzphase bezeichnet die Phase, in dem ein trainiertes Netzwerk angewandt wird, um die Klassenzugehörigkeit von Eingabebilder zu folgern. Im Unterschied zur Trainingsphase wird das Netzwerk nicht mehr optimiert.

Klasse

Klassen sind getrennte Kategorien, welche das Netzwerk unterscheidet (z.B. 'apple', 'peach', 'pear'). In HALCON wird die Klasse eines Bildes durch sein zugehöriges Label gegeben.

Klassifikator

Im Kontext von Deep Learning bezeichnen wir mit Klassifikator folgendes: Der Klassifikator folgert für ein erhaltenes Bild die Konfidenz zu allen unterschiedenen Klassen. Als Beispiel seien die drei Klassen 'apple', 'peach', 'pear' unterschieden. Nun wenden wir den Klassifikator auf ein Bild eines Apfels an. Als Resultat erhalten wir Konfidenzen wie 'apple': 0.92, 'peach': 0.07, 'pear': 0.01.

Konfidenz

Die Konfidenz ist eine Zahl, welche die Klassenzugehörigkeit eines Bildes darstellt. In HALCON ist die Konfidenz die Wahrscheinlichkeit, gegeben im Intervall [0,1].

Konfusionsmatrix

Eine Konfusionsmatrix ist eine Tabelle, in welcher die Klassifizierungen des Klassifikators (im Sinne von Klasse mit jeweils größtem Konfidenzwert) mit den korrekten Klassenzugehörigkeiten (Labels) verglichen werden. Sie wird oft verwendet zur Visualisierung der Klassifikationsergebnisse auf dem Validierungs- oder Test-Datensatz, siehe z.B. die entsprechende Abbildung.

Label

Label sind beliebige Zeichenketten (Strings), welche die Klasse eines Bildes angeben. In HALCON ist das Label eines Bildes gegeben durch seinen Namen (evt. gefolgt von einer Kombination aus Unterstrich und Ziffern) oder dem Namen seines direkten Ordners, zB. 'apple_01.png', 'peach.png', 'pear/01.png'.

Layer und Verborgene Layer

Layer sind Bausteine von Neuronalen Netzwerken und führen eine spezifische Funktion aus (z.B. Faltung, Vereinigung, etc., siehe „Solution Guide Classification“). Ein Layer kann man als eine Box betrachten, welche Eingabewerte erhält, diese transformiert und den Rückgabewert an den nächsten Layer weiter gibt. Eingabe- und Ausgabe-Layer sind jeweils mit den Daten verbunden, d.h. mit den Bilder, respektive den Labels. Alle dazwischenliegenden Layers bezeichnet man als verborgenen Layer.

Alternative Namen: Schicht (Layer), Zwischenschicht (hidden Layer)

Lernrate - Hyperparameter 'learning_rate'"learning_rate""learning_rate""learning_rate""learning_rate"

Die Lernrate ist die Gewichtung des Gradienten (siehe SGD) beim Anpassen der Argumente der Zielfunktion. In einfachen Worten: Der Gradient sagt uns, in welche Richtung optimiert werden soll und die Lernrate sagt, wie groß unser Schritt sein wird.

Momentum - Hyperparameter 'momentum'"momentum""momentum""momentum""momentum"

Das Momentum wird bei der Optimierung der Zielfunktionsargumente eingesetzt. Werden die Argumente der Zielfunktion aktualisiert (nach Berechnung des Gradienten), wird der Aktualisierungsvektor des vorherigen Aktualisierungsschrittes zu einem Anteil berücksichtigt. Dadurch werden Oszillationen gedämpft. Wir nennen den Hyperparameter Momentum. In einfachen Worten, wenn wir die Argumente aktualisieren, erinnern wir uns noch an den Schritt der letzten Aktualisierung. Wir gehen nun einen Schritt mit einer Länge entsprechend der Lernrate in Richtung des Gradienten. Zusätzlich wiederholen wir den Schritt, den wir bei der letzten Aktualisierung gingen, machen ihn jetzt aber nur noch mal so weit.

Nachtrainieren

Wir verstehen unter Nachtrainieren das Anpassen der Gewichtungen eines bereits vortrainierten Netzwerkes, d.h. während des Nachtrainierens lernt ein Netzwerk eine spezifische Aufgabe.

Regularisierung - Hyperparameter 'weight_prior'"weight_prior""weight_prior""weight_prior""weight_prior"

Regulariserung ist eine Methode um Überanpassung von Neuronalen Netzwerken zu vermeiden. Dies geschieht durch Addition eines Strafterms zur Zielfunktion. Dieser Regularisierungs-Term schiebt die Gewichte gegen Null und bestraft dabei insbesondere große Gewichte. Einfach gesagt führt dies dazu, das einfachere Modelle bevorzugt werden, die sich weniger an Rauschen in den Daten anpassen und besser generalisieren. In HALCON wird die Regularisierung durch den Parameter 'weight_prior'"weight_prior""weight_prior""weight_prior""weight_prior" gesteuert. Dieser Parameter wird in der Literatur auch Regularisierungsparameter, weight decay, oder einfach genannt (Wir vermerken, dass wir innerhalb von HALCON für die Lernrate verwenden und in Formeln das Symbol für den Regularisierungsparameter).

Solver

Der Solver optimiert das Modell, indem er die Gewichtungen so anpasst, dass die Zielfunktion optimiert (d.h. minimiert) wird.

Stochastisches Gradientenverfahren (engl.: stochastic gradient descent, SGD)

Das stochastische Gradientenverfahren ist ein iterativer Optimierungsalgorithmus für differenzierbare Funktionen. Ein besonderes Merkmal bildet die Einschränkung der für einen einzelnen Iterationsschritt berücksichtigten Datenmenge, denn für eine Iteration wird nur ein einzelner Batch mit zufällig gewählten Bildern berücksichtigt. Bei Deep Learning verwenden wir den SGD zur Optimierung (d.h. Minimierung) der Zielfunktion.

Top-k Fehler

Der Klassifikator ordnet einem Bild nicht eine einzelne Klasse zu, sondern bezüglich jeder Klasse eine Konfidenz. Für ein Bild gibt es somit k Klassen mit höchster vorhergesagter Konfidenz. Der top-k Fehler gibt nun an, bei wie vielen Vorhersagen diese k Klassen die wahre Klasse (das Label) beinhalten. Der top-1 Fehler gibt somit an, ob die vorausgesagte Klasse mit größter Wahrscheinlichkeit der wahren, vom Benutzer gegebenen Klasse entspricht. Beim top-3 Fehler wird geprüft, ob das die wahre Klasse einer der drei besten Vorhersagen entspricht (d.h. einer der drei Klassen, die der Klassifikator als am wahrscheinlichsten zutreffend betrachtet).

Transferlernen (engl.: transfer learning)

Transferlernen meint eine Technik, bei der für ein neues Netzwerk das Wissen eines bereits existierenden und trainierten Netzwerkes die Basis bildet. Konkret wird ein bereits (vor)trainiertes Netzwerk inklusive seiner Gewichtungen übernommen und der Ausgabe-Layer für die spezifische Anwendung adaptiert. In HALCON betrachten wir auch den darauf folgenden Schritt des Nachtrainierens als Teil des Transferlernens.

Überanpassung (engl.: overfitting)

Man spricht von Überanpassung, wenn das Netzwerk anfängt, sich die Trainingsdaten zu merken, anstatt generelle Regeln zur Klassifikationsaufgabe zu finden. Überanpassung wird ersichtlich, wenn das Modell den Fehler auf dem Trainings-Datensatz weiter minimiert, während der Fehler auf dem Validierungs-Datensatz steigt. Die meisten Neuronalen Netzwerke haben eine sehr große Anzahl Gewichtungsfaktoren, weshalb diese Netzwerke besonders anfällig für Überanpassung sind.

Unteranpassung (engl.: underfitting)

Unteranpassung passiert, wenn das Modell übergeneralisiert. D.h. das Modell ist nicht fähig, die Komplexität der Aufgabe zu erfassen. Dies wird ersichtlich, wenn der Wert der Zielfunktion oder der Fehler auf dem Trainings-Datensatz nicht signifikant gemindert wird.

Zielfunktion (engl.: loss)

Bei der Bildklassifikation misst die Zielfunktion die Übereinstimmung zwischen den wahren, vom Benutzer gegebenen Klassen (den Labels) und den vom Klassifikator zugeordneten Klassen (jeweils größter Wahrscheinlichkeit). D.h. die Zielfunktion ordnet einer Klassifikation den Schaden zu, der entsteht, wenn die gefolgerte Klassenzugehörigkeit nicht der gegebenen Klasse (dem Label) entspricht. Beim Training optimieren wir die Argumente dieser Zielfunktion, um das Netzwerk für seine spezifische Aufgabe zu trainieren.


Liste der Operatoren

apply_dl_classifierApplyDlClassifierApplyDlClassifierapply_dl_classifier
Klassifizieren eines Sets von Bildern durch einen Deep Learning-basierten Klassifikator.
clear_dl_classifierClearDlClassifierClearDlClassifierclear_dl_classifier
Löschen eines Deep Learning-basierten Klassifikators.
clear_dl_classifier_resultClearDlClassifierResultClearDlClassifierResultclear_dl_classifier_result
Löscht das Handle mit den Resultaten der Deep Learning-basierten Klassifikation.
clear_dl_classifier_train_resultClearDlClassifierTrainResultClearDlClassifierTrainResultclear_dl_classifier_train_result
Löschen eines Handles von einem Trainingschritt eines Deep Learning-basierten Klassifikators und Freigabe des verwendeten Speichers.
deserialize_dl_classifierDeserializeDlClassifierDeserializeDlClassifierdeserialize_dl_classifier
Deserialisiert einen Deep Learning-basierten Klassifikator.
get_dl_classifier_paramGetDlClassifierParamGetDlClassifierParamget_dl_classifier_param
Auslesen der Parameter eines Deep Learning-basierten Klassifikators.
get_dl_classifier_resultGetDlClassifierResultGetDlClassifierResultget_dl_classifier_result
Abrufen der Inferenz-Ergebnisse eines Deep Learning-basierten Klassifikators.
get_dl_classifier_train_resultGetDlClassifierTrainResultGetDlClassifierTrainResultget_dl_classifier_train_result
Auslesen der Resultate eines Trainingsschrittes des Deep Learning-basierten Klassifikators.
read_dl_classifierReadDlClassifierReadDlClassifierread_dl_classifier
Lesen eines Deep Learning-basierten Klassifikators aus einer Datei.
serialize_dl_classifierSerializeDlClassifierSerializeDlClassifierserialize_dl_classifier
Serialisiert einen Deep Learning-basierten Klassifikator.
set_dl_classifier_paramSetDlClassifierParamSetDlClassifierParamset_dl_classifier_param
Setzen der Parameter des Deep Learning-basierten Klassifikators.
train_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchtrain_dl_classifier_batch
Ausführen eines Trainingsschrittes eines Deep Learning-basierten Klassifikators auf Basis eines Batches von Bildern.
write_dl_classifierWriteDlClassifierWriteDlClassifierwrite_dl_classifier
Abspeichern eines Deep Learning-basierten Klassifikators in eine Datei.

KlassenKlassen | | Operatoren