[PYTHON] Ich habe graph-rcnn berührt, das ein Szenendiagramm erzeugt

In einem Wort

Ich habe graph-rcnn berührt, ein Modell, das Szenendiagramme generiert, die in Aufgaben wie VQA verwendet werden, und habe es daher zusammengefasst. Das Papier ist hier Der ursprüngliche Implementierungscode lautet hier. Der Code, der das Visualisierungsergebnis hinzugefügt hat, lautet hier.

Artikel für was?

Was ist VQA?

VQA ist eine Abkürzung für Visual Question Answering und es ist eine Aufgabe, die richtige Antwortoption auszuwählen, wenn ein Fragensatz mit einem Bild und Optionen angegeben wird. Wie im Artikel hier erläutert, sieht es wie im Bild unten aus. https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-95636-bb306de2-b366-d79e-3f43-76ad3ebcf389.jpeg https://arxiv.org/pdf/1505.00468.pdf

Da es notwendig ist, den Inhalt des Bildes und den Inhalt des Fragentextes zu verstehen, kann gesagt werden, dass es sich um eine Technologie handelt, die CV und NLP kombiniert.

Was ist ein Szenendiagramm?

Um die obige VQA-Aufgabe zu lösen, wird die Erzeugung von Szenendiagrammen als ein Prozess auf der CV-Seite vorgeschlagen. スクリーンショット 2020-03-07 13.42.20.png Ein Szenendiagramm ist ein Diagramm, das Objekte in einem Bild wie in der Abbildung gezeigt erkennt und die Positionsbeziehung zwischen den erkannten Objekten und die semantische Beziehung zwischen den Objekten (Verwendung, Verschleiß usw.) ausdrückt. Auf dem Foto eines Mannes, der auf einem Skateboard fährt, werden verschiedene Objekte (Skateboard, Hosen, Hemden usw.), die den Mann umgeben, als Knoten beschrieben, und die Positionsbeziehung von jedem wird als Kante beschrieben. Die Generierung von Szenendiagrammen, die die Beziehung zwischen Objekten aus einem Bild beschreiben kann, kann nicht nur auf VQA angewendet werden, sondern auch auf verschiedene Aufgaben wie Untertitel, die CV und NLP verbinden.

Methode

スクリーンショット 2020-03-07 14.21.10.png Wie der Ablauf der vorgeschlagenen Methode.

  1. Begrenzungsrahmen von Maske RCNN erkannt
  2. Extrahieren Sie Kombinationen von Begrenzungsrahmen nach Beziehungsvorschlagsnetzwerk
  3. Verfeinern Sie die durch Aufmerksamkeits-GCN extrahierten Kombinationen ist. Davon sind die Hauptbeiträge 2 und 3.

1. Objekterkennung durch maskRCNN

Die Objekterkennung erfolgt durch die Maske RCNN. Daraus werden die Größe, Positionsinformationen und Klasseninformationen des Begrenzungsrahmens geschätzt.

2. Kombinationsextraktion durch Beziehungsvorschlagsnetzwerk

Dies ist der erste Beitrag dieses Papiers. Wir haben ein Beziehungsvorschlagsnetzwerk (RelPN) wie das Beziehungsvorschlagsnetzwerk (RePN) in RCNN eingerichtet. Da es schwierig ist, die Beziehungsbezeichnung für jede Kombination von Begrenzungsfeldern zu schätzen, wird die Beziehungsbezeichnung $ f (p_i, p_j) $ für die Klassenlogik $ p_i, p_j $ der beiden Begrenzungsfelder verwendet. f(p_i, p_j) = \phi(p_i)\cdot\\psi(p_j) Ist berechnet. Wobei $ \ phi () und \ psi () $ zweischichtige Perzeptrone sind. Mit anderen Worten wird die Beziehungsbezeichnung durch Multiplizieren der Merkmale der beiden Objekte geschätzt. Auch hier werden die Objektpaare in absteigender Reihenfolge der Punktzahl auf K Kandidaten eingegrenzt.

3. Bestimmung der Graphstruktur durch aufmerksame Graphfaltung

Dies ist der zweite Beitrag dieses Papiers. Die Aufmerksamkeitsstruktur wird der Graphfaltung hinzugefügt. Bei der normalen Graphfaltung verwendet die Faltung des Knotens $ z_i $ die Verbindungsmatrix $ \ alpha $. z_i^{l+1}=sigmoid(z_i^l + \sum_{j}\alpha_{ij}Wz_j^l) Es wird. W ist das Gewicht. Hier nimmt jedes Element der Verbindungsmatrix 0 oder 1 an, und wenn es 0 ist, sind i und j nicht verbunden, wenn es 1 ist, sind sie verbunden und so weiter. Andererseits wird in der Aufmerksamkeitsgraphenfaltung des vorgeschlagenen Verfahrens der Wert dieser Verbindungsmatrix auf einen reellen Wert von 0 bis 1 eingestellt. Insbesondere werden die zu lernenden Gewichte $ W_a und w_h $ verwendet. \alpha_{ij}=softmax(w_h^Tsigmoid(W_a\[z_i^l, z_j^l\])) Lernen als. [・, ・] Ist eine Kombination.

