C ++ OpenCV 3.4:HOG detectMultiScale()/ detect()问题

时间:2018-05-09 07:12:50

标签: c++ opencv

我遇到了detectmultiScale()函数的问题。我正在开发一个多个对象(汽车,树,建筑......)的对象识别器。为此,我训练了n个二进制SVM(object_i / no_object_i)。在测试集上(使用相同大小的补丁),我可以获得大约90%的准确度,这是相当不错的。但是,当我使用它们检测较大图像中的对象(即使用MultiScale())时,无论我使用何种模型,我都会在图像中间找到一个漂亮的窗口。

enter image description here

你对这里的问题有什么想法吗?我使用了detect()函数,在这种情况下,我确实得到了完全相反的情况。到处都是广场。

enter image description here

我也给了一个矢量作为函数参数来获得置信度权重。但是,返回的值总是在20 - 30左右。有人知道它们是什么意思吗?哪个因素应该正常化?

import csv
import io
import urllib.request
csv_response = urllib.request.urlopen(url)
lst = list(csv.reader(io.TextIOWrapper(csv_response)))

2 个答案:

答案 0 :(得分:0)

好的,我为线性SVM解决了这个问题。既然没有关于这一点的文档,也许它对其他人有用,所以:我们走了!

问题是alphas和rhos已经在内部乘以-1,因此需要这样做:

// get the support vectors
    cv::Mat sv = svm->getSupportVectors();
    sv = -sv;
    const int sv_total = sv.rows;
    // get the decision function
    cv::Mat alpha, svidx;
    double rho = svm->getDecisionFunction(0, alpha, svidx);
    std::vector< float > hog_detector(sv.cols + 1);
    memcpy(&hog_detector[0], sv.ptr(), sv.cols * sizeof(hog_detector[0]));
    hog_detector[sv.cols] = (float) rho;

之后它不能完美地运作,但是做了它应该做的事情,并且与错误的&#34;相比非常快。版本

答案 1 :(得分:0)

我也遇到同样的问题。无论输入什么测试图像,输出始终在中间有一个矩形,并且矩形始终出现在同一位置。

我用David Romero的解决方案修复了它!非常感谢!

// get the support vectors
    cv::Mat sv = svm->getSupportVectors();
    sv = -sv;
    const int sv_total = sv.rows;
    // get the decision function
    cv::Mat alpha, svidx;
    double rho = svm->getDecisionFunction(0, alpha, svidx);
    std::vector< float > hog_detector(sv.cols + 1);
    memcpy(&hog_detector[0], sv.ptr(), sv.cols * sizeof(hog_detector[0]));
    hog_detector[sv.cols] = (float) rho;

效果很好!