画像から顔かどうかを判別するというのはデジカメでは当たり前の機能ですが、個人が独自で開発するとなるとなかなか難しい機能だと思います。それをWebAPIを使うことで簡単に実装できてしまいます。
一番有名なのはface.comというAPIなのですが、facebookに買収されて残念ながらAPIの提供がなくなってしまいました。
face.comを使ったサービスでは以下のようなものがあります。今はどうしてるんだろう・・・・。
自分でWEBサービスを作りたいと思っている人へ (完全に一致をつくった人)
目からビームジェネレータ
しかしながらdetectFace();という顔認識APIが精度も高く動作も軽いため、face.comがなくなった今でも手軽に顔認識機能を使うことが可能です。
ADs
公式のドキュメントが日本語でとても充実しているのであらためて解説するようなこともないですが・・・。
画像のURLと検出モード、ムリヤリ度というオプションを指定して以下のURLへアクセスすると、目の位置や顔の大きさなどがXMLで返ってきます(以下はGETの例ですが、POSTも可能です)。
1 |
http://detectface.com/api/detect?url=URL [&m=検出モード] [&f=ムリヤリ度] |
返されるXMLは以下のフォーマットとなっており、faceが顔と判定されたものの数だけ返ります。顔の各部位の詳細な位置まで返ってきますが、boundsに含まれる属性(顔の位置・大きさ)と目の位置ぐらいがあればWebサービスで使用するには充分ではないかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<faces> <face id="0"> <bounds x="45" y="153" width="386" height="386"/> <right-eye x="164" y="302"/> <left-eye x="317" y="304"/> <features s-avg="0.88" s-min="0.71" s-max="0.96"> <point id="PR" x="171" y="317" s="0.89"/> <point id="PL" x="312" y="311" s="0.87"/> ..省略.. <point id="F7" x="350" y="489" s="0.88"/> </features> </face> <face id="1"> ..省略.. </face> </faces> |
上記のXMLをsimplexml_load_fileで配列とすると、写真から顔の位置や大きさを取得したりすることができます。
具体的には以下のようなコードで顔の位置、大きさを取得できます。
1 2 3 4 5 6 7 8 |
$face = 'http://detectface.com/api/detect?url='.$file.'&m=0&f=1'; //xmlかえる。$fileには画像のURLを入れる $xml = simplexml_load_file($face); foreach($xml->face as $val){ echo $val->bounds['width']; //顔の幅 echo $val->bounds['height']; //顔の高さ echo $val->bounds['x']; //顔のX座標 echo $val->bounds['y']; //顔のY座標 } |
実際に使ってみると分かるのですが、相当に高い精度で顔が判定され、さらに動作も非常に高速です。世界に通用するサービスではないかと思います(買収されてAPI提供が終わってしまうのはやめてほしいですが)。
その精度と速さを多くの人に体感してほしいと思い、簡単ですがWebサービスをつくってみました。
画像をアップロードすると、顔と判定された部分にモザイクをかけて返してくれるサービスです。集合写真などをブログに掲載したいけど顔出しNGの人も多くて加工がめんどうさい・・・というときの利用を想定しています。
集合写真が一番分かりやすいのですが、自由に使えるものがなかったので手持ちの素材集より・・・。
どうですか!
正面を向いた写真は相当高い精度で判定してくれます。
もちろん顔と判定されずモザイクがかからない場合もありますが、ためしに写真をアップロードしてみてください。精度の高さに驚くと思います。
このサービスを使ってほしいというよりも(実際難しい処理はしてないし・・・)、detectFace();APIのすごさを分かっていただければと思います。
ADs
コメントはまだありません。