アニメ顔の検出とキャラクターの分類

時間がないくせにアレコレしていて、もうなにをしたかったのかしているのかわけ分からなくなってきたけど、まだ大きな目線で見ると方向性は間違ってないと思う。最近は画像から矩形を超高速に切り抜きまくるためのツールを作っていて、その用途が検出器を作るための良質のサンプルデータ集めの効率化で、作りながら、そういえば顔判定はよく見るけど、アニメ顔判定は見ないなーと思っていたところに『http://techon.nikkeibp.co.jp/article/NEWS/20080325/149419/:title=』というニュースを見て、これはまずい先を越されてしまう、コンテンツベースのサイト分類器を作ってニートになるのは俺だ! と思って、いますぐアニメ画像の判定をしてみようと思い始めた。
考えた判定の方法は、

  1. アニメ顔検出
  2. 顔の位置から他の部位の座標を大体求める
  3. 髪の色と服の模様(ヒストグラムを使う)でキャラクターを判定(統計とか確率的なやつ)
  4. 複数キャラ映っている場合は同時に映る可能性のあるグループの判定率を上げる(たとえば、ハルヒとみくるちゃんと綾波レイを検出した場合、それは綾波レイではなく長門だろう)

て感じ。
これを静止画に対して試していたけど、1の顔検出の時点で検出率がダメダメでもう3度目になる検出器を別のアイデアをもとに作ろうとか思っていて、なんとなく動画で試してみたら、動画の場合は結構使えそうだと気づいた。この時点で興味が静止画から動画に移った。さらになにをしているのか分からなくなる。
これは失敗をある程度許せるところが重要で、静止画だと、1フレームのみに対して判定を行うため失敗が許されない。失敗が許されないということは、映っているアニメキャラが横を向いていたり、斜めに映っていたり、カオスな体勢をしていた場合でもうまく検出する必要があって、それを実現するには、さまざまな方向からの顔検出器を複数試しつつ顔を検出するとか、顔と手と足をバラバラに検出して接続具合から体勢を求めたりとか、想像しただけであばばばばばばとなりそうになる。しかし、動画だと1秒に何十フレームもあるし、それが何百秒もあるので、少々ミスっても失敗データとして捨ることができるため、かなり判定率が上げられる、ようにみせることができる。大体において顔は垂直だし、顔から顔2つ下には体がある。

参考動画


匿名うp主の、この動画で使われているアニメ顔検出器は、4chanをクロールして集めた約1000枚のecchi画像から切り抜いた顔をランダムにアフィン変換して9000枚に増やしたデータをもとに作っているので、そこそこ汎用性を持って現代風アニメ顔(エロゲ顔)の検出が行えるものだ。ハルヒEDの画像は一切使っていない。
キャラ判定はまだできていないので、この動画用に3人の髪の色を判定する処理を約2分かけてハードコーディングしたテキトウなものが使われている。

現代風アニメ顔(エロゲ顔)検出用のhaarcascade

haarcascade_animeface.xml
(ブラウザで開くと重いので注意!)
そこそこ使えるとは思うけど、少ない元データを擬似的に増やして作っているので、あまりよくない。そのうちもっといいのを作る。
使い方は、
opencv.jp - OpenCV: 物体検出(Object Detection)サンプルコード - (C言語)
とか。ヒストグラムの均一化はしないほうがいいです。グレーにもしなくていいと思います。(追記:中の処理でグレーにされてます)
Perlでも、
OpenCVを使って画像の物体認識をするPerlモジュール作った - spiritlooseのはてなダイアリー
があるけど、いくつかの重要なパラメータが指定できない。

画像から効率的に矩形を切り取りまくるツール

そのうち公開する。

最新版(2009/10/09追記)

これより新しいバージョンがあるのですが毎回こっちにリンクされる気がするので、リンクします。
OpenCVでアニメ顔を検出するためのXML v2 - デー