0

預測我用衝浪訓練SVM和弓,現在wher我預測的圖像,它總是返回我1,甚至當我去的負面形象還給我1作爲輸出每次得到積極的結果,而從SVM

下面是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; 

這裏是intializatio:

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

回答

1

您應該檢查是否設置足夠大C(我沒有看到它在你的代碼,以便它應設置爲1000,根據opencv documentation)值來強制一個合理的模型,你應該嘗試許多值,對於許多實際的問題必須使用10^10的量級C。由於太小,SVM將僅僅尋找具有小規範的超平面,而沒有真正關注正確的分類。它可以通過opencv實現中的Cvalue參數訪問。

Params.gamma=3; 

即使它不會導致一個錯誤 - 你不需要設置gamma價值,因爲它不是線性內核中使用,則需要的RBF內核。

您還應該確保您正在訓練類似數量的正面和負面樣本(或使用某種類別加權技術),因爲它也可能會導致「微不足道」的模型。

+0

是我使用的正面和負面形象同樣數額,但我通過不同的目錄,不同的目錄正面形象以及爲負的不同培養他們,我不明白你對'C' – Rocket

+0

概念SVM模型最重要的參數之一是'C',即錯誤分類的「懲罰」數量。它應該在模型params中設置:'Cvalue - 一個SVM優化問題的參數C(C_SVC/EPS_SVR/NU_SVR)。「http://docs.opencv.org/modules/ml/doc/support_vector_machines.html,by默認情況下它設置爲'C = 1000',它可能是行數量級的小 – lejlot

+0

@lijlot你問這個:'CvParamGrid CvSVM = get_default_grid(CvSVM :: C);'但它給我錯誤get_default_grid(CvSVM: :C)'沒有定義 – Rocket

1

除了已經提供的答案之外,您將不得不在未來就如何提高SVM分類性能提出另一個問題,即正確設置模型參數。

爲了實現這一目標,您還應該研究CvParamGrid提供的網格搜索。

最佳

+0

我應該在我預測的時候訓練數據嗎?或者是否有像這樣的功能 – Rocket

+0

在預測之前,需要在學習步驟中完成參數搜索。 –

+0

+1,爲什麼我們使用獲取矢量支持?在svm – Rocket