こんにちは、VOYAGE GROUPのエンジニア、ガイアです。今は、ECナビのスマホサイトの開発運用をしています。

僕はECナビのスマホサイトを8ヶ月利用して5万ポイント貯めました。

貯めたポイントをWebマネーに変えて、音楽でも買おうと思います。まあ、ステマはこのぐらいにして本題に入ります。(5万ポイントは本当です、信じてください)

現在、Webで配信されるコンテンツはテキストに始まり、画像、音声、映像ときて、今はインタラクションのあるコンテンツもごく当たり前に配信されてます。javascript、HTML5、Unityなど色々と技術はありますが、やはりWebとの親和性や、普及度などなど・・・結局、色々物議を醸し出していますが、Flashで作られたコンテンツが多いのが現状です。ただ、Apple信者としてはiPhoneやiPadに対応したコンテンツにしたいところ、Flashを使ったコンテンツは少しばかり抵抗があります。Apple曰く「アプリでやればいいじゃない」というツンデレっぷりです。

そんな事を考えている時、Webで顔認識をやりたいという願いが降り落ちて来ました。最善はFlashだろうと思ったのですが、このご時世iPhoneは外せない。という訳で他の方法を模索するに至りました。顔認識についてはOpenCVというオープンソースのコンピュータビジョン用のライブラリを利用するのが一番楽だと信じているので、それをWebのインターフェイスから利用しようと妄想を走らせ、Google先生にお伺いを立ててみると、PHPからOpenCVを使う方法があるみたいです。Sounds great!
PHPのExtensionにface_detectという拡張機能があり、それを使います。

さあ、前置きはこのぐらいにして実際の作業に入りましょう。
詳しくはXarg.orgに情報があります。

環境設定 
Scientific Liunux 5を利用しています。OSはなんでもいいでしょう。

インストールするもの
  • httpd
  • php5.3
  • php-devel
  • php-gd
  • OpenCV2.3
  • php face_detect extension 

php-gdあたりまでは楽に揃えられると思います。パッケージ管理ツールで揃えてしまいましょう。php-gdをインストールしたら、phpinfo のページを作って GD が有効になっていることを確認します。

gd


画像表示
次に、PHPで画像を表示させてみましょう。phpanualからPHPの画像表示のコードを拝借します。
imagecreatefromjpeg :新しい画像をファイルあるいは URL から作成する


lena

OpenCVのインストール
画像は表示されましたか?では、次にOpenCVをインストールします。OpenCVは2.3が推奨です。
OpenCVはリポジトリに無いことが多いので、ここを参考にさせて頂きました。
mk-mode BLOG * Scientific Linux - OpenCV をソースからインストール
ソースからOpenCVをインストールするときにcmakeを利用するのですが、リポジトリからcmakeをインストールすると2.6系が入り、このページの通りに進めていくとエラーが出てしまいます。ソースパッケージからcmakeの2.8系をインストールすれば解決します。その他、gc++が必要だったりしますが、エラーが出たら、適宜インストールして下さい。


facedetect extension
OpenCVをインストールしたら、facedetect extensionをインストールします。
Xarg.orgにインストール方法が書いてあります。


 Install OpenCV (OpenCV 2.3.1)
 Download facedetect source package
 Unpack facedetect source package
 Go to facedetect folder and type "phpize && ./configure && make && make install"
 Make sure you have extension=facedetect.so in your php.ini


コマンドだとこんな感じです。簡単ですね。(権限で怒られたら、適宜権限を追加するなり、コマンドを一つづつ実行するなりして下さい。)
  • git clone https://github.com/infusion/PHP-Facedetect.git
  • cd PHP-Facedetect
  • phpize && ./configure && make && make install
インストールが終わったらphp.iniに extension=facedetect.so を追記して、facedetectを有効化します。その後 phpinfo のページでfacedetectが有効化されていることを確認します。これで準備は万端です。
facedetect

因みに、facedetect extensionをインストールすると2つの関数が使えるようになります。
  • face_count('party.jpeg', 'cascade.xml') 顔の数を返す
  • face_detect('party.jpeg', 'cascade.xml') 顔の場所の配列を返す
第一引数は、画像ファイル、第2引数はOpenCVでオブジェクト検出に利用される分類器です。この分類器に関してはOpenCVに学習済みのサンプルがあります。OpenCVインストール時に解凍したディレクトリ OpenCV-2.3.0/data/haarcascades/ 以下にあるxmlがそのデータです。

ついに顔認識!!
さあ、環境設定も終わり、あとはコードを書くだけです、先ほどの画像表示のコードを変更します。
lena_face

よく見る出力結果になりましたね。PHPで顔認識をすることができました。みなさんも、PHPで顔認識を楽しんで下さい。

face_detect_murata


・・・

「いやいやいや、ちょっとまって、なんだよ、PHPで顔認識って、その処理、全部サーバでやる気かよ、そこはFlashだろjk」
っておみさんに言われそうな仕様です。
 
今回VirtualBoxを使っていたのですが、実行速度も・・・
これでは、ユーザの同時アクセスに耐えれそうにありません・・・
PHPで顔認識ってニーズあるんですかね。実現可能性が低いんでは・・・
そもそもOpenCVの顔認識って色々オプションあったよね、そんなのも設定できないんじゃ・・・


「まだだ、まだ終わらんよ」

こうなったら更にニッチなところへと足を踏み入れていく次第です。

次回
「サンプルコードでDeveloper!? OpenCVで学ぶ!自作 PHP Extension」