takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

Viola & Johns版AdaBoostをOpenCVで実装

OpenCVには、「cvHaarDetectObjects」っていうオブジェクト検出の関数が用意されてます。これを使うと簡単に顔検出を実装できたりします。また、学習をさせることでオリジナルの検出装置を作れたりします。

詳しくは
http://gihyo.jp/dev/feature/01/opencv
を参照

特にこの関数の中のロジックがどうなっているかは、ここで解説してます。
http://gihyo.jp/dev/feature/01/opencv/0003


以下は、上記の内容を理解していることを前提で話を進めます。

以前のエントリーで書いた通り、実はこの「cvHaarDetectObjects」関数では、CvBoostクラスというOpenCVに用意されているAdaBoostのクラスは使用していません。実は、OpenCVで実装されているCvBoostクラスの振る舞いと、「cvHaarDetectObjects」(つまりは元になったViola & Johnsの手法)で実装されているAdaBoostの振る舞いが違うためです。

では、具体的にどう違うのかというと、Viola & Johnsの手法では、Haar-Like特徴という弱識別器を使って、その出力をAdaBoostに回していますが、CvBoostでは弱識別器まで内包されてしまっています。

例えば、以下のような3つの要素を持つベクトルが入力となる場合、

[0.5, 1.2, -0.7]

CvBoostの弱識別器は、これら3つの要素の重み付き和として表します。

AdaBoostでは、入力信号に対して、これら弱識別器の出力の重み付き和を用いて、予測結果を出力します。

で、僕としてはViola & Johnsのように自分自身で弱識別器を定義して、その弱識別器の重みを学習したいと思ったため、試行錯誤の末なんとかOpenCVでの実装に成功しました。

が、長くなったので、ソースはまた次回。