Haar Cascadeを使用して画像を比較する

画像






私がお話しするHaarの兆候は、認識システムや機械学習に何らかの形で関係しているほとんどの人に知られていますが、明らかに、標準の範囲外の問題を解決するためにそれらを使用する人はほとんどいません。 この記事は、ビデオの隣接するフレーム間でオブジェクトを追跡するタスク、複数の写真の対応を検索する、画像内の画像を検索するタスク、およびその他の同様のタスクで、Haarカスケードを使用して近接画像を比較することに専念します。



画像






ほとんどの場合、画像のかなり類似した2つのフラグメントの単純な比較が必要な場合、それらの共分散 (または類似したもの)によって実現されます。 サンプル(写真の花)が撮影され、サンプル( J )と画像( I )の差がある点を探して、XおよびYに沿って画像内を移動します。

画像

最小値に達します。



この方法は、実装が非常に高速で、直感的であり、よく知られています。 おそらく、どこで使用されたとしても、私は単一の開発グループに会ったことがありません。 もちろん、誰もが彼の欠陥を驚くほど知っています。



誰もがこれらの欠点に対処する方法を知っています。



相関の結果が十分でない状況では、特徴点マップ( SURF )、境界線の比較、オブジェクトの直接選択など、より複雑な方法に切り替えます。 しかし、これらのアルゴリズムは完全に異なります。ほとんどの場合、非常に遅く、最初から書くのが難しく(特にDSPプロセッサで)、画像構造に制限があります。



ある時点で、次のプロジェクトを考えると、画像内の複数の可変領域を比較する必要があるという問題に遭遇しました。 そして、Habrでかつて言及されたPredatorアルゴリズムを思い出すまで、ビデオでの高速かつ安定したオブジェクトトラッキングが示されていました。 少し考えて、私はこのアプローチ全体が大きなクラスの問題を解決することを可能にしていることに気付きました。

ハールの兆候を思い出させてください。 機能のカスケードは、一般に、 、手、または他のオブジェクトなどの複雑なオブジェクトを区別するためのシステムを構築するための基礎と呼ばれます 。 ほとんどの記事では、このアプローチはAdaBoosta学習アルゴリズムと密接にリンクしています 。 Haarカスケード自体は、画像との畳み込みが考慮されるプリミティブのセットです。 最も単純なプリミティブが使用され、長方形で構成され、+ 1と-1の2つのレベルしかありません。 さらに、各長方形は異なるサイズで数回使用されます。 ここでの畳み込みとは、 s = XYを意味します。ここで、 Yは暗い領域の画像要素の合計であり、 Xは明るい領域の画像要素の合計です( X / Yを取ることもできます。ズームすると安定性があります)。

画像画像

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

画像画像

ちょうど口の領域が額よりも暗くなるように、目はそれらの間の領域よりも暗くなります。 より多くの異なるプリミティブが使用されるほど、オブジェクトをより正確に分類できます。 さらに、正確な分類が必要ない場合は、使用するプリミティブを少なくすることができます。

ここで、オブジェクト認識問題では、テストサンプルから属性のセットが構築された後、トレーニングアルゴリズム( AdaBoostSVM )がオブジェクトに対応する畳み込みのシーケンス(カスケード)を決定することに言及できます。 画像内でオブジェクトが認識されると、テスト画像と比較されます。

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は手動で行われます)。



All Articles