UFOを探しています。 画像内のオブジェクトの検出

キャプチャをハッキングすることは、もちろん興味深く有益です。しかし、 概して 、役に立たないのです。 これは、IT開発の興味深い方向の1つであるパターン認識という問題の特別な場合にすぎません。







今日は、機械学習やコンピュータービジョンなどの分野の接点にあるアルゴリズム(より正確には、多くのアルゴリズムを組み合わせているため、これを手法と考える方が正しい)を検討します。



このアルゴリズムを使用して、画像内のUFO(神聖なものを見る)を探します。





はじめに





提示された手法は、記事「 単純な機能のブーストされたカスケードを使用した高速オブジェクト検出 」、ポールヴィオラ、マイケルジョーンズ、2001年に最初に説明されました。 また、推測するのが難しい範囲は、画像またはビデオストリーム内のオブジェクトの検索です。



当初、この技術は顔検出アルゴリズムの開発分野で開発および適用されましたが、他のオブジェクトを検索するアルゴリズムの学習を妨げるものはありませんでした。 空港で禁止されているX線オブジェクト 医用画像の腫瘍。 一般的に、あなたが理解しているように、これは深刻であり、人類に大きな利益をもたらす可能性があります。







テクニックの説明





アダブースト



方法論は、適応ブースティングアルゴリズム(または略してAdaBoost )に基づいています。 アルゴリズムの意味は、参照オブジェクトのセットがある場合、つまり 値とそれらが属するクラス(たとえば、-1-顔がありません、+ 1-顔があります)、さらに多くの単純な分類子があり、さらに完璧で強力な分類子をもう1つ作成できます。 同時に、最終分類子をコンパイルまたはトレーニングするプロセスでは、「悪い」と認識されている標準に重点が置かれます。これはアルゴリズムの適応性であり、学習プロセスでは最も「複雑な」オブジェクトに適応します。 ここでアルゴリズムの動作を見ることができます



一般に、AdaBoostは非常に効率的で高速なアルゴリズムです。 私のプロジェクトでは、これを使用して、画像に関連せず性質の異なるさまざまなデータの強い干渉の背景に対して弱い異常を検出します。 つまり アルゴリズムは普遍的であり、それに注意を払うことをお勧めします。 現在ハブで人気のあるデータマイニングでは一般的であり、「 データマイニングのトップ10アルゴリズム 」にさえ入っています。 非常に有益な出版物、私は皆に助言します。



Haarのような機能



問題は、写真をどのように説明するかです。 分類の特性として何を使用しますか? これを迅速に行う必要があり、オブジェクトの形状、色、傾斜角度を変えることができることを考えると...この手法では、いわゆるhaarのような機能が使用されます(以降、これらをプリミティブと呼びます)。







上の図では、このようなプリミティブのセットが表示されています。 本質を理解するために、参照画像を取得し、その上に任意のプリミティブ(たとえば1a)を重ね合わせてから、プリミティブの白い領域(左側)と黒い領域(右側)のピクセル値の合計を考慮し、最初の値から2番目の値を引く。 その結果、画像の特定の部分の一般化された異方性特性を取得します。



しかし、問題があります。 小さな画像であっても、スーパーインポーズされたプリミティブの数は非常に多く、24x24の画像を撮影した場合、プリミティブの数は約180,000です。AdaBoostアルゴリズムのタスクは、このオブジェクトを最も効果的に選択するプリミティブを選択することです



例:







左側のオブジェクトに対して、アルゴリズムは2つのプリミティブを選択しました。 明らかな理由により、目の領域は顔と鼻の中央領域に比べて暗いです。 この構成とサイズのプリミティブは、最良の方法でこのイメージを「特徴付け」ます。

最も効果的なプリミティブが選択されたこのような分類子に基づいて、カスケードが構築されます。 カスケードの後続の各要素は、成功するための条件が前の要素よりも厳しい(より多くのプリミティブが使用される)ため、最も「正しい」要素のみが最後に到達します。



アルゴリズムの実装



私たちは怠け者なので、 OpenCVライブラリのこのテクニックの実装を使用します 。 サンプルの作成、カスケードのトレーニング、テスト用のモジュールがすでに作成されています。 実装は非常に粗雑であるため、頻繁なクラッシュ、学習プロセスのフリーズ、その他の不快な事態に備えておく必要があります。 何度かソースに飛び込み、自分で編集しなければなりませんでした。 このテクニックの実装をどのように使用するかについての非常に詳細で理解しやすいチュートリアルをここで見ることができます



学習アルゴリズムは非常に長期にわたるものです。 適切なアプローチにより、学習プロセスは3〜7日間続きます。 したがって、タスクを可能な限り簡素化します。 1週間学習する時間もコンピューティング手段もありません。 この記事のカスケードを学習する際に、Core 2 Duoを1日必要としました。



OpenCVの実装では、AdaBoostアルゴリズムのより高度な修正-Gentle AdaBoostを使用したことに注意してください。



問題の声明





それはすべて理論です。 練習に移りましょう。 私たちの仕事は、これを見つけることです(私にとって価値のないアーティスト)。







