我正在尝试训练我自己的检测器以与 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 ;
当我使用 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/