アメブロFace向け顔認識システムの開発 | サイバーエージェント 公式エンジニアブログ
はじめまして。アメーバ事業本部でアプリケーションエンジニアをしています、寺本と申します。

サイバーエージェントに入社後、ブログのエンジニアを経て、現在はアメブロFaceというスマホ向けサービスを担当してます。アメブロFaceについては、こちらのプレスリリースこちらの弊社広報ブログでも紹介されていますのでご覧ください。

今回はアメブロFace向けに開発した「顔認識システム」について、弊社研究レポートから抜粋してご紹介いたします。アメブロFaceでは、この顔認識システムを用いて事前に約1,400万枚のブログ画像に顔認識を実施することで、顔写真のみを表示できるようにしています。今回1,400万枚の全画像に対して顔認識させるのに、16コアCPUのマシン6台で約1ヶ月程かかりました。かなりCPUパワーを使う手法ではありますが、精度についてはなかなかのものになっています。

それでは、以下ご覧ください。

第1章 はじめに
1 背景
現在、スマートフォンのアプリケーションで利用可能な顔認識システムの開発をしている。2011年8月現在、スマートフォンアプリで使える顔認識技術の主要選択肢として以下のものが挙げられる。

表1.1 スマートフォンアプリで利用可能な主要顔認識技術一覧
顔認識技術 概要
Android標準ライブラリ Androidにおいては、標準ライブラリにて顔認識機能が提供されている。
OpenCV Intel社の開発したオープンソースのコンピュータビジョンライブラリ。
WebAPI face.comなど、いくつかのWebサービスが、WebAPIで画像のURLを通知することで、顔認識結果を返すAPIを提供している。

開発中の顔認識システムはプロトタイプ段階において、Android標準ライブラリを用いた実装をしていた。しかしながら、その後iPhoneでの利用も計画に入ってきたために、別の選択肢を考える必要が出てきた。アメーバのサービスとして投入することを念頭に置くと、API呼出し回数制限や、APIサービス停止のリスクを抱えるWebAPIの利用は許容しがたい。そこで、OpenCVを用いてサーバーサイドで顔認識を実施する方法をとることとした。

2 本研究の目的
2011年8月現在において、AmebaでOpenCVでの顔認識を用いたサービスは存在しない。実サービスとしてリリースする以上、実用上耐えうる認識精度を達成する必要がある。しかしながら、後述する基礎検証によって、OpenCVが標準で提供している分類器(顔認識のための検出器)を利用してもAndroid標準ライブラリ以上の認識精度は得られないことが判明している。

そこで本稿では、複数分類器の検出結果積算による認識精度向上手法を提案し、Amebaのサービスとして実用上耐えうる精度を持った顔認識システムを開発することを目的とする。特に、精度についてはプロトタイプで使用していたAndroid標準ライブラリ以上の精度を出すことを定量目標とする。

第2章 各顔認識技術の精度評価
まず、基礎データの収集を目的として、OpenCV標準分類器、Android標準ライブラリ、face.com(WebAPI)、の3つを対象として精度を測定し、定量評価を行う。なお、face.comは、イスラエルの新興企業による顔認識APIを提供するサービスで、現時点で最高レベルの高精度認識を実現している。そのため、今回のベンチマーク対象として相応しいと判断した。

1 性能指標定義
定量評価にあたり、性能指標を定義する。顔認識処理の性能は、一般に以下のような表で表される。(参考文献[1])

表2.1 画像認識処理の認識率(2クラス(陽性/陰性)分類の場合) 

顔認識判定結果

合計枚数

A(陽性)

not A(陰性)

正解

A

(陽性)

True Positives (TP)

(真陽性)

N1

False Negatives (FN)

(偽陰性)

N2

N1+N2

not A

(陰性)

False Positives (FP)

(偽陽性)

N3

True Negatives (TN)

(真陰性)

N4

N3+N4

合計枚数

N1+N3

N2+N4

N1+N2+N3+N4


医療診断のように、Aを陽性、not Aを陰性とみなすと、顔認識判定結果は、TP、TN、FP、FNの枚数で表される。当然ながら、TP、TNだけで、FNおよびFPが少なければ少ないほど、性能が高いとみなされる。本稿では、認識精度を評価する性能指標として、以下の2つを定義する。

誤認識率:FP/(TP+FP) = N3/(N1+N3)
認識漏れ率:FN/(TP+FN) = N2/(N1+N2)

誤認識率が高いと、顔画像以外の画像の混入率が多くなり、ユーザーに認識精度が低いという印象を与えてしまう。また、認識漏れ率が高いと、顔画像として提供できる画像の枚数が少なくなってしまう。誤認識率と認識漏れ率を共に低く押さえることが重要である。

2 検証方法
検証用画像 
検証用の画像にはアメーバのオフィシャルブロガーSさんのブログから収集した直近1,000枚の画像を使用する。検証用画像を、目視で確認し、以下の基準に従って、正解画像、不正解画像に分類した。

