OpenCVで顔画像認識システムを作成

  • このエントリーをはてなブックマークに追加

読了時間10分

こんにちは、白ヤギコーポレーションのニコです。
普段はAndroidデベロッパーですが、昔から人工知能に興味を持っていて、大学でも人工知能専攻でした。
特に興味があるのはコンピュータビジョン(画像処理、顔認識、等)です。

カメリオでは記事タイトルと一緒にサムネイルを表示するのですが、最近より良いサムネイルを作るために、顔画像認識システムを作りました。
今までサムネイルを作る時は、画像の中央の部分を切って表示するだけでした。
なぜかと言うと、ほとんど画像の重要な部分は中央にあり、人の顔も中央にあるという仮説があったからです。
しかし、そうでもないケースも結構あります。例えばこの画像です。

facerec

ご覧のように元画像の中央の部分を切ると結果がイマイチだと思います。
今回の場合は着物だけが見えるので、誰がその着物を着ているのか分からなくなるし、そもそも顔がなくて着物だけ映されてもなんか微妙というか、無駄に意味ありげ(もしくはバグ?)と思われてしまいます。。。
もし顔が見えれば、モデルのファンにも一般人にも着物だけが見える画像より心地よいサムネイルになるかと思います。

他のケースでは顔が半分切れている状態でサムネイルが表示されるというのもありました。その場合にクレームやユーザーからの問い合わせもたまに来るので(特に有名人の写真)、顔が見えるサムネイルがやはり適していますね。

その問題に基づいて、顔画像認識システムを作りたいと考えました。
提案されてたワークフローは:

顔画像認識ワークフロー

そのためにOpenCVとPythonを使いました。
OpenCVのHAARカスケード型分類器を使えば、画像の中に顔があるかないか認識することができます。認識した後に、顔の情報を取れます。必要な情報は画像の中の座標、顔の幅と高さです。
複数の顔を認識された場合に画像の中央に一番近い顔を選びます。その情報が分かれば、顔が見えるサムネイルを作れるようになります。

そして、以下のような結果になりました。

顔画像認識を使う場合と使わない場合の違い:

Screen Shot 2016-02-17 at 18.01.00

いかがでしょうか。表示されているパターンは複数の顔も単数の顔もありますが、とちらもうまくいきました。
やはりしっかりと顔が見えたほうがサムネイルとして価値がありますね。

ではまた次回まで。

最先端情報吸収研究所 – AIAL

際限ない情報の中から、自分に価値のある情報を効果的に吸収することは、かつてなく大きなチャレンジです。最先端情報研究所はニュースアプリ「カメリオ」、レコメンドエンジン「カメクト」を提供する白ヤギコーポレーションのR&D部門として、データサイエンスの力でこの問題を解決していきます。白ヤギでは現在研究開発メンバーを募集しております。ご興味のある方は是非下記サイトを御覧ください!

Date:2016-02-22 Posted in:バックエンドの技術 Text by: