[PYTHON] Welche Art von Kommentaren machen Menschen, die nur Feste gesehen haben, wenn sie die Berührung sehen, und kann die Maschine Chino-chan nur durch Kommentieren erkennen?

Der Kommentar des Nico Nico-Videos wurde vom Untertitelgenerierungsmodell mithilfe von Deep Learning gelernt und automatisch generiert. Klicken Sie hier für verwandte Artikel. Show and Tell: A Neural Image Caption Generator(code) Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

Ergebnis der Kommentargenerierung

gif_1 Lerne Festvideos und Kommentare (train, dev)

gif_2 Generiere einen Kommentar mit einem Video von Kemofure (Test)

Ein Teil des Codes ist am Ende.

Was ich diesmal gemacht habe

Ich habe eine Reihe von Nico Nico-Videos und Kommentaren gelernt und sie auf ein anderes Video angewendet. Ich benutze keine neue Technologie. Ich habe es wie ein Tutorial zum maschinellen Lernen versucht.

Der allgemeine Fluss ist so.

    1. Ist Ihre Bestellung ein Kaninchen? Lernen Sie Kommentare mit dem ersten Vogel
  1. Generierung von Kommentaren in der ersten Folge von Kemono Friends
    1. Lernen und visualisieren Sie mit dem Aufmerksamkeitsmodell

Untertitelgenerierung

Die Untertitelgenerierung generiert eine Beschreibung des Eingabebildes. Bilder und Sätze sind den Trainingsdaten beigefügt. Zu den Datensätzen gehören COCO und Flickr. Dieses Mal extrahieren wir einen Frame des Videos und generieren einen Kommentar für dieses eine Bild. Hierfür wird die Untertitelerstellung mit Deep Learning verwendet.

Modell zur Erzeugung von Untertiteln

Die diesmal verwendete ist CNN + RNN. Grob gesagt werden die Merkmale des Bildes von CNN extrahiert und die Merkmale des Satzes werden von RNN extrahiert, und die Entsprechung zwischen ihnen wird gelernt. Die Geschichte der Untertitelerstellung ist Automatische Erzeugung von Bildunterschriften, Yoshitaka Ushiku, 2016

Datensatz

Kommentar

Ich habe den Kommentar von Nico Nico Video verwendet. Ich habe Sakubus zum Herunterladen verwendet. Ich habe Sakubus von Python aus angerufen und ungefähr 420.000 Kommentare heruntergeladen, wobei ich vom letzten Kommentar zum ältesten Kommentar zurückgekehrt bin. Sie wurden mit MeCab in Wörter aufgeteilt, was insgesamt 75.356 Wörter ergab. Die Top 10 Frequenzen und die Anzahl sind wie folgt.

.py


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

Der erste Platz war das Leerzeichen '\ xe3 \ x80 \ x80'. Die 30 am häufigsten verwendeten Wörter, die als Nomenklatur eingestuft werden, lauten wie folgt.

.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
Hier 11,916
Hmm 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
Zwei 6,993
Gehen Sie 6,130
Abfall 6,099
5 von,990
Kakao 5,909
Reparatur 5,852
Matsuoka 5,680
w 5,637

Von diesen 70.000 Wörtern wurden 30.000 mit der höchsten Häufigkeit verwendet, und der Rest waren unbekannte Wörter. Die Häufigkeit des 30.000sten Wortes betrug 2. Normalerweise sind Wörter, die weniger als fünfmal im Datensatz vorkommen, unbekannte Wörter, aber dieses Mal wollte ich den Wortschatz erweitern, also habe ich den Schwellenwert gesenkt.

Darüber hinaus lauten die Top-10-Kommentare in absteigender Reihenfolge der Anzahl der Kommentare für jeden Frame wie folgt.

Anzahl der Kommentare Rahmenindex Zeit im Video
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

