[PYTHON] YOLO mit Chainer

Einführung

YOLO ist eine Abkürzung für You Only Look Once, aber ist es eine Vermutung? Es handelt sich um ein geschwindigkeitsspezifisches neuronales Netzwerk zur Bilderkennung / -erkennung, das auf einem C-basierten darknet Framework basiert. Das Originalpapier ist hier. Das Merkmal ist, dass die Klassenwahrscheinlichkeit und die Begrenzungsrahmenkoordinaten des Objekts plötzlich aus allen Bildern abgeleitet werden. Im Gegensatz zu R-CNN usw. müssen Sie nicht viele Male auf mehrere Kandidatenbereiche schließen, daher ist es schnell, weil es einmal aussieht.

Es scheint, dass es bereits ein Beispiel für die Konvertierung in TensorFlow gibt, daher werde ich dieses Mal versuchen, daraus einen Chainer zu machen. Der Zweck der Konvertierung von C in eine Skriptsprache besteht darin, den Inhalt zu verstehen. In diesem Artikel werde ich nur anhand der erlernten Koeffizienten Rückschlüsse ziehen. Wenn ich jedoch das Papier lese, scheint das Lernverfahren eines der größten Merkmale zu sein, daher möchte ich es bald nachverfolgen.

Den Code finden Sie unter hier.

Erfassung trainierter Koeffizientendaten

Es scheint, dass YOLO eine normale Größe hat, klein, winzig usw., aber diesmal wird nur winzig konvertiert.

tiny-yolo und yolo-tiny scheinen unterschiedliche Versionen zu sein. tiny-yolo verwendet die Batch-Normalisierung und so weiter, was moderner ist, aber dieses Mal werde ich das ältere yolo-tiny verwenden, das bereits in das Tensorflow-Modell konvertiert wurde.

Der Koeffizient von yolo-tiny für die TensorFlow-Version ist in hier angegeben, daher wird der Koeffizient mit numpy ausgespuckt.

import tensorflow as tf
from YOLO_tiny_tf import *
import numpy as np

c=YOLO_TF()
with c.sess.as_default():
    for v in tf.trainable_variables():
        name = v.name
        ary = v.eval()
        np.save("npy/"+name, ary)

Jetzt können Sie die Koeffizienten im numpy-Format unter den Ordner npy schreiben. Mit tf.trainable_valiables () können Sie die in Link enthaltenen Parameter in der Kette auflisten. eval () sind die Daten im Chainer.

Außerdem wird in YOLO_tensorflow der Koeffizient in Text modifiziertes Darknet geschrieben ) Wird verwendet, um den Koeffizienten aus Darknet umzuwandeln.

Chainer

Wir werden dies in einen Kettenhändler umwandeln.

Die Konfiguration von yolo-tiny ist this gemäß der Geschichte von github. Es ist ein Kanji, das 3x3-Faltung und maximales Pooling wiederholt. Ich werde die Kette gemäß dieser Beschreibung beschreiben.

Wenn Sie das Originalmodell mit einer so großen Anzahl von Stufen kennen, ist es einfacher, in Sequential zu schreiben, ohne zwischen Link und Funktion wie Keras zu unterscheiden.

Übrigens wird der auf diese Weise konstruierte Kettenkoeffizient ersetzt, aber da Chainer durch Ausführen definiert ist, kann auf W und b usw. überhaupt nicht zugegriffen werden, ohne einmal eine Vorwärtsberechnung durchzuführen. Dieses Mal habe ich die Gewichte neu geschrieben, nachdem ich die 0-Matrix eingefügt und weitergeleitet habe. Ich denke, dass es durch initialW, initial_bias usw. angegeben werden kann.

Die Gewichte von Convolution_2d unterscheiden sich stark zwischen TensorFlow und Chainer.

--TensorFlow: [Kernel vertikal, Kernel horizontal, Ausgangskanal, Eingangskanal] --Chainer: [Ausgangskanal, Eingangskanal, Kernel vertikal, Kernel horizontal]

Sie sind so ausgerichtet, seien Sie also beim Sortieren vorsichtig. Die vertikale und horizontale Richtung sind für alle Verbindungen ebenfalls umgekehrt.

Beachten Sie auch, dass die Steigung von leaky_relu für Chainer 0,2, für YOLO 0,1 beträgt.

