ぴょこりんブログ

裏垢です。

サナララRプレイ動画からのへちょ顔抽出。

この記事は、ぴょこりんクラスタ:Re Advent Calendar 2016のために書きました。

はじめに

サナララ及びサナララRの登場人物である椎名希未さん(以降のぞみ先生と呼ぶことにする)の音声と感情ラベルがペアになったデータセットがとてもほしい気がしてきた。僕はそういう気持ちを大事にしたい。

サナララRでは、各ヒロインが発言する際、画面の一定の部分に小さくへちょ顔が表示される。このへちょ顔の表情は発言によって変化するため、これとそのタイミングでの発言のペアを抽出できれば良いだろう。そこで本稿ではその基礎的検討として、サナララのプレイ動画からへちょ顔が表示されているフレームのみの抽出を試みた。

やったこと

まず公式のYoutubeにあがってるWeb体験版 動画ver.をローカルに保存(今回はChapter 1だけを対象とした)。

画面中のへちょ顔が表示される部分を切り出し。

import cv2
# 保存したファイルの読み込み
vidcap = cv2.VideoCapture('./sanarara/Chap01.mp4') 

success=True
faces=[]
while success:
    success,image = vidcap.read()
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
    # へちょ顔部分に対応する部分を切り抜くおまじない的数字
    faces.append(image[255:285,125:180]) 

得られた画像データをすげぇ雑に次元削減+ノーマライズしたあとk-meansでクラスタリング。これでへちょ顔のみのクラスタができることを期待。

from sklearn.decomposition import NMF
from sklearn.preprocessing import normalize

# 全部眺めるのはめんどくさいので10フレームに1回だけにした。
dataset=[i.reshape(30*55*3) for i in faces[::10]]
# クラスタの数は5あたりでだいぶサチったのでこれを採用。
model = NMF(n_components=5, init='random', random_state=0)
X=normalize(model.fit_transform(dataset))
kmeans = KMeans(n_clusters=5, random_state=0).fit(X)

それぞれのクラスタごとに別々のディレクトリに画像を保存。作業ディレクトリ下にkmeansってディレクトリをつくって、更にその下に0~4(クラスタ数に対応)って名前のディレクトリをつくってあると想定。

for frame,i in enumerate(zip(kmeans.labels_,faces[::10])):
    cv2.imwrite('./kmeans/'+str(i[0])+"/"+str(frame)+".png", cv2.cvtColor(i[1], cv2.COLOR_RGB2BGR))

こんな大雑把なことしても、案外のぞみ先生のへちょ顔が1つのディレクトリに集まってるってワケですよ。 f:id:cappsLk:20161211153247p:plain

他のディレクトリには、へちょ顔が写ってない状態のフレームだったり、真っ暗だったり、OPの映像(動画の後半に入ってる)などが入ってる。

目視で確認したら少しだけへちょ顔が半分で切れて写ったフレームがのぞみ先生以外のクラスタに混じっていた。

f:id:cappsLk:20161211155058p:plain

何があったのかと思って動画を確認したら、のぞみ先生がびっくりするところで画面が揺れていた、かわいい。先程の動画だと例えば3:54あたりみたいな感じ。まぁそういう例外があることを念頭においておけば大した問題にはならないだろう。

まとめ

サナララRのプレイ動画からへちょ顔を抽出した。かわいい!!