紳士淑女の友利奈緒なみなさま、ネット上の幼女のみなさん、こんにちは。
友利奈緒advent calendar
の4日目担当の幼女、 こくたん (@cocu_tan
)です。
友利奈緒advent calendar
では、
これまでに 友利奈緒の方々 が友利奈緒への変態力愛を発揮されてますが、
私は変態でないのであまり過度な期待しないでください。
あと間違ったことを言っていたらぜひコメントにてご指摘お願いしますっ。
今回は、きかいがくちぅ を使って友利奈緒シーン集を作ろうと思います。
それと幼女な私は歩未ちゃん推し。なのです〜〜
ほしいもの
特定のキャラシーン集
解法その1: 顔画像認識
最初に思いつくのは 顔画像認識 して分類器に突っ込むやり方ですね。たぶんアニメ 機械学習
でぐぐるとでてくるやりかたです。
んで、処理の流れはこんな感じで。
生動画 ↓ ↓ ffmpeg -i raw.mp4 -r 10 -av -f image2 %0d10.png ↓ キャプチャ画像 ↓ ↓ 顔画像crop ↓ (opencvのcascadeClassifierにlbpcascade_animeface.xmlを使う) ↓ 顔画像(64x64px, RGB) ↓ ↓ 分類器で分類 ↓ キャラクターが画面にいるかのベクトル
この 顔画像crop
と 分類器
の設計が機械学習の領域なんですが、既存研究でアニメ顔の認識器を作っている方がいるのでそれを使います。
顔画像からキャラクターの識別をする分類器を作るのですが、この関数の入力ドメインはRGB画像(64x64px)です。
データから何か当てたい時は 「まずデータを見よ」 とよく言われるのでcropしてみたのがこちら。
顔画像っぽいの取れてますね。
でも、 明らかに顔じゃない部分とかが写ってますよね…?
なので最初にゴミ画像を抜く処理が必要そうです
生動画 ↓ ↓ ffmpeg -i raw.mp4 -r 10 -av -f image2 %0d10.png ↓ キャプチャ画像 ↓ ↓ 顔画像crop ↓ (opencvのcascadeClassifierにlbpcascade_animeface.xmlを使う) ↓ 顔画像+ゴミ(64x64px, RGB) ↓ ↓ ゴミ分類器でゴミ捨て ↓ 顔画像(64x64px, RGB) ↓ ↓ 分類器で分類 ↓ キャラクターが画面にいるかのベクトル
それに教師あり学習では、教師データを作る必要があります。
なので、手作業でゴミ取りとラベル付します。
だいたい1話で3500枚ぐらいあるので、筆者が力尽きるまでやって1話目と2話目から7150枚の教師データを作りました。
さぎょうふうけい
作業をらくするために先にkmeansでクラスタリングさせる。
あとは地味な作業
なぜか顔として認識された乙坂家秘伝のピザソース
できたでーたせっと
ゆさりん少なっ乙坂兄多すぎっ(1話と2話なので)
ぶんるいき
巷で流行りのdeep learning
とかは設定にもかなりよりますけど、本気でやると数万のデータと数日〜数週間掛かる最適化問題を解く必要があります。
この7000件程度のデータセットでは確実に過学習すると思われるのでやりません*1。
ということで、古き良きPCA
とSVM
をつかいます。
画像データそのままだと64x64x3= 12288次元 になってやばやばなので、normalizeして主成分分析して150次元に圧縮してから、SVMにかけます。
SVMは簡単に言えば、友利奈緒空間とそうじゃない空間の境界を探していい感じに分類するやつです。
選んだ理由としては、惨事の顔画像認識の既存研究*2でも使われてるということとデータセットが少ないのでmargin最大化するとよさげに空間広がって多少はいい感じになるんじゃないかとか思ってました。
数式とパラメータチューニングの値域はsklearnのこちらとほぼ同じ参考に
1.4. Support Vector Machines — scikit-learn 0.17 documentation
Faces recognition example using eigenfaces and SVMs — scikit-learn 0.17 documentation
"過学習"ってなに?
過学習
のイメージは、教えてあげたことは答えられるけど予想外なことには間違った答えを答えちゃう娘`を想像してもらって、この娘状態なことです。
なのでこの娘にちゃんと答えを教えた1話と2話を見せると知ってるのでちゃんと正しい答えを教えてくれるけど、3話目を見せると知らないシーンなの「はわわはわわ」となって間違った答えを返しちゃう感じです。
機械学習は 「多少は教えたよ?ほかは察してちょうだいね?」 って感じに機械に 汎化能力
を与えて人間がらくをするための技術なので、テンパっちゃう娘はお呼びじゃないのです(わたしのおうちにはおいで
じっけん
1話目と2話目から作ったデータセットでパラメータのgrid searchと3-fold cross validationしてtest errorを見ると…
お、識別率97%いってる!!!やったー
ゆさりん識別率0%ですね。しかたないね。1話と2話だけだし18枚だし。
OPをみてみると。。。いいかんじ
opencvが顔と認識したけど明らかに違うものはちゃんとできている様子。
opencvの顔認識器で顔画像と認識できてないのはそもそも識別できない。
でもこの結果、
明らかに過学習していそうな匂いを感じます
(きかいがくちぅ幼女の嗅覚)
しきべつけっかをどうがにする
データセットにない3話目冒頭で識別しておんなじ感じにやってみます。
これが真のテスト誤差になるはずです。
う、うん…まぁこんなもんかな。。
とりあえず識別したやつ全部みていくらか抜粋してみると。。。
頂けるやつ
頂けないやつ
けつろん
このアルゴリズムでシーン集を作るのは難しそう…
じつは
実験する前からたぶんあんまりうまくいかないだろうと思ってました。どうしてかというと。
- 友利奈緒の顔画像識別は「青い目」「白い髪」という特徴的な特徴を持っているので問題としては楽だけどPCA+SVMはその特徴をうまく掴めないから
- そもそもopencv側のアニメ顔認識の精度が厳しい
- たぶんこのアニメ顔認識がcharlotteの作画に合っていない認識器だと思われるので、チューニングしないといけなそう(call of 闇)
- SVMだから棄却領域とか確率的議論が微妙
- mobが1つのキャラとして扱っているのでmob空間が他のキャラクター空間に影響を与える実装になっている(きがする
よそうがいのこと
展望
今回利用していない制約条件は考えられるだけで以下の通り(coinsLTで話したことはこのあたり
- ロバスト性
- 1ピクセルずれるだけで特徴ベクトルがブレる問題を正則化項なりモデルの変形なり特徴ベクトルに持たせる(SIFT, SURF, CNNはこれがつよい)
- 位置的回転的縮尺的
- 時系列に対する制約
- 次のフレームにも同じ人物が写ってるはず的な
- small dataset設定で既存研究がちょこちょこある
- 転移学習
- アニメ特有の塗りに対する制約
- 声と連動している(であろう)制約
- 画面に写ってるなら声もあるはず
- 声優統計学べんきょうするかーっ
時間があればもっといい感じなアルゴリズム設計するはなし書きたいです。
友利奈緒advent calendar4日目でしたーっばいばいっ