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
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://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.
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. 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.
Comme le flux de la méthode proposée.
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.
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.
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 $.
En plus de cela, le document a également proposé un nouvel indice d'évaluation (SGGen +) pour le graphe de scène généré.
L'implémentation est sur github avec une explication détaillée, mais je posterai le flux général
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
Téléchargez 1 ~ 5. Ici, 1 n'est pas encore préparé, donc c'est en dessous
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.
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
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
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
.
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.
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.
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