Die beiden oberen sind das erste und das letzte Bild. In Bezug auf die Bildnummer des Videos, das dem Kommentar beigefügt ist, wurde ein Wert festgelegt, der etwas größer als das maximale Bild des Videos ist. Daher habe ich entschieden, dass es sich um alle letzten Bilder handelt. Ich werde einige Bilder und zufällig erworbene Kommentare veröffentlichen. (Das Bild ist rau)

  1. Frame Japans ältester aller Zeiten, Misao Okawa 117 Jahre 27 Tage Bis zu 1,5 Millionen Spiele 1772 Wohin soll ich zurückkehren?

42.468. Rahmen die Welt Bucchipa Süß

10.531. Rahmen Hier jetzt ! Dies ↑ das ↓

10.530. Rahmen Hier Hier ! Hier !

10.532. Rahmen Hier ! Hier ist es! Das ist ↑ das ↓!

Bild

Das Video wurde für jedes Bild zu einem Bild gemacht und die Merkmale wurden im Voraus über CNN extrahiert. Es waren 42.469 Bilder in 24 Minuten. Es gibt durchschnittlich 10 Kommentare pro Frame. Es gab 513 unkommentierte Frames. CNN verwendete VGG-19. Ich habe die Größe des 640x480-Bildes auf 224x224 geändert und es mit einem 4.096-dimensionalen Vektor aus der relu7-Ebene in das CNN eingegeben.

Lernen

Erfahren Sie das Bild und die dazugehörigen Kommentare. Zuerst haben wir die Festdaten in Zug und Entwickler unterteilt. Die Frames wurden zufällig durch 9: 1 geteilt. Beispielsweise gehören alle Kommentare, die an in Züge unterteilte Rahmen angehängt sind, zum Zug.

Das Lernen drehte sich um Kommentare. Wenn sich beispielsweise 100 Frames und 500 Kommentare im Zug befinden, lernen alle 500 Kommentar-Frame-Paare, 1 Epoche zu bilden.

Dieses Mal ist 1 von 10 Bildern des Animationsvideos dev, und es gibt viele doppelte Kommentare, sodass dev im Zug enthalten ist. Es wäre vielleicht besser gewesen, Zug und Entwickler jede Sekunde zu wechseln oder das Video in die erste und die zweite Hälfte zu teilen.

Die Anzahl der Kommentare und die Vervielfältigung der einzelnen Daten sind wie folgt. (Nach der Konvertierung aller Wörter, die nicht in den 30.000 Wörtern im Vokabular enthalten sind, in unbekannte Wortsymbole)

all train dev
Das ganze 427,364 38,4922 42,442
uniq 202,671 185,094 26,682

Darüber hinaus betrug die Anzahl der Kommentare von uniq (Zug) und uniq (Entwickler) 9.105.

Animiert

Dieses Mal haben wir anstelle der Echtzeitverarbeitung Kommentare für jeden Frame mithilfe eines durch Lernen erstellten Modells generiert und zu einem Video verbunden. Erstellen Sie Kommentare für alle Zielframes, kombinieren Sie sie zu einer Datei und schreiben Sie sie später in ein Bild. Ich denke, wenn Sie die Sakubus-Funktion verwenden, können Sie automatisch ein Video mit Kommentaren erstellen, wenn Sie eine Kommentardatei und eine Videodatei haben, aber ich wusste nicht, wie es geht, also habe ich es mit Python gemacht.

Die in der Reihenfolge vom 0. Frame generierten Kommentare wurden gelesen und auf das Bild gezeichnet. In der Vergangenheit gezeichnete Kommentare wurden nach 4 Sekunden in den Rahmen verschoben. Im obigen Gochiusa-Video wurde die Anzahl der generierten Kommentare aus der Verteilung der Anzahl der Kommentare im Datensatz ermittelt (obwohl dies ein Cheat ist).

Um die Variation der Kommentare zu erhöhen, wird außerdem das erste Wort wahrscheinlich aus allen Wörtern mit Ausnahme von Symbolen ausgewählt, die auf der Erscheinungswahrscheinlichkeit des Wortes basieren, und das zweite und nachfolgende Wort haben die höchste Wahrscheinlichkeit aus anderen als unbekannten Wörtern. Ist jetzt ausgewählt.

Gilt für Kemono-Freunde

Ich habe einen Kommentar zum Film von Kemono Friends mit dem Modell generiert, das aus den Daten von Gochiusa gelernt wurde.