Der Code für die Kettenbeschreibung und -konvertierung lautet hier. Andere Variationen wie kleine sollten ebenfalls möglich sein.

Ausgangsinterpretation

Die Koeffizienten wurden für einen Datensatz von 20 Klassifizierungsproblemen optimiert, der als Pascal VOC bezeichnet wird.

Teilen Sie den gesamten Bildschirm in 7x7-Raster ein und geben Sie direkt alle Informationen über die Klassenwahrscheinlichkeit für jedes Raster, bis zu zwei in diesem Raster zentrierte Begrenzungsrahmen und die Zuverlässigkeit der beiden Begrenzungsrahmen an. Schließen.

Die Koordinaten des Begrenzungsrahmens sind die Quadratwurzeln der Werte, bei denen x und y an der Mittelposition in der Rastergröße von 0 bis 1,0 normalisiert sind, und die Größe ist die Quadratwurzel der Werte, bei denen Breite und Höhe von 0 bis 1,0 in der Bildgröße normalisiert sind. Der Grund für die Verwendung der Quadratwurzel ist, dass er die Fehlerstrafe reduzieren möchte, wenn die Größe zunimmt.

Der Ausgangsvektor der Endstufe ist

--20 Klassenwahrscheinlichkeit pro 7x7x20 Gitter

Identifizieren Sie nach der Umformung den zuverlässigen Begrenzungsrahmen und rufen Sie seine Koordinaten und Klassen ab.

Zum Zeitpunkt der Inferenz reicht es aus, die Klassenwahrscheinlichkeit und die Zuverlässigkeit des Begrenzungsrahmens zu multiplizieren und auf den Schwellenwert zu schneiden, aber zum Zeitpunkt des Lernens scheint es so zu sein, dass es einfach ist, nur in dem wichtigen Teil auf die Verlustfunktion zuzugreifen.

Anwendungsbeispiel

Probieren Sie es aus Flickr's Commercial Use & Mods erlaubten Bildern aus.

Train train_marked.png Hört sich gut an.

Sheep sheep_marked.png Es ist ein Schaf.

Bicycle bicycle_marked.png Der Begrenzungsrahmen der Person hat sich ein wenig verschoben. Die Menge wird nicht erwischt.

Birds birds_marked.png Ich möchte, dass Sie auch die Person auf der rechten Seite finden. Ich frage mich, ob es herauskommt, wenn die Schwelle gesenkt wird.

Cat cat_marked.png Es ist eine Katze.

PottedPlant plant_marked.png Ist es so ..

Impressionen

Wie es wiederholt in der Arbeit geschrieben wird, ist es eine fette Struktur, die plötzlich die Koordinaten des Begrenzungsrahmens mit einem Netzwerk ausgibt. Ich denke, der Punkt ist der Lernprozess, um die mutige Idee dazu zu bringen, richtig zu funktionieren.

Andererseits ist, wie in dem Papier erwähnt, die Genauigkeit des Begrenzungsrahmens nicht so gut, insbesondere bei winzigen. Ich denke, dieser Bereich hängt von der Anwendung ab.

Ich habe zum ersten Mal eine Modellkonvertierung zwischen TensorFlow und Chainer durchgeführt, aber es scheint, dass dies möglich ist, indem nur auf die Anordnung der Koeffizienten geachtet wird. Ich denke, ich kann es mit Allzweckwerkzeugen tun, aber es scheint den Rahmen meiner Hobbys zu sprengen.

Nachtrag

YOLO ist als ver2 raus.

Recommended Posts

YOLO mit Chainer
Installieren Sie Chainer 1.5.0 unter Windows
Installieren Sie Chainer unter CentOS 6.7
Bereiten Sie die Chainer-Umgebung unter Windows vor
Installieren Sie Chainer 1.6 (GPU) unter Windows 7.
Führen Sie YOLO v3 unter AWS v2 aus
[Python] [Chainer] [Windows] Chainer unter Windows installieren
Führen Sie YOLO v3 unter AWS aus
Installieren Sie OpenCV und Chainer unter Ubuntu
Installieren Sie CUDA 8.0 und Chainer unter Ubuntu 16.04
Kettenproben
Lernen Sie Paints Chainer mit Macbook Pro ~ Operation
Ich habe versucht, YOLO v3 mit Google Colab auszuführen