2013-06-19 54 views
7

私は、traincascadeユーティリティを使用してOpenCVのLBP機能を使用してヘッド検出器を作成しようとしています。ヘッド検出器は、Vladim Pivarevskyによって作成されたOpenCVのプロファイルフェイスと同様のものになります。現在のモデルは正面と左側面だけを扱うので、モデルを再作成したい。LBPトレーニングのOpenCV traincascade

私はNaotoshi Seo tutorialに従い、Irshad Ali websiteからデータセットを使用します。残念なことに、結果として得られるモデルは、多くの誤検出でゆっくりと実行されます。

traincascadeは次のように実行されます。

opencv_traincascade -data "data" -vec "samples.vec" -bg "out_negatives.dat" -numPos 26000 -numNeg 4100 -numStages 16 -featureType LBP -w 20 -h 20 -bt GAB -minHitRate 0.995 -maxFalseAlarmRate 0.3 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1 

私はhttp://fei.edu.br/~cet/facedatabase.htmlから正面顔今、他のデータセットを使用してみましたが、結果は同じです:偽陽性の遅い検出およびたくさん。

誰かがカスケードhaar/lbpモデルを作成する上での知識や経験がありますか?私はモデルの精度を向上させるために何か提案してください。私はOpenCV組み込みモデルを使ってみましたが、結果は良いです(lbpfrontalface.xml)。どうもありがとうございます!

答えて

1

20x20で始まる比較的遅くなり、画像全体を検索して少し大きくなり、再び検索します。実行する時間を減らすためにサンプルサイズを増やしてみてください。

また、陽性と同数のbg画像の近くにあなたがいないことに気付きました。あなたの肯定的なものと少なくとも同じものを増やしてみてください。

また、ハアの機能を解読して、結果が得られるかどうかを確認することをおすすめします。他

すべてが最善の方法は、「試行錯誤」である入力データで

3

を見ずに罰金だ...あなたは本当に貴様面を必要とし、大きな違いが優れています。あなたは1つの顔を取ることができ、createsamplesを介して多くの顔をすることができます。しかし、この方法では、良いカスケードは決してありません。多くの異なる顔を持つ必要があります。十分でない場合は、サンプルを作成することでそれらを増やすことができます。たとえば、500種類の顔を持つサンプルを作成して、5000種類のサンプルを作成した後、カスケードすることであなたを満足させることができます。

スタートトレーニングについて:多くの肯定的に:)または少なすぎるネガティブに。たとえば、5,000ポートと2500ネガ(pos = 2 * neg)が必要です。少なくとも私の場合はそれが最善の選択でした。

+0

私はあなたの提案、12000陽性と5000陰性を試しました。 2000年から作成されたポジティブは、サンプルを作成して12000にしています。しかし、依然として、あまりにも多くの誤検出。あなたは私の仕事のtraincascadeパラメータの例を教えてもらえますか?私のパラメータは次の通りです:opencv_traincascade -data "data" -vec "samples.vec" -bg "out_negatives.dat" -numPos 10000 -numNeg 5600 -numStages 16 -featureType LBP -w 20 -h 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1 – bonchenko

+0

あなたが誤った「顔」と真実を持っているなら、numStagesを増やすことをお勧めします。あなたの肯定的なところで何か間違っています。私のパラメータは "-data h_data -vec vecs/vec -bg bg/negative.txt -numPos 5000 -numNeg 2500 -numStages 14 -featureType HAAR -minHitRate 0.999 -maxFalseAlarmRate 0.3 -w 14 -h 24"ですが、私はボトルのカスケードを練習します(私はlbpも訓練しましたが、haarは良くなりました)。また、[this](http://answers.opencv.org/question/7141/about-traincascade-paremeters-samples-and-other/?answer=10049#post-id-10049)もお読みください。それは私が見た最も良い答えです。 – McBodik

+0

ありがとう!偽陽性が---> 0に減少しました。私は0maxFalseAlarmRateを0.1に変更し、makWeakCount 300を変更しました。しかし、1つの問題は依然として速度です。今度はサンプルサイズを増やす@GPPK答えを試してみましょう。私は陽性ベクトルのためにSonotsから.MergeVectorを使用するので、私は20x20の他のサイズを使用することができないようです。陽性ベクターを作るのにあなたは何を使用しますか? – bonchenko

1

要するに、モデリングのステージ1の後に多くの誤検出を得るのは正常です。これらの偽陽性を負のデータセットに追加し、モデリングを繰り返す必要があります(ステージ2)。これはハードネガティブマイニングと呼ばれています。それは不可欠です。偽陰性を漸進的に360度回転させることで、偽陰性を掛けることができます。

その他の3つの重要な点:1)opencv_createsamplesは顔に悪いです。 2)挑戦的なネガを使用する(適切)。 3)LBPは多くの状況で2番目の割合です。

  1. 顔はかなり対称で、撮影時に台形のような台形を表示することはありません。 0.02ラジアンのように、必要な場合は非常に小さな角度を使用してください。さらに、.vecファイル内の画像を見ると、ゆがんだエッジの周囲の背景が非常に不自然に見えることがわかります。

  2. ネガの数だけでなく、ネガの品質も重要です。顔は、多くのネガティブイメージ(例えば、木、ロッキー山脈など)と比べて滑らかです。遠く離れた松の木と顔を区別するのは比較的簡単です。しかし、壁のような滑らかな表面から多くの誤検出があります。ネガティブデータセットに挑戦的な画像を含めることが最善です。最高の背景は、滑らかな塗装された石膏ボードの壁の画像であることがわかりました。いくつかの壁に沿って歩いている間にビデオを撮り、ffmpegを使ってそれを画像のヒープに切り詰める。繰り返しますが、これらのネガティブを360度ずつ漸進的に回転させて戻し、再び反転して回転させることができます。

  3. 患者がいれば、HAARではなくLBPを使用してください。

AIはすべて怒っています。未処理の100,000画像を対応するクラスのフォルダに分割し、モデルのトレーニングを開始するだけです。しかし、このアプローチでは、98〜99%の正しい分類率しか得られないことがあります。あまりにも多くの偽陽性。あなたは、上記のこと(HAARカスケードまたはニューラルネットを使用しているかどうか)をはるかに少なくして、より良い結果を得ることができます。これは実際のデータサイエンスの仕事です:負のデータセットと積極的なデータセットの賢明な選択と、境界ボックスを定義する際の時間のかかる作業です。

関連する問題