[PYTHON] Quel genre de commentaires les gens qui n'ont vu que les fêtes font-ils quand ils voient le toucher, et la machine peut-elle reconnaître Chino-chan rien qu'en commentant?

Nous avons appris les commentaires de la vidéo Nico Nico avec un modèle de génération de sous-titres utilisant l'apprentissage en profondeur et les avons générés automatiquement. Cliquez ici pour les articles connexes. Show and Tell: A Neural Image Caption Generator(code) Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

Résultat de la génération de commentaires

gif_1 Apprenez des vidéos de fête et des commentaires (train, dev)

gif_2 Générer un commentaire avec une vidéo de Kemofure (test)

Une partie du code est à la fin.

Ce que j'ai fait cette fois

J'ai appris un ensemble de vidéos et de commentaires de Nico Nico et je les ai appliqués à une autre vidéo. Je n'utilise aucune nouvelle technologie. Je l'ai essayé comme un tutoriel d'apprentissage automatique.

Le flux général est comme ça.

    1. Votre commande est-elle un lapin? Apprenez les commentaires avec le premier oiseau
  1. Génération de commentaires dans le premier épisode de Kemono Friends
    1. Apprenez et visualisez avec le modèle d'attention

Génération de légende

La génération de sous-titres génère une description de l'image d'entrée. Des images et des phrases sont jointes aux données d'entraînement. Les ensembles de données incluent COCO et Flickr. Cette fois, nous allons extraire une image de la vidéo et générer un commentaire pour cette image. La génération de sous-titres à l'aide de l'apprentissage en profondeur est utilisée pour cela.

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

Celui utilisé cette fois est CNN + RNN. En gros, les caractéristiques de l'image sont extraites par CNN et les caractéristiques de la phrase sont extraites par RNN, et la correspondance entre elles est apprise. L'histoire de la génération de légendes est Génération automatique de légendes d'images, Yoshitaka Ushiku, 2016

base de données

commentaire

J'ai utilisé le commentaire de la vidéo de Nico Nico. J'ai utilisé Sakubus pour le téléchargement. J'ai appelé Sakubus depuis Python et j'ai téléchargé environ 420 000 commentaires, en remontant dans l'ordre du dernier commentaire au commentaire le plus ancien. Ils ont été séparés en mots avec MeCab, soit un total de 75 356 mots. Les 10 premières fréquences et le nombre sont les suivants.

.py


  207,947
Bon 170,959
U 145,736
! 46,939
43,857
・ 31,119
26,608
25,683
Est 25,392
24,575
Shigeru 24,540

La première place était le caractère vide '\ xe3 \ x80 \ x80'. Les 30 mots les plus fréquemment utilisés qui sont considérés comme nomenclature sont les suivants.

.py


Matsuzaki 24,228
Shigeru 24,165
Aso 23,962
Taro 22,832
( 17,850
) 17,638
P 13,952
Chino 13,812
~ 12,410
Ici 11,916
Hum 11,414
Rohi 11,324
Pro 11,298
♪ 10,916
Oo 9,677
Ishibashi 9,463
Shigeru 9,244
Goku 8,981
-8,664
O 8,038
Lao 7,966
I 7,775
Oh 7,537
Deux 6,993
Aller 6,130
Déchets 6,099
5 sur,990
Cacao 5,909
Réparation 5,852
Matsuoka 5,680
w 5,637

De ces 70 000 mots, les 30 000 mots les plus fréquents ont été utilisés et les autres étaient des mots inconnus. La fréquence du 30 000e mot était de 2. Normalement, les mots avec moins de 5 occurrences dans l'ensemble de données sont définis comme des mots inconnus, mais cette fois, je voulais augmenter le vocabulaire, j'ai donc abaissé le seuil.

De plus, les 10 premiers commentaires par ordre décroissant du nombre de commentaires pour chaque image sont les suivants.

Nombre de commentaires Index de trame Temps dans la vidéo
1,482 0 0m0s
1,339 42,468 23m37s
622 10,531 5m51s
446 10,530 5m51s
342 10,532 5m51s
195 28,795 16m0s
188 8,075 4m29s
164 10,529 5m51s
121 25,169 13m59s
121 28,091 15m37