表2.2 正解・不正解画像定義 
分類 基準
正解画像 人が写っている画像。目、鼻、口など顔の特徴を明確に確認できるものに加えて、全身写真や後姿なども含む。
不正解画像 人が写っていない画像。

図2.1に実際の正解画像(全752枚)、図2.2に不正解画像(全248枚)を抜粋して示す。
※著作権のため実際に使用した画像に対してモザイク処理を施している。

図2.1 正解画像図2.2 不正解画像

検証環境
以下、検証を実施する環境を示す。

表2.3 OpenCV検証環境 
種別内容
OS CentOS 5.4
ライブラリ OpenCV 2.2、javacv
検証方法概要 OpenCV標準分類器で1,000枚の画像をそれぞれ顔認識

表2.4 Android標準ライブラリ検証環境 
種別内容
OS Android 2.2
検証用端末 IS06
検証方法概要 実機上で顔認識処理をさせる。

表2.5 face.com検証環境 
種別内容
API 2011年8月時点のAPIを使用する。
検証方法概要 検証用画像のURLをAPIを通じてface.comに通知し、顔認識処理をさせる。

なお、OpenCVの検証に用いる標準分類器とは、OpenCVのインストール時に予め提供されている分類器のことで、それぞれ、検出できる部位が異なる。OpenCV2.2では、標準分類器として、下記の19種類が提供されている。

表2.6 OpenCV標準分類器 
分類器検出部位
haarcascade_eye
haarcascade_eye_tree_eyeglasses眼鏡を掛けた目
haarcascade_frontalface_alt正面顔
haarcascade_frontalface_alt_tree正面顔
haarcascade_frontalface_alt2正面顔
haarcascade_frontalface_default正面顔
haarcascade_fullbody全身
haarcascade_lefteye_2splits左目
haarcascade_lowerbody下半身
haarcascade_mcs_eyepair_big
haarcascade_mcs_eyepair_small
haarcascade_mcs_lefteye左目
haarcascade_mcs_mouth
haarcascade_mcs_nose
haarcascade_mcs_righteye右目
haarcascade_mcs_upperbody上半身
haarcascade_profileface横顔
haarcascade_righteye_2splits右目
haarcascade_upperbody上半身

3 検証結果
表2.7~2.9に、各検証の結果を示す。

表2.7 Android標準ライブラリの認識精度

表2.7_Android標準ライブラリの認識精度


表2.8 OpenCV標準分類器の認識精度

表2.8_OpenCV標準分類器の認識精度


表2.9 face.comの認識精度

表2.9_face.comの認識精度


4 評価とOpenCVによる顔認識課題
表2.7~2.9の検証結果を、誤認識率順に並べ、グラフ化したものを図2.5に示す。

図2.5_各顔認識技術の精度

図2.5 各顔認識技術の精度

図2.5より、以下のことが読み取れる。
・face.comの誤認識率、認識漏れ率が、両方とも群を抜いて低く、極めて精度が高い。
・OpenCVの標準分類器の中で、Androidの誤認識率、認識漏れ率の両方を精度として上回る(率として低い)ものは存在しない。OpenCV標準分類器のうち、誤認識率でAndroidを上回るものは6個あるが、それらの認識漏れ率は最小でも64.10%である。これは、本来コンテンツ(人物画像)として提供できる画像のうち、64.10%を漏らしているということである。OpenCVを用いた顔認識の精度を向上させる必要がある。

第3章 複数分類器の認識結果積算による認識精度向上手法
1 複数分類器の認識結果積算手法
そこで本稿では、複数の分類器の顔認識結果を積算する手法を提案する。前述したように各分類器はそれぞれ検出する部位は異なるものの、人間の特定の部位を検出するという点では同じである。そこで、複数の分類器によって顔画像と判定された画像は、顔画像の可能性が高いという仮定に基づき、表3.1の手順で顔画像を判定する。

表3.1 複数分類器の認識結果積算による認識精度向上手法 
項番 処理
1 対象画像に対して全ての分類器で顔認識処理を順番に実施する。
2 各分類器で顔画像と判定された場合、検出ポイントとして1ポイントを加算する。
3 全ての分類器での処理が完了後、検出ポイントが一定の閾値より大きい画像を顔画像と判定する。

なお、下半身の画像は、顔画像コンテンツとして不適であるため、本稿では下半身検出用の分類器であるhaarcascade_lowerbody以外の全18個の分類器を用いる。また、画像のうち、サイズの小さい画像の認識率が悪い傾向が読み取れた。そこで、各分類器での認識処理の前処理として画像サイズを一定のサイズにリサイズする処理を加えることで認識精度を向上させる。

