Dieses Kapitel beschreibt, wie Deep Learning-basierte Objektdetektion genutzt wird.
Mit der Objektdetektion will man verschiedene Instanzen auf dem Bild finden und einer Klasse zuordnen. Dabei werden auch partiell überlappende Instanzen als eigenständige Instanzen unterschieden. Dies wird im folgenden Schema illustriert.
Objektdetektion führt zu zwei verschiedenen Aufgabenstellungen: Die Instanzen finden und sie einer Klasse zuordnen. Zu diesem Zweck wird ein kombiniertes Netzwerk verwendet, welches aus drei Hauptteilen besteht. Der erste Teil, das Backbone, besteht aus einem vortrainierten Netzwerk, welches auch zur Klassifikation verwendet werden kann. Seine Aufgabe ist das Generieren verschiedener Merkmalskarten, weshalb der Klassifikations-Layer entfernt wurde. Diese Merkmalskarten verschlüsseln verschiedenste Informationen auf verschiedenen Größenskalen, abhängig davon wie tief im Netzwerk sie sind, siehe dazu auch das Kapitel Deep Learning. Dabei ordnet man Merkmalskarten gleicher Größe (Breite und Höhe) der gleichen Ebene zu. Im zweiten Teil werden ausgewählte Merkmalskarten miteinander verbunden. Genauer, Backbone-Layers verschiedener Ebenen sind als Docking Layer festgelegt. Ihre Merkmalskarten werden miteinander verbunden. Daraus entstehen neue Merkmalskarten, die sowohl Informationen von tiefer als auch höher liegenden Ebenen beinhalten. Diese Merkmalskarten werden im dritten Teil verwendet. Den zweite Teil nennt man auch Merkmalspyramide und zusammen mit dem ersten Teil bilden sie das Merkmalspyramiden-Netzwerk. Der dritte Teil besteht aus zusätzlichen Netzwerken, den Heads, für jede ausgewählte Ebene. Diese kriegen je eine der Merkmalskarten als Eingabe und lernen, potentielle Objekte zu finden, respektive zu klassifizieren. Zusätzlich beinhaltet dieser dritte Teil auch die Reduktion sich überlappender umschließender Rechtecke. Eine Übersicht zu den drei Teilen ist im folgenden Schema gegeben.
Der dritte Teil soll nun genauer betrachtet werden.
In der Objektdetektion wird die Stelle einer Instanz im Bild durch ein
umschließendes Rechteck angegeben.
Somit besteht die erste Aufgabe aus dem Finden eines passenden
umschließenden Rechtecks für jede Instanz.
Dafür generiert das Netzwerk umschließende Referenzrechtecke und lernt,
wie diese anzupassen sind, um bestmöglich zu den Instanzen zu passen.
Diese Referenzrechtecke werden Anchors genannt.
Je näher die Anchors bereits an die Gestalt der verschiedenen Ground Truth
umschließenden Rechtecke kommen, desto einfacher ist es für das
Netzwerk die korrekten Formen zu lernen.
Zu diesem Zweck generiert das Netzwerk einen Satz Anchors auf jedem
Anchor-Punkt, d.h., auf jedem Pixel aller verwendeten Merkmalskarten der
Mermkalspyramide.
Ein solcher Satz besteht aus jeder möglichen Kombination aus Form, Größe
und für den Instanztyp 'rectangle2'
auch Orientierung.
Dabei wird die Form über den Parameter 'anchor_aspect_ratios'
, die
Größe über den Parameter 'anchor_num_subscales'
und die
Orientierung über den Parameter 'anchor_angles'
beeinflusst,
siehe die unten folgende Illustration und
.
Falls die gewählten Parameter mehrere idente Anchors erzeugen,
werden Duplikate vom Netzwerk intern ignoriert.
get_dl_model_param
Das Netzwerk sagt die Anpassungen voraus, um aus den Anchors angepasste umschließende Referenzrechtecke zu erhalten, welche besser zu möglichen Instanzen passen. Es lernt dies über seine Heads für die umschließenden Rechtecke, welche die vorgeschlagenen umschließenden Rechtecke mit den Ground Truth umschließenden Rechtecken vergleichen, d.h. mit der Information, wo im Bild sich einzelne Objekte befinden. Eine Illustration ist unten gegeben.
(1) | (2) |
Wie zuvor erwähnt werden Merkmalskarten verschiedener Ebenen verwendet.
Ob sehr frühe Merkmalskarten (die noch nicht sehr komprimiert sind und
somit auch kleine Merkmale aufzeigen) und sehr tiefe Merkmalskarten
(die sehr komprimiert sind und somit nur große Merkmale aufzeigen) benutzt
werden sollen oder nicht, hängt vom Größenverhältnis der gesuchten Instanzen
zum Gesamtbild ab.
Welche Ebenen berücksichtigt werden, kann über die Parameter
'min_level'
und 'max_level'
bestimmt werden.
Mit diesen umschließenden Rechtecken sind potentielle Instanzen auf dem
Bild geortet, aber noch keiner Klasse zugeordnet.
Folglich besteht die zweite Aufgabe aus dem Klassifizieren des Bildteils
innerhalb des umschließenden Rechtecks.
Dies geschieht über die Heads für die Klassen.
Für weitere Informationen zur Klassifikation im Allgemeinen wird auf das
Kapitel Deep Learning / Klassifikation und den
„Solution Guide on Classification“
verwiesen.
Höchstwahrscheinlich findet das Netzwerk verschiedene vielversprechende
Instanzen für ein einzelnes Objekt.
Solche sich überlappende, vorhergesagte umschließenden Rechtecke werden
über die 'non-maximum suppression' unterdrückt. Letztere kann über
die Parameter 'max_overlap'
und
'max_overlap_class_agnostic'
eingestellt werden, entweder direkt
beim Erstellen des Modells oder über
.
Eine Illustration ist unten gegeben.
set_dl_model_param
(1) | (2) |
Als Ausgabe werden die umschließenden Rechtecke und die Konfidenzwerte zurück gegeben. Erstere schlagen mögliche Orte für Objekte vor während letztere die Zugehörigkeit des darin enthaltenen Bildinhaltes zu einer der Klassen angibt.
In HALCON ist die Objektdetektion mittels DL als Teil des allgemeinen DL Modells implementiert. Für weitere Information zu letzterem wird auf das Kapitel Deep Learning / Modell verwiesen. Es sind zwei verschiedene Instanztypen implementiert, welche sich in den möglichen Orientierungen der umschließenden Rechtecke unterscheiden:
'rectangle1'
Die umschließenden Rechtecke sind achsen-parallel.
'rectangle2'
Die umschließenden Rechtecke können beliebig orientiert sein.
Die folgenden Abschnitte behandeln den generellen Ablauf der Objektdetektion, Informationen zu den involvierten Daten und Parameter sowie Erklärungen zu den Evaluierungsmaßen.
Dieser Abschnitt beschreibt den generellen Ablauf einer Objektdetektion
mittels Deep Learning.
Er ist unterteilt in die vier Bereiche
Erstellen eines Modells und 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 detect_pills_deep_learning
zeigt eine mögliche Anwendung unterteilt in die einzelnen Bereiche.
Dieser Abschnitt behandelt das Erstellen eines DL Modells für
Objektdetektion und die notwendigen Anpassungen des Datensatzes an
die Anforderungen des Modells.
Die einzelnen Schritte sind im HDevelop Beispiel
detect_pills_deep_learning_1_prepare.hdev
gezeigt.
Erstellen eines Modells mit dem Operator
Dabei müssen zumindest das Backbone und die Anzahl zu unterscheidender
Klassen angegeben werden. Weitere Parameter können über das Dictionary
angegeben werden.
Diese Parameterwerte sollten gut für die spezifische Aufgabe gewählt
werden, nicht zuletzt um möglicherweise Speicherbedarf und Laufzeit
zu reduzieren.
Für weitere Informationen wird auf die Dokumentation des Operators
verwiesen.
Es gilt zu beachten, dass nach dem Erstellen eines Modells seine
zugrunde liegende Architektur auf die entsprechenden Eingabewerte
festgelegt ist.
Als Resultat gibt der Operator das Handle DLModelDetectionParam
'DLModelHandle'
zurück.
Alternativ kann auch mit dem Operator
ein Modell eingelesen werden, welches zuvor mit
gespeichert wurde.
write_dl_model
Die Information, was auf welchem Bild des Trainings-Datensatzes gefunden werden soll, muss eingelesen werden. Dies kann geschehen durch Einlesen
eines
durch den Operator DLDataset
read_dict
einer Datei im COCO Format durch die Prozedur
read_dl_dataset_from_coco
, wobei ein Dictionary
erstellt wird.
DLDataset
Das Dictionary
dient als Datenbank, in welchem
alle notwendigen Informationen über die Daten abgespeichert werden.
Für mehr Information zu den Daten und die Art und Weise, wie sie
übergeben werden, wird auf den unteren Absatz „Daten“ und das
Kapitel Deep Learning / Modell verwiesen.
DLDataset
Die Daten von
sollen in drei
getrennten Datensätze geteilt 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
Das Netzwerk stellt mehrere Anforderungen an die Bilder, wie die Bilddimensionen und den Grauwertbereich. Jeder einzelne Wert kann über den Operator
abgefragt werden. Alternativ können alle Werte auf einmal über die Prozedur
create_dl_preprocess_param_from_model
.
abgefragt werden.
Der Datensatz kann nun vorverarbeitet werden. Dafür kann die Prozedur
preprocess_dl_dataset
verwendet werden. Für die Implementierung einer selbst erstellten Vorverarbeitung kann man sich an dieser Prozedur orientieren. Es wird empfohlen, alle für das Training benötigten Bilder vor dem Training vorzuverarbeiten und abzuspeichern, was das Trainieren signifikant beschleunigt.
Die vorverarbeiteten Daten können mit der Prozedur
dev_display_dl_data
visualisiert werden.
Dieser Abschnitt behandelt das Trainieren des DL Modells für
Objektdetektion.
Die einzelnen Schritte sind im HDevelop Beispiel
detect_pills_deep_learning_2_train.hdev
gezeigt.
Setzen der Trainingsparameter und Abspeichern derselben im
Dictionary
.
Diese Parameter beinhalten:
TrainingParam
die Hyperparameter, für eine Übersicht wird auf den unteren Abschnitt „Modellparameter und Hyperparameter“ sowie das Kapitel Deep Learning verwiesen.
Parameter zur eventuellen Datenanreicherung.
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.
Während des Trainings sollte sich der Wert der Gesamt-Zielfunktion verringern.
Dieser Abschnitt behandelt das Evaluieren eines DL Modells für
Objektdetektion.
Die einzelnen Schritte sind im HDevelop Beispiel
detect_pills_deep_learning_3_evaluate.hdev
gezeigt.
Setzen der Modellparameter, welche die Evaluierung beeinflussen.
Die Evaluierung kann bequem mit der Prozedur
evaluate_dl_model
.
durchgeführt werden.
Diese Prozedur erwartet ein Dictionary
mit
den Evaluierungsparametern.
Um die Resultate danach zu visualisieren, muss der Parameter
GenParamEval
auf detailed_evaluation
'true'
gesetzt sein.
Die Ergebnisse der Evaluierung können mit der Prozedur
dev_display_detection_detailed_evaluation
visualisiert werden.
Dieser Abschnitt behandelt die Inferenz auf neuen Bildern durch ein
DL Modell für Objektdetektion.
Die einzelnen Schritte sind im HDevelop Beispiel
detect_pills_deep_learning_4_infer.hdev
gezeigt.
Anfragen der Bildanforderungen des Netzwerks über den Operator
oder die Prozedur
create_dl_preprocess_param_from_model
.
Setzen der Modellparameter die im unteren Abschnitt „Modellparameter und Hyperparameter“ erwähnt sind, über den Operator
Dabei kann die
im Allgemeinen unabhängig von
der Anzahl der gleichzeitig zu inferierenden Bilder gesetzt werden.
Siehe batch_size
für weitere Informationen, wie man
diesen Parameter setzt, um eine größere Effizienz zu erzielen.
apply_dl_model
Generieren des Dictionaries
für jedes Bild.
Dies kann über die Prozedur
DLSample
gen_dl_samples_from_images
getan werden.
Jedes Bild muss auf dieselbe Art und Weise wie für das Training vorverarbeitet werden. Dies kann mit der Prozedur
preprocess_dl_samples
getan werden.
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 wird jedoch für jedes einzelne Objekt die Information benötigt, zu welcher Klasse es gehört und wo im Bild es sich befindet (gegeben über das umschließende Rechteck).
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 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 Objekt eines jeden Bildes gesagt wird, zu welcher Klasse es gehört
und wo auf dem Bild es sich befindet.
Getan wird dies über das Klassenlabel und das umschließende Rechteck.
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
als Datenbank
der Informationen, die von den Trainings- und Evaluierungs-Prozeduren
benötigt werden.
Die Daten können direkt mit Hilfe des MVTec Deep Learning Tools gelabelt
werden, erhältlich auf der MVTec Webseite.
Dabei wird das Dictionary DLDataset
direkt erzeugt.
Sind die Daten bereits im Standard COCO-Format gelabelt, kann
die Prozedur DLDataset
create_dl_dataset_from_coco
verwendet werden
(nur für 'instance_type'
= 'rectangle1'
).
Diese formatiert die Daten und erstellt das Dictionary
.
Für weitere Informationen zum benötigten Part des COCO-Formats wird
auf die Dokumentation der Prozedur verwiesen.
DLDataset
Es sollten genügend Trainingsdaten vorliegen um diese in die drei Untermengen aufzuteilen, welche für das Training, die Evaluierung und das Testen des Netzwerks verwendet werden. Diese Untermengen sind idealerweise unabhängig und gleich verteilt, siehe den Abschnitt „Daten“ im Kapitel Deep Learning.
Es gilt zu beachten, dass das Netzwerk lernen muss, wie es mögliche Positionen und Größen von Instanzen finden soll. Deshalb ist es wichtig, dass auch alle später wichtigen Größen und Positionen im Datensatz repräsentativ vorhanden sind.
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 und können
mit
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 liefern diese Prozeduren eine
Anleitung für die Implementierung.
Abhängig vom Instanztyp, werden die umschließenden Rechtecke unterschiedlich parametrisiert:
'rectangle1'
Die umschließenden Rechtecke werden über
das linke obere Eck ('bbox_row1'
, 'bbox_col1'
) und
das rechte untere Eck ('bbox_row2'
, 'bbox_col2'
)
beschrieben.
Dies ist konsistent zu
.
gen_rectangle1
'rectangle2'
Die umschließenden Rechtecke werden über den Schwerpunkt
('bbox_row'
, 'bbox_col'
), der Orientierung
'bbox_phi'
und den halben Kantenlängen
'bbox_length1'
und 'bbox_length2'
beschrieben.
Die Orientierung wird in Bogenmaß angegeben und gibt den
Winkel zwischen der horizontalen Achse und 'bbox_length1'
an
(mathematisch positiv).
Dies ist konsistent zu
.
gen_rectangle2
'rectangle2'
das orientierte umschließende
Rechteck von Interesse ohne die Ausrichtung des Objekts
innerhalb dieses umschließenden Rechtecks zu berücksichtigen, so kann
der Parameter 'ignore_direction'
auf 'true'
gesetzt
werden.
Die verschiedenen Typen sind in der folgenden Abbildung illustriert.
(1) | (2) | (3) |
Als Trainingsausgabe 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.
DLTrainResult
Als Inferenz- und Evaluierungs-Ausgabe gibt der Operator
für das Modell für jedes Bild
ein Dictionary apply_dl_model
zurück.
Im Falle der Objektdetektion beinhaltet dieses Dictionary für jede
gefundene Instanz das umschließende Rechteck sowie den Konfidenzwert
der zugeordneten Klasse.
Dabei können für ein Objekt des Bildes mehrere Instanzen gefunden
werden, siehe die obere Erklärung zur 'non-maximum suppression'.
Die umschließenden Rechtecke werden entsprechend dem Instanztyp
(über DLResult
'instance_type'
bestimmt) parametrisiert und
in pixel-zentrierten, subpixel-genauen Koordinaten angegeben.
Für weitere Informationen zu den dabei verwendeten Bildkoordinaten wird
auf das Kapitel Transformationen / 2D-Transformationen
verwiesen.
Weitere Informationen zum Ausgabe-Dictionary können im Kapitel
Deep Learning / Modell gefunden werden.
Nebst den allgemeinen DL Hyperparametern aus dem Kapitel Deep Learning gibt es für die Objektdetektion noch weitere Hyperparameter:
'bbox_heads_weight'
'class_heads_weight'
'class_weights'
Diese Hyperparameter können über den Operator
gesetzt werden.
Für weitere Informationen wird auf die Dokumentation des Operators
create_dl_model_detection
verwiesen.
get_dl_model_param
Für die Objektdetektion gibt es zwei Arten von Modellparametern:
Parameter, welche die Architektur beeinflussen. Diese können für ein
erstelltes Modell nicht mehr geändert werden.
Diese Parameter werden beim Erstellen des Modells über den Operator
gesetzt.
create_dl_model_detection
Parameter, welche die Vorhersage und somit auch die Evaluierung beeinflussen. Dabei sind folgende Parameter nur für die Objektdetektion relevant:
'max_num_detections'
'max_overlap'
'max_overlap_class_agnostic'
'min_confidence'
Weitere Erklärungen dazu finden sich in
.
Diese Parameter können beim Erstellen des Modells mit
get_dl_model_param
gesetzt werden oder danach mit
create_dl_model_detection
.
set_dl_model_param
Für die Objektdetektion werden in HALCON folgende Evaluierungsmaße unterstützt. Es gilt zu beachten, dass zur Berechnung eines solchen Maßes die zugehörige Ground Truth Annotation notwendig ist.
Mean average precision,
und average precision (AP)
einer Klasse für einen gegebenen IoU, mAP
ap_iou_classname
Die Größe AP ist ein Mittelwert maximaler Precision-Werte für verschiedene Recall-Werte. In einfachen Worten besagt dieses Maß, ob die vorhergesagten Objekte dieser Klasse weitgehend richtige Vorhersagen sind oder nicht. Dabei erhalten Vorhersagen mit hoher Konfidenz ein höheres Gewicht. Je höher der Wert desto besser.
Damit eine Vorhersage als richtig zählt, muss beides stimmen, die top-1 Klassenzuordnung sowie auch die Lokalisierung im Bild. Die Lokalisierung wird über die Intersection over Union (IoU) gemessen: Eine Instanz zählt als korrekt geortet, wenn der IoU höher als der geforderte Schwellwert ist. Der IoU wird unten ausführlicher erklärt. Somit ist die Größe AP sowohl von der Klasse als auch dem IoU Schwellwert abhängig.
Als Resultate können folgenden Werte erhalten werden:
Die spezifischen AP-Werte, die Mittelung über alle Klassen,
die Mittelung über die IoU Schwellwerte sowie die Mittelung über
sowohl alle Klassen als auch die Schwellwerte.
Letzteres ist die Größe mean average precision,
, ein Maß
zur Bestimmung wie gut die Instanzen gefunden und klassifiziert wurden.
mAP
'True Positives', 'False Positives' und 'False Negatives'
Das Konzept von 'True Positives', 'False Positives' und 'False Negatives' wird im Kapitel Deep Learning erklärt. Es trifft auch bei der Objektdetektion zu, mit der Ausnahme dass es verschiedene Arten von 'False Positives' gibt wie z.B.:
Eine Instanz wurde falsch klassifiziert.
Eine Instanz wurde auf dem Hintergrund gefunden
Die Position einer Instanz wurde ungenügend präzise gefunden, d.h. der IoU zwischen der Instanz und dem Ground Truth Objekt ist kleiner als der bei der Evaluierung verwendete IoU Schwellwert.
Duplikate, d.h. mindestens zwei Instanzen überlappen
hauptsächlich mit dem selben Ground Truth Objekt aber überlappen
miteinander weniger als durch 'max_overlap'
erlaubt,
weshalb keine der Instanzen unterdrückt wird.
Es gilt zu beachten, dass diese Werte nur aus der detaillierten
Evaluierung erhältlich sind. Dies bedeutet, in
evaluate_dl_model
muss der Parameter
auf detailed_evaluation
'true'
gesetzt sein.
Score of Angle Precision (SoAP)
Die Größe SoAP ist ein Maß für die Präzision der inferierten
Orientierungswinkel. Dieses Maß bestimmt sich aus der Winkeldifferenzen
zwischen den inferierten Instanzen (I) und den zugehörigen Ground Truth
Annotationen (GT):
wobei der Index über alle inferierten Instanzen läuft.
Diese Größe ist nur für Modelle mit Instanztyp 'instance_type'
'rectangle2'
definiert.
(1) | (2) |
create_dl_model_detection