2013-08-26 8 views
5

私の目的は、SVMをトレーニングし、オブジェクト検出のためにopencvのHOGdescriptorにプラグインできるサポートベクターを得ることです。cvSVMトレーニングでHOGDescriptorの結果が悪くなる

私は4000個の陽性と15000個の陰性を集めました。私はopencvが提供するSVMを使って訓練しました。結果は私にあまりにも多くの偽陽性を与える(画像あたり20個まで)私は偽陽性を取り除き、それらをネガティブプールに加えて再訓練する。私は時々、より多くの偽陽性に終わるだろう!私は大幅に改善することなく、私のhogdescriptorのL2HysThresholdを300以上に調整しようとしました。私の正と負のプールは十分に大きいのですか?

SVMトレーニングも予想よりもはるかに高速です。私は2916と12996の特徴ベクトルサイズで、グレースケール画像とカラー画像を別々の試行で使用してみました。 SVMトレーニングは20分以上もかかりません。私はauto_trainを使用します。私は機械学習の新人ですが、私のような大きさのデータセットでトレーニングを受けるのは、少なくとも1日はかかりません。

私はcvSVMが多くの学習をしていないと信じており、http://opencv-users.1802565.n2.nabble.com/training-a-HOG-descriptor-td6363437.htmlによれば、この目的には適していません。 cvSVMの経験がある方はこれ以上の情報がありますか?

私はSVMLight http://svmlight.joachims.org/を使用することを検討していますが、SVM超平面を視覚化する方法がないようです。私の選択肢は何ですか?

私はopencv2.4.3を使用して、私は「OpenCVのから訓練時にSVMモデルを学習するなSVMLightを使用して成功した結果を得ていますが、cvSVMを使用していない、そうすることができますhogdescriptor

hog.winSize = cv::Size(100,100); 
hog.cellSize = cv::Size(5,5); 
hog.blockSize = cv::Size(10,10); 
hog.blockStride = cv::Size(5,5); //12996 feature vector 

hog.winSize = cv::Size(100,100); 
hog.cellSize = cv::Size(10,10); 
hog.blockSize = cv::Size(20,20); 
hog.blockStride = cv::Size(10,10); //2916 feature vector 
+0

約3000または10,000のディメンションの記述子を使用している場合は、さらに多くのトレーニングデータを使用しないでください。 経験則によれば、トレーニングデータのサイズは問題の次元の約10倍でなければならないと言われています。それは正しいのではないですか? – GilLevi

答えて

6
  1. 最初のディスクリプタディメンションは、大きすぎて役に立たないものです。信頼できるSVM超平面を形成するには、以上、の記述子の次元と同じ数の正と負のサンプルが必要です。理想的には、超平面のあらゆる次元で情報を分離する必要があるからです。
  2. バイアスパラメータ(cvSVMで利用できない可能性があります)をSVMトレーナーに提供しない限り、肯定と否定のサンプル数は多かれ少なかれ同じです。
  3. HOGは、解決しようとしているタイプの問題の良い記述子であるという保証はありません。 視覚的にあなたが検出しようとしているオブジェクトが、すべてのサンプルで同様の方向性を持つ明確な形状を持っていることを確認できますか?例えば、単一のタイプの花は、独特の形状を有することができるが、多くの種類の花が一緒に同じ独特の形状を有していない。竹は独特な形をしていますが、他のオブジェクトとは区別しにくい場合や、すべてのサンプル画像で同じ向きになっていない場合もあります。
  4. cvSVMは通常、OpenCV HOG用のSVMをトレーニングするためのツールではありません。 SVMLight(商用目的では無料ではありません)またはlibSVM(商用目的ではOK)のバイナリ形式を使用してください。 C++/OpenCVコードを使用してすべてのサンプルのHOGを計算し、SVMLight/libSVMの正しい入力フォーマットでテキストファイルに書き込みます。いずれかのプログラムを使用して、最適なCの線形カーネルを使用してモデルをトレーニングします。ループ内でCを変更しながら最適な精度を検索して最適なCを探します。すべてのサポートベクターを見つけて、対応するサポートベクターごとにアルファ値を掛けてから、ディメンションごとにすべての結果のアルファ*値を加算してNを見つけることによって、検出器ベクトル(N+1次元ベクトル、Nはあなたの記述子の次元です)を計算しますDベクター。最後の要素はです。bは超平面バイアスです(SVMLight/libSVMトレーニングから出てくるモデルファイルにあります)。このN+1次元検出器をHOGDescriptor::setSVMDetector()に供給し、検出のためにHOGDescriptor::detect()またはHOGDescriptor::detectMultiScale()を使用してください。
+0

ありがとう。なぜあなたはcvSVMが正しいツールではないかを詳しく説明できますか?気になります。 – tzl

+0

SVMツールとしてcvSVMに問題はありませんが、 'HOGDescriptor :: detectMultiScale()'を使用する予定がある場合は、cvSVMが提供しない検出器ベクトルが必要です。 cvSVMを使用している場合、トレーニングを行う必要があります。その後、すべてのテストイメージに対してスライディングウインドウのHOG機能を手動で抽出し、cvSVMにフィードし、結果を取得し、再スケーリングし直します。 HOGDescriptorはHOGのいくつかをあらかじめ計算しているので、スライディングウィンドウはより効率的です。 – Bee

+0

誰かがcvSVMからそれを取得する方法を考え出したようです。あなたはこれへの答えを見ることができますhttp://stackoverflow.com/questions/15339657/training-custom-svm-to-use-with-hogdescriptor-in-opencv私の問題はあなたの答えの中でポイント3と思われます。私は一貫してポジティブなイメージで私のオブジェクトを整列させませんでした。私はSVMightに移行する前に、まずcvSVMを使って適切なイメージのセットを試してみましょう。ご協力いただきありがとうございます – tzl

2

ために、次のsetsupsを試してみました比較する。

hogDrawの機能は、http://vision.ucsd.edu/~pdollar/toolbox/doc/index.htmlから表示されます。

+0

共有していただきありがとうございます。 SVMのために超平面を視覚化する(自分自身をより明確にするために編集する)のですか?私は、私のデータセットがどんな種類のカーネルタイプに適しているかを調べたいと思います。答えは – tzl

関連する問題