Dieses Kapitel beschreibt, wie Deep Learning-basierte zur 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ösenskalen, 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 verschiedener Ebenen 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. Diese kriegen je eine der Merkmalskarten als Eingabe und lernen, potentielle Objekte zu finden und 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
Achsen-paralleles umschließendes Rechteck angegeben.
Somit besteht die erste Aufgabe aus dem Finden eines passenden
umschließenden Rechtecks für jede Instanz.
Dafür schlägt das Netzwerk umschließende Referenzrechtecke vor und lernt,
wie diese anzupassen sind, um bestmöglich zu den Instanzen zu passen.
Die umschließenden Rechtecke können verschiedene Größen und
Seitenverhältnisse haben.
Das Netzwerk muss also lernen, wo solche umschließenden Rechtecke im Bild
vorkommen können und was für eine Gestalt sie haben können.
Mit dem Ansatz in HALCON schlägt das Netzwerk für jeden Pixel jeder
Merkmalskarte der Merkmalspyramide einen Satz umschließender
Referenzrechtecke vor.
Dabei wird die Form über den Parameter 'aspect_ratios'
und die
Größe über den Parameter 'num_subscales'
beeinflusst,
siehe die unten folgende Illustration und
.
So werden für jeden, der genannten Pixel get_dl_model_param
'aspect_ratios'
mal
'num_subscales'
umschließende Referenzrechtecke generiert.
Diese Referenzrechtecke dienen als Basis zum Finden potentieller Objekte.
Das Netzwerk sagt die Anpassungen voraus, um aus den umschließenden Referenzrechtecken angepasste umschließende Referenzrechtecke zu erhalten, welche besser zu möglichen Instanzen passen. Es lernt dies indem die vorgeschlagenen umschließenden Rechtecke mit den Ground Truth umschließenden Rechtecken vergleicht, d.h. mit der Information, wo im Bild sich einzelne Objekte befinden. Eine Illustration ist unten gegeben. Dabei ist es für das Netzwerk umso einfacher die korrekte Form zu lernen, je näher die umschließenden Referenzrechtecke der Gestalt der Ground Truth umschließenden Rechtecke kommen.
(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.
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'
in
eingestellt werden. 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.
Die folgenden Abschnitte behandeln den generellen Ablauf der Objektdetektion, Informationen zu den involvierten Daten und Parameter sowie Erklärungen zu den Evaluierungsmaßen.
Dieser Absatz beschreibt den generellen Ablauf einer Objektdetektion
mittels DL. Dabei wird angenommen, dass der Datensatz bereits sämtliche
notwendigen Annotationen beinhaltet, siehe den Absatz „Daten“ unten.
Die HDevelop Beispiels-Reihe detect_pills_deep_learning
zeigt
eine mögliche Anwendung. Dabei ist die Anwendung in die vier Teile
'Vorbereitung', 'Training', 'Evaluierung' und 'Inferenz'
unterteilt, welche jeweils als Anleitung für eine Implementierung genutzt
werden können.
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 und konvertiert werden. Dazu kann die Prozedur
read_dl_dataset_from_coco
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 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 liefert diese Prozedur eine Anleitung. 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_batch
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 „Modell-Parameter 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, DLDetectionHandle
das Dictionary mit den Informationen über den Datensatz,
DLDataset
das Dictionary mit den Trainingsparametern,
TrainingParam
die Angabe, über wieviele 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 Modell-Parameter, 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
'TRUE'
gesetz sein.
Die Ergebnisse der Evaluierung können mit der Prozedur
dev_display_detection_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 Modell-Parameter die im unteren Abschnitt „Modell-Parameter und Hyperparameter“ erwähnt sind, über den Operator
Dabei sollte die
auf die Anzahl gleichzeitig
zu inferierenden Bilder gesetzt werden.
batch_size
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 Dictonary '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.
Um die Daten entsprechend zu formatieren, wird im Fall der
Objektdetektion empfohlen, die Prozedur
create_dl_dataset_from_coco
zu verwenden.
Diese liest das Standard COCO-Format ein und erstellt ein Dictionary
.
Letzteres fungiert als Datenbank der benötigten Informationen.
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.
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 über die obere linke Ecke
(DLResult
, bbox_row1
) und die untere rechte Ecke
(bbox_col1
, bbox_row2
)
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.
bbox_col2
Nebst den allgemeinen DL Hyperparametern aus dem Kapitel Deep Learning gibt es für die Objektdetektion noch einen weiteren Hyperparameter:
'class_weights'
, für weitere Informationen siehe die
Dokumentation des Operators
.
get_dl_model_param
Hyperparameter können über den Operator
gesetzt werden .
set_dl_model_param
Für die Objektdetektion gibt es zwei Arten von Modell-Parametern:
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 Resultate der 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, ParName{mAP}, ein Maß zur Bestimmung wie gut die Instanzen gefunden und klassifiziert wurden.
'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
'TRUE'
gesetzt sein.
(1) | (2) |
create_dl_model_detection