文章目录
这篇文章本意是为了自己整理使用,觉得还是整理出一些脉络了,所以公开出来。本意为了自用,因此没有及时明确标注文章的来源,侵删。感谢各位大佬的blog指点,我仅仅做了整理的工作。
目标检测
干货 | 物体检测算法全概述:从传统检测方法到深度神经网络框架
检测算法通常包含三个部分,第一个是检测窗口的选择, 第二个是特征的设计,第三个是分类器的设计。
人工设计特征+浅层分类器 => 基于大数据和深度神经网络的End-To-End的物体检测框架
主要难点就是复杂光照情况(过暗、过曝)以及非刚性物体形变(如人体、手势的各种姿态)、低分辨率和模糊图片的检测场景。
传统检测算法(2012年之前的物体检测算法)
2001年,一篇基于Haar+Adaboost的检测方法
纵观2012年之前的物体检测算法,可以归结为三个方面的持续优化:
检测窗口的选择
暴力搜索候选框=>通过缩放一组图片尺寸,得到图像金字塔来进行多尺度搜索
**不足:**计算量很大并且效率不高
人脸具有很强的先验知识:比如人脸肤色YCbCr空间呈现很紧凑的高斯分布,通过肤色检测可以去除很大一部分候选区域。(不足:肤色提取只是用到简单的颜色先验,相似颜色干扰)
**改进:**提高精度衍生出如Selective Search或EdgeBox等proposal提取的方法,基于颜色聚类、边缘聚类的方法来快速把不是所需物体的区域给去除
特征的设计
Haar由于提取速度快,能够表达物体多种边缘变化信息,并且可以利用积分图快速计算
LBP更多的表达物体的纹理信息,对均匀变化的光照有很好的地适应性
HOG通过对物体边缘使用直方图统计来进行编码,特征表达能力更强
不足: 经验驱动,更新周期较长,改进: 不同的特征组合调优,从不同维度描述物体,如ACF检测,组合了20种不同的特征表达。
分类器的设计
传统的分类器包含Adaboost、SVM、Decision Tree等。
- Adaboost: 一个弱分类器往往判断精度不高,通过Adaboost自适应地挑选分类精度高的弱分类器并将它们加权起来,从而提升检测性能。
- SVM分类器: SVM通过最大化分类间隔得到分类平面的支持向量,在线性可分的小数据集上有不错的分类精度,另外通过引入核函数将低维映射到高维,从而线性可分,在检测场景被广泛使用。
比如线性SVM分类器就是一些支持向量,将物体表示为一些特征向量,实际当中学到的分类器就是一些系数向量,这些系数向量和特征向量做一个加权的话可以得到分类分数,对分数进行阈值判断,就可以判断是否是某一类。 - Decision Tree: 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶子节点代表一种类别。
- Random Forest 通过对决策树进行Ensemble,组合成随机森林更好的提高分类或者回归精度。(voting)
深度学习(2013以后)
R-CNN(穷举法)
Selective Search等Proposal窗口提取算法,对于给定的图像,不需要再使用一个滑动窗口进行图像扫描,而是采用某种方式“提取”出一些候选窗口,在获得对待检测目标可接受的召回率的前提下,候选窗口的数量可以控制在几千个或者几百个。
SPP
去掉了原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层。
为什么要引入SPP层呢?其实主要原因是CNN的全连接层要求输入图片是大小一致的,而实际中的输入图片往往大小不一,如果直接缩放到同一尺寸,很可能有的物体会充满整个图片,而有的物体可能只能占到图片的一角。
SPP对整图提取固定维度的特征,首先把图片均分成4份,每份提取相同维度的特征,再把图片均分为16份,以此类推。可以看出,无论图片大小如何,提取出来的维度数据都是一致的,这样就可以统一送至全连接层。
Fast R-CNN
使用Selective Search来进行区域提取,速度依然不够快。
使用一个简化的SPP层 —— RoI(Region of Interesting) Pooling层,其操作与SPP类似,同时它的训练和测试是不再分多步,不再需要额外的硬盘来存储中间层的特征,梯度也能够通过RoI Pooling层直接传播。
Fast R-CNN还使用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。
Faster R-CNN
Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域,每个区域对应一个目标分数和位置信息。
如图1,Faster RCNN其实可以分为4个主要内容:
- Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
- Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
RPN
**RPN的本质是 “ 基于滑窗的无类别obejct检测器 ” **
RPN网络结构就介绍到这里,总结起来就是:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
图4 RPN网络结构
上图4展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,
上面一条通过softmax分类anchors获得positive和negative分类,
下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
2.2 anchors
提到RPN网络,就不能不说anchors。所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出:
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
其中每行的4个值 ( x 1 , x 2 , x 3 , x 4 ) (x_1, x_2, x_3, x_4) (x1,x2,x3,x4) 表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为 { 1 : 1 , 1 : 2 , 2 : 1 } \{1:1, 1:2, 2:1\} { 1:1,1:2,2