Viola-Jones法による顔検出

顔検出で現在主に使用されているのは、ViolaとJonesの2人が考案した「Viola-Jones法」というアルゴリズムです。Viola-Jones法では、顔検出を行いたい対象の1枚の画像に対して、以下の図のように探索窓(例えば8ピクセル×8ピクセルのような判定領域)を左上から走査して順番に動かしていきます。

この探索窓の領域ごとに、あらかじめBoostingという機械学習アルゴリズムにより作成しておいたCascade構造の識別器というものにより、顔画像であるかどうかの判定を行います。このように、「各探索窓において顔が存在するかどうかをCascade構造の識別器により高速に判定する」というのが、顔検出の基本的な流れです。

Viola-Jones法でポイントとなるのは、以下の2つのステップの処理です。

  1. 前処理:大量の学習データを用いたAdaBoostによる識別器の学習
  2. 高速な処理:Haar-Like特徴量を用いたCascade構造の識別による画像中の高速全探索

これにより、計算が高速でかつパターン認識性能が高い処理が実現されています。以下、順番に詳細を説明いたしましょう。

AdaBoostによる強識別器の作成

探索窓領域において顔かどうかを判定するCascade構造の識別器は、Boosting(強化学習)という機械学習アルゴリズムにより事前に作成します。Boostingでは、認識率はある程度低いけれどもシンプルで計算量が少なくて済む識別器である「弱識別器」が、各弱識別が誤って識別したものをそれぞれ担当して正しく識別するように学習させていき、それら弱識別器を連結させて用いることで、弱識別器同士の弱点を補いあった一つの強力な識別器である「強識別器」を作成するという機械学習のアルゴリズムです。

顔検出ではBoostingの一種であるAdaboostというアルゴリズムにより、強識別器を作成します。Adaboostでは、複数用意してある弱識別器を順番に学習していき同時にその学習された各弱識別器の全体に対する重要度を決定します。各弱識別器の学習が終わるごとに、誤識別された学習データの重みを増加させます。

誤識別したデータの重みを増加させておくことで、毎回次の弱識別器を学習する際に、1つ手前の弱識別器が不得意としていた学習データを識別してくれる弱識別器を学習することになります。こうして、各弱識別器がお互いの苦手なデータの識別を補完し合い、全体で1つの高精度の強識別器を作ることができるアルゴリズムがAdaboostなわけです。

Adaboostによる重み付け