Imager::AnimeFaceのページ

Perlから(も)使える静止画を対象としたアニメ顔検出ライブラリです。※Ruby版もできました。

ここは主に技術的な内容について紹介するページになっています。

ライブラリの使い方や機能の紹介は Perlでアニメ顔を検出&解析するImager::AnimeFaceにあります。この記事は僕自身が書いてます。

(画像はヤスヒロさん撮影の写真)

もくじ

アニメ顔検出とは?

アニメ顔検出とは、無作為に提示されたひとつの画像データの中に存在する全てのアニメ顔の位置を見つけることです。多様なアニメ顔をひとつの顔クラスとし、画像上のさまざまな領域について『顔』と『顔以外』に正確かつ高速に分類する問題になります。

多くの場合、1枚の画像には0~20個程度の顔しか存在していません。これに対して顔以外の領域は50000~300000程度あります。つまり制限された範囲においてごく少ない顔を確実に見つける能力を求められます。コンピュータが苦手とするパターン認識の問題に正確さと速度を求めているため難しい問題だと思っています。また、ほとんどの人間はこの問題をコンピュータより正確に行えるため、コンピュータの結果に誤りがあるとすぐに明らかになり厳しく評価されます。

Imager::AnimeFaceとは?

Imager::AnimeFaceはアニメ顔検出に挑戦した際に作られたPerl向けのライブラリです(注1)。顔の検出だけでなく、顔の部品位置や大きさの推定、肌や髪、目の色を精度よく抽出する機能まで実装されています。近いうちにイラスト検索に応用しようと考えています。

注1: 顔検出部分はCライブラリになっているため、画像の読み込み処理を書けばC言語からでも呼び出せます。具体的なコードはAnimeFace.xsを参照。

より詳しい説明

顔検出処理

顔の検出は、画像を位置とスケールの組み合わせでさまざまな領域に分割したあと、各領域について顔と顔外に分類する問題と捉えています。顔と顔以外の分類では、顔の候補となる領域から特徴ベクトルというパターンを記述するベクトルを求め、そのベクトルを教師あり学習という機械学習の手法で生成された関数を使って顔と顔以外に分類します。

検出処理の大まかな流れは次のようになります。

まず入力された画像からグレースケール画像とエッジ画像を作成し、各画像のIntegral Imageを作成します。Integral Imageとは、ある矩形領域の画素値の総和を効率的に計算するためのデータ構造です。グレースケールのIntegral Imageは顔領域の特徴ベクトルを求めるために使われます。エッジのIntegral Imageは『明らかに顔ではない領域』を少ない計算量で分類するために使われます。下の例だと、画像の右上の領域にはエッジが全くないこと――顔は少なくともいくつかのエッジによって構成されていること――から右上の領域は明らかに顔ではないと考えられます。(実際にはもう少し厳密な判定を行っている)

次に画像を位置とスケールの組み合わせでさまざまな正方形の領域に論理的に分解し、領域情報ごとにキューに追加します。『論理的に』とは、(座標,スケール)という領域を示す情報を作るだけで実際に画像データを分割するわけではないという意味です。またキューの部分はOpenMPという並列化ライブラリの内部で行われているため、ソースコード上はただのforループになっています。

このあとCPUコアごとに作られたスレッドがキューから領域情報を取り出しながら、各領域について顔のパターンであるかを段階的に判定していきます。顔である、とされた領域はマークされます。顔としてマークされた領域は少しずつずれた位置やスケールで重なっていることがありますが、最終段階で最も顔らしい領域を残して他を除去していきます。顔の中に顔はないため、完全に重なっている領域はどちらかが除去されます。ここまでが顔の検出処理になります。

以上が大まかな流れです。

機械学習による精度のよい分類器を生成するために次のことを行っています。

実行速度向上のために次のことを行っています。

また一部の処理はCUDAによるGPGPUにも対応していますが、現在は動作環境の制限などの理由により公開していません。

顔部品の位置とサイズの推定

部品位置とサイズの推定は、顔全体のパターンを表す特徴ベクトル(1152変数)を入力とし、顔部品ベクトル(左目の中心座標X,左目の中心座標Y,左目の縦幅,左目の横幅,右目の中心座標X,右目の中心座標Y,右目の縦幅,右目の横幅,鼻の座標X,鼻の座標Y,口の中心座標X,口の中心座標Y,口の縦幅,口の横幅,あご先の座標X,あご先の座標Y)を出力とする回帰問題を多層パーセプトロンで解いています。 つまり、

