OpenCV による顔認識システムの開発

平成 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