顔認識を試してみる

ふいに顔認識技術を試してみたくなった。後悔はない。

と、何の脈絡も無く、ちょっと顔認識で遊んでみたくなったので、メモを残しつつ試してみます。

まずは、OpenCVライブラリのインストールから。SourceForgeのOpenCVのページからソースをダウンロードして、コンパイルします。

$ wget "http://downloads.sourceforge.net/opencvlibrary/opencv-1.0.0.tar.gz?modtime=1162852454&big_mirror=1" -O opencv-1.0.0.tar.gz
$ tar xzvf opencv-1.0.0.tar.gz
$ cd opencv-1.0.0
$ ./configure --without-python
$ make
$ su
# make install

最初に、"./configure"だけしてmakeしてみたら、下記のようなエラーが出て、「Pyで始まってるから、Python関係?」とか短絡的な考えの基、"--without-python"を付けてみたらmakeが通ったので、よしとしてます。ホントにいいのかどうかは不明…。(^^;

pyhelpers.cpp: In function `CvRect PySlice_to_CvRect(CvArr*, PyObject*)':
pyhelpers.cpp:200: `PySlice_GetIndicesEx' undeclared (first use this function)
pyhelpers.cpp:200: (Each undeclared identifier is reported only once for each
   function it appears in.)
make[4]: *** [_cv_la-pyhelpers.lo] エラー 1

続いて、PHPからOpenCVを使えるようにします。OpenCV-PHP拡張モジュールのアップデートのお知らせ - muddy brown thangの記事を参考にさせてもらいました。と言うか、まるパクリです。

$ wget http://www.voltex.jp/downloads/opencv-php-0.0RC1.tar.gz
$ tar xzvf opencv-php-0.0RC1.tar.gz
$ cd opencv-php-0.0RC1
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
$ ./configure
$ make
$ su
# make install

configureした時に、

checking for pkg-config... /usr/bin/pkg-config
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
configure: error: Please install opencv library

と怒られたので、PKG_CONFIG_PATHにopencv.pcのパスを追加するようにしました。

それと、PHP4環境でやったら、makeの時にエラーが出たので、opencv.cファイルをちょっとだけゴニョゴニョさせてもらいました。(^^;ゞ opencv.cの657行目付近です。

#if (PHP_MAJOR_VERSION >= 5)
ZEND_BEGIN_ARG_INFO_EX(arginfo_cv_array_get_mat, 0, 0, 2)
    ZEND_ARG_INFO(0, resource)
    ZEND_ARG_INFO(0, allow_nd)
    ZEND_ARG_INFO(1, coi)
ZEND_END_ARG_INFO()
#else /* PHP 4.X */
#define arginfo_cv_array_get_mat NULL
#endif

後で、PHP4/5両方で試してみてOKだったので、まぁ良いのかなと。つーか、PHP4環境は早く捨てて、PHP5にしときなさいって話ではあるんですが…。(^^;

で、エクステンションとしてPHPに認識させる為、php.iniに追記します。

extension=opencv.so

とりあえず動作するかどうかテストしてみる為、moriyoshiさんのサイトのサンプルコードをopencv_test.phpとでも名前を付けて保存。

haarcascade_frontalface_alt.xmlファイルも同じディレクトリに必要なので、ソースを展開したディレクトリから持ってきておきます。

$ cp -i /tmp/src/opencv-1.0.0/data/haarcascades/haarcascade_frontalface_alt.xml .

あとは、適当に顔の入った写真をtest.jpgという名前で同じディレクトリに準備して、や〜っと準備完了。という事で、早速テストしてみます。

$ php opencv_test.php

これで、out.jpgファイルができていればOK。以前の記事で作った、イケメン写真(笑)を使って、顔認識してみたのがこちら。

ちょっと文字が入った写真を使ってしまったので、ノイズはあるようですが、割ときちんと輪郭がトレースできてますね。
ちなみに、顔の認識だけの例も試してみました。こちらは仕様変更の為、cv_rect_seq_*っていう関数は、cv_seq_*に変えないとダメなので注意。

かなり正確に顔の判定ができてますね。

という事で、本当はここから更に一歩発展させた事をやって記事にしたかったんですが、ここまで来るだけで結構大変だったので、ひとまずライブラリを使わせてもらって、サンプルを試してみました、ってところまでにしておきます。(^^;

顔認識の技術を使ったサービスは色々出てきてはいますが、いかんせん、顔を認識して顔の部分にエフェクトを掛ける…っていうところまでのモノが多いですよね。
そんな中、かな〜り前の記事にはなりますが、id:jkondoが紹介している(顔が認識できるアルバムサービス、Riyaが凄い - jkondoのはてなブログ)、http://riya.com/っていうサービスは、かな〜り素敵なサービスですね。

何か、既に乗り遅れた感バリバリですが(笑)、顔認識の技術って、まだまだ色々できそうな予感がするので、もっと色々試してみようと思います。( ̄ー ̄)