1.目标检测要解决的核心问题
除了图像分类之外,目标检测要解决的核心问题是:
a.目标可能出现在图像的任何位置。
b.目标有各种不同的大小。
c.目标可能有各种不同的形状。
如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。
2.目标检测相关算法:
DPM算法:先提取DPM人工特征,再用latentSVM分类。这种特征提取方式存在明显的局限性,首先,DPM特征计算复杂,计算速度慢;其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。
AlexNet:有5个卷积层(前五个)和3个全连接层(后三个),作者发现移除任意一层都会降低最终的效果。
OverFeat:
主要的亮点是:
a.共享卷基层用于多任务学习(提取候选框)。
b.全卷积网络思想。
c.在特征层进行滑窗操作(Sliding Window)避免大量重复运算,这也是后来的系列算法不断沿用和改进的经典做法。
几个明显的缺陷:
a.采用了多尺度贪婪的划窗策略,导致计算量还是很大
b.由于当时并没有太优秀的backbone网络,共享特征层的表征能力不是太强,没有考虑多尺度特征融合,对小目标效果差,整体的检测效果不尽如人意。ILSVRC 2013数据集上的mAP(可以简单的理解为检测准确率)为24.3%。
FCN)可以支持任意大小图片输入。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入也可以解决问题。
R-CNN:不采用滑动窗口方案
R-CNN检测时的主要步骤为:
1.使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。
2.把所有侯选框缩放成固定大小(原文采用227×227)。
3.用DCNN提取每个候选框的特征,得到固定长度的特征向量。
4.把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。
简单来说,RCNN使用以下四步实现目标检测:
a. 在图像中确定约1000-2000个候选框
b. 对于每个候选框内图像块,使用深度网络提取特征
c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
d. 对于属于某一特征的候选框,用回归器进一步调整其位置
缺点:
1.重复计算。R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。
2.训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。
3.速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。
4.输入的图片Patch必须强制缩放成固定大小(原文采用227×227),使用crop/warp归一化,会造成物体形变,导致检测性能下降。
SPPNet:将提取候选框特征向量的操作转移到卷积后的特征图上进行
SPPNet引入了Spatial Pyramid pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。
Fast RCNN:
其主要创新是RoI Pooling 层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。
方法解决了RCNN方法三个问题:
问题一:测试时速度慢
RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。
本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。
问题二:训练时速度慢
原因同上。
在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
问题三:训练所需空间大
RCNN中独立的分类器和回归器需要大量特征作为训练样本。
本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。
Faster RCNN:faster RCNN可以简单地看做“区域生成网络+fast RCNN“的系统
目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
在整个faster RCNN算法中,有三种尺度:
原图尺度:原始输入的大小。不受任何限制,不影响性能。
归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。
网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。
R-FCN:
R-FCN沿用了Faster R-CNN的基础上通过引入位置敏感得分图,将RoI-wise subnetwork消灭了,直接在位置敏感得分图上利用ROI Pooling进行信息采样融合分类和位置信息。
Mask R-CNN:
Faster R-CNN在做下采样和RoI Pooling时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。
YOLO系列:
YOLO舍去了候选框提取分支(Proposal阶段),直接将特征提取、候选框回归和分类在同一个无分支的卷积网络中完成,使得网络结构变得简单,检测速度较Faster R-CNN也有近10倍的提升。
算法将待检测图像缩放到统一尺寸,为了检测不同位置的目标,将图像等分成的网格,如果某个目标的中心落在一个网格单元中,此网格单元就负责预测该目标。
SSD
SSD对YOLO进行了改进,达到了和两阶段方法相当的精度,同时又保持了较快的运行速度。SSD也采用了网格划分的思想,和Faster RCNN不同的是它将所有的操作整合在一个卷积网络中完成。为了检测不同尺度的目标,SSD对不同卷积层的特征图像进行滑窗扫描;在前面的卷积层输出的特征图像中检测小的目标,在后面的卷积层输出的特征图像中检测大的目标。它的主要特点是:
- 基于多尺度特征图像的检测:在多个尺度的卷积特征图上进行预测,以检测不同大小的目标,一定程度上提升了小目标物体的检测精度。
- 借鉴了Faster R-CNN中的Anchor boxes思想,在不同尺度的特征图上采样候选区域,一定程度上提升了检测的召回率以及小目标的检测效果。
FPN:
FPN(Feature Pyramid Network)方法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到提升预测的效果的作用。FPN中预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式有所不同。
目前主流检测框架有4种使用特征的形式:
- 图像金字塔。即将图像缩放到不同的大小,然后不同大小的图像生成对应的特征。这种方法的缺点是增加了时间成本。有些算法会在检测时采用这种图像金字塔的方案。
- 单一尺度特征层。SPPNet,Fast RCNN,Faster RCNN采用这种方式,即仅采用网络最后一层卷积层的特征。
- SSD采用这种多尺度特征融合的方式,但是没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而足够低层的特征对于检测小物体是很有帮助的。
- FPN采用bottom-up与top-down的结构,实现了低层特征和高层语义特征的融合,提高了特征映射的信息密度和分辨率,提高了小目标物体的检测效果;区别于SSD,FPN每层都是独立预测的。