使用 HOG 和 SVM 进行头部检测

信息处理 图像处理 matlab 物体识别
2022-01-30 08:28:19

我目前正在尝试在一系列真实镜头图像中检测头部,并使用 HOG 特征描述符和 SVM 作为分类器。

目前我在这个链接中找到的 MATLAB 中 使用Dalal 的 HOG 实现代码:http: //www.mathworks.com/matlabcentral/fileexchange/46408-histogram-of-orientation-gradients--hog--code-using-matlab

目前我正在使用此链接中找到的libSVM MATLAB版本: http ://www.csie.ntu.edu.tw/~cjlin/libsvm/

我准备了 350 张正面训练图像和 1243 张负面训练图像。

将训练图像中提取的hog特征向量转换为libsvmFormat,输入libsvm训练方法,得到模型。hog 向量长度是 1764 的长度。

关于 libSVM,我选择了这些作为参数:

  • -s 0 (i.e. C-SVC)
  • -c 1 (i.e. cost = 1)
  • -t 2 (i.e. kernel = RBF)
  • -g 3 (i.e. gamma = 3 (this is for kernel))

关于 HOG 版本,我保留了 cell、bin 和 block 参数,因为它们在上面链接中显示的实现中。

我正在使用大小为 128x128 和 256x256 的扫描窗口扫描整个图像以检测可能的头部。在每个窗口中,为每个图像提取 hog 特征向量并输入到 libsvm predict 中,以测试是否应将其分类为头部。

但是,在完成上述所有操作之后,我有大量的假阴性并且无法弄清楚我做错了什么。

有经验的人可以就可能出现的问题提供一些建议吗?我真的需要弄清楚这一点。非常感激!

2个回答

这里要记住的是,HOG 对于平面内旋转并不是不变的。超过 10-15 度的方向变化可能会将其丢弃。因此,如果您的头部在图像中可以有不同的方向,您要么需要训练多个检测器,要么使用 HOG 以外的其他东西。

顺便说一句,extractHOGFeaturesComputer Vision System Toolbox中有一个函数,Statistics Toolbox中有SVM。请参阅此示例

编辑:从您的示例图像看来,在大多数情况下,您需要检测个人资料面孔。vision.CascadeObjectDetector在计算机视觉系统工具箱中可以为您做到这一点。为了提高鲁棒性,我会连续运行两个检测器:一个用于侧面,一个用于正面。而且,HOG 在这里可能不是您的最佳选择。对于人脸检测,Haar 或 LBP 功能通常效果更好。

不管你做什么,你都会有一些假阴性。因此,如果您使用的是摄像机,我还建议您跟踪面部。请参阅此示例这将使您有机会纠正在单个帧上犯的错误。

Edit2:您还可以使用 训练自己的检测器trainCascadeObjectDetector,并且可以使用trainingImageLabeler应用程序标记阳性样本。

有很多可能的问题。

首先,您应该快速检查一下您的误报情况如何,尤其是它们的合理性。如果有一些在视觉上与头部非常相似的误报,那么现在不要担心它们。

其次,您经常需要执行交叉验证来确定分类器中使用的参数集,而不是选择一组默认参数。同样常见的是,一个问题中的一组好的参数不适用于另一个问题。因此,您应该验证您的 SVM 参数是否最适合您的问题。

第三,众所周知,目标检测还需要后处理来修剪检测结果并处理可能的重叠结果。有时,即使是简单的启发式方法也能很好地工作。

最后,尝试使用 boost + cascade 重新训练错误分类的样本。