Vor ein paar Monaten war ich ein wenig besorgt über den Mangel an Wissen über die Details der SSD (Single Shot Multibox Detector), also beschloss ich, nach und nach meine eigene SSD zu bauen, während ich mir die Papiere und die Implementierung in Github usw. ansah. Es war. Um ehrlich zu sein, ist es noch nicht vorbei, aber ich habe gelernt, wie man eine Standardbox (Prior) erstellt, eine wichtige Funktion für SSDs. Deshalb möchte ich sie mit Ihnen teilen.
Wenn Sie diesen Artikel lesen, wissen Sie wahrscheinlich, was die Standardbox ist, aber ich werde es für alle Fälle ein wenig erklären. Bei der Verarbeitung eines Bildes gibt die SSD ein verschlungenes Bild namens Feature Map aus. Feature Map, Anzahl und Größe sind in den Modelleinstellungen angegeben, im Grunde sind es jedoch ungefähr 5 oder 6. Um das Objekt anhand der Feature-Map zu erkennen, wird der Bereich angegeben, in dem das Objekt wahrscheinlich angezeigt wird. Dieser Bereich wird als Standardfeld (manchmal auch als Prior bezeichnet) bezeichnet und für die Klassifizierung und Regression verwendet. Ich bin.
Es sieht so aus, wenn Sie einen Satz Standardboxen visualisieren. Mit meinen Modelleinstellungen werden insgesamt 8732 erstellt. Dies ist ein Bild des COCO-Datensatzes 2017.
Gemäß der Erklärung des Papiers benötigen wir zur Berechnung der Standardbox die Skalierung (es gibt keine spezifische Definition, aber so etwas wie die Skalierung eines Objekts, Seitenverhältnisse (Seitenverhältnis der Standardbox) und die Größe der Feature-Map.
In der Arbeit wird die Skalierung durch diese Funktion definiert. m ist die Anzahl der Feature-Maps und k ist die Anzahl der Feature-Maps. Und s_min und s_max werden durch die Größe des Objekts im Bild bestimmt. Ich möchte sagen, dass es einen Weg gibt, sich zu entscheiden, aber es scheint, dass es keinen bestimmten Weg gibt.
Die Funktion selbst sieht etwas kompliziert aus, aber kurz gesagt, sie teilt s_min und s_max zu gleichen Teilen in die gleiche Anzahl wie die Anzahl der Feature-Maps. Wenn zum Beispiel s_min = 0,2, s_max = 0,9 und m = 6 ist, dann wäre s_k [0,2, 0,34, 0,48, 0,62, 0,76, 0,9]. Jede Skala ist gleichmäßig durch 0,14 getrennt.
Seitenverhältnisse wie s_min und s_max werden vom Objekt bestimmt. Das Papier gibt an, dass das Seitenverhältnis von {1, 2, 3, 1/2, 1/3} verwendet wurde. Es war ein wenig unklar, nur auf das Papier zu schauen, aber (2, 1/2) und (3, 1/3) sind wie eine Kombination. Wenn Sie also über die Reduzierung des Seitenverhältnisses sprechen, im Grunde 3 und 1/3 Dies bedeutet, dass das Seitenverhältnis nicht verwendet wird.
Feature Maps war der (persönlich) offensichtlichste Teil, aber einfach die Größe der Ausgabe der Faltungsschicht, die an den Klassifizierungs- und Regressionskopf in der SSD übergeben werden soll. In meinem Modell ist die erste Ausgabe beispielsweise 38 x 38 und die letzte Ausgabe 1 x 1.
Sobald Sie die erforderlichen Teile oben haben, können Sie die Standardbox berechnen. Diese Funktion berechnet die Höhe und Breite der Standardbox.
Und Sie können jetzt die cx- und cy-Punkte des Mittelpunkts der Standardbox berechnen. F_k ist hier einfach die Größe der Feature-Map (zB 38).
Übrigens ist das Muster [cx, cy, w, h] bei der Darstellung der Standardbox üblich.
Die oben beschriebenen Berechnungen für cx, cy und w, h werden für jedes Seitenverhältnis in jeder Merkmalskarte durchgeführt. 1 ist jedoch eine kleine Ausnahme. Wenn es 1 ist, werden zwei Standardboxen berechnet. Sie wird mit der Standardbox berechnet, die mit einer normalen Skala und einer anderen Skala berechnet wird. Eine andere Methode zur Berechnung des Maßstabs wird durch die folgende Funktion definiert. Sie kann anhand des Maßstabs der aktuellen Feature-Map und des um eine Stufe höheren Maßstabs berechnet werden.
Es gibt eine Standardbox für das Seitenverhältnis 1. Für {1, 2, 3, 1/2, 1/3} erstellt jeder Block sechs Standardboxen. Im Fall von {1, 2, 1/2} werden vier erstellt.
Ich habe mir einige Implementierungen angesehen, um zu verstehen, wie eine Standardbox erstellt wird, aber irgendwann habe ich sie nach dem Lesen des Dokuments nicht mehr verstanden.
Zunächst sehen wir oft eine Variable namens Schritte. f_k wird berechnet, indem die Bildgröße schrittweise geteilt wird. Es gibt nirgendwo eine Erklärung und sie ist nicht in der Zeitung geschrieben, aber die Schritte werden berechnet, indem die Größe des Bildes durch die Größe der Feature-Map geteilt wird. Zum Beispiel ergibt das Teilen von 300 durch 38 7,89-> 8.
steps: [8, 16, 32, 64, 100, 300]
Das andere, was stecken geblieben ist, ist die Einstellung des Seitenverhältnisses. Es gibt viele Möglichkeiten, so zu schreiben.
aspect_ratios: [[2], [2,3], [2,3], [2,3], [2], [2]]
Ich hatte nicht 1/2 oder 1/3, also dachte ich: "Was ist das?", Aber ich kann einfach 2 und 1/2 mit nur 2 waschen und 3 und 1/3 mit nur 3 ausdrücken. [2,3] bedeutet {1, 2, 3, 1/2, 1/3}.
Es ist üblich, solche Einstellungen für Skalen zu schreiben.
scales: [30, 60, 111, 162, 213, 264, 315]
Dies ist die Bildgröße multipliziert mit dem bereits berechneten s_k. Wenn s_k 0,1 ist, ist der Wert der Skalen 30.
Schließlich mag dies einigen Leuten offensichtlich erscheinen, aber bei der Berechnung der 2 und 1/2 Standardboxen werden nur 2 w und h berechnet, und die 1/2 Standardbox ist 2 h. Verwenden Sie als w und verwenden Sie w als h. Der Grund ist, dass "sqrt (2) == 1 / sqrt (1/2)" und "sqrt (1/2) == 1 / sqrt (2)".
Vielen Dank für das Lesen bis zum Ende! Meine Muttersprache ist nicht Japanisch, daher kann es einige Dinge geben, die ich nicht gut erklären oder seltsame Wörter verwenden kann. Wenn Sie Fragen haben, kommentieren Sie bitte und ich werde versuchen, so viel wie möglich zu beantworten!
Ich möchte während der Implementierung von SSD immer mehr posten, freue mich also auf den nächsten Beitrag!
Recommended Posts