SVM 分类器没有保存在“.xml”中?
Posted
技术标签:
【中文标题】SVM 分类器没有保存在“.xml”中?【英文标题】:SVM classifier is not getting saved in ".xml"? 【发布时间】:2014-03-26 08:16:07 【问题描述】:我正在尝试使用从图像中获取的 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
,但永远不会达到 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 多个小时。
【讨论】:
每类有 35 个样本,它会在一分钟内被保存,但如果我选择 40 个样本/类......它不会被保存......这不是很奇怪吗? (我还没有尝试过你的建议) 哦,是的,听起来很奇怪,不可能猜到原因。以上是关于SVM 分类器没有保存在“.xml”中?的主要内容,如果未能解决你的问题,请参考以下文章