2014-02-24 38 views
0

我正在嘗試使用從圖像中提取的SIFT描述符來訓練SVM。然後我想將格式保存爲.xml格式,以便我可以再次加載它。SVM分類器沒有被保存在「.xml」中?

我的結構:我有10個班級,每班有100個樣本。

問題:如果我爲每個類使用10-50個樣本,那麼SVM會被保存,我可以在我的文件夾中看到一個classifer.xml文件。但是如果我想要使用更多的樣本每類大約100個樣本,則SVM不會被保存。

我認爲它可能需要一些時間來保存,但我已經等了這麼久(我已經做了好幾次)。

我對SVM訓練碼如下:

void svm::svmTrain() 
{ 
    cv::Mat trainme;  // it should contain the feature vectors 
    cv::Mat labels; // it will contain the class labels 

    createTrainingDateUsingBOW(trainme, labels);  

    //svm parameters 
    CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON); 
    CvSVMParams svm_params = CvSVMParams (CvSVM::C_SVC, CvSVM::POLY, 10.0 , 8.0 , 1.0 , 10.0 , 0.5 , 0.1 , NULL   , criteria); //CvSVMParams --it is a struct 
             //(svm_type, kernel_type, degree , gamma , coef0 , Cvalue, nu , p , class_weights, term_crit) 

    cout<<"\n saving SVM \n"; 

    cv::SVM svm; 
    svm.train(trainme, labels, cv::Mat(), cv::Mat(), svm_params); 
    svm.save("classifier.xml"); 

    cout<<"\n SVM classifier is saved."; 

} 

PS:所以,如果我的樣品每班40-60更然後,我到高達saving SVM從上面的代碼,但從來沒有達到SVM classifier is saved.

回答

1

嘗試這種替換,你會發現,它需要太多的時間進行培訓,培訓後,幾乎不需要一分鐘來保存文件。

cout<<"\n training SVM \n"; 

cv::SVM svm; 
svm.train(trainme, labels, cv::Mat(), cv::Mat(), svm_params); 
cout<<"\n saving SVM \n"; 
svm.save("classifier.xml"); 

cout<<"\n SVM classifier is saved."; 

我從來沒有親身體驗過支持向量機,但有多達1000個樣本,它不會在不到一個小時的時間內訓練。在我的情況下,當我爲類似樣本數的漁民嘗試時,花費了2-3個多小時。

+0

35個樣品/類,它在一分鐘內得到保存,但如果我選擇了40個樣品/類...它沒有得到保存..不奇怪? (我還沒有試過你的建議) – skm

+0

哦,是的,這聽起來很奇怪,不可能猜出原因。 – 4nonymou5