OpenCV 3支持向量机训练

11

如您所知,OpenCV 3相较于OpenCV2或旧版本进行了许多更改。

在旧版中,训练SVM的方法为:

CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::POLY;
params.gamma = 3;

CvSVM svm;
svm.train(training_mat, labels, Mat(), Mat(), params);
在 API 的第三个版本中,没有 CvSVMParamsCvSVM。令人惊讶的是,有一个关于 SVM 的文档页面,但它仅仅介绍了一切,却没有告诉我们如何真正使用它(至少我无法理解)。而且,似乎互联网上没有人使用 OpenCV 3.0 中的 SVM。
目前,我只能获取到以下内容:
ml::SVM.Params params;
params.svmType = ml::SVM::C_SVC;
params.kernelType = ml::SVM::POLY;
params.gamma = 3;

你能否提供一些关于如何将现有的训练转换为OpenCV 3的信息?

3个回答

32

使用OpenCV 3.0,肯定有所不同,但并不困难。

Ptr<ml::SVM> svm = ml::SVM::create();
// edit: the params struct got removed,
// we use setter/getter now:
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::POLY);
svm->setGamma(3); 

Mat trainData; // one row per feature
Mat labels;    
svm->train( trainData , ml::ROW_SAMPLE , labels );
// ...
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary)
Mat res;   // output
svm->predict(query, res);

非常感谢您的快速回复,一切都很顺利! 请问结果在res cv::Mat中是如何表示的? 它是否只包含了labels cv::Mat中的相同值? - Jack L.
res.at<something>(0)将包含ID。在此处,'something'将是浮点数或整数,具体取决于标签的类型。 - berak
这个信息:“Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary)” 对我的实现成功帮助很大。谢谢@berak。 - Koray

9

我正在将我的代码从OpenCV 2.4.9移植到3.0.0-rc1,遇到了同样的问题。不幸的是,自回答发布以来API已经发生了变化,因此我想相应地更新它:

Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::POLY);
svm->setGamma(3);

Mat trainData; // one row per feature
Mat labels;    
Ptr<ml::TrainData> tData = ml::TrainData::create(trainData, ml::SampleTypes::ROW_SAMPLE, labels);
svm->train(tData);
// ...
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary)
Mat res;   // output
svm->predict(query, res);

2

该教程仍使用已过时的SVM :: Params params。 - Jake OPJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接