jump_power.png Es ist unmöglich, dass das Wort "Freunde" auf diese Weise richtig generiert wurde. Es wurde nur das Wort über Kemono-Freunde generiert, das zufällig im Kommentar von Gochiusa enthalten war.

gif_2 gif_2

Als ich es mir ansah, stellte ich fest, dass die Trainingsdaten Wörter enthielten, die unerwartet aus Betrug entstanden waren, wobei gelegentlich solche Kommentare flossen. Die beiden oberen sind dieselbe Szene und derselbe Kommentar, aber die folgende ist das durch ein Leerzeichen getrennte Wort. Erstens wird MeCab normal verwendet, sodass Slang usw. überhaupt nicht getrennt werden.

Ich erwartete, dass, wenn es eine schwarze Szene mit einem falschen Touch gäbe, ein Kommentar generiert würde, der der schwarzen Szene mit einem Fest wie "Shigetenna" beigefügt war, aber die Grammatik usw. mehr zusammenbrach als ich erwartet hatte. Hat gemacht. RNN scheint durch den Unterschied zu den Trainingsdaten verwirrt zu sein.

Aufmerksamkeitsmodell

Mit Aufmerksamkeit können Sie mehr aus der RNN-Leistung herausholen. Im Beispiel Anzeigen, Anwesend und Erzählen kann sich das Modell auf die Position im Bild konzentrieren, die dem Wort beim Generieren zugeordnet ist. Einfach ausgedrückt, wenn Sie ein Wort generieren, werden Sie lernen, sich auf irgendwo im Bild zu konzentrieren und sich hoffentlich weiterhin auf ähnliche Positionen zu konzentrieren.

Was ich diesmal tun möchte, ist, dass für den Frame, in dem die Beschriftung mit dem Wort "Chino" nach dem Lernen generiert wird, beispielsweise wenn das Wort "Chino" generiert wird, der Chino im Bild angezogen werden sollte. Das ist.

Zu verwendender Bildmerkmalsvektor

Um auf irgendwo im Bild zu achten, benötigen wir so etwas wie Koordinateninformationen. Da es in der vorherigen Lernmethode keine solche gibt, werden wir die zu verwendenden Daten ein wenig ändern. Im Gegensatz zu zuvor verwenden wir den Vektor aus der CONV5_3-Schicht von VGG-19. Dies ist 14x14x512. Das Bild ist in 14 x 14 Bereiche unterteilt (überlappend), und aus jedem werden 512-dimensionale Vektoren extrahiert. Sie können die Größe des Bilds auch auf 448 x 448 anstatt auf 224 ändern, um einen 28 x 28 x 512 dimensionalen Vektor zu extrahieren. Wenn Sie einen CNN-Vektor in RNN eingeben, können Sie sich auf den Bereich konzentrieren, der dem zugehörigen Wort entspricht, indem Sie dem wichtigen Teil von 14x14 ein großes Gewicht und dem nicht wichtigen Teil ein kleines Gewicht zuweisen.

Aufmerksamkeitsexperimentergebnisse

att_3.PNG Ich habe einen Satz mitgebracht, der das Wort "Chino" in dem Satz enthält, der für das Bild erzeugt wurde, das Chino-chan zeigt. Für dieses Bild wurde der Satz "Chino-Chan hier ist süß" generiert.

Der weiße Teil ist der interessierende Teil, und die Position des Interesses ändert sich, wenn die Wörter der Reihe nach generiert werden. Wenn Sie das Wort "Chino" generieren, ist es in Ordnung, wenn der Bereich, in dem Chino reflektiert wird, weiß ist.

Das Ergebnis war, dass die Art und Weise, wie die Aufmerksamkeit angewendet wurde, subtil und insgesamt nicht nützlich war. Dies ist in diesem Beispiel nicht der Fall, aber ich hatte das Gefühl, dass das Gesicht der Person dazu neigte, ein wenig Aufmerksamkeit zu bekommen.

Im Fall von Kakao ist es wie folgt. "Ich mag das Aussehen von Kakao hier" att_1.PNG

