c++ - 训练自定义 SVM 以在 OpenCV 中与 HOGDescriptor 一起使用

标签 c++ opencv svm

我正在尝试训练我自己的检测器以与 OpenCV::HOGDescriptor 一起使用,但我无法让现有的 HOGDescriptor 与我新训练的 SVM 一起工作。

我已经计算了正面和负面训练图像的 HOG 特征,标记它们并使用 CvSVM 训练 SVM。我使用的参数是:

    CvSVMParams params;
    params.svm_type =CvSVM::EPS_SVR;
    params.kernel_type = CvSVM::LINEAR;
    params.C = 0.01;
    params.p = 0.5;

然后我计算支持 vector 的原始形式,这样我只得到一个 vector 而不是很多 vector ,并使用 HOGDescriptor.setSVMDetector(vector); 设置计算出的支持 vector ;

This is Primal Form

当我使用 CvSVM.predict() 时,我能够使用 SVM 正确地对对象进行分类,但是 HOGDescriptor.detect() 或 detectMultiScale() 总是返回很多正匹配并且没有给出准确的预测。

CvSVM.predict() 使用原始支持 vector 进行分类,因此我计算原始形式的方式可能有问题。

有没有训练过自己的检测器的人可以为我指明正确的方向?

最佳答案

我写了一个 CvSVM 的子类来在训练线性支持 vector 机后提取原始形式。正样本标记为 1,负样本标记为 -1。奇怪的是,我必须在 alpha 前面加上负号并保持 rho 的符号不变,以便从 HogDescriptor 获得正确的结果。

线性支持 vector 机.h

#ifndef LINEAR_SVM_H_
#define LINEAR_SVM_H_
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

class LinearSVM: public CvSVM {
public:
  void getSupportVector(std::vector<float>& support_vector) const;
};  

#endif /* LINEAR_SVM_H_ */

线性SVM.cc

#include "linear_svm.h"    
void LinearSVM::getSupportVector(std::vector<float>& support_vector) const {

    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);
}

关于c++ - 训练自定义 SVM 以在 OpenCV 中与 HOGDescriptor 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15339657/

相关文章:

c++ - MFC中如何停止主线程和等待子线程

c++ - 形参1类型不完整错误

c++ - 为什么这行不通; opencv Mat_<float>

c - 访问 CIE L* a*b* 色彩空间中的像素信息

android - 在 android native C++ 中使用 Facemark opencv contrib

r - 在 SVM 中绘制 Roc 曲线

c++ - 提升 Asio : Calling sync read while an async_read is pending on the same socket

c++ - 捕获vector.erase()

r - 无法绘制 svm 图。 terms.default(x) 错误 : no terms component nor attribute

python - 在手写数字示例中使用 scikit-learn 实现 SVM 的特征提取器