提高 OpenCV HOG 人员检测器的准确性

Posted

技术标签:

【中文标题】提高 OpenCV HOG 人员检测器的准确性【英文标题】:Improving accuracy OpenCV HOG people detector 【发布时间】:2014-12-23 19:17:20 【问题描述】:

我正在做一个项目。项目的一部分包括将 OpenCV 的 HOG 人检测器与摄像头流集成。

目前它正在使用相机和基本的 HOG 检测器 (CPP detectMultiScale -> http://docs.opencv.org/modules/gpu/doc/object_detection.html)。但是效果不是很好...检测非常嘈杂,算法也不是很准确...

为什么?

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

我使用的 sn-p 代码是:

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 中开发?

【问题讨论】:

图像中的人必须至少具有 HOG 描述符的大小(不过要小一些),并且除了检测多尺度(afaik)之外,只会发现更大的人。您不能期望对此类一般“对象”的检测率接近 100%,但在流中您应该至少检测每个真实的人一次。您可以尝试跟踪这些人并验证/拒绝您之前检测到的人。 感谢您的回答米卡!你说:“至少是 HOG 描述符的大小”...但是 这个大小是多少? 你知道其他可能性还是只存在“getDefaultPeopleDetector”?非常感谢!! 这个网站可能对你有帮助:geocities.ws/talh_davidc 【参考方案1】:

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

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

对于参数:

win_stride: 假设您的输入图像大小为 640 x 480,并且默认peopleDetector 的窗口大小为 64x128,您可以在输入图像中多次拟合 HOG 检测窗口(64x128 窗口)。 winstride 告诉 HOG 每次移动检测窗口一定的量。 这是如何运作的: Hog 将检测窗口放在输入图像的左上角。 并且每次将检测窗口移动一个win_stride。

像这样(小win_stride):

或像这样(大 win_stride)

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

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

group_threshold group_treshold 通过检测到的部件何时应放置在组中来确定一个值。 低值不提供结果分组,如果在检测窗口内找到阈值量,则较高值提供结果分组。 (根据我自己的经验,我从来不需要更改默认值)

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

【讨论】:

您也可以调整(增大)图像的大小以找到较小的人。 非常感谢您的回答 Timmynator0!你怎么知道?你知道一些关于这个算法及其参数的文档吗?现在我对训练自己的 HOG 描述符不感兴趣。非常感谢你! :) @Ricardo 我更新了我的答案以反映您关于参数的新问题。如果这有帮助,请将我的答案标记为正确答案。 @Micka 不是图像大小的增加意味着性能更差吗?在不损失性能和避免训练模型的情况下捕获较小的人的解决方案是什么?有没有我们可以调整或类似的参数? @BC1554:预训练的 HoG 窗口检测最小尺寸约为 100 像素高度的人。这与训练有素的 HoG 特征及其窗口大小有关。 Afaik 这不能通过参数进行调整。如果您是身高 56 像素的人,那么人眼仍然可以很好地看到它们,但由于经过训练的特征而无法检测到。如果将大小增加 2 倍,质量仍然可以,并且 HoG 窗口非常适合,因此检测工作正常。

以上是关于提高 OpenCV HOG 人员检测器的准确性的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3 HOG 检测的信心?

OpenCV HOG 描述符参数

OpenCV + HOG +SVM:SVM 单特征向量需要帮助

HOG 用于“检测对象”opencv

Python和openCV:HOG描述符检测多尺度返回负边界框

使用 HOG+SVM Opencv 检测对象的矩形