Dies ist eine Fortsetzung der Objekterkennung mit dem Microsoft Cognitive Toolkit (CNTK).
In Teil 2 wird die Objekterkennung durch CNTK unter Verwendung der in Teil 1 vorbereiteten Trainingsdaten durchgeführt. Es wird davon ausgegangen, dass CNTK und NVIDIA GPU CUDA installiert sind.
In Computer Vision: Objekterkennung Teil 1 - Bounding Box-Vorverarbeitung aus Microsoft Common Object in Contexts (COCO) [1] wird der Bounding Box angezeigt Wir haben ein Kategorielabel und eine Ankerbox vorbereitet.
In Teil 2 werden wir ein einstufiges Objekterkennungsmodell unter Verwendung eines neuronalen Netzwerks erstellen und trainieren.
Dieses Mal habe ich ein Modell erstellt, das die Multi-Scale-Feature-Map von SSD [2] und die direkte Standortvorhersage von YOLOv2 [3] kombiniert. Der Umriss des implementierten neuronalen Netzwerks ist in der folgenden Abbildung dargestellt.
Fügen Sie der Feature-Map eine Faltungsschicht hinzu, die aus dem vorab trainierten neuronalen Faltungsnetzwerk (CNN) erhalten wurde. Die hinzugefügte Faltungsschicht übernimmt nicht den Bias-Term, die Aktivierungsfunktion übernimmt exponentielle lineare Einheiten (ELUs) [[4]](# Referenz) und die Chargennormalisierung [[5]](# Referenz) wird angewendet. Ich werde.
In der endgültigen Ausgabefaltungsschicht wird der Bias-Term übernommen, ohne die nichtlineare Aktivierungsfunktion und die Chargennormalisierung zu verwenden, um Begrenzungsrahmen, Objektivität und Kategorisierung durchzuführen.
Die Idee war, eine 26x26-Feature-Map zum Erkennen kleiner Objekte, eine 13x13-Feature-Map zum Erkennen mittlerer Objekte und eine 7x7-Feature-Map zum Erkennen großer Objekte zu verwenden. Die verwendeten Ankerkästen sind 26 × 26 (0,06, 0,08), 13 × 13 (0,19, 0,28), (0,31, 0,67), (0,66, 0,35), 7 × 7 (0,31, 0,67), (0,66, 0,35), ( 0,83, 0,83) verwendet wird.
Der YOLO-Algorithmus wird verwendet, um den Begrenzungsrahmen vorherzusagen.
x = \sigma(t_x) + c_x \\
y = \sigma(t_y) + c_y \\
w = p_w \log(1 + e^{t_w}) \\
h = p_h \log(1 + e^{t_h}) \\
objectness = \sigma(t_o)
Wenden Sie nun die Sigmoid-Funktion auf die Netzwerkausgabe $ t_x, t_y $ an und addieren Sie dann die oberen linken Koordinaten $ c_x, c_y $ jeder Gitterzelle, um die Mittelkoordinaten jeder Gitterzelle vorherzusagen. Um die Breite und Höhe vorherzusagen, wenden Sie die Soft-Plus-Funktion auf die Netzwerkausgabe $ t_w, t_h $ an und multiplizieren Sie sie mit der Ankerbox. Wenden Sie die Sigmoid-Funktion aus Gründen der Objektivität auf die Ausgabe $ t_o $ an.
Der Anfangswert des hinzugefügten Faltungsschichtparameters wurde auf He's Normalverteilung [6] gesetzt.
Dieses Mal werden wir die Multitasking-Verlustfunktion verwenden. Verwenden Sie Generalized IoU Loss [7] für die Bounding-Box-Regression, Binary Cross Entropy für die Vorhersage der Objektivität und Cross Entropy Error für die Kategorisierung. Die Details der Verlustfunktion werden später erklärt.
Loss = Generalized IoU Loss + Binary Cross Entropy + Cross Entropy Error
Adam [8] wurde als Optimierungsalgorithmus verwendet. Adams Hyperparameter $ β_1 $ wird auf 0,9 und $ β_2 $ auf den Standardwert von CNTK gesetzt.
Verwenden Sie für die Lernrate die zyklische Lernrate (CLR) [9], die maximale Lernrate beträgt 1e-3, die Basis-Lernrate beträgt 1e-5, die Schrittgröße beträgt das 10-fache der Anzahl der Epochen und die Richtlinie ist Auf triangular2 setzen.
Das Modelltraining führte 100 Epochen durch Mini-Batch-Training durch.
・ CPU Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 5000 16 GB
・ Windows 10 Pro 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.13 ・ H5py 2.9.0 ・ Numpy 1.17.3 ・ Pandas 0.25.0 ・ Scikit-Learn 0.21.3
Das Schulungsprogramm ist auf [GitHub] verfügbar (https://github.com/sho-watari/ComputerVision/tree/master/SSMD).
ssmd_training.py
Ich werde den Hauptinhalt dieser Implementierung ergänzen.
Generalized IoU Loss Der quadratische Fehler [10] und der glatte L1-Verlust [2] [11] werden für die Regressionsverlustfunktion des Begrenzungsrahmens verwendet. Der Schnittpunkt über der Union (IoU), der den Grad der Überlappung zwischen dem Begrenzungsrahmen und dem richtigen Begrenzungsrahmen angibt, kann übernommen werden.
IoU hat jedoch das Problem, mehr Sattelpunkte bei der Optimierung zu haben, da der Wert 0 ist, wenn sich die beiden Begrenzungsrahmen überhaupt nicht überlappen. Die dort vorgeschlagene ist Generalized IoU (GIoU).
Unter der Annahme, dass der prädiktive Begrenzungsrahmen $ A $ und der korrekte Begrenzungsrahmen $ B $ ist, lautet GIoU wie folgt.
IoU = \frac{A \cap B}{A \cup B} \\
GIoU = IoU - \frac{C - (A \cup B)}{C} \\
GIoU Loss = 1 - GIoU
Wobei $ C $ den kleinsten rechteckigen Bereich darstellt, der die beiden Begrenzungsrahmen umgibt. GIoU nimmt einen Wert von [-1, 1] an.
Multi-Task Loss Beim Training eines neuronalen Netzwerks, das mehrere Aufgaben ausführt, wird für jede Aufgabe eine Verlustfunktion definiert. Wie oben erwähnt, besteht diese Verlustfunktion aus den folgenden Verlustfunktionen.
Loss = Generalized IoU Loss + Binary Cross Entropy + Cross Entropy Error
Der verallgemeinerte IoU-Verlust bezieht sich auf die Mittelkoordinaten und die Breite / Höhe des Begrenzungsrahmens, die binäre Kreuzentropie auf die Objektivität, um festzustellen, ob ein Objekt vorhanden ist, und der Kreuzentropiefehler auf die Objektkategorisierung. Berechnen Sie die Verlustfunktion.
Daher lautet die Formel für die Verlustfunktion:
Loss = \lambda^{coord}_{obj} \sum^N \sum^B \left\{1 - \left(IoU - \frac{C - (A \cup B)}{C} \right) \right\} +
\lambda^{coord}_{noobj} \sum^N \sum^B \left\{1 - \left(IoU - \frac{C - (A \cup B')}{C} \right) \right\} \\
+ \lambda^{conf}_{obj} \sum^N \sum^B -t \log(\sigma(t_o)) + \lambda^{conf}_{noobj} \sum^N \sum^B -(1 - t) \log(1 - \sigma(t_o)) \\
+ \lambda^{prob}_{obj} \sum^N \sum^B -t \log(p_c) + \lambda^{prob}_{noobj} \sum^N \sum^B -t \log(p_c) \\
\lambda^{coord}_{obj} = 1.0, \lambda^{coord}_{noobj} = 0.1, \lambda^{conf}_{obj} = 1.0, \lambda^{conf}_{noobj} = 0.1, \lambda^{prob}_{obj} = 1.0, \lambda^{prob}_{noobj} = 0.0
Hier repräsentieren $ A, B und C $ den vorhergesagten Begrenzungsrahmen, den korrekten Begrenzungsrahmen und den kleinsten rechteckigen Bereich, der die beiden Begrenzungsrahmen umgibt, und $ B '$ repräsentiert den Standardbegrenzungsrahmen. Der Standardbegrenzungsrahmen bedeutet einen Begrenzungsrahmen, dessen Mittelkoordinaten und Breite / Höhe jeder Gitterzelle dieselbe Größe wie der Ankerrahmen haben.
Der Beitrag jeder Verlustfunktion wird durch den Koeffizienten $ \ lambda $ angepasst, der auf 1,0 gesetzt wird, wenn das Objekt vorhanden ist, und auf 0,1 oder 0,0, wenn das Objekt nicht vorhanden ist.
Dynamic Target Assignment Beim Netzwerktraining entsprechen nicht alle prädiktiven Begrenzungsrahmen den korrekten Daten. Daher werden wir das Maß für die dynamische Zuweisung des richtigen Begrenzungsrahmens und der richtigen Kategoriebezeichnung verwenden.
Wenn beispielsweise die obere linke Abbildung in der folgenden Abbildung das Eingabebild ist, ist der vom Netzwerk ausgegebene Begrenzungsrahmen der rote Begrenzungsrahmen in der oberen rechten Abbildung, wenn ein Objekt vorhanden ist. Der richtige Begrenzungsrahmen ist jedoch der grüne Begrenzungsrahmen in der unteren linken Abbildung. Berechnen Sie hier die IoU des Ausgabe-Begrenzungsrahmens und des korrekten Begrenzungsrahmens und weisen Sie dem vorhergesagten Begrenzungsrahmen mit der größten IoU den richtigen Begrenzungsrahmen und die richtige Kategoriebezeichnung zu. Die Abbildung unten rechts zeigt den vorhergesagten Begrenzungsrahmen, dem der richtige Begrenzungsrahmen zugewiesen ist, in Blau.
Einige der Begrenzungsrahmen, denen nicht der richtige Begrenzungsrahmen zugewiesen wurde, weisen jedoch hohe IoU-Werte auf. Weisen Sie ihnen daher auch den richtigen Begrenzungsrahmen und die richtige Kategoriebeschriftung zu. Der vorhergesagte Begrenzungsrahmen, dem durch diesen Vorgang der richtige Begrenzungsrahmen zugewiesen wird, ist in der unteren rechten Abbildung hellblau dargestellt.
Wenn der richtige Begrenzungsrahmen nicht zugewiesen werden kann, ist das Objekt nicht vorhanden und der Standardbegrenzungsrahmen ist zugewiesen.
Training loss and error
Die folgende Abbildung zeigt eine Visualisierung jeder Verlustfunktion während des Trainings. Von links GIoU-Verlust für Bounding-Box-Regression, Binäre Kreuzentropie für Objektivität und Kreuzentropiefehler für Kategorisierung. Die horizontale Achse repräsentiert die Anzahl der Epochen und die vertikale Achse repräsentiert den Wert der Verlustfunktion.
Validation mAP score
Nachdem wir ein einstufiges Objekterkennungsmodell trainiert haben, haben wir die Leistung anhand von Verifizierungsdaten bewertet.
Für diese Leistungsbewertung haben wir die mittlere durchschnittliche Präzision (mAP) berechnet. Ich habe sklearn verwendet, um den mAP zu berechnen und die IoU auf 0,5 zu setzen. Die Verwendung von val2014 als Validierungsdaten führte zu folgenden Ergebnissen:
mAP50 Score 10.3
FPS and demo
Ich habe auch FPS gemessen, was ein Index für die Ausführungsgeschwindigkeit ist. Die Messung verwendete die Standardzeit des Python-Moduls und die verwendete Hardware war die GPU NVIDIA GeForce GTX 1060 6GB.
39.9 FPS
Unten sehen Sie ein Video eines Objekterkennungsversuchs mit einem trainierten Modell.
Das Ergebnis ist nicht gut. Ich möchte noch einmal versuchen, Objekte zu erkennen.
Microsoft COCO Common Objects in Context
Computer Vision : Image Classification Part2 - Training CNN model Computer Vision : Object Detection Part1 - Bounding Box preprocessing
Recommended Posts