[PYTHON] J'ai touché graph-rcnn qui génère un graphe de scène

En un mot

J'ai touché graph-rcnn, qui est un modèle qui génère des graphes de scène utilisés dans des tâches telles que VQA, alors je l'ai résumé. Le document est ici Le code d'implémentation d'origine est ici Le code qui a ajouté le résultat de la visualisation est ici

Article pour quoi?

Qu'est-ce que VQA?

VQA est une abréviation de Visual Question Answering, et c'est une tâche de sélectionner l'option de réponse correcte lorsqu'une phrase de question avec une image et des options est donnée. Comme expliqué dans l'article ici, cela ressemble à l'image ci-dessous. 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

Puisqu'il est nécessaire de comprendre le contenu de l'image et le contenu du texte de la question, on peut dire qu'il s'agit d'une technologie qui combine CV et PNL.

Qu'est-ce qu'un graphique de scène?

Afin de résoudre la tâche VQA ci-dessus, la génération de graphe de scène est proposée comme processus du côté CV. スクリーンショット 2020-03-07 13.42.20.png Un graphe de scène est un graphe qui détecte des objets dans une image comme indiqué sur la figure, et exprime la relation de position entre les objets détectés et la relation sémantique entre les objets (utilisation, usure, etc.). À partir de la photographie d'un homme sur une planche à roulettes, divers objets (planche à roulettes, pantalons, chemises, etc.) entourant l'homme sont décrits comme des nœuds, et la relation de position de chacun est décrite comme une arête. La génération de graphe de scène, qui peut décrire la relation entre les objets d'une image, peut être appliquée non seulement à VQA mais également à diverses tâches telles que le sous-titrage qui connectent CV et NLP.

Méthode

スクリーンショット 2020-03-07 14.21.10.png Comme le flux de la méthode proposée.

  1. Boîte englobante détectée par Mask RCNN
  2. Extraire des combinaisons de boîtes englobantes par réseau de proposition Relation
  3. Affiner les combinaisons extraites par GCN attentionnel est. Parmi ceux-ci, les principales contributions sont 2 et 3.

1. Détection d'objets par maskRCNN

La détection d'objet est effectuée par le masque RCNN. À partir de là, la taille, les informations de position et les informations de classe de la boîte englobante sont estimées.

2. Extraction combinée par le réseau de proposition de relation

Ceci est la première contribution de cet article. Nous avons établi un réseau de proposition de relation (RelPN) comme le réseau de proposition de relation (RePN) dans RCNN. Puisqu'il est difficile d'estimer l'étiquette de relation pour chaque combinaison de boîtes englobantes, l'étiquette de relation $ f (p_i, p_j) $ est utilisée pour la logique de classe $ p_i, p_j $ des deux boîtes englobantes. f(p_i, p_j) = \phi(p_i)\cdot\\psi(p_j) Est calculé. Où $ \ phi () et \ psi () $ sont des perceptrons à deux couches. En d'autres termes, l'étiquette de relation est estimée en multipliant les caractéristiques des deux objets. De plus, ici, les paires d'objets sont réduites à K candidats par ordre décroissant de score.

3. Détermination de la structure du graphe par convolution de graphe attentionnel

C'est la deuxième contribution de cet article. La structure de l'attention est ajoutée à la convolution du graphe. Dans la convolution normale de graphe, la convolution du nœud $ z_i $ utilise la matrice de connexion $ \ alpha $. z_i^{l+1}=sigmoid(z_i^l + \sum_{j}\alpha_{ij}Wz_j^l) Il devient. W est le poids. Ici, chaque élément de la matrice de connexion prend 0 ou 1, et s'il vaut 0, i et j ne sont pas connectés, s'il vaut 1, ils sont connectés, et ainsi de suite. En revanche, dans la convolution du graphe d'attention de la méthode proposée, la valeur de cette matrice de connexion est définie comme étant une valeur réelle de 0 à 1. Plus précisément, les poids $ W_a et w_h $ à apprendre sont utilisés. \alpha_{ij}=softmax(w_h^Tsigmoid(W_a\[z_i^l, z_j^l\])) Apprenez comme. [・, ・] Est une combinaison.

En plus de cela, le document a également proposé un nouvel indice d'évaluation (SGGen +) pour le graphe de scène généré.

Essayez de tourner le code

L'implémentation est sur github avec une explication détaillée, mais je posterai le flux général

1. Préparation de l'ensemble de données

Après le clonage et la mise en place des exigences, téléchargez l'ensemble de données. L'ensemble de données utilise visual genome. Aller à cette page pour télécharger スクリーンショット 2020-03-07 15.33.18.png

Téléchargez 1 ~ 5. Ici, 1 n'est pas encore préparé, donc c'est en dessous スクリーンショット 2020-03-07 15.35.39.png Suivez cette procédure. Vous devez télécharger et exécuter le script, mais vous n'avez pas à cloner l'intégralité du référentiel. Cependant, ce script semble fonctionner sur la série python2, vous devez donc changer uniquement la version python ici. Avec ces étapes, sous data

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

Si vous pouvez vous préparer, vous êtes prêt.

2. Formation sur modèle

Exécutez ensuite le code. Entraînez d'abord le modèle de détection d'objets, puis entraînez le modèle de génération de graphique. (Le "modèle de génération de graphe de scène de train conjointement" qui peut faire les deux à la fois n'a pas fonctionné en raison d'une erreur)

python main.py --config-file configs/faster_rcnn_res101.yaml
python main.py --config-file configs/sgg_res101_step.yaml --algorithme Nom de l'algorithme que vous souhaitez essayer

3. Validation du modèle

Le code suivant est utilisé pour vérifier le modèle. Vous pouvez visualiser le résultat de l'inférence avec l'option --visualize.

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

4. Résultat

Si vous tournez le code de test de 3, vous verrez le résultat comme ceci.

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

De plus, --visualize générera une telle photo sous . / Visualize.

fig.jpg

Visualisation...?

Cependant, ne pensez-vous pas que le graphe de scène important ne peut pas être visualisé uniquement par le résultat de la détection d'objet dans la figure ci-dessus? J'ai donc ajouté un script python permettant de visualiser le graphique de la scène (ici). Le résultat de la visualisation du graphique de scène pour l'image ci-dessus est le suivant. vis.jpg

Vous avez extrait avec succès les relations entre les objets proches! Je veux aussi pouvoir refléter l'étiquette de relation sur le bord.

Conclusion

C'était une explication de Graph R-CNN for Scene Graph Generation qui génère un graphique de scène à partir d'une image. La tâche intéressante et les instructions de mise en œuvre sont gentilles, alors essayez-le!

Recommended Posts

J'ai touché graph-rcnn qui génère un graphe de scène
J'ai touché PyAuto pendant un moment
J'ai touché "Orator" alors j'ai fait une note
J'ai fait un graphique de nombres aléatoires avec Numpy
J'ai touché HaikuFinder
J'ai touché Flask
Dessine un graphique avec Julia ... j'ai essayé une petite analyse
Un résumé des choses que j'ai touchées comme un blog
Un mémo que j'ai touché au magasin de données avec python