[PHP]写真に対して顔認識を行う(OpenCV,facedetect)

By | 2015年1月9日

写真に対して顔認識(写真のなかに顔が含まれているか)を判別したいという要望を受けまして、
PHPで顔認識をする方法を探しました。そのときのメモです。

顔認識については、OpenCVというオープンソースがあり、こちらを使用するのが一番現実的かなと
考えました。それをPHPから使用する方法としてfacedetectというものがあり、これをPHP.iniより
読み込ませることで拡張機能として使用できるようになります。

以下が環境構築した際のメモです。
※apacheやphpはインストール済みという認識で話を進めます

1. cmake28のインストール
2. OpenCVのインストール
3. facedetectのインストール
4. facedetectの設定

1.cmake28のインストール
 OpenCVをインストールする際に必要になります。
 ※普通のcmakeではビルド時にエラーになりました。

yum install cmake28

※yumのリストに出てこない場合は、rpmが必要になるかもしれません。

2.OpenCVのインストール
今回は、OpenCVの2.4.9をインストールします。

以下よりソースを入手します。

wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip

解凍してビルド・インストールしていきます。
※cmake28を使用しなければビルドエラーになりました。
※ビルドに10分ほど時間がかります。

unzip opencv-2.4.9.zip
cd opencv-2.4.9
cmake28 .
make
make install

3.facedetectのインストール
以下よりソースを入手します。

wget https://github.com/infusion/PHP-Facedetect/archive/master.zip

解凍してビルド・インストールしていきます。

unzip master.zip
cd PHP-Facedetect-master/
phpize && ./configure && make && make install

4. facedetectの設定
php.iniにfacedetect.soの読み込みを記述 します。

extension=facedetect.so

phpinfo()にて正しく読み込めていることを確認します。

facedetect

facedetect

使用方法
今回は顔があるかないかなので、以下の関数を用いて顔の数を数え、
0のものを顔が入っていない写真と見なしました。

$fCnt = face_count('test.jpg','haarcascade_frontalface_alt.xml');
echo "顔の個数:".$fCnt;

 第1引数には画像ファイルのパスを、第2引数には顔認識のテンプレートファイルを指定します。
 第2引数のファイルは顔と認識するための設定がかかれたファイルを指定します。
 これはOpenCVの中に含まれています。

opencv-2.4.9/data/haarcascades

 
 フォルダ内に様々なテンプレートファイルがありますが、ものによって特性が異なっています。
 正面からの顔認識であれば「haarcascade_frontalface_alt.xml」が良いかと思います。