Objektdetektion

Liste der Operatoren ↓

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.

image/svg+xml 'apple' 0.9 'apple' 0.7 'lemon' 0.9
Ein mögliches Beispiel der Objektdetektion: Auf dem Eingabebild werden drei verschiedene Instanzen gefunden und ihrer entsprechenden Klasse zugeordnet.

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.

image/svg+xml (1) (2) (3) + 'lemon' 0.9 'apple' 0.7 'apple' 0.9 confidences confidences confidences +
Schematische Übersicht der genannten drei Teile: (1) Das Backbone. (2) Merkmalskarten des Backbones werden miteinander kombiniert, woraus neue Merkmalskarten entstehen. (3) Zusätzliche Netzwerke lernen, potentielle Objekte zu erkennen und zu klassifizieren. Überlappende umschließende Rechtecke werden unterdrückt.

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'"aspect_ratios""aspect_ratios""aspect_ratios""aspect_ratios" und die Größe über den Parameter 'num_subscales'"num_subscales""num_subscales""num_subscales""num_subscales" beeinflusst, siehe die unten folgende Illustration und get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParam. So werden für jeden, der genannten Pixel 'aspect_ratios'"aspect_ratios""aspect_ratios""aspect_ratios""aspect_ratios" mal 'num_subscales'"num_subscales""num_subscales""num_subscales""num_subscales" umschließende Referenzrechtecke generiert. Diese Referenzrechtecke dienen als Basis zum Finden potentieller Objekte.

image/svg+xml (1) (2) (4) (3)
Schema der umschließenden Referenzrechtecke auf der Merkmalskarte (rechts) und dem Eingabebild (links). (1) Umschließende Referenzrechtecke werden auf den Merkmalskarten der verschiedenen Ebenen generiert, z.B. die gezeigten Referenzrechtecke (in Hellblau, in Orange und in Dunkelblau). (2) Umschließende Referenzrechtecke verschiedener Größen werden generiert durch Setzen von 'num_subscales'"num_subscales""num_subscales""num_subscales""num_subscales". (3) Umschließende Referenzrechtecke verschiedener Seitenverhältnisse werden generiert durch Setzen von 'apsect_ratios'"apsect_ratios""apsect_ratios""apsect_ratios""apsect_ratios".

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.

image/svg+xml image/svg+xml
(1) (2)
(1) Das Netzwerk passt das umschließenden Referenzrechteck (in Hellblau) an, um ein besser geeignetes umschließendes Rechteck (in Orange) vorauszusagen. (2) Während des Trainings vergleicht das Netzwerk das vorhergesagte umschließende Rechteck (in Orange) mit dem Ground Truth umschließenden Rechteck, mit dem es sich am meisten überlagert, und lernt daraus die Anpassungen.

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'"min_level""min_level""min_level""min_level" und 'max_level'"max_level""max_level""max_level""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'"max_overlap""max_overlap""max_overlap""max_overlap" und 'max_overlap_class_agnostic'"max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic" in set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParam eingestellt werden. Eine Illustration ist unten gegeben.

image/svg+xml image/svg+xml
(1) (2)
Unterdrückung signifikant überlappender umschließender Rechtecke. (1) Das Netzwerk findet mehrere vielversprechende Instanzen. (2) Die Unterdrückung sich überlappender Instanzen wird über den Parameter 'max_overlap'"max_overlap""max_overlap""max_overlap""max_overlap" gesetzt. Sich überlappende Instanzen verschiedener Klassen werden nicht unterdrückt. (3) Über den Parameter 'max_overlap_class_agnostic'"max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic" werden auch sich stark überlappende Instanzen verschiedener Klassen unterdrückt.

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.

Genereller Ablauf

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.

Erstellen eines Modells und Vorbereiten des Datensatzes

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.

  1. 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 DLModelDetectionParamDLModelDetectionParamDLModelDetectionParamDLModelDetectionParamDLModelDetectionParam 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 'DLModelHandle'"DLModelHandle""DLModelHandle""DLModelHandle""DLModelHandle" zurück.

    Alternativ kann auch mit dem Operator

    ein Modell eingelesen werden, welches zuvor mit write_dl_modelwrite_dl_modelWriteDlModelWriteDlModelWriteDlModel gespeichert wurde.

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

  3. Die Daten von DLDatasetDLDatasetDLDatasetDLDatasetDLDataset sollen in drei getrennten Datensätze geteilt 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.

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