Les deux premiers sont les premier et dernier cadres. En ce qui concerne le numéro d'image de la vidéo attachée au commentaire, il a été défini sur une valeur légèrement supérieure à l'image maximale de la vidéo, j'ai donc décidé qu'il s'agissait de la dernière image. Voici quelques images et commentaires obtenus au hasard. (L'image est approximative)

0ème image Le plus ancien du Japon, Misao Okawa 117 ans 27 jours Jusqu'à 1,5 million d'écoutes 1772 Où retourner

42468e image le monde Bucchipa Mignonne

10531e cadre ici maintenant ! Ce ↑ ce ↓

10530e cadre ici ici ! ici !

10532e image ici ! C'est ici! C'est ↑ ça ↓!

image

La vidéo a été transformée en une image pour chaque image et les caractéristiques ont été extraites en la passant par CNN à l'avance. C'était 42 469 images en 24 minutes. Il y a en moyenne 10 commentaires par image. Il y avait 513 cadres non commentés. CNN a utilisé VGG-19. J'ai redimensionné l'image 640x480 à 224x224 et l'ai entrée dans le CNN, en utilisant un vecteur dimensionnel de 4096 à partir de la couche relu7.

Apprentissage

Apprenez l'image et les commentaires qui y sont attachés. Tout d'abord, nous avons divisé les données de fête en train et dev. Les cadres ont été divisés au hasard par 9: 1. Par exemple, tous les commentaires attachés aux cadres divisés en trains appartiennent à train.

L'apprentissage a tourné autour des commentaires. Par exemple, s'il y a 100 images et 500 commentaires dans le train, les 500 paires commentaire-image sont apprises et cela devient 1 époque.

Cette fois, 1 image sur 10 de la vidéo d'animation est dev et il y a beaucoup de commentaires en double, donc dev est inclus dans le train. Il aurait peut-être été préférable de changer de train et de développement toutes les secondes, ou de diviser la vidéo dans la première moitié et la seconde moitié.

Le nombre de commentaires et de duplication de chaque donnée est le suivant. (Après avoir converti tous les mots non inclus dans les 30000 mots du vocabulaire en symboles de mots inconnus)

all train dev
L'ensemble 427,364 38,4922 42,442
uniq 202,671 185,094 26,682

De plus, le nombre de commentaires par uniq (train) et uniq (dev) était de 9 105.

Animé

Cette fois, au lieu d'un traitement en temps réel, nous avons généré des commentaires pour chaque image à l'aide d'un modèle créé par apprentissage, et les avons connectés pour créer une vidéo. Créez des commentaires pour toutes les images cibles, combinez-les dans un seul fichier et écrivez-les ultérieurement dans une image. Si vous utilisez la fonction Sakubus, vous pouvez créer automatiquement une vidéo avec des commentaires si vous avez un fichier de commentaire et un fichier vidéo, mais je ne savais pas comment le faire, alors je l'ai fait avec Python.

J'ai lu les commentaires générés dans l'ordre à partir de la 0ème image et les ai dessinés sur l'image. Les commentaires dessinés dans le passé ont été déplacés vers le cadre après 4 secondes. Dans la vidéo Gochiusa ci-dessus, la quantité de commentaires générés a été déterminée à partir de la distribution du nombre de commentaires dans l'ensemble de données (bien que ce soit une triche).

De plus, afin d'augmenter la variation des commentaires, le premier mot est sélectionné de manière probabiliste parmi tous les mots à l'exception des symboles en fonction de la probabilité d'apparition du mot, et le deuxième mot et les suivants ont la plus forte probabilité parmi des mots autres que inconnus. Est maintenant sélectionné.

S'applique aux amis Kemono

J'ai généré un commentaire de la vidéo de Kemono Friends avec le modèle appris des données de Gochiusa.

jump_power.png Il est impossible que le mot Friends ait été généré correctement de cette manière, seul le mot concernant Kemono Friends qui se trouvait être inclus dans le commentaire de Gochiusa a été généré.

gif_2 gif_2

Quand je l'ai regardé, j'ai constaté que les données de formation contenaient des mots qui étaient nés de manière inattendue de fraude, avec des commentaires comme celui-là qui coulaient parfois. Les deux premiers sont la même scène et le même commentaire, mais celui ci-dessous est séparé par un espace. En premier lieu, MeCab est utilisé normalement, donc l'argot, etc. n'est pas du tout séparé.

