1. 行人检测算法研究综述
- 参考资料:https://zhuanlan.zhihu.com/p/51438953
- 要解决的问题:找出图像或视频帧中所有的行人,包括位置和大小,一般用矩形框表示。
- 主要难题: 外观差异大,遮挡问题,背景复杂,检测速度。
- 行人数据库: INRIA 数据库、Caltech 数据库和 TUD 行人数据库。
目标检测现在主要分为以下几个方向:
-
(1)基于运动检测的算法——背景建模。只利用像素级的信息,没有利用图像中更高层的语义信息。利用背景建模方法,提取出前景运动的目标,在目标区域内进行特征提取,然后利用分类器进行分类,判断是否包含行人;
- 只能检测运动目标,不处理静止目标
- 受光照变化、阴影影响大
- 目标伪装色造成漏检和断裂
- 受恶劣天气,雨雪,以及树叶摇晃等干扰物的影响
- 多目标粘连,重叠,则无法处理。
-
(2)基于机器学习的方法(现阶段行人检测算法的主流),也是目前行人检测最常用的方法,根据大量的样本构建行人检测分类器。提取的特征主要有目标的灰度、边缘、纹理、颜色、梯度直方图等信息。分类器主要包括神经网络、SVM、adaboost以及现在被计算机视觉视为宠儿的深度学习。
- 人工特征(括颜色,边缘,纹理等)+分类器(有神经网络,线性SVM,AdaBoost,随机森林等计算机视觉领域常用的算法)
统计机器学习目前存在的难点:
-
-
- 行人的姿态、服饰各不相同、复杂的背景、不同的行人尺度以及不同的光照环境。
- 提取的特征在特征空间中的分布不够紧凑;
- 分类器的性能受训练样本的影响较大;
- 离线训练时的负样本无法涵盖所有真实应用场景的情况;
-
目前的行人检测基本上都是基于法国研究人员Dalal在2005的CVPR发表的HOG+SVM的行人检测算法(Histograms of Oriented Gradients for Human Detection, Navneet Dalel,Bill Triggs, CVPR2005)。HOG+SVM作为经典算法也集成到opencv里面去了,可以直接调用实现行人检测。
为了解决速度问题可以采用背景差分法的统计学习行人检测,前提是背景建模的方法足够有效(即效果好速度快),目前获得比较好的检测效果的方法通常采用多特征融合的方法以及级联分类器。(常用的特征有Harry-like、Hog特征、LBP特征、Edgelet特征、CSS特征、COV特征、积分通道特征以及CENTRIST特征)。
-
(3)基于深度学习的算法(不能满足实际应用中的要求)
- 通用目标检测框架:Faster-RCNN、SSD、FPN、YOLO
- 优点:相比之前的 SVM 和 AdaBoost 分类器,精度有显著的提升
- 参考资料:https://blog.csdn.net/dengheCSDN/article/details/77987627 写的概述比较好
- https://blog.csdn.net/carson2005/article/details/8316835 行人检测简述 CSDN排名266
- https://blog.csdn.net/SIGAI_CSDN/article/details/80693322 CSDN排名6211,写的还可以
https://blog.csdn.net/SIGAI_CSDN/article/details/80693322的内容提要如下:
2. 基于机器学习的方法:人工特征+分类器
2.1 HOG+SVM
人体有自身的外观特征,我们可以手工设计出特征,然后用这种特征来训练分类器用于区分行人和背景。这些特征包括颜色,边缘,纹理等机器学习中常用的特征,采用的分类器有神经网络,SVM,AdaBoost,随机森林等计算机视觉领域常用的算法。由于是检测问题,因此一般采用滑动窗口的技术,这在SIGAI之前的公众号文章“人脸检测算法综述”,“基于深度学习的目标检测算法综述”中已经介绍过了。
行人检测第一个有里程碑意义的成果是Navneet Dalal在2005的CVPR中提出的基于HOG + SVM的行人检测算法[5]。Navneet Dalal是行人检测中之前经常使用的INRIA数据集的缔造者。
梯度方向直方图(HOG)是一种边缘特征,它利用了边缘的朝向和强度信息,后来被广泛应用于车辆检测,车牌检测等视觉目标检测问题。HOG的做法是固定大小的图像先计算梯度,然后进行网格划分,计算每个点处的梯度朝向和强度,然后形成网格内的所有像素的梯度方向分布直方图,最后汇总起来,形成整个直方图特征。
这一特征很好的描述了行人的形状、外观信息,比Haar特征更为强大,另外,该特征对光照变化和小量的空间平移不敏感。下图为用HOG特征进行行人检测的流程:
得到候选区域的HOG特征后,需要利用分类器对该区域进行分类,确定是行人还是背景区域。在实现时,使用了线性支持向量机,这是因为采用非线性核的支持向量机在预测时的计算量太大,与支持向量的个数成正比。如果读者对这一问题感兴趣,可以阅读SIGAI之前关于SVM的文章。
目前OpenCV中的行人检测算法支持HOG+SVM以及HOG+Cascade两种,二者都采用了滑动窗口技术,用固定大小的窗口扫描整个图像,然后对每一个窗口进行前景和背景的二分类。为了检测不同大小的行人,还需要对图像进行缩放。
- HOG计算梯度方向和强度->梯度直方图,比Haar特征更为强大,且对光照变化和小量空间平移不敏感。
- 得到HOG特征后,使用分类器进行分类。线性SVM,非线性SVM计算量太大。
- OpenCV支持HOG+SVM和HOG+Cascade,都采用滑动窗口技术。
2.2 HOG+Adaboost
由于HOG + SVM的方案计算量太大,为了提高速度,后面有研究者参考了VJ[6]在人脸检测中的分类器设计思路,将AdaBoost分类器级联的策略应用到了人体检测中,只是将Haar特征替换成HOG特征,因为Haar特征过于简单,无法描述人体这种复杂形状的目标。下图为基于级联Cascade分类器的检测流程:
图中每一级中的分类器都是利用AdaBoost算法学习到的一个强分类器,处于前面的几个强分类器由于在分类器训练的时候会优先选择弱分类器,可以把最好的几个弱分类器进行集成,所有只需要很少的几个就可以达到预期效果,计算会非常简单,速度很快,大部分背景窗口很快会被排除掉,剩下很少一部分候选区域或通过后续的几级分类器进行判别,最终整体的检测速度有了很大的提升,相同条件下的预测时间只有基于SVM方法的十分之一。
2.3 ICF+AdaBoost
HOG特征只关注了物体的边缘和形状信息,对目标的表观信息并没有有效记录,所以很难处理遮挡问题,而且由于梯度的性质,该特征对噪点敏感。针对这些问题后面有人提出了积分通道特征(ICF)[7],积分通道特征包括10个通道:
6 个方向的梯度直方图,3 个LUV 颜色通道和1 梯度幅值,见下图,这些通道可以高效计算并且捕获输入图像不同的信息。
在这篇文章里,AdaBoost分类器采用了soft cascade的级联方式。为了检测不同大小的行人,作者并没有进行图像缩放然后用固定大小的分类器扫描,而是训练了几个典型尺度大小的分类器,对于其他尺度大小的行人,采用这些典型尺度分类器的预测结果进行插值来逼近,这样就不用对图像进行缩放。因为近处的行人和远处的行人在外观上有很大的差异,因此这样做比直接对图像进行缩放精度更高。这一思想在后面的文章中还得到了借鉴。通过用GPU加速,这一算法达到了实时,并且有很高的精度,是当时的巅峰之作。
2.4 DPM+ latent SVM
行人检测中的一大难题是遮挡问题,为了解决这一问题,出现了采用部件检测的方法,把人体分为头肩,躯干,四肢等部分,对这些部分分别进行检测,然后将结果组合起来,使用的典型特征依然是HOG,采用的分类器有SVM和AdaBoost。针对密集和遮挡场景下的行人检测算法可以阅读文献[15]。
DPM(Deformable Parts Models)算法在SIGAI在之前的文章“基于深度学习的目标检测算法综述”已经提到过。这是是一种基于组件的检测算法,DPM检测中使用的特征是HOG,针对目标物不同部位的组建进行独立建模。DPM中根模型和部分模型的作用,根模型(Root-Filter)主要是对物体潜在区域进行定位,获取可能存在物体的位置,但是是否真的存在我们期望的物体,还需要结合组件模型(Part-Filter)进行计算后进一步确认,DPM的算法流程如下:
DPM算法在人体检测中取得取得了很好的效果,主要得益于以下几个原因:
- 基于方向梯度直方图(HOG)的低级特征(具有较强的描述能力)
- 基于可变形组件模型的高效匹配算法
- 采用了鉴别能力很强的latent-SVM分类器
DPM算法同时存在明显的局限性,首先,DPM特征计算复杂,计算速度慢(论文[8]中针对DPM提出了多个加速的策略,有兴趣的读者可以参考);其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。这些弊端很大程度上限制了算法的应用场景,这一点也是基于人工特征+分类器的通病。
采用经典机器学习的算法虽然取得了不错的成绩,但依然存在下面的问题:
1.对于外观,视角,姿态各异的行人检测精度还是不高
2.提取的特征在特征空间中的分布不够紧凑
3.分类器的性能受训练样本的影响较大
4.离线训练时的负样本无法涵盖所有真实应用场景的情况
基于机器学习的更多方法以参考综述文章[10][18][19]。文献[10]对常见的16种行人检测算法进行了简单描述,并在6个公开测试库上进行测试,给出了各种方法的优缺点及适用情况。
文献[18]提出了Caltech数据集,相比之前的数据集,它的规模大了2个数量级。作者在这个数据集上比较了当时的主要算法,分析了一些失败的的原因,为后续的研究指出了方向。
文献[19]也比较了10年以来的行人检测算法,总结了各种改进措施,并支持了以后的研究方向。
3. HOG+SVM环境配置
3.1 数据集INRIADATA
来自HOG+SVM的论文,论文中使用的图片是归一化之后的。
训练和测试的时候有几种选择方式:
用normalized_images目录下的图片做训练,或者用original_images目录下的图片+annotations获取行人区域做训练;测试则都在original_images/test/pos上测试。
这个数据集来自于 github搜索关键字:HOG+SVM ,或者github搜索关键字:HOG+SVM行人检测,后者star最多的的 https://github.com/icsfy/Pedestrian_Detection,找不到原作者了。反正就是作者已经分好了如下的数据集:
- https://blog.csdn.net/baiyu33/article/details/51762368 感谢这位捉急的博主辛苦的整理!
- 整理后的数据集有点大,上传百度网盘了:http://pan.baidu.com/s/1eSdlw7g ,他分享的百度云下载!感谢!
3.2 算法原理
资料:https://blog.csdn.net/hongbin_xu/article/details/79810544 HOG特征检测学习笔记,MATLAB code求HOG。
3.2.1 HOG梯度方向直方图 Histogram of Oriented Gradients
- 特征描述子:特征向量作为SVM的输入很重要,选取怎样的特征决定了分类的准确率。
- 哪些特征是有用的呢?哪些特征冗余?特征需要有很好的区分能力。
- HOG特征描述子,选用梯度方向的分布作为特征。梯度是描述边缘信息的。
如何计算HOG梯度方向直方图呢?
- 图像需要保持固定的长宽比,如1:2。从原始图像得到小的切片。如得到64*128的切片
- 再把64*128的切片分成8*8的Cell。用特征描述子描述图像的一小块,用更细微的方式刻画了原图像。
- 梯度方向图+梯度强度图,方向在[0,180],经验表明:无符号的梯度比有符号梯度效果更好。
- 计算梯度方向直方图:每个bin是按照梯度方向选出来的。一般是9个bin
- 总结:8*8的cell用9*1的直方图表示,4个cell组成一个block,block为16*16。所以一个block有4*9*1=36*1的列向量表示HOG特征。那么对于一个64*128的图像而言,其特征的维度为:7*15*36=3780。
梯度方向直方图Histogram of Oriented Gradients (HOG) 这篇文章详细描述了HOG特征是如何提取和计算的,超级棒!
关键的几张图示如下:
其他资料:
https://blog.csdn.net/carson2005/article/details/8316835 CSDN 266
https://blog.csdn.net/hongbin_xu/article/details/79845290 CSDN 3081 code
https://blog.csdn.net/qq_37753409/article/details/79047063 CSDN C++ code
https://www.cnblogs.com/heleifz/p/train-hog-svm-detector.html
- Vlfeat有一个HOG的实现,比OpenCV的实现要好。
- 按照这种策略训练出来的检测器,在 INRIA 上达到了 Precision:50%,Recall:71% 的性能,超过了 OpenCV 自带的 HOG Detector(其实没有可比性,因为我用了更好的 HOG 特征),如果您有更好的方案,请告诉我,谢谢。
https://blog.csdn.net/Young__Fan/article/details/85000200 HOG+SVM参考资料大合集
3.2.2 使用线性SVM进行训练
提取特征+分类器,提取了好的特征,那么用什么样的分类器都能得到不错的结果。
为什么使用线性SVM?
- 2.1节中有提到:线性SVM的速度较快。
- 同时什么时候使用逻辑回归、神经网络和SVM呢?在吴恩达的机器学习课程中有提到:参见别人的笔记 coursera-斯坦福-机器学习-吴恩达-第7周笔记-支持向量机SVM
另外一个问题什么时候选择SVM或逻辑回归?如图:
1. 特征维度n很大:
使用逻辑回归和线性SVM.
2. 特征维度n小,样本数量m中等:
使用高斯核SVM。
3. 特征维度n小,且样本数量m巨大:
- 可以创建新的特征
- 然后使用逻辑回归和无核SVM
什么是线性SVM?
左图就是线性SVM,就是不使用核函数,将送入SVM,形成一个大间距分类器。后者使用了高斯核函数,可以得到复杂的曲线边界。
3.3.3 代码
- matlab代码: https://github.com/jmrf/HOG-Pedestrian-Detector
- opencv HOG+SVM行人检测:https://github.com/icsfy/Pedestrian_Detection