OpenCVカスケードHaarの学習

HabrとHaarカスケードとは何かに関する記事(1、2、3、3)が既にあります。 学習プロセスに影響するものもありますが、説明したタスクに関連しています。 トレーニングのトピックについては、英語の良い記事がいくつかあります( firstsecondthird )が、私の意見では、彼らは混乱しています。

画像

この記事では、ビデオストリームで簡単なテーマを見つけるためのトレーニングを行うことで、数時間でカスケードをゼロからトレーニングする方法を示します(例:写真の魅力的なフクロウ)。 すべてのトレーニングサンプルとプログラムが添付されます。

なぜこれがすべて必要なのですか? Haarカスケードは、オブジェクトのクラスを高速で認識する最も簡単な方法の1つです。 これらには、人々の顔と手、ナンバープレート、歩行者が含まれます。 Haar検出器を使用すると、フレーム内の動物を簡単に見つけることができます(ちなみに、ラズベリーパイに自動乳首フィーダーがまだないのは驚くべきことです)。 さらに、既存のほとんどのシステムには既製のOpenCV実装があります(私はblackfinにも会いました)。 これらすべてにより、Haarは、ビデオ処理に携わったことがない人でも、ビデオ処理タスクを解決するための最も便利な方法の1つになります。



プロセス


サンプリング学習プロセス全体にプログラミングスキルは必要ありません。 これを行うために、OpenCVのメインアセンブリには既に既製のコンソールプログラムが存在します。 カスケードを使用するには最低限のプログラミングスキルが必要です。完成したサンプルでは、​​C、C ++、C#、Java、Pythonなどの下の数行を変更するだけで十分です。



何が必要でしょうか?




例と反例はどこで入手できますか?


いくつかの方法があります。



オプション1〜3には、生活を簡素化するプログラムがいくつかあります。 まず第一に、これらは写真にマークを付けることができるプログラムです。 英語の記事では、自作プログラム「 imageclipper 」を使用しています。 大きな写真では正しく動作しないため、私はそれが好きではありませんでした。 私自身のために、私は仕事をするのに便利なプログラムを書きました。 ソースとコードは、この記事の「ダウンロード」セクションに添付されています(PictureCropper)。



何枚の写真が必要ですか?


安定して機能する顔検出器の場合、これらは3000〜4000の正の例で、多くの負の例です。 正の500個と負の1000個のうち、安定した数値検出器を作成しました。 この記事に示されている検出器では、250枚のポジティブ写真と500枚のネガティブ写真を撮りました。

サンプルが大きく、多様であるほど、動作が安定し、学習に時間がかかります。



仕事に取り掛かる。


トレーニングを開始するには、2つのフォルダーとサンプルが必要です。 「良い」はポジティブな画像、「悪い」-ネガティブな画像を含むフォルダです。 重要 ! 少なくとも以前のバージョンのトレーニングプログラムの1つでは、ファイル名にスペースやドットが含まれている場合の反応が不十分でした。 ロシア語はバージョンを認識しません。 画像に「0.bmp」、「1。 bmp "など。 「bmp」と「jpg」の形式は安定して動作しますが、残りの部分については確認しませんでした。

各フォルダーには、使用する画像を説明するテキストファイルが必要です。 それらを「Good.dat」および「Bad.dat」と呼びましょう。 重要 ! このファイルは、フォルダーが存在するファイルシステムと同じレベルである必要があります。

\Good \1. bmp \2. bmp \.... bmp \N. bmp \Bad \1. bmp \2. bmp \.... bmp \N. bmp Good.dat Bad.dat
      
      





ネガティブオブジェクトとポジティブオブジェクトの記述ファイルの構造は異なります。 ネガティブサンプルファイルの場合、これは単なる相対画像パスのリストです。

 Bad\1. bmp Bad\2. bmp Bad\.... bmp Bad\N. bmp
      
      





