OpenCV中的HOGDescritor:如何使用setSVMDetector()

时间:2018-08-09 15:14:58

标签: c++ opencv svm

我是HOG描述符和支持向量机的初学者。 我成功实现了OpenCV示例hog.cpppeopledetect.cpptrain_hog.cpp(CV版本3.4.1)。

现在,由于文档非常少,我在理解HOG方法setSVMDetector()时遇到了一些问题。在我仅有的示例中,有几行没有注释(请参阅train_hog.cpp中的get_svm_detector()函数),我的意思是我不清楚必须如何构建setSVMDetector()的参数。

例如,在train_hog.cpp中,setSVMDetector的参数由函数给出

vector< float > get_svm_detector(const Ptr< SVM >& svm)
{     
    // get the support vectors
    Mat sv = svm->getSupportVectors();
    const int sv_total = sv.rows;
    // get the decision function
    Mat alpha, svidx;
    double rho = svm->getDecisionFunction( 0, alpha, svidx );
    CV_Assert( alpha.total() == 1 && svidx.total() == 1 && sv_total == 1 );
    CV_Assert( (alpha.type() == CV_64F && alpha.at<double>(0) == 1.) ||
               (alpha.type() == CV_32F && alpha.at<float>(0) == 1.f) );
    CV_Assert( sv.type() == CV_32F );
    vector< float > hog_detector( sv.cols + 1 );
    memcpy( &hog_detector[0], sv.ptr(), sv.cols*sizeof( hog_detector[0] ) );
    hog_detector[sv.cols] = (float)-rho;
    return hog_detector;
}

如果SVM参数为(如示例中所示),则此功能有效:

 svm->setCoef0( 0.0 );
 svm->setDegree( 3 );
 svm->setTermCriteria( TermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 1000, 1e-3 ));
 svm->setGamma( 0 );
 svm->setKernel( SVM::LINEAR );
 svm->setNu( 0.5 );
 svm->setP( 0.1 );
 svm->setC( 0.01 ); 
 svm->setType( SVM::EPS_SVR ); // Support Vector Regression

但是,如果我更改SVM参数的类型,例如:

svm->setGamma(1.0); //default is 1
svm->setC(0.01); // soft is 0.01 12.5
svm->setKernel(SVM::RBF); //Radial Basis Function Kernel
svm->setType(SVM::C_SVC); // n-class classification, with n>=2

函数崩溃。所以我的问题是:如果我使用了最后一个SVM参数,应该给setSVMDetector()什么?

0 个答案:

没有答案