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
Lerne Festvideos und Kommentare (train, dev)
Generiere einen Kommentar mit einem Video von Kemofure (Test)
Ein Teil des Codes ist am Ende.
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.
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.
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
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)
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 ↓!
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.
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.
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.
Ich habe einen Kommentar zum Film von Kemono Friends mit dem Modell generiert, das aus den Daten von Gochiusa gelernt wurde.
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.
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.
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.
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.
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"
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.
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.
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 |
Da die Kommentare von etwas anderem abhängen als dem, was auf dem Bild gezeigt wird, funktioniert das Training einfach nicht.
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.
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())
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)
MeCab ich benutzte es
.py
from natto import MeCab
mecab = MeCab()
for t in text:
res_raw = mecab.parse(t.encode('utf-8'))
Python imageio
.py
import imageio
vid = imageio.get_reader(movie_path + movie_name, 'ffmpeg')
frame = vid.get_data(idx)
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)
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
TensorFlow 0.12
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