提高准确性OpenCV HOG人体探测器

时间:2014-10-28 11:39:36

标签: c++ opencv detection

我在一个项目中工作。项目的一部分包括将OpenCV的HOG人员检测器与摄像头流式传输相结合。

目前正在使用相机和基本HOG检测器(CPP detectMultiScale - > http://docs.opencv.org/modules/gpu/doc/object_detection.html)。但是不能很好地工作......检测非常噪音,算法不是很准确......

为什么?

我的相机图像为640 x 480像素。

我正在使用的代码段是:

std::vector<cv::Rect> found, found_filtered;
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
hog.detectMultiScale(image, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);

为什么不能正常工作?什么需要提高准确性?是否需要一些特定的图像尺寸?

PS:你知道一些精确的人检测算法,更快,并在cpp ??

中发展

1 个答案:

答案 0 :(得分:33)

默认人物检测器的大小为64x128,这意味着您想要检测的人必须至少为64x128。对于你的相机分辨率,这意味着一个人在被正确检测之前必须占用相当大的空间。

根据您的具体情况,您可以尝试训练自己的HOG描述符,尺寸较小。如果您想训练自己的HOG描述符,可以查看this answerreferenced library

参数:

<强> win_stride: 如果输入图像的大小为640 x 480,而defaultpeopleDetector的窗口大小为64x128,则可以在输入图像中多次调整HOG Detection窗口(64x128窗口)。 winstride告诉HOG每次都将检测窗口移动一定量。 这是如何运作的: Hog将检测窗口放在输入图像的左上角。 并且每次都通过win_stride移动检测窗口。

喜欢这个(小win_stride): enter image description here

或者像这样(大win_stride) enter image description here

较小的测试版应提高准确性,但会降低性能,反之则

<强>填充 填充在输入图像的每一侧添加一定量的额外像素。这样,检测窗口位于输入图像的外面。这是因为HOG可以检测到非常靠近输入图像边缘的人。

<强> group_threshold group_treshold确定应将检测到的部分放在组中的值。 低值不提供结果分组,如果在检测窗口内找到阈值量,则较高值提供结果分组。 (根据我自己的经验,我从未需要更改默认值)

我希望这对你有点意义。 我过去几周一直在和HOG一起工作,并且阅读了很多论文,但是我丢失了一些参考文献,因此我无法将这些信息来自的页面链接到你,对不起。