【问题标题】:C++ OpenCV 3.4 : HOG detectMultiScale() / detect() issuesC++ OpenCV 3.4:HOG detectMultiScale() / detect() 问题
【发布时间】:2020-03-16 18:16:50
【问题描述】:

我在使用 detectmultiScale() 函数时遇到问题。我正在开发多个对象(汽车、树、建筑物……)的对象识别器。为此,我训练了 n 个二进制 SVM(object_i/no_object_i)。在测试集(具有相同大小的补丁)上,我得到大约 90% 的准确率,这非常好。然而,当我使用它们来检测更大图像中的对象(即使用 MultiScale() )时,无论我使用什么模型,我都会在图像中间得到一个漂亮的窗口。

您对这里可能出现的问题有任何想法吗?我使用了 detect() 函数,在这种情况下,我得到了完全相反的情况。到处都是正方形。

我还给出了一个向量作为函数参数以获得置信权重。但是,返回的值始终在 20 - 30 左右。有人知道它们是什么意思吗?它应该针对哪个因素进行归一化?

// get the support vectors
    cv::Mat sv = svm->getSupportVectors();
    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;


    //hog.winSize = cv::Size(64, 48);
    hog.setSVMDetector(hog_detector);

    //look for cars in an image:

    cv::Mat test_img = cv::imread(SCENE_IMG_PATH + "street_par150.jpg");
    cv::imwrite("result_1.jpg", test_img);

    std::vector<cv::Rect> obj_locations;
    std::vector<double> coinfidence_value;
    hog.detectMultiScale(test_img, obj_locations, coinfidence_value,0.00, cv::Size(4,4), cv::Size(0, 0), 1.05, 2.0, false);
    //what with normal?
    std::vector<cv::Point> obj_locs;
    std::vector<double> coinfidence_values;
    hog.detect(test_img, obj_locs,coinfidence_values, (0.0), cv::Size(4, 4), cv::Size(0,0));

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    好的,我为线性 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;
    

    之后它并不能完美地工作,但它会做它应该做的事情,并且与“错误”版本相比非常快。

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题。无论输入什么测试图片,输出的中间总是有一个矩形,并且矩形总是出现在同一个地方。

      我使用 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;
      

      效果不错!

      【讨论】:

      • 很高兴听到这个消息!如果您可以标记答案以便其他人知道它有效,那就太好了;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2018-10-07
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2015-09-14
      相关资源
      最近更新 更多