そのような画像では(すべてのカラー画像がグレースケールに変換されることに注意してください、そうでなければ不変式の数が大きすぎます):







提供するもの:



1.オブジェクトの色が異なる場合があります。 オリジナルから±50の値。

2.オブジェクトのサイズが異なる場合があります。 サイズは3回まで変更できます。

3.オブジェクトの傾斜角が異なります。 角度の範囲は30°です。

4.オブジェクトは、画像内でランダムな場所にあります。



ステージ1.トレーニングサンプルの作成。





最初の非常に重要なステップは、トレーニングセットを作成することです。 ここでは、2つの方法で移動できます。 トレーニング用に事前にコンパイルされた画像のデータベース(たとえば、人物)を送信するか、1つの参照オブジェクトに基づいて指定された数のケースを生成します。 OpenCVには、1つのオブジェクトに基づいてサンプルを生成するためのcreatesamplesモジュールがあるため、最後のオプションがさらに適しています。 背景画像(つまり、目的のオブジェクトを持たない画像)として、数百のスペースの画像が使用されます(上記の例)。



指定されたパラメーターに応じて、モジュールは参照オブジェクトを取得し、さまざまな変形(回転、色、ノイズを追加)を適用し、背景画像を選択してオブジェクトをランダムに配置します。 次のことが判明しました。







実際のタスクでは、5000の領域のトレーニングサンプルのサイズに焦点を合わせる必要があります。これらのオブジェクトを2000個生成しました。



ステージ2.トレーニング





ここで、オブジェクトの既存のデータベースの分類子のカスケードを作成する必要があります。 これを行うには、haartrainingモジュールを使用します。 多くのパラメーターが渡されます。その中で最も重要なのは、カスケード内の分類子の数、必要な最小分類子効率係数(最小ヒット率)、および最大許容誤警報率(最大誤報)です。 さらに多くのパラメータがあり、実験を繰り返すことにした人は、 ここでそれらをより詳しく知ることができます



ステージ3.カスケードのテスト





長い待機の後、プログラムはオブジェクト検出に直接使用できるxmlファイルの形式で訓練されたカスケードを生成します。 それをテストするために、最初の段階で説明した原則に従って1000個のオブジェクトを再度生成し、テストサンプルを作成します。



カスケードをテストするには、パフォーマンスモジュールを使用します。 彼にテストサンプルとカスケードを供給し、数秒後にコンソールで次の画像を確認できます。



  + ================================= + ====== + ====== + == ==== +
 | ファイル名| ヒット|ミス| 偽|
 + ================================= + ====== + ====== + == ==== +
 |  0001_0032_0126_0138_0066.jpg |  1 |  0 |  0 |
 + -------------------------------- + ------ + ------ +- ---- +
 |  0002_0088_0079_0188_0091.jpg |  1 |  0 |  1 |
 + -------------------------------- + ------ + ------ +- ---- +
 |  0003_0059_0170_0127_0061.jpg |  0 |  1 |  0 |
 + -------------------------------- + ------ + ------ +- ---- +
 |  0004_0035_0143_0134_0065.jpg |  1 |  0 |  0 |
 + -------------------------------- + ------ + ------ +- ---- +
 .......
 + -------------------------------- + ------ + ------ +- ---- +
 | 合計|  457 |  543 |  570 |
 + ================================= + ====== + ====== + == ==== +
ステージ数:7
弱い分類器の数:34
合計時間:14.114000 




まず、1000個の画像を処理するのに必要な時間(「合計時間」の値)を確認します。 ディスクから読み取る必要があるため、1つのイメージを処理するのにかかる時間は1秒のほんの一部です:14/1000 = 14ミリ秒。 とても速い。



今すぐ分類結果に直接。 「ヒット」は見つかったオブジェクトの数です。 「欠落」は、欠落した数です。 「False」は、誤検知の数です(つまり、カスケードは、オブジェクトが存在しない領域で肯定的な応答を示しました)。 一般的に、これは悪い結果です。 :)より正確には、この記事の例としては満足のいくものですが、実際のタスクで使用するには、トレーニングサンプルの作成により慎重にアプローチし、トレーニングの最適なパラメーターを決定する必要があります。その後、0.001の誤警報率で95%の効率を達成できます。



アルゴリズムの結果:







そして、ここに誤検知のいくつかの例があります:







おわりに





説明した手法には、かなり幅広い用途があります。 他のアルゴリズムとうまく組み合わせることができます。 たとえば、画像内のオブジェクトを検索するには、説明した方法を使用し、認識には古典的なニューラルネットワークまたは別の方法を使用できます。



ご清聴ありがとうございました。おもしろかったと思います。



示されたソースに加えて読むべきもの:

haarのような特徴の拡張セットを備えた高速オブジェクトのブースティングアルゴリズムの実証分析

バブルグラムの実装:人間とロボットの相互作用のためのHaarのような機能の使用



この記事では、単一のニューラルネットワークではパターン認識が生きていないことを示しています。 したがって、上記の考えの続きと次の記事では、統計的アプローチ、つまり画像の多次元統計特性と主成分分析(PCA)を使用したオブジェクトの認識についてお話したいと思います。




All Articles