Ask Your Question
0

Retrieve GPU HOG detector scores

asked 2017-05-08 12:37:30 -0600

Felipe gravatar image

Hi everyone, I'm using HOG detector to detect pedestrian

HOGDescriptor hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
hog.detectMultiScale(frame, detections, detectionScores, hit_threshold, Size(8,8), Size(32,32), 1.05, group_threshold);

Now I want to use the GPU version and to retrieve the detection scores, but I don't found any implementation or documentation about this. Is there a way to retrieve the detection scores for each sample?

edit retag flag offensive close merge delete

Comments

1

I've asked a similar question before: http://answers.opencv.org/question/11...

AFAIK, this is still not resolved.

Edit: Looking at my own question again, actually you can retrieve the confidence (detector scores) by setting group_threshold 0. It's embarrassing that I missed it.

nebgnahz gravatar imagenebgnahz ( 2017-05-23 18:15:53 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
1

answered 2017-05-24 14:28:25 -0600

nebgnahz gravatar image

For GPU version of the HOG, pass in the third parameter confidence as &vector<double> would work.

Note: you need to configure group_threshold 0 to retrieve the detector scores. See the example code below.

Documentation link: http://docs.opencv.org/3.2.0/de/da6/c...


Below is a minimal working example in case you are interested:

// g++ mwp.cpp -o hog --std=c++11 `pkg-config --cflags --libs opencv`
#include "opencv2/core/core.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/objdetect.hpp"
#include <iostream>

using namespace cv;

static void printUsage() { std::cout << "Usage: hog <image>\n"; }

int main(int argc, char **argv) {
  if (argc < 2) {
    printUsage();
    return 0;
  }

  //
  // Load Image
  //
  Mat frame = imread(argv[1], CV_LOAD_IMAGE_COLOR);
  Mat img;
  cvtColor(frame, img, COLOR_BGR2BGRA);
  cuda::GpuMat gpu_img;
  gpu_img.upload(img);

  //
  // Create Hog
  //
  Size win_size(64, 128);
  Size block_size(16, 16);
  Size block_stride(8, 8);
  Size cell_size(8, 8);
  int nbins = 9;
  cv::Ptr<cv::cuda::HOG> hog = cv::cuda::HOG::create(
      win_size, block_size, block_stride, cell_size, nbins);
  Mat detector = hog->getDefaultPeopleDetector();
  hog->setSVMDetector(detector);

  //
  // Do detection
  //
  hog->setGroupThreshold(0); // Important
  std::vector<Rect> found;
  std::vector<double> confidences;
  hog->detectMultiScale(gpu_img, found, &confidences);

  //
  // Show result
  //
  assert(found.size() == confidences.size());
  for (int i = 0; i < found.size(); i++) {
    Rect r = found[i];
    printf("(%d, %d, %d, %d), %3.2f\n", r.x, r.y, r.width, r.height,
           confidences[i]);
  }

  return 0;
}
edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2017-05-08 12:37:30 -0600

Seen: 1,414 times

Last updated: May 24 '17