簡體   English   中英

C++ OpenCV 3.4:HOG detectMultiScale() / detect() 問題

[英]C++ OpenCV 3.4 : HOG detectMultiScale() / detect() issues

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

好的,我為線性 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;

之后它無法完美運行,但可以完成它應該做的事情,並且與“錯誤”版本相比非常快。

我也遇到同樣的問題。 無論輸入什么測試圖片,輸出的中間總是有一個矩形,矩形總是出現在同一個地方。

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

它運行良好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM