顔検出の高速化1:単純な特徴量「Haar-Like特徴量」による識別器の使用
顔検出はデジタルカメラなどではリアルタイムに顔の位置を検出してくる必要がある処理であります。従って、できるだけ計算量の少ない特徴量を用いていながら、かつパターン認識精度の高い識別器により各探索窓ごとの処理を行う必要があるわけです。
この目的を達成するために顔検出では「Haar-Like特徴量」というシンプルな特徴量を用いてBoostingの学習する強識別器における各弱識別器を作成します。
Haar-Like特徴量の値は、探索窓中の中で計算対象である矩形中の黒色の領域のピクセル値の和の値から白色の領域のピクセル値の和の値を引いただけの非常にシンプルな値です。この矩形の配置場所は探索窓のどこにどう配置しても良い事から、探索窓中に数万通りの配置場所の可能性があることになります。
従って、探索窓が例えば20×20ピクセルだとすると、Haar-Like特徴量の計算対象の矩形の位置は数万通りの候補があるわけですが、Boostingにより探索窓内の各弱識別器の重みづけ(強識別器全体の認識率が高くなるための各弱識別器の重要度)を学習で決定しておくことが可能です。
これにより、数万通りあるHaar-Like特徴量の弱識別器の内から、重要度が低いものは強識別全体の性能に影響が出ないので使わないことにし、重要度が上位の数十個の弱識別器のみを選択して強識別器を作ることができます。学習によって決定した上位数十個のHaar-Like特徴量の弱識別器による顔検出は、以下の動画のようになります。
OpenCV Face Detection: Visualized from Adam Harvey on Vimeo.
これだと、各探索窓ごとには数十回Haar-Like特徴量を計算するだけで済み、高速な判定が実現できます。このような仕組みにより「毎回の探索窓での特徴量計算コストは少なく抑えて、かつパターン認識の性能は強力であるような強識別器」をBoostingとHaar-Like特徴量により作成することが可能になるわけです。
顔検出の高速化2:「Cascade構造の識別器」を用いた、顔でない領域の早い段階の破棄
Viola-Jones法では、この「Cascade構造の識別器」を用いて探索窓ごとでの顔画像かどうかの判定を行います。Boostingにより強識別器を学習データのバリエーションを変えて作成し、それら複数の強識別器を一列にならべて1つの識別のように用いる識別器の構造を「Cascade構造の識別器」と呼びます。
Cascade構造の識別器では、各強識別器により順番に顔であるかどうかの判定が行われます。各強識別器において顔判定されれば次の識別器に処理が移り、途中で顔でないと判定されればその時点でそれ以降強識別器による処理が破棄されます。途中でのどれかの強識別器で顔でないと判定されると、現在の探索窓におけるCascade構造の識別器による処理は終了です。一方でCascade構造のすべての強識別器において顔画像であると判定された場合のみ、顔画像がその位置に存在していると判定されるわけです。
この方法の何が有利かというと、Cascade構造内の前半の各識別器により顔ではない探索窓領域をほとんど排除してくれる点です。一般的な画像には、顔以外の背景部分が多いわけで、このようにCascade構造中の前半の強識別器で早めに顔以外の探索窓の判定を終えることで、全体の処理の高速化がはかれるわけです。
まとめと最近の顔検出技術の傾向
今回は、人間の顔の位置をパターン認識により特定するという、顔検出技術の仕組みを解説しました。顔検出をはじめとした物体検出技術を支えるのは今回紹介した「パターン認識と機械学習」という先端技術でした。
今回紹介したのは正面顔のデータで学習を行った識別器による正面顔の検出でしたが、横向きのデータで学習を行えば当然その横向きの姿勢の顔が検出できる識別器が作成できます。最新のデジタルカメラの顔検出機能は、正面以外の方向を向いた顔の検出にも対応してきていますが、これは顔の向きごとに識別器を作成すれば実現できるわけです。
また、顔検出の最近の新トレンドとしては「ペット顔検出」があげられます。猫や犬などのペットの顔を検出してくるわけですが、要は学習データを猫や犬の顔にしておけば、今回紹介した機械学習ベースの手法で同じように実現できるわけです。つまり顔検出の手法としてご紹介したものの、学習データさえ猫の顔や犬の顔のように他の画像に変えてしまえば、どんな物体の検出にも使える方法なのです。
顔検出は「顔認識」と連携して活きる技術ですので、今後「顔認識」の技術を紹介する際に顔検出技術との連携の話を紹介する予定です。楽しみにお待ち頂ければ幸いです。