[PYTHON] Génération de légende d'image avec Chainer

Aperçu

J'ai implémenté la génération de légendes d'image à l'aide de Chainer. Lorsque vous entrez une image, sa description sera générée. Le code source est ci-dessous. https://github.com/dsanno/chainer-image-caption

J'ai utilisé l'algorithme dans l'article suivant. Show and tell: A neural image caption generator

Certaines personnes ont déjà implémenté la génération de sous-titres dans Chainer, alors j'y ai également fait allusion. Image caption generation by CNN and LSTM ~ Satoshi's Blog from Bloomington

Modèle de génération de légende

image_caption_model.png

Le modèle de génération de sous-titres utilisé dans le document est à peu près divisé en trois réseaux.

--Convertir l'image en vecteur $ {\ rm CNN} $ $ {\ rm CNN} $ inclut GoogleNet et VGG_ILSVRC_19_layers Utilisez un modèle existant pour la classification des images tel que / 3785162f95cd2d5fee77 # file-readme-md).

Modèle utilisé pour la mise en œuvre

Étant donné que la mémoire du GPU était insuffisante si l'implémentation était telle qu'elle était dans le papier, je l'ai changée et implémentée.

--Convertir l'image en vecteur $ {\ rm CNN} $ (Entrée: 224 x 224 x Sortie 3D: 4096 dimensions)

Les données d'entraînement sont l'image $ I $ et la chaîne de mots $ \ {S_t \} (t = 0 ... N) $. Cependant, $ S_0 $ est le symbole de début de l'instruction \ <S > et $ S_N $ est le symbole de fin \ </ S >. Apprenez comme suit.

  1. Entrez l'image $ I $ dans $ {\ rm CNN} $ et extrayez la sortie d'une couche intermédiaire spécifique en tant que vecteur de caractéristiques.
  2. Entrez le vecteur de caractéristiques dans $ {\ rm LSTM} $.
  3. Entrez $ S_t $ dans l'ordre de $ t = 0 $ à $ N-1 $ et obtenez $ p_ {t + 1} $ à chaque étape.
  4. Minimisez le coût obtenu à partir de la probabilité de sortie de $ S_ {t + 1} $ $ p_ {t + 1} (S_ {t + 1}) $

Probabilité logarithmique négative en tant que fonction de coût dans l'article

L(I,S)=-\sum_{t=1}^{N}\log p_t(S_t)

J'ai utilisé, mais dans ma mise en œuvre, j'ai utilisé l'entropie croisée softmax. De plus, dans l'article, le paramètre a été mis à jour par SGD sans élan, mais dans mon implémentation, j'ai utilisé Adam (le paramètre est la valeur recommandée du papier Adam). .. J'ai également essayé de l'implémenter avec la vraisemblance logarithmique et la SGD, mais il semble qu'il n'y ait aucun mérite simplement parce que la convergence de l'apprentissage est ralentie, mais je ne comprends pas pourquoi elle est adoptée dans le document. J'ai aussi utilisé le décrochage comme dans le papier. Dans l'article, j'ai mentionné que des «modèles d'assemblage» étaient utilisés, mais je ne l'ai pas implémenté car je ne connaissais pas la méthode d'implémentation spécifique.

Génération de légende

Lors de la génération d'une légende à l'aide d'un modèle entraîné, la probabilité d'occurrence de mot est calculée dans l'ordre à partir du début, comme indiqué ci-dessous, et la chaîne de mots avec le produit le plus élevé de la probabilité d'apparition des mots est utilisée comme légende.

  1. Entrez l'image dans $ {\ rm CNN} $ et extrayez la sortie d'une couche intermédiaire spécifique en tant que vecteur d'entités.
  2. Entrez le vecteur de caractéristiques dans $ {\ rm LSTM} $.
  3. Convertissez le symbole de début de l'instruction \ <S > en vecteur à l'aide de $ W_e $ et entrez-le dans $ {\ rm LSTM} $.
  4. Puisque la probabilité d'apparition des mots peut être connue à partir de la sortie de $ {\ rm LSTM} $, sélectionnez les mots $ M $ supérieurs.
  5. Convertissez le mot produit à l'étape précédente en un vecteur en utilisant $ W_e $ et entrez-le dans $ {\ rm LSTM} $.
  6. À partir de la sortie de $ {\ rm LSTM} $, calculez le produit des probabilités des mots sortis jusqu'à présent et sélectionnez les M chaînes de mots supérieures.
  7. Répétez les étapes 5 et 6 jusqu'à ce que le mot de sortie soit le symbole de fin \ </ S >.

Dans cette implémentation, nous définissons $ M = 20 $

Données d'entraînement

Pour les données d'entraînement, nous avons utilisé l'ensemble de données d'image avec l'annotation de MSCOCO. Cependant, au lieu des données diffusées par MSCOCO, j'ai utilisé les données diffusées sur les sites suivants. Les données vectorielles de caractéristiques extraites de l'image à l'aide de VGG_ILSVRC_19_layers et les données de chaîne de mots d'annotation sont distribuées sur ce site. En utilisant ces données, nous avons pu éviter le problème de l'extraction du vecteur de caractéristiques de l'image et le problème du prétraitement de l'annotation (division de la phrase en mots).

