[PYTHON] Was ich durch die Implementierung des Erstellens einer Standardbox für SSD gelernt habe

Ich habe versucht zu analysieren, wie eine Standardbox für SSD erstellt wird

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.

Was ist die Standardbox?

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. example.png Dies ist ein Bild des COCO-Datensatzes 2017.

Berechnungserklärung der Standardbox aus SSD-Papier

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. image.png 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.

image.png image.png

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

image.png

Übrigens ist das Muster [cx, cy, w, h] bei der Darstellung der Standardbox üblich.

Standardbox erstellen

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.

image.png

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.

Unterschiede zwischen SSD-Papieren und SSD-Implementierungen

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)".

Schließlich

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

Was ich durch die Implementierung des Erstellens einer Standardbox für SSD gelernt habe
So erstellen Sie ein 1-zeiliges Kivy-Eingabefeld
Was ich dachte und lernte, 100 Tage an einer Programmierschule zu studieren
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
So erstellen Sie ein lokales Repository für Linux
Ich habe versucht, einen Bot für die Ankündigung eines Wiire-Ereignisses zu erstellen
Ich möchte vorerst eine Docker-Datei erstellen.
So erstellen Sie ein Conda-Paket
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
Was ich durch das Schreiben einer Python Pull-Anfrage zum ersten Mal in meinem Leben gelernt habe
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
So erstellen Sie einen Klon aus Github
So erstellen Sie einen Git-Klonordner
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
So erstellen Sie eine * .spec-Datei für pyinstaller.
So erstellen Sie ein Repository aus Medien
Ich möchte eine schöne Python-Entwicklungsumgebung für meinen neuen Mac erstellen
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ich möchte einfach ein Rauschmodell erstellen
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So schreiben Sie einen ShellScript Bash für Anweisung
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich las "Wie man ein Hacking Lab macht"
[Hinweis] So erstellen Sie eine Ruby-Entwicklungsumgebung
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
So erstellen Sie eine Rest-API in Django
[Hinweis] So erstellen Sie eine Mac-Entwicklungsumgebung
Was Sie verstehen können, weil Sie ein Anfänger sind So erstellen Sie eine Datei (erster Beitrag)
So stellen Sie pyenv unter Amazon Linux und Ubuntu ein, um eine Python 3.6.0-Umgebung zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
So erstellen Sie eine Eigenschaft von Beziehungen, die durch bestimmte Bedingungen vorab abgerufen werden kann
Ich habe vergessen, VIM zu bedienen, also habe ich ein Video zum Auswendiglernen gemacht. 3 Videos nach Level
Was ich durch das Starten einer Foto-Site mit Verwaltungsdaten und mehreren APIs gelernt habe
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Ich dachte darüber nach, wie man kostenlos Programmieren lernt.
Ich möchte manuell eine Legende mit matplotlib erstellen
So speichern Sie eine von Python gekratzte Tabelle in CSV
So erstellen Sie eine Entwicklungsumgebung für TensorFlow (1.0.0) (Mac)
So erstellen Sie ein einfaches TCP-Server / Client-Skript
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
Vergleichen Sie, wie die Verarbeitung für Listen nach Sprache geschrieben wird
Was ich durch die Teilnahme am ISUCON10-Qualifying gelernt habe
Ich habe versucht, eine RESTful-API zu erstellen, indem ich die explosive Fast-API des Python-Frameworks mit MySQL verbunden habe.
So richten Sie WSL2 unter Windows 10 ein und erstellen eine Lernumgebung für Linux-Befehle
So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen
Ich möchte eine Karaoke-Klangquelle erstellen, indem ich Instrumente und Gesang mit Python trenne
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
So verwalten Sie eine README-Datei für Github und PyPI
Ich habe eine Schachtel gemacht, um mich auszuruhen, bevor Pepper müde wird
So erstellen Sie mit snappyHexMesh ein Flussnetz um einen Zylinder