Haar Cascadeによる顔検出の原理

Haar Cascade(識別器・分類器)による顔検出のアルゴリズム・仕組み・計算方法についてまとめました。

【はじめに】Haar Cascadeとは

Haar Cascadeは、物体検出に使われる識別器の1つです。
有名な画像処理ライブラリOpenCVにも実装されています。
アルゴリズムがシンプルかつ処理時間も高速なため、カメラ映像からのリアルタイム顔検出などに使われています。

Haar Cascadeではその名の通り、Haar-like特徴を弱識別器として、カスケード型識別器を作成します。

顔検出までの流れ


※探索窓画像・・・入力画像から探索窓の領域をトリミングした画像

カスケード型識別器(Cascade detector)は、検出精度の異なる複数の強識別器(優秀な弱識別器を組み合わせて強化した識別器)を連結した識別器です。各強識別器で入力画像が顔画像であるかどうか順番に判別していきます。

探索窓画像を入力し、強識別器1~Nの全てで正解(顔)と判別された場合のみ顔画像であると判別します。
逆に途中で非正解(非顔)と判別されたら非顔画像と結論付けて処理を終えます。

このように、途中で非顔画像を弾いて処理を終了することで全体的な処理を高速化しています。
(詳細はカスケード型識別機の原理を参照)

【原理】Haar Cascadesの作り方

Haar Cascadesの作成手順は以下の通りです。

説明
1 N個の識別器それぞれに対して目標値(最小検出率dと最大許容誤検出率f)を設定します。
2 訓練データ(顔・非顔画像、教師データ)を多数用意します。
3 N個の強識別器をAdaBoost学習で順に作成します。
3.1 i番目の強識別器に弱識別器(Haar-like特徴)を1つ追加します。(最初はi=1)
3.2 強識別器に訓練データを与えて、判別を行わせます。
3.3 判別結果が目標値dを満たすよう、強識別器の閾値を下げます。(※誤検出率は高くなる)
3.4 誤検出率が目標値fを満たせばAdaBoost学習を終了し、手順3.5に進みます。満たさなければ手順3.1に戻って学習を続けます。
3.5 判別を誤った非顔画像のみを、次の強識別器を求めるのに使用する非顔画像とします。
3.6 手順3.1に戻り、次の強識別器を作成します。(i=i+1)

手前にある強識別器に対しては最大許容誤検出率fを高めに設定します。

「Haar-like特徴」「AdaBoost学習」「カスケード型識別器」の詳細については下記事でそれぞれ解説しています。

解説記事
Haar-like特徴の原理・・・顔を判別するための特徴(弱識別器)
AdaBoost学習の原理・・・多数の弱識別器(Haar-like特徴)から強識別器を作成
カスケード型識別器・・・非顔領域の判別時間を短縮(処理の高速化)

参考文献
[1] Paul Viola, Michael Jones “Rapid Object Detection using a Boosted Cascade of Simple Features” (2001)

【関連記事】
【画像処理入門】アルゴリズム&プログラミング

コメント