PHPだけで顔認識をやってみた

久々の"やってみた"系の記事です。…と言うか、記事自体書くのが久々だ…。

PHPだけで顔認識をやってみたという以下の記事に魅かれて、とりあえず触ってみました。ちょっと出遅れたので二番煎じな感は否めませんが…。

http://svay.com/blog/index/post/2009/06/19/Face-detection-in-pure-PHP-(without-OpenCV)

準備する

まずはリンク先の記事にあるコードをコピペして、"Face_Detector.php"という名前で保存します。

そして、顔識別用のデータファイルである"detection.dat"というファイルをダウンロードして、Face_Detector.phpと同じディレクトリに置いておきます。

続いて、顔認識に使う画像ファイルを用意します。自分の写真でもいいんですが、そのままだと何となく恥ずかしいので、以前も使った事のあるHairMixerというサービスを使って、イケメン風に偽装(?)したものを使う事にしました。

後は、以下のような実行用のファイルを作れば準備オッケー。

<?php
require_once(dirname(__FILE__).'/Face_Detector.php');

$filename_input = dirname(__FILE__).'/input.jpg';
$filename_output = dirname(__FILE__).'/output.jpg';
$filename_detectiondata = dirname(__FILE__).'/detection.dat';

$detector = new Face_Detector($filename_detectiondata);
$detector->face_detect($filename_input);
$face = $detector->getFace();

$image = imagecreatefromjpeg($filename_input);
$color = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, $face['x'], $face['y'], $face['x']+$face['w'], $face['y']+ $face['w'], $color);
imagejpeg($image, $filename_output);
?>

最初は元記事にあるように、"toJpeg"というメソッドを使って直接JPEGイメージを出力するようにしてApache経由で呼び出してみたんですが、メモリ不足で落ちてしまったので仕方なくCLIでやる事に…。

結果は…?

という訳で試してみた結果は以下の通り。

だいたいは合っていますが、顔の大きさの認識が若干合ってないようですね。

その後、いくつか別の写真を使って試してみたんですが、顔の座標は概ね合っているんですが、顔の大きさの認識が少しずれてるかな…という場合が見受けられました。

元記事はざっくりとだけ読みましたが、どうやらAS3での実装をPHPに移植したもののようですね。AS3のライブラリが元という事で、リアルタイムでも利用できるような軽い実装のようではあるんですが、実際実行してみると、認識処理に数秒間掛かるので、Webサーバから呼び出して顔認識してごにょごにょ…っていうのはちょっと厳しいかもしれないですね。

顔認識は、Webカメラを使ってリアルタイムに…っていう方が面白い事ができそうなので、AS3の顔認識ライブラリというのを使うと楽しいかもしれないですね。ちょっと後で調べてみよう…。