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
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).
É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.
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.
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.
Dans cette implémentation, nous définissons $ M = 20 $
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).
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.
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.
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.
Certains ont été générés correctement, tandis que d'autres étaient clairement erronés.
Recommended Posts