こんにちは、Fogrexです。
この記事は:nan_india:ですか
この記事は、あなたの担当(もしくは推し)を推すために顔認識を使った馬鹿記事です
正直もとになったプログラムはかなり前に作ったのであんまりどうやったか覚えてないけど勘弁してください
あと長いことデレステから離れていたのでところどころ古い知識で書いているかもしれないです
皆さん、デレステをやったことはありますか?
僕はあります。そして沼にハマって一時期金を費やしていたこともあります(といっても高校生だったのでそんなにお金なかった)
しゅがはかわいい
デレステの醍醐味といえばMVのスクショだと思います。
イラストを描く技術がなくても、エモい動画編集の技術がなくても、手軽に担当の素晴らしい姿を記録し、宣伝できます。
というわけで、スクショを取りまくってスクショだけでカメラロールが埋まったりするわけですが、途中で気付くわけです
あれ、これスクショ撮るより動画取った方がいいんじゃね
と。いや、実際には画質が落ちるので完全なる上位互換ではないんですよ?でもね、
- デレステMVは巻き戻しできないので一回撮影ポイント逃すと曲のはじめからやり直し
- どうせ無限にスクショを撮るのでいったん録画してからじっくり撮影ポイント探せばよくないか
となるわけです
で、こうなる
動画から全フレーム切り出して画像で保存したものです
でも正直誰も映ってないフレームとか要らないんですよ
で、本題
顔認識で担当の顔を検知させてそのフレームだけ切り出す
何やるか見えてきましたね
処理の流れはこう
スクリプト1
学習用の動画を用意する
OpenCVで顔認識をして認識された顔を切り出して画像に保存
保存された画像をそれぞれ分類する(人力)
スクリプト2
分類した画像をラベル付けしてnpy形式で出力
スクリプト3
npyを読み込んでKerasでモデルを構築し学習
重みデータを出力
スクリプト4
学習済みモデルをロードしてOpenCV+Kerasで顔認識しつつフレーム切り出し
という処理になります。OpenCVでアニメの顔認識をする場合はlbpcascade_animefaceをカスケードファイルに用います。これはOpenCV付属のカスケードファイルではカバーできないアニメやイラストの顔を検知するためのファイルです。Python+OpenCVで顔認識をするやつはネット上にいくらでも転がってるので書きません。
ちなみに酔い乙女宵乙女の5人で顔認証しようとしたんですがナナさんがいなかったのでイヴで代用してます。ナナパイセン担当の人ごめんなさい
スクリプト1と2に関しては昔に書いたプログラムが消え失せてしまったので記憶の限りに書くと、顔を切り出す際、切り出す大きさを検知された範囲より1.4倍大きくしたはずです。顔以外の情報量が増えて認識しやすくなると思ったので。分類は、それぞれフォルダを作って手作業で分けた後、フォルダ内の全部の画像に対して同じラベルを付けて保存、みたいな方式を取りました。ラベルはOne-Hot式。そして、切り出した部分を64x64の大きさに成型してnpyに出力しました。
スクリプト3、4に関してはGoogleColaboratoryに移植したやつを乗っけておきます。GoogleColaboratoryで認証フェーズと想起フェーズを実行すれば望むものが得られます。学習フェーズは気になったら見てみてください。コメントの指示に従えば実行できるはずです。自分で自由にコードを編集して遊んでみるのもいいでしょう。変更はあなたのブラウザでしか適用されないので気にせずどうぞ
実行めんどくさい!という方は以下に動画置いときますね
画像認識でしゅがはだけを切り出す
ちなみに、顔認識をした結果を出力した奴を下に置いておきます
Predicted Video
なんか動画の速度がおかしいかもしれませんがそれは元動画が60fps(コマ抜け有)を間違えて約30fpsにしたからです
うちのスマホで3Dリッチ60fpsは厳しい
総評
最適化とかなんもしてないので精度はいまいちですがそれでもまぁまぁの精度は出てます
あと一番めんどくさいのは手作業での分類です
分類も自動でやってくれねぇかなぁと試行錯誤したけどぼくの技術力じゃ無理でした
自分でやりたい人、がんばれ
しゅがはかっこいい(Spin-off!みろ)
明日はryohaさんの記事です 楽しみ~