2016-03-10

【PHP】顔認証の精度をあげるためやったこと

とある開発で画像から顔だけを切り出す必要あったので、いろいろとGoogleさんで探っていたらすでに「php-facedetection」というパッケージを公開している人がいました。

やっぱり世界中には天才的なプログラマがゴロゴロしてるんだなーと関心しつつ、なによりPHPでも画像から顔だけを切り出すことができるという事実にとても感動しました。
デジタルとリアルが融合してる気がしたんですね(笑)

ってことで早速誰かの顔を抽出しよう!
・・・とはならず、まずどうやって(効率的に)顔を検出しているのかが気になってしょうがなかったのでこれもGoogleさんで探ってみました。

するととてもわかりやすく説明してくれている記事を発見!
このページはまるでテレビ番組のように「Viola & Johns」と呼ばれる顔認証テクニックをわかりやすく紹介してくれています。
↓↓↓

サルでもわかる顔検出の原理


この記事を読むと顔が入っている画像には共通のパターンがあって、それを利用することで顔認証をショートカットしているようです。
やっぱり賢い人はすごいねー。

ひと番組楽しんだ感覚を覚えた後、「php-facedetection」を使って実際に顔検出をやってみました。


すごい!

こんなに簡単に画像から顔を抽出するなんて。。
その昔ニュートンが「俺が遠くまで見渡せるのは巨人の肩の上にのっかってるからだぜ」って名言を思い出しましたよ。


しかし!

顔を自動で抽出してくれるのはいいんだけど、画像によってはやっぱり精度がよくなったりする。
というのも、実際には顔じゃないものまで顔として検出してしまうことが少なくなかったから。

…ってことで僕も今いる巨人の肩の上でさらにつま先立ちができるよういろいろと考えてみました。
まず考えたのは、色を使ってフィルターをかける方法です。

この方法は「顔は基本的に肌色なんだから肌色が適度に含まれているものだけ抽出する」というものです。
実際には以下のページを参考にどんな色がどれだけ含まれているかを抽出してみました。

http://stackoverflow.com/questions/3468500/detect-overall-average-color-of-the-picture/3468588#3468588

そして、「肌色が他の色の何%になっているか」を計算して、それがある範囲以内なら「顔」として判断するようにすると期待通り、少しだけ精度が上がりました。
(今回ターゲットにした色は['FFCC99', 'CC9966', 'CC9999', 'FFCCCC']の4つです)


でも、でも、、、それでもまだ顔じゃないものまで検出されてしまう。。。

んー、もうこのまま妥協しようかとも思った瞬間にひとつアイデアが浮かびました。
php-facedetection抽出してくれる顔は、もちろん顔だけじゃなく髪の毛や背景なども含まれています。

じゃあ、「画像の真ん中だけをくり抜いて、そこに肌色ばっかり残ってたらほぼ顔ってことになるんじゃ?」

ってことで早速やってみたらさらに精度があがってほぼたまにしか顔じゃないものを検出しなくなりました。

とまぁ、色を使ってフィルターをかけることで(今のところは)満足がいく精度で顔画像だけを抽出することができました。
めでたしめでたし。^-^

(それでもたまーに顔以外もはいってくるし、そもそもphp-facedetectionは画像につきひとつしか顔を検出できないけどね。。^^;)


どうやら以下のページのように画像から肌色だけを抽出するというアプローチもあるみたいです。
時間ができたらいつか機械学習も含めて勉強してみようかな、、、英語の勉強が終わったら(笑)

https://www.blogger.com/blogger.g?blogID=6545450414259005128#editor/target=post;postID=6012962723697327725


※ちなみに僕の好きなX Japanで顔認証をためしたらギタリストの Pataさんが検出されました。ファンとして早いご回復を切に願っています。m_ _m


0 件のコメント:

コメントを投稿