Rで動画から笑顔判定する

こんな動画がある。
http://www.ustream.tv/recorded/61679410
撮影場所も不明、映っている人物の動機も不明であり、どんな経緯でこの動画が作られたのかその詳細はわからない。
どういうつもりなのだろうか。
さて、この動画をみていると人物が時々微妙な表情をする。
「笑顔」というにはあまりに微妙であり正直どのように形容してよいかわからない。
ということで、そういうのは機械に判定してもらうことにした。

動画を画像に分割する

動画はffmpegで簡単に分割できる。
しかし80分もあるので1秒単位で分割しても4,800枚になった。
わかってはいたことだがこんな微妙な画像が4,800枚もマイPCのハードディスクを占めることに動揺を隠せない。

画像をFACE++に投げて笑顔判定する

Rのfaceplusplusパッケージを使ってsmiling値を取得する。
4,800枚もあるのでずいぶん時間がかかる。
長澤まさみの映画を観るなどしてしのごうとしたのだが耐えられなくなって1,872枚でやめた。
だから以下に示す結果は上記動画の冒頭約30分の結果である。

笑顔判定の結果を可視化する

笑顔判定の結果を動画の秒数と併せて以下に可視化した。
ついでに年齢も可視化した。
上が年齢、下が笑顔値である。

動画開始後13分あたりで比較的高い笑顔値が頻発しており15分頃に最高の笑顔値を記録している。この時年齢も上昇しておりぐっと老け込んでいる様が伺える。
いわゆる「好々爺」的な顔になったのだろうか。

笑顔の異常値を把握する

さて、一般的な「人間の笑顔」に近いのはどのシーンか知りたい。
普段が微妙な表情なので「人間の笑顔」に近いシーンは異常値として検出されるはず。
異常値検出を行うことでそのシーンをピックアップすることにする。
RのAnomalyDetectionパッケージを使って異常値をマークした結果が以下である。

ついでにどんなシーンだったか異常値をいくつかピックアップしてそのシーンを貼付けた結果を以下に示す。

年齢については顔を下に向けていたり、顔の一部を隠すことで極端に上下している。老け込んだわけではなかった。
笑顔についてはうまく判定できているところもある一方、なぜそんな顔が「満面の笑み」だと判定されたのかわからないものもあった。
あれか髭の感じなどがアノニマスぽかったからだろうか。

参考画像

後記

今回の判定をやりながら、ストリーム動画に対してオンライン異常値検出することで面白そうな部分だけ見るといったことが可能になるなと思った。
正直おじさんの顔をあてどもなくにらめっこするのは辛い。
しかし途中でなにかハプニングが起きて面白くなるかもしれない。
ハプニングだけ見たい。ライブ感保ったままハプニングだけ見たい。
そんなジレンマを技術が解決してくれそうだなという実感を得た。
この辺いずれJubatusで実装してみたい。

参考資料

今回の着想は以下の発表から得た。
Rで色々やってみました
TokyoRでこの発表を聞いてからもう4年にもなるのか。

最後にこの素敵な素材を提供してくれた動画の提供主には感謝したい。

enjoy!!!