多分こうすれば、Kinectの表情認識っぽいの作れる
2011 年 1 月 7 日 金曜日Cesで発表された、Kinectによる表情認識のアバター技術。これ面白いなぁと思いつつ、ちょっと工夫すれば以外と普通のテクノロジーでいけるんじゃないかと。
いま時間がないので、自分で実装できないけどロジックのメモ。これを読んだ誰かに託します。そしてトラックバックをしてくださいwww
Step1: OpenCVで顔を認識する
とりあえずは定番のOpenCVで顔の矩形を認識します。
ここまでは普通普通。
Step2: 口を認識する
で、認識した顔の矩形ビットマップの下半分を切り出して、それをソースに、口をOpenCVで認識します。
定義XMLは本家CVにあるので問題無し。下半分を切り出すことで、目や眉毛を口と認識する問題を回避します。顔をソースに再帰することで、目と口が同じ顔に属することを保証します。
普通の人間は、顔の下50%に口がついていると思うので、口がおでこにある人を認識できなくてもいいんじゃないかと。
Step3: 口の表情を求める
Step2で、口の矩形データが取得できました。でですね、この矩形の幅と高さの比率から、口の表情を求められるのではないかと。ディフォルトよりWが広くなったらば、スマイルですし、Hが高くなったらば口をあけています。こいつをマッピングしてやればいいのではないかというわけです。
暇があれば、閉じた口、開いた口、引き延ばした口で、それぞれOpenCVの定義ファイルを用意してやればいいと思いますが、それはさすがにメンドウなのでWとHの比率だけでいいかと。
Step4: 目か眉毛を認識する
次は、顔矩形の上70%ぐらいのビットマップをソースに、目か眉毛を認識します。目のほうが楽かな。
画面上半分を更に目の検出をします。 2個検出されたら左にあるのが左目、右にあるのが右目です。口は除外されているのでご検知はされない。。。と。で、目の上にある塊が眉毛として認識。
成人の人間の顔は、骨格的にだいたい顔面の上下中心に目があります。左右でいうと中心線を基準に1/3ぐらい。プログラマがそういった比率をしったうえでCVのプログラムをそこだけに奔らせれば、認識精度は大幅にあがります。
で目の表情も、目と眉毛の距離関係からとれるんじゃないかと。 余裕があれば眉毛の矩形の比率やらから、眉毛が起きてるか寝てるかをとればよいということで。
で、あとは認識した顔をベースに、絵をマッピングしてやる。顔の認識に失敗した場合は、最後に顔が認識されたときのデータを引き続き採用すればいい。 顔のパーツの位置や角度は、移動平均を用いてまるめてやれば認識のガクガクしたノイズも削れる。
メンドクさそうではあるけど、既存の技術で全部できそうだし、テクニカルな壁はいっさいなさそうじゃないでしょうか?どうなんでしょ? 僕の処理は顔が正面を向いていることを前提としていますが、目2個距離と口の位置関係から、顔がある程度横を向いたのも検出できると思う。
お暇なプログラマがいたら、是非ためしてみてくださいまし。