att_2.PNG Es scheint, dass der Kakao mehr Aufmerksamkeit auf das erste Stück hat, aber das zweite Stück hat Aufmerksamkeit auf Rize und es scheint, dass die Person nicht identifiziert werden kann.

Ich denke, es gibt verschiedene Ursachen, wie zum Beispiel die Tatsache, dass die Wörter in den Kommentaren des Datensatzes und die Objekte im Bild nicht sehr stark übereinstimmen und dass die Frames Daten sind, die leicht klassifiziert werden können.

Lernumgebung

Wortvektor 30.000 Vokabeln x 256 Dimensionen LSTM versteckte Schicht 256 Dimensionen Eine GPU NVIDIA TITANX

Die verborgene Schicht ist viel weniger. Das Modell war eine LSTM1-Schicht und eine MLP2-Schicht zur Wortvorhersage.

Lernzeit

Modell- Die Anzahl der Epochen, die benötigt wurden, um die bestmögliche Gültigkeit zu erzielen batch size Zeit für 1 Epoche
VGG relu7, keine Aufmerksamkeit 19 epoch 256 7m30s
VGG Conv5_3, mit Aufmerksamkeit 25 epoch 256 25m0s

Fazit

Da die Kommentare von etwas anderem abhängen als dem, was auf dem Bild gezeigt wird, funktioniert das Training einfach nicht.

Impressionen

Da CNN mit ImageNet vorab erlernt wurde, weiß ich nicht, wie viele Funktionen durch Animation extrahiert werden könnten, aber wenn Sie eine Feinabstimmung vornehmen, haben Sie möglicherweise mehr Aufmerksamkeit gesehen, als Sie erwartet hatten. Erstens hat es vielleicht gut funktioniert, auch wenn es nicht so reich war wie VGG. Ich wollte die Größe und Farbe von Kommentaren lernen, hörte aber auf. Da das Verhältnis der Anzahl der Premium-Kommentare gering ist, ist es erforderlich, beispielsweise den Verlust beim Lernen zu beeinflussen, aber in einer Szene, in der zwischen dem Inhalt des Premium-Kommentars und dem normalen Kommentar kein großer Unterschied besteht, kann die zufällige Generierung entsprechend der Wahrscheinlichkeit ausreichend sein. Ich habe mich gefragt, ob alle Vögel Aufmerksamkeit bekommen haben, wenn ich sie gelernt habe, oder ob auch nur ein Vogel Aufmerksamkeit bekommen hat, wenn ich die Linien gelernt habe. Es war surreal und interessant zu sehen, wie Nico Nicos Kommentare dabei auf der Konsole flossen.

Die Software, Bibliotheken usw., die ich verwendet habe

Erhalten Sie Kommentare

Saccubus1.66.3.11 Ich habe eine Befehlszeilenoperation von Python ausgeführt. Ich habe einen Fehler mit Ubuntu 14.04 bekommen, also habe ich es nur hier mit Windows 10 gemacht.

.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())

Kommentardatei lesen

Python-xml Die von Sakubus heruntergeladene Datei ist XML, daher habe ich sie wie folgt gelesen. Ich gab das älteste Datum als nächste Wayback-Zeit an und ging zurück.

.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)

Wort geteilt

MeCab ich benutzte es

.py


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

Video laden

Python imageio

.py


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

Exportieren Sie Text in ein Bild

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))
#Randzeichen
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)

Bild-zu-Video-Konvertierung

ffmpeg Es gibt verschiedene Methoden, aber der erste Frame und die Anzahl der zu schreibenden Frames werden durch -start_number und -frames angegeben. Ich denke, dass es ohne andere Optionen in Ordnung war.

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

Bibliothek für maschinelles Lernen

TensorFlow 0.12

Nachschlagewerk

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

Welche Art von Kommentaren machen Menschen, die nur Feste gesehen haben, wenn sie die Berührung sehen, und kann die Maschine Chino-chan nur durch Kommentieren erkennen?
Das Geheimnis der Zahl, die nur durch Anordnen von 1s gesehen werden kann - Die Anzahl der Wiederholungen und die mysteriöse Natur -