OpenCV:如何将HOGDescriptor::detectMultiScale()用于自定义SVM?

OpenCV:如何将HOGDescriptor::detectMultiScale()用于自定义SVM?,opencv,svm,Opencv,Svm,我用自己的正片和负片样本训练了一个关于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 f

我用自己的正片和负片样本训练了一个关于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);
我试着用OpenCV 2.3.1和2.4.7运行这个程序;结果是一样的


我做错了什么?

您训练的向量大小可能太小了。您需要确保训练时窗口的大小与描述符大小匹配 win_size=size(64128) 块大小=大小(16,16) 块体步幅=大小(8,8) 单元大小=大小(8,8) 如果(您的)原始svm.size()与hog.getDescriptorSize()不同,则会抛出该错误


我没有发现您的代码中有任何立即出错的地方,但一些样板文件显然丢失了。

您需要初始化类似猪的猪(cv::Size(64,64)、cv::Size(16,16)、cv::Size(8,8)、cv::Size(8,8),9),并确保参数值与您的匹配。

我不再有权访问原始代码

为了解决这个问题,我编写了自己的多尺度检测器,这比获得原始SVM形式的工作量要少


我建议现在有类似问题的人尝试升级到OpenCV 3.x。

我也有同样的问题。我意识到我给了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);
向量原始;
getSupportVector(原始);
cv::hog(cv::Size(32,64),cv::Size(8,8),cv::Size(4,4),cv::Size(4,4,9);
弓形探测器(原始);

您解决过这个问题吗?我也有同样的问题,我还没有解决。我写了自己的多尺度探测器来解决这个问题。
#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;
}
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
 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);