読者です 読者をやめる 読者になる 読者になる

cocuh's note

type(あうとぷっと) -> 駄文

友利奈緒シーン集つくりたくないっすか その1

紳士淑女の友利奈緒なみなさま、ネット上の幼女のみなさん、こんにちは。
友利奈緒advent calendarの4日目担当の幼女、こくたん(@cocu_tan)です。

www.adventar.org

友利奈緒advent calendarでは、
これまでに 友利奈緒の方々友利奈緒への変態力を発揮されてますが、
私は変態でないのであまり過度な期待しないでください。

あと間違ったことを言っていたらぜひコメントにてご指摘お願いしますっ。

今回は、きかいがくちぅ を使って友利奈緒シーン集を作ろうと思います。
それと幼女な私は歩未ちゃん推し。なのです〜〜

f:id:cocu_628496:20151204215430p:plain

ほしいもの

特定のキャラシーン

解法その1: 顔画像認識

最初に思いつくのは 顔画像認識 して分類器に突っ込むやり方ですね。たぶんアニメ 機械学習ぐぐるとでてくるやりかたです。

んで、処理の流れはこんな感じで。

生動画
 ↓
 ↓ ffmpeg -i raw.mp4 -r 10 -av -f image2 %0d10.png
 ↓
キャプチャ画像
 ↓
 ↓ 顔画像crop
 ↓ (opencvのcascadeClassifierにlbpcascade_animeface.xmlを使う)
 ↓
顔画像(64x64px, RGB)
 ↓
 ↓ 分類器で分類
 ↓
キャラクターが画面にいるかのベクトル

この 顔画像crop分類器 の設計が機械学習の領域なんですが、既存研究でアニメ顔の認識器を作っている方がいるのでそれを使います。

Imager::AnimeFaceのページ

顔画像からキャラクターの識別をする分類器を作るのですが、この関数の入力ドメインRGB画像(64x64px)です。
データから何か当てたい時は 「まずデータを見よ」 とよく言われるのでcropしてみたのがこちら。

f:id:cocu_628496:20151204080635p:plain

顔画像っぽいの取れてますね。
でも、 明らかに顔じゃない部分とかが写ってますよね…?

なので最初にゴミ画像を抜く処理が必要そうです

生動画
 ↓
 ↓ 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でクラスタリングさせる。

f:id:cocu_628496:20151204230422p:plain

あとは地味な作業

f:id:cocu_628496:20151204083234p:plain

なぜか顔として認識された乙坂家秘伝のピザソース

f:id:cocu_628496:20151204230600p:plain

できたでーたせっと

ゆさりん少なっ乙坂兄多すぎっ(1話と2話なので)

f:id:cocu_628496:20151204082316p:plain

ぶんるいき

巷で流行りのdeep learningとかは設定にもかなりよりますけど、本気でやると数万のデータと数日〜数週間掛かる最適化問題を解く必要があります。 この7000件程度のデータセットでは確実に過学習すると思われるのでやりません*1


ということで、古き良きPCASVMをつかいます。

画像データそのままだと64x64x3= 12288次元 になってやばやばなので、normalizeして主成分分析して150次元に圧縮してから、SVMにかけます。
SVMは簡単に言えば、友利奈緒空間とそうじゃない空間の境界を探していい感じに分類するやつです。

選んだ理由としては、惨事の顔画像認識の既存研究*2でも使われてるということとデータセットが少ないのでmargin最大化するとよさげに空間広がって多少はいい感じになるんじゃないかとか思ってました。

f:id:cocu_628496:20151204085131p:plain

数式とパラメータチューニングの値域は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を見ると…

f:id:cocu_628496:20151204090234p:plain

お、識別率97%いってる!!!やったー
ゆさりん識別率0%ですね。しかたないね。1話と2話だけだし18枚だし。

OPをみてみると。。。いいかんじ

f:id:cocu_628496:20151204210710p:plain

opencvが顔と認識したけど明らかに違うものはちゃんとできている様子。

f:id:cocu_628496:20151204210741p:plain

f:id:cocu_628496:20151204210915p:plain