2 提案手法の精度検証結果
表3.1の手法に基づき、複数分類器の認識結果を積算した検証結果を示す。併せて、顔画像、非顔画像としてそれぞれ判定された実際の画像を抜粋して図3.2~3.3に示す。なお、検出ポイントの閾値が、誤認識率、認識漏れ率に影響してくるが、ここでは、閾値を9ポイントに設定している。

表3.2 提案する複数分類器の結果積算手法を用いた顔認識精度

表3.2_提案する複数分類器の顔認識精度



図3.1_提案する複数分類器の結果積算手法

図3.1 提案する複数分類器の結果積算手法を用いた顔認識精度


図3.2_顔画像として判定された画像

図3.3_顔画像ではないと判定された画像
図3.2 顔画像として判定された画像図3.3 顔画像ではないと判定された画像


第4章 考察
以下、結果に対する考察を述べる。

1 誤認識率・認識漏れ率の性能特性
本稿で提案する手法では、OpenCVを使った顔認識処理で算出した検出ポイントをデータベースにストアしておく。その後、オンラインで顔画像へのアクセスが発生した場合に、検出ポイントが一定の閾値以上の画像を返す。そのため、一度顔認識処理を実施した後においても、検出ポイントの顔画像判定用閾値の設定次第で、誤認識率と認識漏れ率のバランスにおける性能特性を自由に調整することが可能である。これは、本手法のメリットの1つである。

下記、図4.1にて、今回構築した複合分類器について、検出ポイントの顔画像判定における閾値と性能特性の関係を示す。顔画像判定用の閾値を大きくすれば、誤認識率は低くなるが、認識漏れ率が高くなっていることが分かる。逆に、顔画像判定用の閾値を小さくすれば、誤認識率は高くなるが、認識漏れ率は低くなる。

図4.1_検出ポイントの顔画像判定用閾値と性能特性

図4.1 検出ポイントの顔画像判定用閾値と性能特性

2 画像サイズ補正の影響
前述したように、本稿で構築した複合分類器では、処理対象画像を一定のサイズにリサイズした上で顔認識処理を実施している。具体的には、縦横比を保持した上で画像の長編を600pixelに揃えている。これは、サイズの補正をせずに顔認識処理をした場合に、サイズの小さな画像について認識精度が悪い傾向が見られたためである。画像サイズ補正が、精度向上にどの程度寄与しているかを評価するため、図4.2に画像サイズの補正なし版と、補正あり版(600pixに補正)の精度比較を示す。

図4.2_画像サイズ補正有無の精度比較

図4.2 画像サイズ補正有無の精度比較

検出ポイントの顔画像判定用閾値が4~10ポイントの範囲において、誤認識率、認識漏れの両方の精度が向上していることが分かる。特に本稿で構築した複合分類器で採用している閾値9ポイントにおいては、認識漏れ率が約1.6%、誤認識率が約4.2%の向上を見せている。

3 別のデータセットを用いた検証
構築した複合分類器の性能確認の一環として、別のデータセットで検証を行う。ここでは、アメーバのオフィシャルブロガーMさんのブログから取得した直近1,000件の画像に対して顔認識処理を実施した。精度比較のため、Android、face.comでも顔認識を実施した。以下、表4.1、図4.3に顔認識結果の比較を示す。図4.4、4.5に実際の判定結果を抜粋して示す。
※著作権のため実際に使用した画像に対してモザイク処理を施している。

表4.1 別のデータセットでの顔認識結果の比較

表4.1_別のデータセットでの顔認識結果の比較


図4.3_別のデータセットでの顔認識結果の比較

図4.3 別のデータセットでの顔認識結果の比較

図4.4_顔画像として判定された画像

図4.5_顔画像ではないと判定された画像
図4.4 顔画像として判定された画像図4.5 顔画像ではないと判定された画像

第5章 結論・まとめ
本稿では、基礎検証として、Android、OpenCVの各標準分類器、face.comの顔認識精度を測定し評価した。OpenCVを用いた顔認識精度向上のため、複数分類器の顔認識結果積算手法を提案し、実際にシステムとして構築した。構築したシステムの精度測定・評価を行い、大幅な精度向上を達成した。目標どおりAndroidよりも高精度な顔認識システムを構築することができた。

本稿において、各顔認識技術の精度を定量的に評価したこと、OpenCVを使った顔認識で実用レベルの精度を達成したことは非常に有意義であると考える。今後、構築した顔認識システムを実際にサービスに組み込んで使用する予定である。

参考文献
[1] 長尾 智晴, C言語による画像処理プログラミング入門―サンプルプログラムから学ぶ, 昭晃堂, p184 ,2011
[2] face.com, http://face.com/ 
[3] 奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム, OpenCVプログラミングブック第2版, 毎日コミュニケーションズ,2010
[4] Gary Bradski, Adrian Kaehler 著 松田晃一 訳, 詳解 OpenCV―コンピュータビジョンライブラリを使った画像処理・認識, オライリージャパン,2009