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

3

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

  1. 收集训练数据集(正向数据集和负向数据集)。
  2. 对于每个图像提取hog描述符,用于训练SVM(当前的'1'类标签为正向,'-1'类标签为负向)。
  3. 将训练好的SVM设置到HOGDescriptor中,并使用detect/detectMultiscale方法。

我已经完成了上述所有步骤。但是我困惑的是,HOGDescriptor.detect/detectMultiscale方法检测哪个类别?它只检测正向类别标签(1)吗?


这可能会对你有所帮助:http://www.geocities.ws/talh_davidc/ - SomethingSomething
1个回答

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

enter image description here

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和计算机视觉的新手。 - rjoniuqa
detectMultiScale 只返回正样本,但它们可以是真正的正样本(正确识别为人的对象)或假正样本(如汽车、树木等错误地被识别为人)。 - Kornel
我有一个关于使用自定义支持向量机的问题,正面图像数据集应该只包含人类,还是人类和背景?我读了一些其他帖子,有些人说需要背景,而其他人则说我必须在裁剪图像之前进行操作。 - Alexandra Tupu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接