Trainieren des Modells

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.

  1. Setzen der Trainingsparameter und Abspeichern derselben im Dictionary TrainingParamTrainingParamTrainingParamTrainingParamtrainingParam. Diese Parameter beinhalten:

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

  2. Trainieren des Modells. Dafür kann die Prozedur

    • train_dl_model.

    verwendet werden. Diese Prozedur benötigt:

    • das Handle des Modells, DLDetectionHandleDLDetectionHandleDLDetectionHandleDLDetectionHandleDLDetectionHandle

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

    • das Dictionary mit den Trainingsparametern, TrainingParamTrainingParamTrainingParamTrainingParamtrainingParam

    • die Angabe, über wieviele Epochen trainiert werden soll.

    Während des Trainings sollte sich der Wert der Gesamt-Zielfunktion verringern.

Evaluierung des trainierten Modells

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.

  1. Setzen der Modell-Parameter, welche die Evaluierung beeinflussen.

  2. Die Evaluierung kann bequem mit der Prozedur

    • evaluate_dl_model.

    durchgeführt werden. Diese Prozedur erwartet ein Dictionary GenParamEvalGenParamEvalGenParamEvalGenParamEvalgenParamEval mit den Evaluierungsparametern. Um die Resultate danach zu visualisieren, muss der Parameter DetailedDetailedDetailedDetaileddetailed auf 'TRUE'"TRUE""TRUE""TRUE""TRUE" gesetz sein.

  3. Die Ergebnisse der Evaluierung können mit der Prozedur

    • dev_display_detection_evaluation

    visualisiert werden.

Inferenz auf neuen Bildern

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.

  1. Anfragen der Bildanforderungen des Netzwerks über den Operator

    oder die Prozedur

    • create_dl_preprocess_param_from_model.

  2. Setzen der Modell-Parameter die im unteren Abschnitt „Modell-Parameter und Hyperparameter“ erwähnt sind, über den Operator

    Dabei sollte die batch_sizebatch_sizebatch_sizebatch_sizebatchSize auf die Anzahl gleichzeitig zu inferierenden Bilder gesetzt werden.

  3. Generieren des Dictionaries DLSampleDLSampleDLSampleDLSampleDLSample für jedes Bild. Dies kann über die Prozedur

    • gen_dl_samples_from_images

    getan werden.

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

  5. Anwenden des Modells über den Operator

  6. Die Resultate können aus dem Dictonary '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 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 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 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 DLDatasetDLDatasetDLDatasetDLDatasetDLDataset. 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.

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.

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 und können 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 liefern diese Prozeduren eine Anleitung für die Implementierung.

Netzwerk Ausgabe

Als Trainingsausgabe gibt der Operator train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatch für das Modell ein Dictionary DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResult mit dem aktuellen Wert der Gesamt-Zielfunktion sowie die Werte aller weiteren im Modell enthaltenen Zielfunktionen.

Als Inferenz- und Evaluierungs-Ausgabe gibt der Operator apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelApplyDlModel für das Modell für jedes Bild ein Dictionary DLResultDLResultDLResultDLResultDLResult 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 (bbox_row1bbox_row1bbox_row1bbox_row1bboxRow1, bbox_col1bbox_col1bbox_col1bbox_col1bboxCol1) und die untere rechte Ecke (bbox_row2bbox_row2bbox_row2bbox_row2bboxRow2, bbox_col2bbox_col2bbox_col2bbox_col2bboxCol2) 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.

Modell-Parameter und Hyperparameter

Nebst den allgemeinen DL Hyperparametern aus dem Kapitel Deep Learning gibt es für die Objektdetektion noch einen weiteren Hyperparameter:

Hyperparameter können über den Operator set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParam gesetzt werden .

Für die Objektdetektion gibt es zwei Arten von Modell-Parametern:

Evaluierungsmaße für die Daten der Objektdetektion

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.

Vorher erklärte Maße verwenden die Intersection over Union (IoU). Die IoU ist ein Maß zur Genauigkeit der Lokalisierung. Für ein vorgeschlagenes umschließendes Rechteck wird das Verhältnis folgenden beiden Flächen betrachtet: Die Fläche der Schnittmenge und die Fläche der Vereinigungsmenge des vorgeschlagenen umschließenden Rechtecks und des Ground Truth umschließenden Rechtecks. Die folgende Abbildung zeigt ein visuelles Beispiel.
image/svg+xml image/svg+xml IoU=
(1) (2)
Visuelles Beispiel des IoU. (1) Im Eingabebild sieht man das Ground Truth umschließende Rechteck (in Orange) und das vorhergesagte umschließende Rechteck (in Hellblau). (2) Die IoU ist das Verhältnis zwischen den beiden Flächen Schnittmenge und Vereinigungsmenge.

Liste der Operatoren

create_dl_model_detectionCreateDlModelDetectionCreateDlModelDetectioncreate_dl_model_detection
Erzeugen eines Deep Learning-Netzwerks zur Objektdetektion.