gpt4 book ai didi

OpenCV:如何将 HOGDescriptor::detectMultiScale() 与自定义 SVM 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:48 26 4
gpt4 key购买 nike

我用我自己的正样本和负样本在 HOG 特征上训练了 CvSVM:

CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::RBF;

CvSVM svm;
svm.train_auto(descriptors, labels, cv::Mat(), cv::Mat(), params,
SVM_CROSS_VALIDATION_K);

我可以使用 just fine 对图像进行分类:

cv::HOGDescriptor hog;
hog.winSize = cv::Size(HOG_PARAMS.width(), HOG_PARAMS.height());

//compute the HOG features
hog.compute(image, ders,
cv::Size(HOG_PARAMS.stride(),HOG_PARAMS.stride()),
cv::Size(0,0), locs);

//convert the feature to a Mat
cv::Mat desc_mat;
desc_mat.create(ders.size(), 1, CV_32FC1);
for(unsigned int i = 0; i < ders.size(); i++)
desc_mat.at<float>(i, 0) = ders[i];

float response = svm.predict(desc_mat);

现在我想使用 HOGDescriptor::detectMultiScale() 来检测图像中感兴趣的对象。为了将 CvSVM 转换为 HOGDescriptor 需要的原始形式,我使用了 https://stackoverflow.com/a/17118561/2197564 建议的方法。 :

detector_svm.h:

#ifndef DETECTOR_SVM_H
#define DETECTOR_SVM_H

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

class Detector_svm : public CvSVM
{
public:
std::vector<float> get_primal_form() const;
};

#endif //DETECTOR_SVM_H

detector_svm.cpp:

#include "detector_svm.h"

std::vector<float> Detector_svm::get_primal_form() const
{
std::vector<float> support_vector;

int sv_count = get_support_vector_count();

const CvSVMDecisionFunc* df = decision_func;
const double* alphas = df[0].alpha;
double rho = df[0].rho;
int var_count = get_var_count();

support_vector.resize(var_count, 0);

for (unsigned int r = 0; r < (unsigned)sv_count; r++)
{
float myalpha = alphas[r];
const float* v = get_support_vector(r);
for (int j = 0; j < var_count; j++,v++)
{
support_vector[j] += (-myalpha) * (*v);
}
}

support_vector.push_back(rho);

return support_vector;
}

但是,当我尝试设置 SVM 检测器时

HOGDescriptor hog;
hog.setSVMDetector(primal_svm); //primal_svm is a std::vector<float>

我得到失败的断言:

OpenCV Error: Assertion failed (checkDetectorSize()) in setSVMDetector, file /home/username/libs/OpenCV-2.3.1/modules/objdetect/src/hog.cpp, line 89
terminate called after throwing an instance of 'cv::Exception'
what(): /home/username/libs/OpenCV-2.3.1/modules/objdetect/src/hog.cpp:89: error: (-215) checkDetectorSize() in function setSVMDetector

我试过用 OpenCV 2.3.1 和 2.4.7 运行它;结果是一样的。

我做错了什么?

最佳答案

我遇到了同样的问题。我意识到我给了 HogDescriptor 函数错误的 winSize。 winSize 应与训练图像的尺寸相匹配。在我的例子中,我使用了 32x64 图像(用于训练),所以我需要使用 winSize=(32x64)。我设置检测器的代码如下所示。

 vector<float> primal;
svm.getSupportVector(primal);
cv::HOGDescriptor hog(cv::Size(32, 64), cv::Size(8, 8), cv::Size(4, 4), cv::Size(4, 4), 9);
hog.setSVMDetector(primal);

关于OpenCV:如何将 HOGDescriptor::detectMultiScale() 与自定义 SVM 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com