好例のファイルの場合、記録は少し複雑です。 パスに加えて、問題のオブジェクトの位置とそのサイズを示す必要があります。 原則として、各ポジ画像にはオブジェクトのいくつかの例を含めることができます。 しかし、それはお勧めしません。 すべてのベスト:1つのフレーム-1つのオブジェクト。

 Good \0.bmp 1 0 0 414 148 Good \1.bmp 1 0 0 568 164 Good \....bmp 1 0 0 440 144 Good \N.bmp 1 0 0 590 182
      
      





「Good \ 0.bmp」は、説明ファイルに関連するオブジェクトのアドレスです。 「1」-画像内のポジティブオブジェクトの数。 「0 0 414 148」-オブジェクトが配置されている画像内の長方形の座標。 複数のオブジェクトがある場合、レコードは「Good \ 0.bmp 2 100 200 50 50 300 300 25 25」という形式を取ります。

オブジェクトの座標がフレームのサイズに等しいときに、各オブジェクトが個別のフレームである場合に最も便利であることを繰り返します。



陽性サンプルのスナップショットの例:

画像画像画像画像画像



ネガティブサンプルスナップショットの例:

画像画像画像画像画像



教え始めます!


トレーニング自体は2段階で行われます。 最初の段階-すべてのポジ画像が共通の形式に縮小されます。 OpenCVフォルダプログラムにあるこれを行う必要があります。 システムに合ったものを使用してください。 この「opencv \ build \ x64 \ vc10 \ bin」があります。 このプログラムはopencv_createsamples.exeと呼ばれます。

上記のポジティブイメージのパックを作成するには、コンソールからopencv_createsamplesを実行します。

 opencv_createsamples.exe -info E:\BAZAS\Sova\Good.dat -vec samples.vec -w 20 -h 20
      
      





-info E:\ BAZAS \ Sova \ Good.dat-ポジ画像を記述するためのファイル。 完全なアドレスが指定されているか、opencv_createsamples.exeプログラムに関連しています。

-vec samples.vec-一般的な形式に縮小されたポジ画像のデータベースが保存されるファイル。 アドレスは、opencv_createsamples.exeプログラムに関連して指定する必要があります(システム内のフルパスとしましょう)。

-w 20 -h 20-テンプレートのサイズ。 目的のオブジェクトの割合をほぼ反映する必要があります。 たとえば、顔またはフクロウの場合、高さと幅の最適な比率は1 * 1です。 数字の場合、3 * 1です。 鉛筆を検索するには、8 * 1のようなものを配置するのが論理的です。 テンプレートのサイズは十分に小さくする必要があります。 人自身が描かれたオブジェクトを区別できるように設定することが理想的ですが、それ以上はできません。 テンプレートが大きいほど、トレーニングは長くなります。

プログラムの結果はsamples.vecファイルになります。このファイルには、bmpに近い形式でサイズがw * hのすべてのポジティブイメージが含まれます。



最終カスケードを作成する


最終的なカスケードを計算するには、opencv_createsamples.exeと同じフォルダーにあるプログラム「opencv_traincascade.exe」を使用します。 それは長い間機能します。 非常に長い時間でも。 500〜1000個のオブジェクトのカスケードのトレーニングには、ほぼ1日かかります。 例は約2時間トレーニングされました。

 opencv_traincascade.exe -data haarcascade -vec samples.vec -bg E:\BAZAS\Sova\Bad.dat -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.4 -numPos 200 -numNeg 500 -w 20 -h 20 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024
      
      





-data haarcascade-結果を保存するフォルダーのアドレス。 プログラムのルートフォルダーからカウントされます。 事前に作成する必要があります。そうしないと、すべてが飛び出します。

-vec samples.vec-最後の段落で計算された肯定的な例を含むファイルのアドレス

-bg E:\ BAZAS \ Sova \ Bad.dat-否定的な例の説明ファイルのアドレス

-numStages 16-プログラムがトレーニングするカスケードレベルの数。 レベルが多いほど正確になりますが、長くなります。 通常の番号は16〜25です。

-minhitrate 0.999-トレーニングの質を決定する係数。 実際、これは「正しい」検出の割合です。 .999が設定されている場合、つまり、最初のサンプルによると、1-0.999 = 0.1%のターゲットが見落とされます。 比率が高いほど、誤報のレベルが高くなります。 原則として、サンプルが良好であれば、0.99-0.999を設定できます。 ひどい場合(オブジェクトが少なく、背景と混ざっている場合)は省略してください。

