私がお話しするHaarの兆候は、認識システムや機械学習に何らかの形で関係しているほとんどの人に知られていますが、明らかに、標準の範囲外の問題を解決するためにそれらを使用する人はほとんどいません。 この記事は、ビデオの隣接するフレーム間でオブジェクトを追跡するタスク、複数の写真の対応を検索する、画像内の画像を検索するタスク、およびその他の同様のタスクで、Haarカスケードを使用して近接画像を比較することに専念します。
ほとんどの場合、画像のかなり類似した2つのフラグメントの単純な比較が必要な場合、それらの
共分散 (または類似したもの)によって実現されます。 サンプル(写真の花)が撮影され、サンプル(
J )と画像(
I )の差がある点を探して、XおよびYに沿って画像内を移動します。

最小値に達します。
この方法は、実装が非常に高速で、直感的であり、よく知られています。 おそらく、どこで使用されたとしても、私は単一の開発グループに会ったことがありません。 もちろん、誰もが彼の欠陥を驚くほど知っています。
- 照明変更時の不安定性
- 画像のズームまたは回転時の不安定性
- 画像の一部が変化する背景である場合の不安定性
- 低速-m * m画像でn * n領域を検出する必要がある場合、操作の数はn2∙(mn)2に比例します。
誰もがこれらの欠点に対処する方法を知っています。
- 照明は、エリアの正規化または2値化への移行によって中和されます。
- スケール変更と小さなターンは、相関中の解像度の変更により中和されます。
- このアプローチでは、誰もこのアプローチで戦うことはありません。
- 速度は、大きなステップまたは低解像度で検索することにより最適化されます。
相関の結果が十分でない状況では、特徴点マップ(
SURF )、境界線の比較、オブジェクトの直接選択など、より複雑な方法に切り替えます。 しかし、これらのアルゴリズムは完全に異なります。ほとんどの場合、非常に遅く、最初から書くのが難しく(特にDSPプロセッサで)、画像構造に制限があります。
ある時点で、次のプロジェクトを考えると、画像内の複数の可変領域を比較する必要があるという問題に遭遇しました。 そして、Habrでかつて言及された
Predatorアルゴリズムを思い出すまで、ビデオでの高速かつ安定したオブジェクトトラッキングが示されていました。 少し考えて、私はこのアプローチ全体が大きなクラスの問題を解決することを可能にしていることに気付きました。
ハールの兆候を思い出させてください。
機能のカスケードは、一般に、
顔 、手、または
他のオブジェクトなどの複雑なオブジェクトを区別するためのシステムを構築するための基礎と呼ばれ
ます 。 ほとんどの記事では、このアプローチは
AdaBoosta学習
アルゴリズムと密接にリンクしてい
ます 。 Haarカスケード自体は、画像との畳み込みが考慮されるプリミティブのセットです。 最も単純なプリミティブが使用され、長方形で構成され、+ 1と-1の2つのレベルしかありません。 さらに、各長方形は異なるサイズで数回使用されます。 ここでの畳み込みとは、
s = XYを意味します。ここで、
Yは暗い領域の画像要素の合計であり、
Xは明るい領域の画像要素の合計です(
X / Yを取ることもできます。ズームすると安定性があります)。


このような畳み込みは、オブジェクトの構造情報を強調します。たとえば、次の畳み込みは、人の顔の中心に対して常に負になります。


ちょうど口の領域が額よりも暗くなるように、目はそれらの間の領域よりも暗くなります。 より多くの異なるプリミティブが使用されるほど、オブジェクトをより正確に分類できます。 さらに、正確な分類が必要ない場合は、使用するプリミティブを少なくすることができます。
ここで、オブジェクト認識問題では、テストサンプルから属性のセットが構築された後、トレーニングアルゴリズム(
AdaBoost 、
SVM )がオブジェクトに対応する畳み込みのシーケンス(カスケード)を決定することに言及できます。 画像内でオブジェクトが認識されると、テスト画像と比較されます。
Haarのプラスとは何ですか?また、これらのoneい長方形の代わりに、たとえば正弦曲線やガウス曲線のような素晴らしい物理曲線を使用できないのはなぜですか?
さらに、Haarカスケードは
、画像の積分表現を通じて非常に迅速にカウントされ
ます 。 これについては、ここで詳しく説明します。ここでは、統合されたイメージが次のように表されることを簡単に説明します。

元の画像(
I )から取得した行列(
II )の
X、Yポイントの値は、長方形(0,0、X、Y)内のすべてのポイントの合計です。 次に、画像内の任意の長方形(ABCD)上の積分を次のように表すことができます。
SumOfRect(ABCD)= II(A)+ II(C)-II(B)-II(D)サイズに関係なく、長方形のすべての要素の合計を計算するために、メモリへの4つのアクセスと3つの数学演算のみを提供するもの。 Haarプリミティブのたたみ込み以外の他のたたみ込みを計算する場合、プリミティブのサイズの2乗に比例するアクションの数が必要です(FFTを使用して計算しない場合、パターンでは不可能です)。
問題に戻りましょう。 大きな画像(
I )から小さな断片(
J )を見つけたいとします。 これを行うために、トレーニングは必要ありません。 1つのフラグメントを作成することはまだ不可能です。 Haarのプリミティブは、
Jのイメージを取得し、
Iでそれを探すのに役立ちます
。 Haar符号のセットで畳み込み
Jを取得し、小さなフラグメントに比例するウィンドウで
Iで計算された同じプリミティブの畳み込みのセットと比較するだけで十分です。
長所:
- 照明の局所的な変化であっても、照明の変化に対する耐性、ノイズに対する耐性(プリミティブは最も単純なバンドパスフィルターです )。
- プリミティブがそれほど小さくない場合、スケールを変更するときの相関ははるかに安定しています(小さなステップでバイパスする場合、プリミティブのサイズは精度に影響しません)。
- 大きな画像のサインが事前に計算され、検索ウィンドウがシフトされて既に計算され、関連している場合、検索は相関よりもはるかに高速になります(より少ない要素を比較する必要があります)。
同時に、このアプローチを加速および改善するかなり単純な最適化を数多く実行できることは明らかです。
誰かがプレイしたい場合は、このアルゴリズムの最も単純なバージョンが実装されている小さな
プログラムを作成しました。 プログラムは、選択したフラグメントをビデオストリームに保持します。 カメラの
フックと単純な画像変換のための
EmguCV (Haarは手動で行われます)。