Deep Visual-Semantic Alignments for Generating Image Descriptions

Selon le site suivant, les données d'annotation de MSCOCO semblent difficiles à gérer en raison de fortes fluctuations de notation (les phrases commencent par des majuscules ou des minuscules, avec ou sans points).

J'ai résumé l'ensemble de données Microsoft COCO (MS COCO) - je peux avoir 3 tasses de riz sur le thème de l'intelligence artificielle

Parmi les mots inclus dans les données d'apprentissage, seuls les mots qui apparaissent 5 fois ou plus ont été utilisés, et les autres ont été appris comme des mots inconnus.

Évaluation des légendes générées

Il semble qu'il existe des indicateurs tels que BLEU, METEOR et CIDER pour évaluer les légendes générées, mais cette fois je n'ai pas calculé les indicateurs.

Exemple de génération de sous-titres

Les légendes ont été générées à l'aide d'images du domaine public téléchargées depuis PublicDomainPictures.net. Placez le top 5 des chaînes de caractères générées.

l'horloge

``` a clock on the side of a building a clock that is on the side of a building a clock on the side of a brick building a close up of a street sign on a pole a clock that is on top of a building ```

Le contrôle du trafic est-il en cours? Officier de police

``` a man riding a skateboard down a street a man riding a skateboard down a road a man riding a skateboard down the street a man riding a skateboard down a sidewalk a man riding a skateboard down the side of a road ``` planche à roulette. .. .. ??

Femme avec une raquette de tennis

``` a woman holding a tennis racquet on a tennis court a man holding a tennis racquet on a tennis court a woman holding a tennis racquet on a court a woman holding a tennis racquet on top of a tennis court a man holding a tennis racquet on a court ``` Les deuxième et cinquième sont «homme», mais parfois je prends l'homme pour la femme.

Canapé vivant

``` a cat laying on top of a bed a cat sitting on top of a bed a cat sitting on top of a couch a black and white cat laying on a bed a cat laying on a bed in a room ``` Il semble que le coussin soit pris pour un chat.

Certains ont été générés correctement, tandis que d'autres étaient clairement erronés.

Les références

Recommended Posts

Génération de légende d'image avec Chainer
Génération d'images dégradées avec Python [1] | np.linspace
Seq2Seq (1) avec chainer
Essayez facilement la génération automatique d'images avec DCGAN-tensor flow
Reconnaissance d'image avec le modèle Caffe Chainer Yo!
[Petite histoire] Tester la génération d'images avec Python / OpenCV
Traitement d'image avec MyHDL
Reconnaissance d'image avec keras
Utiliser tensorboard avec Chainer
Traitement d'image avec Python
Traitement d'image avec PIL
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Génération automatique de quiz avec COTOHA
Traitement d'image avec Python (partie 2)
Traitement d'image avec PIL (Pillow)
Essayez d'implémenter RBM avec chainer.
Édition d'image avec python OpenCV
Apprenez les orbites elliptiques avec Chainer
Génération de phrases avec GRU (keras)
Tri des fichiers image avec Python (2)
Tri des fichiers image avec Python (3)
Seq2Seq (3) ~ Edition CopyNet ~ avec chainer
Utilisation du chainer avec Jetson TK1
Créer une visionneuse d'images avec Tkinter
Traitement d'image avec Python (partie 1)
Tweet avec image en Python
Tri des fichiers image avec Python
Réseau de neurones commençant par Chainer
Traitement d'image avec Python (3)
Implémentation du GAN conditionnel avec chainer
Obtenez des fonctionnalités d'image avec OpenCV
Implémentation de SmoothGrad avec Chainer v2
Clustering embarqué profond avec Chainer 2.0
Un peu coincé dans le chainer
Reconnaissance d'image avec Keras + OpenCV
[Python] Traitement d'image avec scicit-image
Découpez une image avec python
Principes de base du traitement d'image en temps réel avec opencv
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Génération de requêtes plus rapide avec SQLAlchemy ORM
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Segmentation d'image avec scikit-image et scikit-learn
[Chainer] Apprentissage de XOR avec perceptron multicouche
Traitement d'image avec la binarisation Python 100 knocks # 3
Classification d'images avec un jeu de données d'images de fond d'oeil grand angle
Faisons du scraping d'images avec Python
Première reconnaissance faciale d'anime avec Chainer
Exécuter l'inférence avec l'exemple de Chainer 2.0 MNIST
Générer un mot de passe pour le manuel avec python
Utilisation de Chainer avec CentOS7 [Construction de l'environnement]
Génération de jetons de contre-mesure CSRF avec Python
Trouver la similitude d'image avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
Convertir un PDF en image avec ImageMagick
100 traitement d'image par Python Knock # 2 Échelle de gris
Essayez l'apprentissage de la représentation commune avec le chainer
Comparez deux images avec le hachage d'image
J'ai essayé la génération de phrases avec GPT-2
Envoyer l'image avec python et enregistrer avec php
Seq2Seq (2) ~ Attention Model edition ~ avec chainer