【发布时间】:2013-02-26 16:37:39
【问题描述】:
我正在尝试训练我自己的检测器以与 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;
然后我计算支持向量的原始形式,这样我只得到一个向量而不是多个向量,并使用 HOGDescriptor.setSVMDetector(vector); 设置计算的支持向量;
当我使用 CvSVM.predict() 时,我能够使用 SVM 正确分类对象,但 HOGDescriptor.detect() 或 detectMultiScale() 总是返回很多正匹配并且不能给出准确的预测。
CvSVM.predict() 使用原始支持向量进行分类,因此我计算原始形式的方式可能有问题。
有没有人训练过自己的探测器,可以为我指明正确的方向?
【问题讨论】:
-
似乎从 libsvm 继承了一个错误,其中标签的顺序被弄乱了。 predict 函数知道顺序并查找哪个标签是哪个标签,因此可以正常工作。我通过将我的 +ve 标签设置为小于我的 -ve 的数字解决了这个问题,即 pos = 1,neg = 2。否则你可能必须通过乘以 -1 来反转你的模型。 (这就是为什么接受的答案有奇怪的负号)。我选择不这样做,以防他们修复错误(如果您使用预测,它不是真正的错误,但他们可以改变它)