Darüber hinaus schlug das Papier einen neuen Bewertungsindex (SGGen +) für das generierte Szenendiagramm vor.

Versuchen Sie, den Code zu drehen

Die Implementierung ist auf github mit einer detaillierten Erklärung, aber ich werde den allgemeinen Ablauf veröffentlichen

1. Datensatzvorbereitung

Laden Sie den Datensatz herunter, nachdem Sie die Anforderungen geklont und gestellt haben. Der Datensatz verwendet visuelles Genom. Wechseln Sie zum Download zu dieser Seite スクリーンショット 2020-03-07 15.33.18.png

Laden Sie 1 ~ 5 herunter. Hier ist 1 noch nicht vorbereitet, also ist es darunter スクリーンショット 2020-03-07 15.35.39.png Befolgen Sie diese Prozedur. Sie müssen das Skript herunterladen und ausführen, müssen jedoch nicht das gesamte Repository klonen. Dieses Skript scheint jedoch auf der Python2-Serie zu laufen, sodass Sie hier nur die Python-Version wechseln müssen. Mit diesen Schritten unter "Daten"

data/vg/imdb_1024.h5
data/vg/bbox_distribution.npy
data/vg/proposals.h5
data/vg/VG-SGG-dicts.json
data/vg/VG-SGG.h5

Wenn Sie sich vorbereiten können, sind Sie bereit.

2. Modelltraining

Führen Sie dann den Code aus. Trainieren Sie zuerst das Objekterkennungsmodell und dann das Diagrammgenerierungsmodell. (Das "Zugszenengraphen-Generierungsmodell gemeinsam", das beides gleichzeitig ausführen kann, hat aufgrund eines Fehlers nicht funktioniert.)

python main.py --config-file configs/faster_rcnn_res101.yaml
python main.py --config-file configs/sgg_res101_step.yaml --Algorithmus Name des Algorithmus, den Sie ausprobieren möchten

3. Modellvalidierung

Der folgende Code wird verwendet, um das Modell zu überprüfen. Sie können das Inferenzergebnis mit der Option --visualize visualisieren.

python main.py --config-file configs/sgg_res101_step.yaml --inference --visualize

4. Ergebnis

Wenn Sie den Testcode 3 drehen, sehen Sie das Ergebnis folgendermaßen.

020-03-02 05:05:03,016 scene_graph_generation.inference INFO: ===================sgdet(motif)=========================
2020-03-02 05:05:03,017 scene_graph_generation.inference INFO: sgdet-recall@20: 0.0300
2020-03-02 05:05:03,018 scene_graph_generation.inference INFO: sgdet-recall@50: 0.0563
2020-03-02 05:05:03,019 scene_graph_generation.inference INFO: sgdet-recall@100: 0.0699
2020-03-02 05:05:03,019 scene_graph_generation.inference INFO: =====================sgdet(IMP)=========================
2020-03-02 05:05:03,020 scene_graph_generation.inference INFO: sgdet-recall@20: 0.03372315977691639
2020-03-02 05:05:03,021 scene_graph_generation.inference INFO: sgdet-recall@50: 0.06264976651796783
2020-03-02 05:05:03,022 scene_graph_generation.inference INFO: sgdet-recall@100: 0.07724741486207399

Außerdem generiert --visualize ein solches Foto unter ". / Visualize".

fig.jpg

Visualisierung ...?

Denken Sie jedoch nicht, dass das wichtige Szenendiagramm nicht nur durch das Ergebnis der Objekterkennung in der obigen Abbildung visualisiert werden kann? Also habe ich ein Python-Skript hinzugefügt, das das Szenendiagramm visualisieren kann (hier). Das Visualisierungsergebnis des Szenendiagramms für das obige Bild ist wie folgt. vis.jpg

Sie haben die Beziehungen zwischen Objekten in der Nähe erfolgreich extrahiert! Ich möchte in der Lage sein, auch das Beziehungslabel am Rand wiederzugeben.

Fazit

Es war eine Erklärung von Graph R-CNN für die Erzeugung von Szenendiagrammen, die aus einem Bild ein Szenendiagramm generiert. Die interessanten Anweisungen für Aufgaben und Implementierung sind nett, probieren Sie es aus!

Recommended Posts

Ich habe graph-rcnn berührt, das ein Szenendiagramm erzeugt
Ich berührte PyAutoIt für einen Moment
Ich berührte "Orator" und machte mir eine Notiz
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe HaikuFinder berührt
Ich berührte Flask
Zeichne ein Diagramm mit Julia ... Ich habe eine kleine Analyse versucht
Eine Zusammenfassung dessen, was ich wie ein Blog berührt habe
Ein Memo, dass ich den Datenspeicher mit Python berührt habe