Je m'attendais à ce que s'il y avait une scène noire avec une fausse touche, un commentaire qui était attaché à la scène noire avec un festin comme "Shigetenna" serait généré, mais la grammaire etc. s'est effondrée plus que ce à quoi je m'attendais. était en train de faire. RNN semble être dérouté par la différence avec les données d'entraînement.

Modèle d'attention

Vous pouvez tirer le meilleur parti des performances RNN en utilisant l'attention. Dans l'exemple Afficher, assister et dire, le modèle pourra se concentrer sur la position dans l'image associée au mot lorsqu'il est généré. En termes simples, lorsque vous générez un mot, vous apprendrez à vous concentrer sur quelque part dans l'image et, espérons-le, à continuer à vous concentrer sur des positions similaires.

Ce que je veux faire cette fois, c'est que pour le cadre où la légende contenant le mot "Chino" est générée après l'apprentissage, par exemple, lorsque le mot "Chino" est généré, le Chino de l'image doit être attiré. C'est.

Vecteur de fonction d'image à utiliser

Pour prêter attention à quelque part dans l'image, nous avons besoin de quelque chose comme des informations de coordonnées. Comme il n'y a rien de tel dans la méthode d'apprentissage précédente, nous modifierons un peu les données à utiliser. Contrairement à la précédente, nous utiliserons le vecteur de la couche CONV5_3 de VGG-19. C'est 14x14x512. L'image est divisée en 14x14 zones (chevauchement) et des vecteurs de 512 dimensions sont extraits de chacun. Vous pouvez également redimensionner l'image à 448x448 au lieu de 224 pour extraire un vecteur dimensionnel 28x28x512. Avec cela, lors de la saisie d'un vecteur CNN dans RNN, vous pouvez vous concentrer sur la zone correspondant au mot associé en appliquant un poids important à la partie importante de 14x14 et un petit poids à la partie non importante.

Attention résultats de l'expérience

att_3.PNG J'ai apporté une phrase qui contient le mot "Chino" dans la phrase générée pour l'image de Chino-chan. Pour cette image, la phrase "Chino-chan here is cute" a été générée.

La partie blanche est la partie d'intérêt et la position d'intérêt change à mesure que les mots sont générés dans l'ordre. Lorsque vous générez le mot "Chino", ce n'est pas grave si la zone où le Chino est réfléchi est blanche.

Dans l'ensemble, le résultat était que la manière dont l'attention était appliquée était subtile et inutile. Ce n'est pas le cas dans cet exemple, mais j'ai senti que le visage de la personne avait tendance à attirer un peu l'attention.

Dans le cas du cacao, c'est comme suit. "J'aime l'aspect du cacao ici" att_1.PNG

att_2.PNG Il semble que le cacao a plus d'attention sur le premier morceau, mais le deuxième morceau a l'attention sur Rize, et il semble que la personne ne puisse pas être identifiée.

Je pense qu'il y a diverses causes telles que les mots dans les commentaires de l'ensemble de données et les objets dans l'image ne correspondent pas tellement, et les cadres sont des données qui peuvent être facilement classées.

Environnement d'apprentissage

Word vecteur 30000 vocabulaire x 256 dimensions Couche cachée LSTM 256 dimensions Un GPU NVIDIA TITANX

La couche cachée est beaucoup moins. Le modèle était la couche LSTM1 et la couche MLP2 pour la prédiction de mots.

Temps d'étude

modèle Le nombre d'époques qu'il a fallu pour obtenir la meilleure validité batch size Il est temps de prendre 1 époque
VGG relu7, pas d'attention 19 epoch 256 7m30s
VGG Conv5_3, avec attention 25 epoch 256 25m0s

Conclusion

Puisque les commentaires dépendent d'autre chose que de ce qui est montré dans l'image, la formation ne fonctionne pas.

Impressions

