0

私は surf と bow を使用して svm をトレーニングしましたが、画像を予測すると常に 1 が返されます。負の画像を選択した場合でも、出力として 1 が返されます。

svm のパラメーターは次のとおりです。

CvSVMParams Params;
Params.svm_type=CvSVM::C_SVC;
Params.kernel_type=CvSVM::LINEAR;
Params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
Params.gamma=3;
CvSVM svm;
svm.train(training_mat,labels,cv::Mat(),cv::Mat(),Params);

そして、ここに予測用の私のコードがあります:

predict_img = cvLoadImage("ss.jpg",0);
detector.detect(predict_img, keypoint2);
RetainBestKeypoints(keypoint2, 20);
dextract.compute( predict_img, keypoint2, descriptors_2);
Mat my_img_3 = descriptors_2.reshape(1,1);
float response = svm.predict(my_img_3);
cout<<response;

これが初期化です:

BOWImgDescriptorExtractor dextract(extractor,matcher);
SurfFeatureDetector detector(500);
4

2 に答える 2

1

すでに提供されている回答に加えて、SVM 分類のパフォーマンスを向上させる方法、つまりモデル パラメーターを正しく設定する方法について、将来必ず別の質問をすることになります。

その目標に向けて、CvParamGrid によって提供されるグリッド検索も調査する必要があります。

一番

于 2013-08-30T13:26:03.090 に答える
1

妥当なモデルを強制するのに十分な大きさの値を設定したかどうかを確認する必要があります (コードには表示されないため、 opencv のドキュメントCに従って 1000 に設定する必要があります)。多くの実際の問題については、多くの値を試す必要があります。の大きさの使用さえ。が小さすぎると、SVM はノルムが小さい超平面を探すだけで、正確な分類にはあまり注意を払いません。opencv 実装のパラメーターを介してアクセスできます。C10^10CCvalue

Params.gamma=3;

エラーは発生しませんが、gamma値を設定する必要はありません。この値は線形カーネルでは使用されず、RBF カーネルにのみ必要です。

また、「些細な」モデルにつながる可能性があるため、同様の量のポジティブ サンプルとネガティブ サンプルをトレーニングしている (またはクラスの重み付け手法を使用している) ことを確認する必要があります。

于 2013-08-29T20:02:23.480 に答える