opencvの顔認識器で顔画像と認識できてないのはそもそも識別できない。

f:id:cocu_628496:20151204210835p:plain

でもこの結果、
明らかに過学習していそうな匂いを感じます
(きかいがくちぅ幼女の嗅覚)

しきべつけっかをどうがにする

データセットにない4話目冒頭で識別しておんなじ感じにやってみます。
これが真のテスト誤差になるはずです。

う、うん…まぁこんなもんかな。。




とりあえず識別したやつ全部みていくらか抜粋してみると。。。

頂けるやつ

f:id:cocu_628496:20151204211510p:plain

頂けないやつ

f:id:cocu_628496:20151204211612p:plain f:id:cocu_628496:20151204211738p:plain f:id:cocu_628496:20151204214759p:plain




f:id:cocu_628496:20151204211855p:plain




けつろん

このアルゴリズムでシーン集を作るのは難しそう…

じつは

実験する前からたぶんあんまりうまくいかないだろうと思ってました。どうしてかというと。

  • 友利奈緒の顔画像識別は「青い目」「白い髪」という特徴的な特徴を持っているので問題としては楽だけどPCA+SVMはその特徴をうまく掴めないから
    • 12288次元、ひとつひとつはピクセルになっていて、ピクセルの隣接関係も捨てられているし「目」とか「髪」とかを全く考慮してない
    • 1ピクセルずれるだけ、照明条件が変わるだけ*3、回転縮小拡大で特徴ベクトルがかなりブレる
      • このブレてしまうことをロバスト性(頑健性)がないという
      • このブレを学習するほどデータ数が(感覚的に)なさそう
      • ちなみにPCAには(ノイズに対する)ロバスト性は持っています(固有値の小さい固有ベクトルを捨てるから
        • (が、自然画像じゃないのでjpgのノイズのり画像を行列でゴリゴリとかしない限りはあんまりノイズは問題なさそう)
  • そもそもopencv側のアニメ顔認識の精度が厳しい
    • たぶんこのアニメ顔認識がcharlotteの作画に合っていない認識器だと思われるので、チューニングしないといけなそう(call of 闇)
  • SVMだから棄却領域とか確率的議論が微妙
    • mobが1つのキャラとして扱っているのでmob空間が他のキャラクター空間に影響を与える実装になっている(きがする

よそうがいのこと

  • 150次元に圧縮しても明らかに過学習してる
    • 正則化項もないSVMだからなのですけど、この次元このデータ数でもなるのか…と個人的に
  • おしごとで障害発生 x2
    • 実はこの実験がbaselineのつもりだった

展望

今回利用していない制約条件は考えられるだけで以下の通り(coinsLTで話したことはこのあたり

  • ロバスト
    • 1ピクセルずれるだけで特徴ベクトルがブレる問題を正則化項なりモデルの変形なり特徴ベクトルに持たせる(SIFT, SURF, CNNはこれがつよい)
    • 位置的回転的縮尺的
  • 時系列に対する制約
    • 次のフレームにも同じ人物が写ってるはず的な
  • small dataset設定で既存研究がちょこちょこある
  • 転移学習
  • アニメ特有の塗りに対する制約
  • 声と連動している(であろう)制約
    • 画面に写ってるなら声もあるはず
    • 声優統計学べんきょうするかーっ

時間があればもっといい感じなアルゴリズム設計するはなし書きたいです。






友利奈緒advent calendar4日目でしたーっばいばいっ

f:id:cocu_628496:20151204181321p:plain

*1:いくつかアニメ機械学習界隈で使っている方いますけど。汎化性能どうなんじゃろ、ほんとにテストデータ大丈夫?ネットワーク構造大丈夫?といろいろ思ったり。たぶんこの記事でも思われそう

*2:1998-2005年あたりが多い気がする。最近の手法はあんまりしらない

*3:アニメ塗りなのであんまり関係ないですし、画像ごとに正規化してるので明度にたいしてはまぁロバストになっています。が、RGBを愚直に縮めてるだけなので色空間的には微妙かなと思ったり