Étant donné que CNN a été pré-appris avec ImageNet, je ne sais pas combien de fonctionnalités pourraient être extraites par animation, mais si vous faites des ajustements précis, vous avez peut-être vu plus d'attention que vous vous attendiez. En premier lieu, cela a peut-être bien fonctionné même s'il n'était pas riche comme VGG. Je voulais connaître la taille et la couleur des commentaires, mais j'ai arrêté. Étant donné que le rapport du nombre de commentaires premium est faible, il est nécessaire de concevoir un biais tel que la perte en cas d'apprentissage, mais dans une scène où il n'y a pas beaucoup de différence entre le contenu du commentaire premium et le commentaire normal, la génération aléatoire peut être suffisante selon la probabilité. Je me demandais si tous les oiseaux étaient attirés par le personnage, ou si j'avais appris les lignes, même un oiseau était attiré. C'était surréaliste et intéressant de voir les commentaires de Nico Nico couler sur la console tout en le faisant.

Les logiciels, bibliothèques, etc. que j'ai utilisés

Obtenez des commentaires

Saccubus1.66.3.11 J'ai fait une opération en ligne de commande à partir de Python. J'ai eu une erreur avec Ubuntu 14.04, donc je ne l'ai fait qu'ici avec Windows 10.

.py


import subprocess
def download_comment(email, password, target_id, WaybackTime):
    cmd = 'java -jar Saccubus1.66.3.11\saccubus\saccubus.jar %s %s %s %s @DLC' % (email, password, target_id, WaybackTime)
    subprocess.call(cmd.split())

Lire le fichier de commentaires

Python-xml Le fichier téléchargé par Sakubus est xml, je l'ai donc lu comme suit. J'ai spécifié la date la plus ancienne comme la prochaine heure de retour et je suis retourné en arrière.

.py


import xml.etree.ElementTree as ET
def read_xml(path):
    return ET.fromstring(codecs.open(path, 'r+', 'utf-8').read())

def extract_data(root):
    date, vpos, text = [], [], []
    for r in root:
        if 'date' in r.attrib:
            date.append(int(r.attrib['date']))
            vpos.append(int(r.attrib['vpos']))
            text.append(r.text)
    return date, vpos, text

xml = read_xml(xml_path)
date, vpos, text = extract_data(xml)
oldest_date = min(date)

Partage de mots

MeCab Je l'ai utilisé

.py


from natto import MeCab
mecab = MeCab()
for t in text:
    res_raw = mecab.parse(t.encode('utf-8'))

Chargement de la vidéo

Python imageio

.py


import imageio
vid = imageio.get_reader(movie_path + movie_name, 'ffmpeg')
frame = vid.get_data(idx)

Exporter le texte vers l'image

Python PIL

.py


from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 

img = Image.fromarray(frame)
draw = ImageDraw.Draw(img)
draw.text((x, y), text, font=font, fill=(0, 0, 0))
#Caractère de bordure
def write_text_with_outline(draw, x, y, text, font, fillcolor, shadowcolor):
    offset = [[-1, 0], [1, 0], [0, -1], [0, 1], [-1, -1], [1, -1], [-1, 1], [1, 1]]
    for _x, _y in offset:
        draw.text((x + _x, y + _y), text, font=font, fill=shadowcolor)
    draw.text((x, y), text, font=font, fill=fillcolor)

Conversion d'image en vidéo

ffmpeg Il existe différentes méthodes, mais la première image et le nombre d'images à écrire sont spécifiés par -start_number et -frames. Je pense que c'était correct sans autres options.

ffmpeg -y -f image2 -start_number 0 -loop 1 -r 29.97 -i 'out/frames/target/%010d.png' -pix_fmt yuv420p -frames 40000 out/movies/target.mp4

Bibliothèque d'apprentissage automatique

TensorFlow 0.12

Document de référence

Show and Tell: A Neural Image Caption Generator, Vinyals et al., 2015

Show, Attend and Tell: Neural Image Caption Generation with Visual Attention, Xu et al., 2015

Very deep convolutional networks for large-scale image recognition, Simonyan and Zisserman, 2014

Framing image description as a ranking task: Data, models and evaluation metrics, Hodosh et al., 2013

From image descriptions to visual denotations: New similarity metrics for semantic inference over event descriptions, Young et al., 2014

Microsoft coco: Common objects in context, Lin et al., 2014(web)

Recommended Posts

Quel genre de commentaires les gens qui n'ont vu que les fêtes font-ils quand ils voient le toucher, et la machine peut-elle reconnaître Chino-chan rien qu'en commentant?
Le mystère du nombre qui peut être vu simplement en arrangeant les 1-Le nombre de repunits et de propriétés mystérieuses-