我正在尝试使用从图像中获取的SIFT描述符来训练SVM。然后我想以.xml
格式保存SVM,以便我可以再次加载它。
我的结构:我有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
但从未到达{{1 }} 的
答案 0 :(得分: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.";
我从未亲身体验过SVM,但是,在多达1000个样本的情况下,它不会在不到一个小时的时间内进行训练。在我的情况下,当我为具有相似数量的样本的渔民尝试的东西时,花了超过2-3小时。