-maxFalseAlarmRate 0.4-誤警報レベル。 AdaBoostは、サンプルのあらゆるレベルの誤警報をプルできるアルゴリズムです。 しかし、合理的なことをする方が良いです。 デフォルトでは、すべて0.5に設定されています。 しかし、遊ぶのは理にかなっているかもしれません。 サンプルが非常に良い場合、必要な不安のレベルにすぐに到達し、トレーニングが停止します。

-numPos 200-肯定的な例の数。 重要! 持っているファイルの数があるはずです。 しかし、これはそうではありません(ほとんどのマニュアルでは注意されていません)。 最小化率が低いほど、ファイルは使用不可と見なされます。 ほとんどの場合、所有するポジティブファイルの80%にnumPosを配置するだけで十分です。 1日の作業の後、プログラムがエラーでクラッシュしないように、安全にプレイすることをお勧めします。

-numNeg 500-負の例の数。 何ですか-それから書きます。

-w 20 -h 20-最後のアイテムのプリミティブのサイズ。

-mode ALL-Haarサインの完全なセットを使用するかどうか。 操作の速度とアルゴリズムの精度はこれに依存します。 ただし、標識の完全なセットが必要でない場合があります(たとえば、オブジェクトの向きが変わらない場合)。

-precalcValBufSize 1024 -precalcIdxBufSize 1024-プロセスに割り当てられたメモリ。 OpenCVの最新バージョンでは、私が言ったように、プログラムはほぼ同じ量を食べたようですが、それより少し前のバージョンは約2倍多く食べました。 トレーニング中にコンピューターを使用する予定がある場合は、さらに作業するのに十分な量のメモリーを入れてください。



既知のバグ


学習は使いやすさを損なわないことを言わなければなりません。 多くのバグがあります。 ただし、OpenCVは徐々に修正されます。 最新のOpenCVは、プログラムがクラッシュする理由のほとんどを十分に詳細に説明しています。 原則として、これは肯定的または否定的な例、達成不可能な特性、曲がった住所の欠如です。 確かに、フクロウでサンプルを訓練したとき、訓練の中断に何らかの不具合がありました。 どうやら、テストケースが少なすぎた(その時点で150のフクロウと200の反例を使用した)。



結果


ビデオのアルゴリズムの例。 ギャップがあることがわかります。 しかし、200の例しかないサンプルの場合、これは良い結果です。





ソースコード


約束されたように、人生を楽にするサンプルプロジェクトといくつかのプログラム。 ここ (Yandex-diskのrar-archive)またはここ (github)のいずれかをダウンロードできます。 しかし、githubでは、最大ファイルサイズは100メガバイトであり、使用するEmguアセンブリ(C#のOpenCV)は、使用されていないがプロジェクトから除外できない2つの大きなOpenCVファイルをプルします。 これらのファイルは両方ともBin \ x86フォルダー内にあり、「lagedll.rar」アーカイブにアーカイブされています。それらを取り出すだけです。

プロジェクト全体はVS2010、Windows 7上にあります。すべての実行可能プログラムは「Bin」フォルダーにあります。

VideoCropper-ビデオカメラからシーケンスを作成するためのプログラム。 起動時に、保存するフォルダと操作モード(ポジティブまたはネガティブ選択の作成)を指定する必要があります。 保存する領域をマウスで選択すると、スペースがスペースで保存されます。

PictureCropper-既存の写真データベースをスライスするためのプログラム。 起動時に、作業フォルダーが示されます。 スライスされた画像でサブフォルダーを作成します。 マウスで保存する領域を選択します。 「s」によって保存されます。 「r」で-保存して次の画像に進みます。 スペースバー-次の画像に移動します。

OwlDetector-フクロウを探す最終プログラム

悪い、良い - 悪い例と良い例

haarcascade-学習カスケード

Bad.dat、Good.dat-画像記述ファイル

samples.vec-トレーニング用に準備された一連のポジティブイメージを含むファイル



All Articles