犬ターネット

OpenCVとPHP用顔検出拡張(face_detect)使って顔検出するまで

2011-06-20 opencv 顔認識

CentOS, PHP-5.3.3, OpenCV-2.2.0, face_detect-0.0.1(※ちょっと手を加えた)で作った。

OpenCV インストール

OpenCV いれるのに CMake が必要なのであらかじめいれとく。

$ yum install cmake

OpenCV-2.2.0 をダウンロード、/usr/local/src/ 以下に配置して解凍。

$ bzip2 -d OpenCV-2.2.0.tar.bz2
$ tar -xvf OpenCV-2.2.0.tar

解凍した OpenCV-2.2.0 ディレクトリに移動してインストール作業。pythonインターフェースはいろいろあって無効にした。

$ cd /usr/local/src/OpenCV-2.2.0/
$ mkdir release
$ cd release
$ cmake -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=NO -D WITH_1394=OFF -D ENABLE_OPENMP=ON ../
$ make
$ make install

face_detect インストール

今度は OpenCV の PHP用拡張 face_detect をダウンロードしてインストール作業。

$ cd /usr/local/src/
$ wget http://www.netflowers.co.jp/face_detect/face_detect-0.0.1.tar.gz
$ tar -xzvf face_detect-0.0.1.tar.gz
$ cd face_detect-0.0.1/

face_detect-0.0.1 は 古い OpenCV(1.x?) 用の拡張なので、このままビルドしてもうまくいかない。なので、ソースをちょっと書き換える必要がある。まず、cvHaarDetectObjects の引数の数が変更されているので、face_detect.c と face_detect.xml を修正。

$ vim face_detect.c
137: objects = cvHaarDetectObjects(gray, cascade, storage,
138: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0));

$ vim face_detect.xml
45: objects = cvHaarDetectObjects(gray, cascade, storage,
46: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0));

次に、OpenCV のライブラリ名も 2.2 から大きく変更されているので、config.m4 を修正。

$ vim config.m4
35: PHP_ADD_LIBRARY_WITH_PATH(opencv_core, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
36: PHP_ADD_LIBRARY_WITH_PATH(opencv_objdetect, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
37: PHP_ADD_LIBRARY_WITH_PATH(opencv_highgui, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
38: dnl PHP_ADD_LIBRARY_WITH_PATH(cxcore, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
39: PHP_ADD_LIBRARY_WITH_PATH(opencv_ml, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)

※ opencv_core, opencv_objdetect, opencv_highgui, opencv_ml を見にいくように修正すればいい。

ここまでやったら phpize → configure → make 実行。うまくいけば ./modules/face_detect.so が作成される。

$ phpize
$ ./configure
$ make
$ ls ./modules/face_detect.so
./modules/face_detect.so

作成された face_detect.so を PHPから認識させるために php.ini を修正。php.ini の設定に併せて face_detect.so も配置。

$ vim /usr/local/lib/php.ini
extension_dir = "/usr/local/lib/php/extensions"
extension=face_detect.so
$ cp modules/face_detect.so /usr/local/lib/php/extensions/

php -m で face_detect が表示されればOK。

$ php -m | grep face
face_detect

動作確認

face_detect 関数は検出された顔の数だけ座標(x, y, width, height)の配列を返す。これを利用して元の画像の顔部分を赤い四角で囲うだけの簡単なPHPスクリプトを書いた。

ちなみに「haarcascade_frontalface_alt.xml」は OpenCVで用いる「正面顔」識別情報定義ファイル。実パスは /usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml だけどローカルコピーして使ってる。

実行結果。Battlesの人たちの顔が赤く検出されました。

20110620144508

20110620144509

雑感

処理が重たいけど、顔座標検出だけだったら充分かも。

より細かく制御したかったら、face.com API 使えばいいと思う。


ffmpeg + ffmpeg-php で m4a のタグ情報を読み込む

iPad