OpenCV:SVM train_auto断言sv_count!= 0失败

时间:2014-10-22 14:28:07

标签: c++ opencv machine-learning svm

这基本上是this question的副本,但无论如何我都要问它,因为原来的海报要么解决了问题,要么失去了兴趣。

我想使用以下代码自动训练使用OpenCV的回归SVM:

CvSVMParams params;
params.svm_type = CvSVM::EPS_SVR;
params.kernel_type = CvSVM::RBF;
params.term_crit = TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);

CvSVM svm;
svm.train_auto(_data, _resp, _var_idx, _train_idx, params);

这里_data和_resp是Mats持有特征向量和响应,_var_idx包含活动特征,_train_idx是活动样本。对于参数网格,使用默认值。不幸的是,代码产生以下错误:

  

OpenCV错误:do_train中的断言失败(sv_count!= 0),文件/home/.../opencv-2.4.9/modules/ml/src/svm.cpp,第1346行

当我使用手动选择的参数运行单个回归时,它可以正常工作。当我切换到分类问题(并更改相应的参数和SVM类型)时,它也可以工作。在这种情况下,单一培训和自动培训。

有人可以指出问题是什么吗?

修改

上面的代码也会导致另一个错误:

  

OpenCV错误:CvSVM :: set_params中的一个参数'值超出范围(参数p必须为正)

对于CvSVM :: NU_SVR,这与参数nu相同。当我设置这些参数时,问题就消失了,但我不明白为什么这个错误首先发生。当我查看train_auto的文档时,它表示使用相应的默认网格评估p(和nu)。那我为什么要设置呢?

提前致谢。

编辑2:

我做了一个小问题就是这个问题。以防任何人想要尝试并重现问题:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

using namespace cv;
using namespace std;

int main() {

    Mat X(1000, 2, CV_32FC1);
    Mat Y(1000, 1, CV_32FC1);

    randu(X, -2, 2);

    for(int i = 0; i < 1000; i++){
        Y.at<float>(i,0) = pow(X.at<float>(i,0),2) + pow(X.at<float>(i,1),2) - 1;
    }

    CvSVMParams params;
    params.svm_type = CvSVM::EPS_SVR;
    params.kernel_type = CvSVM::RBF;
    params.term_crit = TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);
    params.p = 0.1;

    CvSVM svm;
    svm.train_auto(X, Y, Mat::ones(1,2, CV_8U), Mat::ones(1,1000, CV_8U), params);

    return 0;
}

1 个答案:

答案 0 :(得分:-1)

也许您应该为这些参数指定初始值。

param.C = 1;  //initialize parameter
param.p = 5e-3;  //initialize parameter  
param.gamma = 0.01;  //initialize parameter