OpenCV - 使用 SVM 和 HOG 进行人员检测

Posted

技术标签:

【中文标题】OpenCV - 使用 SVM 和 HOG 进行人员检测【英文标题】:OpenCV - Using SVM and HOG for person detection 【发布时间】:2016-05-01 07:48:27 【问题描述】:

我知道完成此任务所需的步骤:

    收集训练集(正集和负集)。 提取用于训练 SVM 的每个图像的 hog 描述符(当前“1”类标签用于正样本,“-1”类标签用于负样本)。 将经过训练的 SVM 设置为 HOGDescriptor 并使用检测/检测多尺度。

我已完成上述所有步骤。我很困惑,HOGDescriptor.detect/detectMultiscale 检测到哪个类?它是否只检测到正类标签 (1)?

【问题讨论】:

这可能对你有帮助:geocities.ws/talh_davidc 【参考方案1】:

在计算机视觉中,视觉描述符或图像描述符(即 HoG)是对图像内容的视觉特征的描述。它们描述了诸如形状、颜色、纹理或运动等基本特征。因此,HoG 描述符仅表征场景 - 如图所示,即在街上行走的行人,您可以在下面看到一个示例 HoG 描述符(HoG 仅计算图像局部部分中梯度方向的出现):

SVM 是一组用于分类、回归和异常值检测的监督学习方法。但最初,SVM 是一种用于构建最佳二元(2 类)分类器的技术,因此 SVM 可以决定描述符的含义。也就是说,HoG 的输出是 SVM 的输入,而后者的输出是 +1 或 -1。

OpenCV 提供了一个隐藏此操作的接口,并且可以通过函数调用来完成完整的对象检测。这就是HOGDescriptor::detectMultiScale() 所做的,它使用多尺度窗口执行对象检测。一旦声明了 cv::HOGDescriptor hog 实例,那么 SVM 分类器的系数也应该通过以下方式完成:

hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());

然后detectMultiScale()进行完整的对象检测(描述符提取和二元分类一起)并返回每个候选者的边界框:

std::vector<cv::Rect> found;
hog.detectMultiScale(frame, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);

【讨论】:

感谢您的回复。就我而言,我想使用自定义 SVM 来检测人(不是默认值)。我已经通过提取正面和负面图像的 hog 描述符训练了一个线性 SVM,并且我还能够通过使用 hog.setSVMDetector(svm.getSupportVectors()) 将 hog 设置为使用经过训练的 svm。让我感到困惑的是detectMultiScale。它是否检测到负类(没有人)或正类(人)?抱歉,我只是 opencv 和计算机视觉的新手。 detectMultiScale 只返回正数,但它们可以是真正数(正确识别为人的对象)或误报(错误识别为人的汽车、树木等对象) 我有一个关于使用自定义 SVM 的问题,带有正面图像的数据集应该只包含人类还是有背景的人类?我读了一些其他帖子,有些人告诉他们需要背景,而其他人则说我必须先裁剪图像

以上是关于OpenCV - 使用 SVM 和 HOG 进行人员检测的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习笔记SVM+HOG

将 svm 分类器设置为 HOG 检测器

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

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

HOG + SVM(行人检测, opencv实现)

如何用opencv在一周内实现人物行为语义识别