2017-05-26 146 views
1

我正在研究乳腺癌檢測系統並使用miniMias數據集。我在最後一步,我從ROI和不同ROI提取SIFT,SURF功能我有不同數量的功能,所以我得到了不同數量的描述。 我在做什麼?SVM響應問題opencv

  1. 發現至少SIFT,SURF數描述所有數據集(這樣的訓練數據大小相同)的
  2. 在單個矢量(首先篩選然後衝浪)中插入兩個SIFT,SURF描述符(起始索引到最小長度)。

所以,這就是我想過去功能SVM,但我沒有得到的測試數據所需的響應,精確度是檢驗數據低於50%。我也試過洗牌,但結果相同。功能有問題嗎?有人可以告訴我該怎麼辦?

這是我如何設置SVM參數。

CvSVMParams params=new CvSVMParams(); 
params.set_svm_type(CvSVM.C_SVC); 
params.set_kernel_type(CvSVM.LINEAR); 
TermCriteria termC = new TermCriteria(TermCriteria.MAX_ITER, 100, 1e-6); 
params.set_term_crit(termC); 
CvSVM classifier = new CvSVM(); 
classifier.train(feature, label, new Mat(), new Mat(), params); 

回答

1

在SVM中有很多參數可以幫助我們獲得準確的結果。一些是: -

1)選擇適合我們的訓練數據的內核類型,使用線性內核嘗試使用其他類型的內核(如RBF)並查看精度,然後選擇最高精度的內核類型。順便提一下,RBF主要用於內核類型,對於非線性可分離數據集表現更好。

2)選擇最佳參數C和伽馬值。您必須爲opencv SVM中的C和gamma參數選擇最佳值,或者也可以使用SVM的train_auto方法代替train,然後此方法將自動選擇C,gamma和其他參數的最佳值。

使用類似下面的代碼是C++,但很容易將它更改爲Java

cv::SVMParams params; 
     params.kernel_type = CvSVM::RBF; //CvSVM::RBF, CvSVM::LINEAR ... 
     params.svm_type=SVM::C_SVC; 
     params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,100000,0.000001); 

SVM svm; svm.train_auto(samples,labels,Mat(),Mat(),params,2,SVM::get_default_grid(SVM::C),SVM::get_default_grid(SVM::GAMMA),SVM::get_default_grid(SVM::P),SVM::get_default_grid(SVM::NU), 
        SVM::get_default_grid(SVM::COEF),SVM::get_default_grid(SVM::DEGREE),false); 

    char *fs="svmFile.yml"; 
    svm.save(fs); 
+0

'CvParamGrid'不包含(get_dufault _.....)。有沒有其他方法? –

+1

嘗試使用SVM.get_default_grid(CvSVM.GAMMA)使用此鏈接http://docs.opencv.org/java/2.4.2/org/opencv/ml/CvSVM.html#train_auto(org.opencv.core.Mat – Yirga

+0

我已經手動完成了它(使用這些方法創建了自己的類),但是具有相同的準確性 –