目标检测:
目标检测的目标是确定某张给定图像中是否存在给定类别(比如人、车、自行车、狗和猫)的目标实例;如果存在,就返回每个目标实例的空间位置和覆盖范围(比如返回一个边界框)。
目标检测的意义
作为图像理解和计算机视觉的基石,目标检测是解决分割、场景理解、目标追踪、图像描述、事件检测和活动识别等更复杂更高层次的视觉任务的基础。目标检测在人工智能和信息技术的许多领域都有广泛的应用,包括机器人视觉、消费电子产品、安保、自动驾驶、人机交互、基于内容的图像检索、智能视频监控和增强现实。
目标检测的过程:
传统的目标检测方法一般分为三个阶段:首先在给定的图像上选择一些候选区域,然后对这些区域提取特征,最后使用分类器进行分类。
目标检测面临的难点:
高准确度(Loc acc.+Reg acc.)
高效性(时间、内存效率)
两级式(2-stage):区域提议+检测(R-CNN系列),主要倾向于准
单级式(1-stage):无区域提议框架,提议和检测是整体的(SSD,YOLO系列),主要倾向于快
R-CNN是利用卷积神经网络进行“目标检测”的开山之作,其意义深远
R-CNN流的发展过程:
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
实现步骤:
1)Region Proposal+Crop/Wrap归一化:通过SS方法生成约2000个候选区域,并将候选区域resize成固定大小(227*227)
2)对每个框进行CNN特征提取:对每个候选区域提取卷积特征图,得到4096-d的向量
3)SVM分类+边界回归:将2000个特征向量送入SVM学习N个SVM分类器
每个分类器用来对特定类别分类,预测出候选区域中所含物体属于每个类的概率值。由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。
通过回归方法得到目标b-box
定位精度:利用IoU来近似表示
思路:假设得到的物体检测框与实际标注的物体边界框存在一个线性变化,则可以通过学习线性变换参数的方法实现位置精修。通过学习线性变换参数,从而得出使得loss函数最小的线性变换。
R-CNN的贡献:
1)使用ImageNet训练好的优质模型,在PASCAL VOC数据集上机芯微调,因为大数据集图像高达几百万,利用卷积网络充分学习了浅层特征,之后在小数据集上微调后进行特征提取,获得了好多特征提取效果。
2)使用b-box regression进行了目标包围框的修正
R-CNN的缺点:
1)SS耗时:每幅图像的SS需要花费2s
2)每个候选区域内的图像都要经过一次AlexNet,为所有的框提取特征大约花费47s,且每个特征都要存储下来,浪费空间。
3)三个模块(SS+特征提取+分类)是分别训练的,导致训练分类器时没有更新网络参数,且对存储空间消耗很大
4)所有的框都暴力归一化到统一大小227*227,造成图像内容损失,引起物体形变,影响精度。
R-CNN的主要特点有以下三点:
1)利用了selective search方法,即先通过实例分割将图像分割为若干小块,然后选择相似度较高的小块,把这些相似小块合并为一个大块,最后整个物体生成一个大的矩形框,通过这种方法大大提高候选区域的筛选速度。
2)用在ImageNet数据集上进行学习的参数对神经网络进行预处理,解决了在目标检测训练过程中标注数据不足的问题。
3)通过线性回归模型对边框进行校准,减少图像中的背景空白,得到更精确的定位。
4)该方法将PASCAL VOC上的检测率从35.1%提升到了53.7%,其意义与AlexNet在2012年取得分类任务的大突破是相当的,对目标检测领域影响深远。
该方法提出的最初原因是为了解决全连接层的输入要求大小统一的问题,SPP层可以和R-CNN结合起来提升网络性能。R-CNN中采用暴力resize的方法将所有的框都归一化为227*227,但这会影响识别精度,于是SPPnet在CNN层与全连接层之间插入了空间金字塔池化层来解决该矛盾。
假定CNN层得到的特征图大小为a×a(比如13×13,随输入图片大小而变化),设定的金字塔尺度为n×n bins(对于不同大小图片是固定的),那么SPP层采用一种滑动窗口池化,窗口大小win_size=⌈a/n⌉,步长为stride=⌊a/n⌋,采用max pooling,本质上将特征图均分为n×n个子区域,然后对各个子区域max pooling,这样不论输入图片大小,经过SPP层之后得到是固定大小的特征。一般设置多个金字塔级别,文中使用了4×4,2×2和1×1三个尺度。
每个金字塔都得一个特征,将它们连接在一起送入后面的全连接层即可,这样就解决了变大小图片输入的问题了。SPP-net在ImageNet ILSVRC 2014图像分类大赛中夺得了第三名。
空间金字塔池化过程:
输入图像 → \to → 卷积层 → \to → 三种不同尺度的最大池化( 4 × 4 , 2 × 2 , 1 × 1 4\times 4,2\times 2,1\times 1 4×4,2×2,1×1) → \to → 三组向量组合成一个固定大小的特征向量
SPPnet和R-CNN的关系:
R-CNN中送入全连接层的特征必须是相同大小的,于是就使用暴力resize方法将其统一大小,会导致出现形变而影响精度。SPP层就很好的利用池化的方法来解决该问题,可以大大减少计算量并提升计算速度,基于SPP的R-CNN在模型准确度上的提升不是很大,但在速度上比原始R-CNN模型快24-102倍,这也正是Fast R-CNN所改进的方向。
SPPnet工作过程:
1)利用SS方法获得区域提议,通过Stride区域映射的方法,在卷积层的后面加入位置信息,便于在卷积特征图中找到每个区域的位置。
2)对整张图进行卷积特征提取,解决了卷积层的重复计算的问题
3)空间金字塔池化,也就是替换最后一个池化层为SPP pooling layer
4)SVM分类
缺点:
1)提取候选框 | 计算CNN特征 | SVM分类 | 回归训练过程都是各自独立的,大量中间结果需要转存,无法整体训练参数
2)无法同时微调卷积层和全连接层,在很大程度上限制了CNN的效果
3)候选区域仍然使用SS方法,很耗时
Fast R-CNN如其名,在R-CNN的基础上增加了RoI pooling层,并且简化了模型,大幅度提高了检测速度。
特点:
1)共享卷积特征:借鉴SPP的方法,对输入图像首先进行CNN,之后在从特征图中取出候选区域的内容进行后续过程,加速了检测过程。
2)提出了RoI pooling层,借鉴SPP pooling,但只是用单尺度的max pooling,来获得固定长度的特征图
RoI pooling层的Caffe官方实现,RoI pooling层在大部分深度学习框架中是没有官方实现的,需要自己扩展,Tensorflow上的开源实现可以参考deepsense-ai/roi-pooling,但是在TensorFlow中可以基于一种crop+resize+pooling的方式,可以看一下Luminoth上的实现)
RoI pooling 过程
4)将R-CNN的串行结构改成了并行结构,也就是可以同时进行分类+回归
Fast R-CNN的工作过程:
1)使用SS方法生成一系列的候选区域
2)对整幅图像进行卷积特征提取,将最后一层的池化层替换为RoI pooling层,输出固定长度的特征向量
3)将特征向量输入全连接层,用于多任务学习并计算多任务损失,输出两个分支:
4)通过NMS处理获得最终的目标检测和识别结果
论文提出的重要讨论结果:
1)多任务的训练相比独立训练,效果确有提升,但时间开销也更大
2)在更大的数据集上(VOC)训练后,效果确有提升
3)softmax比SVM表现略好,引入了类间竞争
4)更多的候选区域不一定带来更多的精度提升
存在的问题:
依然靠SS来提取候选框,很耗时
针对Fast R-CNN的使用传统方法进行区域提议方法的不足,提出了RPN来直接实现区域提议,使得检测任务可以由神经网络端到端的完成,且RPN和CNN是共享卷积的,计算量很小,Faster R-CNN=Fast R-CNN+RPN,在精度方面也达到了SOTA(State Of The Art)。
网络结构图(基于ZF):
RPN网络:将proposal这一任务建模为二分类问题(是目标物体/不是目标物体)
RPN本质上是一个树状结构:
树干是一个 3 × 3 3\times3 3×3的卷积层,获得256个不同的特征图
树枝是两个 1 × 1 1\times1 1×1的卷积层
一个解决了前后景的输出(对于每个像素点,输出9个anchor,每个anchor有一个前景分数和一个背景分数,故输出 2 × 9 = 18 2\times 9=18 2×9=18个值)
另一个解决了边框和anchor的偏移位置输出(对于每个像素点,输出 4 × 9 = 36 4\times 9=36 4×9=36个值)
RPN工作原理:
RPN依靠一个在共享特征图上的滑动窗口,为每个像素位置生成9种预先设置好长宽比与面积的目标框(anchor),包含三种面积( 128 × 128 , 256 × 256 , 512 × 512 128\times 128,256\times 256,512\times 512 128×128,256×256,512×512),每种面积包含三种长宽比(1:1,1:2,2:1),示意图如下:
假设特征图大小为 40 × 90 40\times90 40×90,那么RPN生成的初始anchor总数约为20k个( 40 × 60 × 9 40\times60\times9 40×60×9)。
对于生成的anchor,RPN要做两件事:
首先要判断是前景还是背景,也就是判定这个anchor到底有没有覆盖到目标(使用softmax直接训练,在训练时排除掉超越图像边界的anchor)
其次是为属于前景的anchor进行第一次坐标修正(使用smooth L1 损失进行训练)。
anchor的正样本标定方法:
anchor的负样本标定方法:
训练RPN的loss=cls loss+reg loss
L ( p i , t i ) = 1 N c l s Σ i L c l s ( p i , p i ∗ ) + λ 1 N r e g Σ i p i ∗ L r e g ( t i , t i ∗ ) L({p_i},{t_i})=\frac{1}{N_{cls}}\Sigma_iL_{cls}(p_i,p_i^*)+\lambda \frac{1}{N_{reg}}\Sigma_ip_i^*L_{reg}(t_i,t_i^*) L(pi,ti)=Ncls1ΣiLcls(pi,pi∗)+λNreg1Σipi∗Lreg(ti,ti∗)
为了边界框的回归,我们依据如下方式进行四个坐标的参数化:
其中,x,y,w和h分别表示边界框的中心坐标、宽和高。
变量 x x x, x a x_a xa和 x ∗ x^* x∗分别表示预测框、锚框和真实框,这可以被认为是从锚框到邻近真实边界框的回归。
四步交替优化法,使得学习到RPN和CNN共享特征的统一网络
训练RPN,使用ImageNet预训练模型进行初始化,对区域提议任务进行端到端的微调
使用由第一步RPN生成的提议,由Fast R-CNN训练单独的检测网络。该检测网络也由ImageNet的预训练模型进行初始化。此时两个网络不共享卷积层。
使用检测器网络来初始化RPN训练,但是我们修正共享的卷积层,并且只对RPN特有的层进行微调。现在这两个网络共享卷积层。
保持共享卷积层的固定,对Fast R-CNN的独有层进行微调。
注意:
1)训练时忽略超过图像边界的anchor boxes(不收敛且误差难以纠正),测试时剪切跨边界的框。
2)一些RPN proposals相互高度重叠,为了减少冗余,根据cls分数采取非极大值抑制,阈值为0.7,NMS不会影响检测准确性,但会大大减少proposal的数量。在NMS之后使用前N个候选区域进行检测。
从R-CNN,SPP-net,Fast R-CNN到Faster R-CNN,基于深度学习目标检测的流程变得更加精简、精度更高、速度更快,因此基于region proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。
Faster RCNN这种基于CNN的目标检测方法使得real-time检测成为可能,在这个方向上有老进一步的研究思路。