将 svm 分类器设置为 HOG 检测器

Posted

技术标签:

【中文标题】将 svm 分类器设置为 HOG 检测器【英文标题】:set svm classifier to HOG detector 【发布时间】:2019-01-03 06:03:37 【问题描述】:

我致力于训练自己的 SVM。首先我想要训练它来检测人并将结果与​​在 opencv 中实现的 SVM 进行比较。训练后 SVM 看起来很好(我创建了 xml 文件进行检查),但我无法将 svm 检测器设置为 HOG。

这是我训练和保存我的 svm 的方法:

std::cout << "Entering trainAndSave" << std::endl;

cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
svm->setType(cv::ml::SVM::C_SVC);
svm->setKernel(cv::ml::SVM::RBF);
std::cout << "Creating SVM pointer successfull" << std::endl;

cv::Ptr<cv::ml::TrainData> tData = cv::ml::TrainData::create(trainingData, cv::ml::SampleTypes::ROW_SAMPLE, labels);

std::clog << "Wait until training will get finish! This may take a few minutes...";
svm->trainAuto(tData);
std::clog << "...[done]" << std::endl;
std::cout << "trainAuto successfull" << std::endl;

svm->save(filename);
std::cout << "saving to file successfull" << std::endl;

我认为它做得正确,问题是我如何获得支持向量并将 smv 检测器设置为 HOG:

    cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::load(filename);
    // get support vectors
    cv::Mat supportVectors = svm->getSupportVectors();
    const int supportVectorsTotal = supportVectors.rows;

    // get the decision function
    cv::Mat alpha, sVidx;
    double rho = svm->getDecisionFunction(0, alpha, sVidx);

    CV_Assert(alpha.total() == 1 && sVidx.total() == 1 && supportVectorsTotal == 1);
    CV_Assert((alpha.type() == CV_64F && alpha.at<double>(0) == 1.) ||
        (alpha.type() == CV_32F && alpha.at<float>(0) == 1.f));
    CV_Assert(supportVectors.type() == CV_32F);

    std::vector<float> svmDetector(supportVectors.cols + 1);
    memcpy(&svmDetector[0], supportVectors.ptr(), supportVectors.cols * sizeof(svmDetector[0]));
    svmDetector[supportVectors.cols] = (float)-rho;

    hog.setSVMDetector(svmDetector);

当 svm 加载后,我在这一行得到错误:

        CV_Assert(alpha.total() == 1 && sVidx.total() == 1 && supportVectorsTotal == 1);

error looks like this

我真的不知道问题出在哪里。我将非常感谢所有的建议。

【问题讨论】:

【参考方案1】:

此错误是因为,您在 setSVMDetector 之前实例化了 HOG 检测器,其参数与您计算 HOG 描述符以创建 svm 分类器的参数相同。

例如,输入你的参数值

 HOGDescriptor hog;
 hog.winSize = Size(256,256);
 hog.blockSize = Size(128,128);
 hog.blockStride = Size(64,64);
 hog.cellSize = Size(32,32);
 hog.nbins =9;

然后,再次运行。

【讨论】:

以上是关于将 svm 分类器设置为 HOG 检测器的主要内容,如果未能解决你的问题,请参考以下文章

基于 HOG 特征的 SVM 分类器用于 OpenCV 中的“对象检测”

为 HOG 特征分配标签以训练 SVM 分类器

OpenCV和SVM分类器在自动驾驶中的车辆检测

如何在 Python 中使用 OpenCV 3.0 中的 HOG 功能训练 SVM 分类器?

HOG + SVM(行人检测, opencv实现)

将HOG + SVM培训应用于网络摄像头以进行对象检测