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

Ric*_*rdo 12 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);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 33

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

根据您的具体情况,您可以尝试训练自己的HOG描述符,尺寸较小.如果您想训练自己的HOG描述符,可以查看此答案引用的库.

对于参数:

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

像这样(小win_stride): 在此输入图像描述

或者像这样(大win_stride) 在此输入图像描述

较小的wintride应提高准确性,但会降低性能,反之亦然

padding Padding在输入图像的每一侧添加一定量的额外像素.这样,检测窗口位于输入图像的外面.正是由于这种填充,HOG可以检测到非常接近输入图像边缘的人.

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

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