OpenCV线性SVM没有训练

时间:2014-10-20 06:03:43

标签: c++ opencv svm libsvm

我已经坚持了一段时间了。 OpenCV的SVM实现似乎不适用于线性内核。我相当确定代码中没有错误:当我将kernel_type更改为RBF或POLY时,将其他所有内容保持原样,它可以正常工作。

我说它不起作用的原因是,我保存生成的模型并检查出来。它将支持向量计数显示为1.在RBF或多项式内核中不是这种情况。

代码本身并没什么特别之处,我之前使用过OpenCV的SVM实现,但从来没有使用过线性内核。我尝试在POLY内核中将degree设置为1,它会产生相同的模型。这让我相信这里有些东西。

代码结构,如果需要:

Mat trainingdata;    //acquire from files. done and correct.
Mat testingdata;     //acquire from files. done and correct again.
Mat labels;          //corresponding labels. checked and correct.

SVM my_svm;
SVMParams my_params;
my_params.svm_type = SVM::C_SVC;
my_params.kernel_type = SVM::LINEAR;    //or poly, with my_params.degree = 1.
my_param.C = 0.02;    //doesn't matter if I set it to 20000, makes no difference.

my_svm.train( trainingdata, labels, Mat(), Mat(), my_params );
//train_auto(..) function with 10-fold cross-validation takes the same time as above (~2sec)!
Mat responses;
my_svm.predict( testingdata, responses );
//responses matrix is all wrong.

我有一个班级的500个样本和另一个班级的600个样本进行测试,我得到的正确分类是:1/500和597/600。

最疯狂的部分: 我在libSVM的MATLAB包装器上使用相同的数据进行了相同的实验,并且它可以正常工作。只是尝试做一个OpenCV版本。

1 个答案:

答案 0 :(得分:2)

通常只使用线性CvSVM 获得一个支持向量,这不是一个错误。

OpenCV将线性SVM优化为一个支持向量 这里的想法是支持向量定义分类边界,并且仅进行实际分类需要分离超平面,并且它可以仅由一个向量定义。

如果您的训练数据是线性可分的,参数 C 并不重要。也许是你的情况。