Python 2.7 と OpenCV 2.4.13 を使用して、UAV 画像から車の検出器を実行しようとしています。目標は、都市環境であらゆる方向から上から見た車を検出することです。時間の実行と精度の問題に直面しています。
インターネットから入手したいくつかのカスケードで使用すると、検出器は正常に動作します。
- バナナ分類子 (明らかに車は検出しませんが、バナナとして認識するオブジェクトを検出します): (coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)
- OpenCV からの顔検出カスケード (バナナ分類器と同じ動作)
検出自体のために、私はdetectMultiScale()
withscaleFactor = 1.1-1.2
とを使用していますminNeighbors=3
検出は、4000x3000 ピクセルの画像で妥当な時間 (数秒) で実行されます。
独自のトレーニング済み分類子を使用しようとすると、問題が発生します。結果が悪く、検出に非常に時間がかかります (30 分以上)
トレーニングのために、たくさんの車が停まっている駐車場のある大きなオルソモザイク (数回ダウンスケールしたもの) からポジティブ画像とネガティブ画像の両方を抽出しました。合計 50 台の車 (25x55 ピクセル) を抽出し、水平方向に反射して、同じオルソモザイクから 100 個のポジティブ イメージと 2119 個のネガティブ イメージ (60x60 ピクセル) を作成しました。私はこのセットを「イメージの完全なセット」と呼んでいます。そのセットから、「ダミー セット」と呼ぶサブセット (4 つのポジティブと 35 のネガティブ) を作成しました。
トレーニングには、 と を使用opencv_createsamples
しopencv_traincascade
ました。100 のポジ画像から 6000 のサンプルを作成し、車を 0 度から 360 度まで回転させました。
perl bin/createsamples.pl positives.txt negatives.txt samples 6000 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 -maxzangle 6.28 -maxidev 40 -w 60 -h 60"
これで、ランダムな背景の上に任意の方向にある車の 6000 個の 60x60 ピクセルのサンプル画像があります。
次に、実行mergevec.py
してファイルを作成しsamples.vec
、トレーニング アプリケーションを実行しますopencv_traincascade
。
python mergevec.py -v samples/ -o samples.vec
opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 3700 -numNeg 2119 -w 60 -h 60 -mode ALL -precalcValBufSize 3096 -precalcIdxBufSize 3096
この方法で、4 つの分類器をトレーニングしました。2 つは完全なセットを使用し、残りの 2 つはダミー セットを使用して、セットごとに 1 つの LBP と 1 つの HAAR をトレーニングしました。私が得る結果は次のとおりです。
- ダミーセット、LBP:1ステージでトレーニング停止。高速検出、オブジェクトは検出されません
- ダミーセット、HAAR: トレーニングは 1 ステージで終了しました。検出には永遠に (または少なくとも 30 分以上) かかります。明らかに機能していないため、プロセスを中断しました。
- コンプリート セット、LBP: トレーニングは 6 段階で停止します。検出が非常に遅い (500x400 ピクセルの画像で 1 ~ 2 分、scaleFactor = 2 を使用)。画像内に少なくとも 10 台の車があり、同じ画像がトレーニングに使用されている場合、非常に少数のオブジェクト (2) を検出します。車はありません。
- コンプリート セット、HAAR: テストのために第 4 段階でトレーニングを停止しました。ダミー セットと同じ動作です。
私が間違っていることは何ですか?バナナと顔のカスケードは妥当な時間内に機能し、オブジェクトを検出するため、問題は明らかに私のカスケードにありますが、その理由はわかりません。
本当にありがとうございました。前もってありがとう、フェデリコ