问题描述
我试图训练我自己的探测器使用OpenCV :: HOGDescriptor,但我有麻烦使现有的HOGDescriptor工作与我新训练的SVM。
I'm trying to train my own detector for use with OpenCV::HOGDescriptor but I'm having trouble making the existing HOGDescriptor work with my newly trained SVM.
我已经计算了正面和负面训练图像的HOG特征,标记他们,并使用CvSVM训练SVM。我使用的参数是:
I have calculated HOG features for positive and negative training images, labeled them and trained the SVM using CvSVM. The parameters I have used are:
CvSVMParams params;
params.svm_type =CvSVM::EPS_SVR;
params.kernel_type = CvSVM::LINEAR;
params.C = 0.01;
params.p = 0.5;
然后我计算支持向量的Primal形式,使得我只得到一个向量,使用HOGDescriptor.setSVMDetector(vector)计算支持向量;
Then I calculate Primal Form of the support vectors so that I only get one vector instead of many and set the calculated support vector using HOGDescriptor.setSVMDetector(vector);
当我使用CvSVM.predict()时,我能够使用SVM正确分类对象,但HOGDescriptor.detect ()或detectMultiScale()总是返回大量的正匹配,并且不给出准确的预测。
When I use CvSVM.predict() I am able to correctly classify objects with the SVM, but HOGDescriptor.detect() or detectMultiScale() always returns a lot of positive matches and does not give accurate predictions.
CvSVM.predict()使用原始的支持向量进行分类,因此我计算原始形式的方式可能有问题。
CvSVM.predict() uses the original support vectors for classification so there might be something wrong with the way I'm calculating primal form.
有没有人训练自己的探测器,能指出我的方向?
Is there anyone who has trained their own detector who can point me in the right direction?
推荐答案
我写了一个CvSVM的子类来在线性svm被训练之后提取原始形式。阳性样品标记为1,阴性样品标记为-1。奇怪的是,我必须在alphas前面放负号,并留下rho的符号不变,以从HogDescriptor获得正确的结果。
I wrote a child class of CvSVM to extract primal form after a linear svm is trained. Positive samples are labeled 1 and negative samples are labeled -1. It is strange that I have to put negative sign in front of alphas and leaving the sign of rho unchanged in order to get correct results from HogDescriptor.
LinearSVM.h
LinearSVM.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_ */
LinearSVM.cc
LinearSVM.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);
}
这篇关于训练自定义SVM以与OpenCV中的HOGDescriptor一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!