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 进行人员检测的主要内容,如果未能解决你的问题,请参考以下文章