平成 23 年度 研究レポート課題 OpenCV による顔認識システムの開発 サービスディベロップメントグループ 寺本 隆彦 2011 年 8 月 31 日 概要 現在、OpenCVを用いた顔認識システムを開発している。実用上耐えうる認識 精度を達成する必要があるが、OpenCVが標準で提供している分類器を利用して もさほど良い精度は得られない。本稿では、多くの分類器によって顔画像と判 定された画像ほど、顔画像の可能性が高いという仮定に基づき、複数分類器の 検出結果積算による認識精度向上手法を提案する。実際に提案手法を顔認識シ ステムとして実装し、評価実験を行った。その結果、ベンチマーク対象である Android標準ライブラリを用いた顔認識よりも、高い精度を実現した。 第 1 章 はじめに 1 背景 現在、スマートフォンのアプリケーションで利用可能な顔認識システムの開 発をしている。顔認識の精度が悪いと、人物以外の画像も提示してしまったり、 本来コンテンツとして提供できる画像を提示できなかったりしてしまう。2011 年 8 月現在、スマートフォンアプリで使える顔認識技術の主要選択肢として以 下のものが挙げられる。 表 1.1 スマートフォンアプリで利用可能な主要顔認識技術一覧 顔認識技術 概要 Android においては、標準ライブラリにて顔認識機能が提供され 標 準 ラ イ ブ ている。 ラリ Android OpenCV Intel 社の開発したオープンソースのコンピュータビジョンライ ブラリ。 WebAPI face.com など、いくつかの Web サービスが、WebAPI で画像の URL を通知することで、顔認識結果を返す API を提供している。 表 1.2 に、上記の顔認識技術の比較を示す。各技術を用いてサービスを構築する 際に、顔認識ロジックを別途構築する必要があるか、認識精度、どのプラット フォーム(iPhone/Android/Web(サーバー側))で利用できるかの観点から整理し ている。 表 1.2 顔認識技術の比較 顔認識技術 顔 認 識 ロ ジ ッ 精度 クの開発要否 利用可能プラ 備考 ットフォーム Android 標準 ライブラリ 不要 Android OpenCV 必要 顔 認 識 ロ Android (標準分類器を ジ ッ ク に iPhone Web 使 用 す る 場 合 依存 不要) face.com (WebAPI) 不要 普通 高 Android iPhone Web ・API 呼出し回数 に制限がある ・API サービス停 止のリスクがあ る 開発中の顔認識システムはプロトタイプ段階において、Android 標準ライブラ リを用いた実装をしていた。しかしながら、その後 iPhone での利用も計画に入 ってきたために、別の選択肢を考える必要が出てきた。OpenCV と WebAPI の 2 択となるが、アメーバのサービスとして投入することを念頭に置くと、API 呼出 し回数制限や、API サービス停止のリスクを抱える WebAPI の利用は許容しがた い。そこで、OpenCV を用いてサーバーサイドで顔認識を実施する方法をとるこ ととした。 2 本研究の目的 2011 年 8 月現在において、Ameba で OpenCV での顔認識を用いたサービスは存 在しない。実サービスとしてリリースする以上、実用上耐えうる認識精度を達 成する必要がある。しかしながら、後述する基礎検証によって、OpenCV が標準 で提供している分類器(顔認識のための検出器)を利用しても Android 標準ライ ブラリ以上の認識精度は得られないことが判明している。 そこで本稿では、複数分類器の検出結果積算による認識精度向上手法を提案し、 Ameba のサービスとして実用上耐えうる精度を持った顔認識システムを開発す ることを目的とする。特に、精度についてはプロトタイプで使用していた Android 標準ライブラリ以上の精度を出すことを最低限の定量目標とする。 第 2 章 各顔認識技術の精度評価 前述の通り、本稿では Android 標準ライブラリ以上の精度を出すことを最低限 の目標とする。そこで、基礎データの収集を目的として、OpenCV 標準分類器、 Android 標準ライブラリ、face.com(WebAPI)、の 3 つを対象として精度を測定し、 定量評価を行う。なお、face.com は、イスラエルの新興企業による顔認識 API を提供するサービスで、現時点で世界最高レベルの高精度認識を実現している。 そのため、今回のベンチマーク対象として相応しいと判断した。なお、face.com は、元々顔写真のタグ付けアプリケーションである Photo Finder、Photo Tagger を Facebook でリリースしていたが、その後 API を一般に公開している。 1 性能指標定義 定量評価にあたり、性能指標を定義する。顔認識処理の性能は、一般に以下の ような表で表される。(参考文献[1]) 表 2.1 画像認識処理の認識率(2 クラス(陽性/陰性)分類の場合) 顔認識判定結果 正 解 A(陽性) not A(陰性) A True Positives (TP) False Negatives (FN) (陽性) (真陽性) N1 枚 (偽陰性) N2 枚 not A False Positives (FP) True Negatives (TN) (陰性) (偽陽性) N3 枚 (真陰性) N4 枚 N1 + N3 N2 + N4 合計枚数 合計枚数 N1 + N2 N3 + 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~2.4 に実際の正解画像(全 752 枚)、不正解画像(全 248 枚)を示す。 ※実際に使用した画像に対してモザイク処理を施している。 図 2.1 正解画像(1) 図 2.2 正解画像(2) 図 2.3 正解画像(3) 図 2.4 不正解画像 検証環境 以下、検証を実施する環境を示す。 表 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 標準ライブラリの認識精度 画像認識結果 真陽性 (N1 枚) 偽陰性 (N2 枚) 偽 陽 性 真陰性 (N3 枚) (N4 枚) 誤 認 識 認識漏れ 率 率 (%) (%) 338 414 31 8.40 217 55.05 表 2.8 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 画像認識結果 真陽性 (N1 枚) 偽陰性 (N2 枚) 偽陽性 (N3 枚) 誤 認 識 認識漏れ 率 真陰性 率 (%) (N4 枚) (%) 569 183 156 92 21.52 24.34 197 555 3 245 1.50 73.80 377 375 40 208 9.59 49.87 212 540 9 239 4.07 71.81 410 342 62 186 13.14 45.48 520 232 135 113 20.61 30.85 133 619 23 225 14.74 82.31 242 510 22 226 8.33 67.82 190 562 40 208 17.39 74.73 155 597 11 237 6.63 79.39 185 567 15 233 7.50 75.40 705 47 223 25 24.03 6.25 713 39 230 18 24.39 5.19 550 202 131 117 19.24 26.86 589 163 163 85 21.68 21.68 613 139 146 102 19.24 18.48 300 452 32 216 9.64 60.11 270 482 23 225 7.85 64.10 306 446 95 153 23.69 59.31 表 2.9 face.com の認識精度 画像認識結果 真陽性 (N1 枚) 偽陰性 (N2 枚) 偽 陽 性 真陰性 (N3 枚) (N4 枚) 誤 認 識 認識漏れ 率 率 (%) (%) 595 157 17 2.78 231 20.88 4 評価と OpenCV による顔認識課題 表 2.7~2.9 の検証結果を、誤認識率順に並べ、グラフ化したものを図 2.5 に示す。 90 80 誤認識率 (%) 認識漏れ率 (%) 70 60 率(%) 50 40 30 20 10 ey e_ tre e_ ey eg fro nt f las al ac se m face e.c s m cs_e _al om cs y t_ _e ep tre rig yep air_ e ht air big e _ le ye_ sma fte 2 ll ye spl _2 its fro A split nt nd s al ro fa id p fro ro ce_ nt file alt al fa fa c ce e fu _alt m lo llbo 2 cs we d _u rb y pp od fro e nt m rbo y al cs dy fa _n ce o _d se ef au m lt cs _ri ey up ght e p e m erb ye cs o d m _left y cs e _m ye ou th 0 図 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 個の分類器を用い る。 また、画像のうち、サイズの小さい画像の認識率が悪い傾向が読み取れた。そ こで、各分類器での認識処理の前処理として画像サイズを一定のサイズにリサ イズする処理を加えることで認識精度を向上させる。 e_ tr ee _e ye 分 fro gla 類 nt 器 alf fac sse の ac e. s 結 e_a co m 果 m 積 lt_tr m cs_e 算 ee cs y 手 _e ep 法 y a rig epa ir_b ht ir_ ig e s le ye_ ma fte 2s ll y e pl i _2 ts s fro A plit n nt d s alf ro a id p fro ro ce_a nt file lt alf fa a c ce e_ fu alt2 m low llbo cs e d y _u rb pp od fro e y nt m rbo alf cs dy a c _n e_ os de e fa ul m t cs _ r i ey g up hte e pe y e m rb cs o _ d m left y cs ey _m e ou th 数 複 ey 率(%) 2 提案手法の精度検証結果 表 3.1 の手法に基づき、複数分類器の認識結果を積算した検証結果を示す。併 せて、顔画像、非顔画像としてそれぞれ判定された実際の画像を図 3.2~3.5 に 示す。 なお、検出ポイントの閾値が、誤認識率、認識漏れ率に影響してくるが、ここ では、閾値を 9 ポイントに設定している。 表 3.2 提案する複数分類器の結果積算手法を用いた顔認識精度 画像認識結果 真陽性 (N1 枚) 偽陰性 (N2 枚) 偽 陽 性 真陰性 (N3 枚) (N4 枚) 誤 認 識 認識漏れ 率 率 (%) (%) 443 309 21 4.53 90 80 227 41.09 誤認識率 (%) 図 3.1 提案する複数分類器の結果積算手法を用いた顔認識精度 認識漏れ率 (%) 70 60 50 40 30 20 10 0 図 3.2 顔画像として判定された画像(1) 図 3.3 顔画像として判定された画像(2) 図 3.4 顔画像ではないと判定された画像(1) 図 3.5 顔画像ではないと判定された画像(2) 第 4 章 考察 以下、結果に対する考察を述べる。 1 誤認識率・認識漏れ率の性能特性 本稿で提案する手法では、OpenCV を使った顔認識処理で算出した検出ポイン トをデータベースにストアしておく。その後、オンラインで顔画像へのアクセ スが発生した場合に、検出ポイントが一定の閾値以上の画像を返す。そのため、 一度顔認識処理を実施した後においても、検出ポイントの顔画像判定用閾値の 設定次第で、誤認識率と認識漏れ率のバランスにおける性能特性を自由に調整 することが可能である。これは、本手法のメリットの1つである。 下記、図 4.1 にて、今回構築した複合分類器について、検出ポイントの顔画像判 定における閾値と性能特性の関係を示す。顔画像判定用の閾値を大きくすれば、 誤認識率は低くなるが、認識漏れ率が高くなっていることが分かる。逆に、顔 画像判定用の閾値を小さくすれば、誤認識率は高くなるが、認識漏れ率は低く なる。 100 90 80 誤認識率 認識漏れ率 率(%) 70 60 50 40 30 20 10 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 検出ポイントの顔画像判定用閾値 図 4.1 検出ポイントの顔画像判定用閾値と性能特性 2 画像サイズ補正の影響 前述したように、本稿で構築した複合分類器では、処理対象画像を一定のサ イズにリサイズした上で顔認識処理を実施している。具体的には、縦横比を保 持した上で画像の長編を 600pixel に揃えている。これは、サイズの補正をせず に顔認識処理をした場合に、サイズの小さな画像について認識精度が悪い傾向 が見られたためである。画像サイズ補正が、精度向上にどの程度寄与している かを評価するため、図 4.2 に画像サイズの補正なし版と、補正あり版(600pix に 補正)の精度比較を示す。 100 90 80 70 誤認識率(サイズ補正なし) 認識漏れ率(サイズ補正なし) 誤認識率(サイズ補正600pix) 認識漏れ率(サイズ補正600pix) 率(%) 60 50 40 30 20 10 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 検出ポイントの顔画像判定用閾値 図 4.2 画像サイズ補正有無の精度比較 検出ポイントの顔画像判定用閾値が 4~10 ポイントの範囲において、誤認識率、 認識漏れの両方の精度が向上していることが分かる。特に本稿で構築した複合 分類器で採用している閾値 9 ポイントにおいては、認識漏れ率が約 1.6%、誤認 識率が約 4.2%の向上を見せている。 3 パフォーマンス 構築した複合分類器のパフォーマンスについて整理する。今回の検証で使用 したマシンのスペックは表 4.1 の通り。なお、OpenCV2.1 から、Intel Threading Building Blocks(TBB)を利用した並列化がサポートされており、検証マシンへの OpenCV インストール時に TBB を有効化している。 表 4.1 検証に使用したマシンのスペック 項目 内容 機種 富士通 RX200 s6 CPU Intel(R) Xeon(R) CPU E5620 @ 2.40GHz × 2 ソケット ※クアッドコア、Hyper-Threading により論理 16 コア メモリ 8GB 前述したように、本稿で構築した複合分類器では、画像の大きさを一定サイズ にリサイズした上で、個別の分類器に処理をさせている。表 4.2、図 4.3 に処理 対象画像サイズ(リサイズ後の画像サイズ)と処理性能の関係を示す。 表 4.2 処理対象画像サイズと処理性能(スループット・処理時間) 処理対象画像サイズ スループット(枚/秒) 処理時間(秒/枚) (pixel) 400 0.88 1.14 600 0.54 1.86 800 0.33 3.00 1.00 0.90 スループット 処理時間 3.50 3.00 2.50 0.70 0.60 2.00 0.50 1.50 0.40 0.30 1.00 処理時間(秒/枚) スループット(枚/秒) 0.80 0.20 0.50 0.10 0.00 0.00 400 600 800 処理対象画像サイズ(pixel) 図 4.3 処理対象画像サイズと処理性能(スループット・処理時間) 表 4.2、図 4.3 より、顔認識処理の対象となる画像サイズが大きくなると、スル ープットが低下し、処理時間が長くなることが分かる。 また、この時の CPU 使用率を表 4.3、図 4.4 に示す。 表 4.3 処理対象画像サイズと CPU 使用率 処 理 対 象 画 像 サ イ ズ CPU 使用率 (pixel) %user %sys %iowait %idle 400 38.88 2.22 0.03 58.87 600 52.85 1.59 0.02 45.54 800 61.11 1.15 0.02 37.72 100% 90% CPU使用率(%) 80% 70% idle iowait sys user 60% 50% 40% 30% 20% 10% 0% 400 600 800 処理対象画像サイズ(pixel) 図 4.4 処理対象画像サイズと CPU 使用率 処理対象画像サイズが大きいほど、CPU 使用率が高くなることが分かる。 4 別のデータセットを用いた検証 構築した複合分類器の性能確認の一環として、別のデータセットで検証を行う。 ここでは、アメーバのオフィシャルブロガーM さんのブログから取得した直近 1,000 件の画像に対して顔認識処理を実施した。精度比較のため、Android、 face.com でも顔認識を実施した。以下、表 4.4、図 4.5 に顔認識結果の比較を示 す。これらより、別のデータセットにおいても、本稿で構築した顔認識システ ムは、Android を大きく上回る精度を達成していることが分かる。図 4.6~4.9 に 実際の判定結果を示す。 表 4.4 別のデータセットでの顔認識結果の比較 画像認識結果 測定対象 真陽性 (N1 枚) 偽陰性 (N2 枚) 偽陽性 真陰性 (N3 枚) (N4 枚) 誤認識 認 識 漏 率 れ率 (%) (%) face.com 433 157 35 375 7.48 26.61 複数分類器の結果 積算手法 342 248 44 366 11.40 42.03 Android 248 342 36 374 12.68 57.97 70 誤認識率 (%) 60 認識漏れ率 (%) 率(%) 50 40 30 20 10 0 face.com 複数分類器の結果積算手法 図 4.5 別のデータセットでの顔認識結果の比較 Android 図 4.6 顔画像として判定された画像(1) 図 4.7 顔画像として判定された画像(2) 図 4.8 顔画像ではないと判定された画像(1) 図 4.9 顔画像ではないと判定された画像(2) 第5章 結論・まとめ 本稿では、基礎検証として、Android、OpenCV の各標準分類器、face.com の顔 認識精度を測定し評価した。OpenCV を用いた顔認識精度向上のため、複数分類 器の顔認識結果積算手法を提案し、実際にシステムとして構築した。構築した システムの精度測定・評価を行い、大幅な精度向上を達成した。目標どおり Android よりも高精度な顔認識システムを構築することができた。 本稿において、各顔認識技術の精度を定量的に評価したこと、OpenCV を使っ た顔認識で実用レベルの精度を達成したことは非常に有意義であると考える。 今後、構築した顔認識システムを実際にサービスに組み込んで使用する予定で ある。また、顔認識システム実用化への目処を立てたことで、今後アメーバに おいての企画の幅も広がっていくと考える。 今後の課題として、より一層の精度向上を考えている。OpenCV では、機械学 習によって分類器を作成することができるが、機械学習によって、性能の高い 単一の分類器を構築するのは難しい。しかしながら、本稿での提案は、1 つ 1 つ の分類器の性能がさほど高くなくても、組み合わせることで全体の性能を向上 させる手法であり、機械学習によって個々の標準分類器よりも高精度な分類器 を構築することができれば、分類器の差し替えにより全体の精度を向上できる。 今後は、機械学習によって個々の分類器の性能を向上させ、複合分類器全体と しての精度向上を達成したい。 参考文献 [1] 長尾 智晴, C言語による画像処理プログラミング入門―サンプルプログラム から学ぶ, 昭晃堂, p184 ,2011 [2] face.com, http://face.com/ [3] 奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム, OpenCVプログラミングブック第2版, 毎日コミュニケーションズ,2010 [4] Gary Bradski, Adrian Kaehler 著 松田晃一 訳, 詳解 OpenCV―コンピュータ ビジョンライブラリを使った画像処理・認識, オライリージャパン,2009
© Copyright 2024 Paperzz