【问题标题】:OpenCV: SVM train_auto assertion sv_count != 0 failedOpenCV:SVM train_auto 断言 sv_count != 0 失败
【发布时间】:2014-12-18 01:07:32
【问题描述】:

这基本上是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;
}

【问题讨论】:

  • svm_type=CvSVM::NU_SVR 工作吗?对于单回归,你的意思是一类 SVM?
  • @greeness 是的,NU_SVR 正在工作。不,“单一回归”是指使用固定参数集对相同数据进行一次回归。
  • 你试过train_auto(X, Y, Mat(), Mat(), params);吗?

标签: c++ opencv machine-learning svm


【解决方案1】:

也许您应该为这些参数分配初始值。

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

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2014-01-16
    • 2018-06-02
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多