顔部品ベクトル = f(顔全体の特徴ベクトル)

となる関数fが存在すると仮定して、このfという関数を教師データから近似しています。これは入力された顔から『顔の部品情報』を想起する問題、また入力された顔から『欠損した顔の部品情報』を復元する問題、と考えています。アニメ顔は鼻や口が無い『顔』があること、目の形状が多様なこと、などにより各部品パターンでのマッチングが難しいことから、このような実装になっています。この方法は例え鼻や口が無くても鼻や口があったとしたら妥当な位置を得ることができます。あまり正確ではありません。

肌・髪・目の色の抽出

肌の色は、顔の部品から予測される肌領域のピクセルをランダムにサンプリングして色空間でクラスタリングを行い、『クラスメンバーの多数決により選択したクラスの平均色』を肌の色としています。髪の色も同じ方法ですが、肌の色を含まないように事前に肌クラスの分布を考え、肌と肌以外を分離したあとに肌以外について髪の色を多数決で選択しています。目の色も同様に肌や髪を含まないようにしています。このため肌と髪の色が同じ線画や髪の色と目の色がかなり似ているキャラクターではうまくいかないことがあります。

!!!各アルゴリズムの詳細は準備中 NOW!!!

デモ

顔検出のデモ

顔検出を使った画像検索のデモ

精度についてはウェブ上のデモですぐに確認できます。速度についてはサーバのCPUがよくないのであまり参考にはなりません。OpenMPでの並列処理に対応しているため、マルチコアCPUのコンピュータだとデモの数倍の速度で実行できます。僕の環境(Core 2 Quad Q9550)だと一般的なシーンの640x480のイラストを250ms程度で処理できています。背景が複雑なイラストはそれなりに処理時間がかかります。

顔検出デモには一度検出処理を行うとページの移動ができなくなるバグがあります。これはGoogleの不具合か仕様で対応できません。再度検索するとよくなると思います。

ダウンロードとインストール

ソースコードを公開しています。現在僕作成部分のライセンスはNYSLと宣言しています。ただし、sourceforgeへの移行を考えているため、次のバージョンからMIT Licenseになる可能性があります。(NYSLは拒否されました)

またライブラリとしてCLAPACKを含んでいるため、./CLAPACKのライセンスを確認してください。

ソースコード (Linux, MacOS, FreeBSD..etc)

nvxs-1.0.2.tar.gz
Imager-AnimeFace-1.02.tar.gz

1. nvxsをインストール
$ ./configure
$ make install

コア・ライブラリのnvxsを最初にインストールします。OpenMPを使う場合は、configureに--enable-openmpオプションをつけます。このソースコードにはCLAPACKがまるごと含まれているためコンパイルには少し時間がかかります。共有サーバーのホームディレクトリに入れる場合は、--prefix=$HOME/localなどのオプションを追加します。CGIで動かす場合は、LD_RUN_PATHを設定しないとロードできない場合があります

2. Imagerをインストール
$ cpan
> install Imager

ImagerというPerlの画像処理ライブラリを使っているのでCPANからインストールします。libpng-develやlibjpeg-develなどの画像フォーマットパッケージを先に入れておかないとImagerでJPEGやPNGなどのフォーマットが読めないようです。詳しくはImagerのインストールについて調べてみてください。

3. Imager::AnimeFaceをインストール
$ perl Makefile.PL
$ make install

共有サーバでホームディレクトリに入れる場合は、Makefile.PLのオプションにPREFIX=$HOME/localなどをつけます。この場合、環境変数PERL5LIBやuse libなどでインストール先を指定しないとPerlからロードできないことがあります。

Windowsバイナリ

WindowsはActivePerl(5.8,5.10)のPPMバイナリを用意しています。

Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)を先にインストールします。

> ppm install http://www.udp.jp/software/PPM/Imager-AnimeFace.ppd

またImager::AnimeFaceのWindows Active Perl環境へのインストール方法が参考になると思います。この記事は僕自身が書いています。


© 2009 anime.udp.jp