图1
图2
1. 训练过程
(1)将通用的网络模型(例如 AlexNet、VGG16 等)在 ImageNet 数据集上进行预训练,从预训练模型中初始化一个Fast R-CNN模型
作者预训练了三个ImageNet网络,每个网络包含五个最大池化层以及五到十三个卷积层。预训练网络指的就是在ImageNet上预训练好的一个图像分类模型,如图1和图2。
* 先传入一整张图片给一个深度卷积网络,深度卷积网络会得到这整张图片的特征图
* 接上一个固定尺寸的最大池化层来对这一个特征图做最大池化
* 再接上几个全连接层
* 最后接上一个全连接层并跟上softmax函数来输出ImageNet数据集上1000个图像类别
初始化就是把一个预训练的图像分类网络变成Fast R-CNN网络,既从图1变成图3的过程。变换过程中共经历了三个变换阶段:
* 把网络修改成两个数据输入,除了输入图片外还需要输入图片中一系列候选区域坐标,以便于在最终的特征图中根据候选区域的坐标把候选区域的特征给抠出来
* 把最后一个最大池化层替换成ROI池化层
* 把全连接层和softmax层替换成两个并行的全连接层,其中一个分支用来预测K+1个类别,另一个分支用来预测bounding-box regressors(边界框回归)
(2)在检测任务上进行Fine-tuning(微调)
微调模型实际就是使用反向传播来训练整个网络的权重。由于样本的采样方法不同,Fast R-CNN具有很好的训练权重的能力,但是SPPNet就不能很好的更新网络权重。
在SPPNet中,训练时输入的一批图片是通过随机采样得到的。比如说,我们需要128个候选区域,这128个区域可能是来自不同的图片,也就是说我们需要传入128张这样类似的原图进去,然后在128张特征图中各自扣除需要的候选区域。在前向传播和后向传播的过程中,会占用大量的显存,降低模型的训练效率。
在Fast R-CNN中,在前向传播的时候,我们只需要传两张图片进去,因为每张图片的64个区域都是在一张图上得到的。也就是说我们两张原图传进去,然后在其特征图上各自扣出64个候选区域即可。
2. 模型结构
图3
(1)输入图片
(2)通过Deep ConvNet(深度卷积神经网络)得到整张图片的特征
(3)根据候选区域在原图上的位置,通过ROI projection(候选区域投影)获取到候选区域在特征图上的候选区域特征
(4)通过ROI pooling layer(训练样本池化层)把尺寸不固定的候选区域特征图给转换成特定尺寸的特征图
(5)再连接上两个全连接层(FC层)来得到每个区域的特征向量
(6)再额外接上两个并行的FC层,其中一个利用softmax函数负责预测类别,另一个输出四个真实的数字值来精细化对检测物体框的位置,直接预测和框的坐标相关的一个框回归。简单讲就是一个输出该框内的物体到底属于哪一类,另外的一个输出调整候选框的位置,让候选框可以更加准确的框住被测目标。
3. ROI pooling layer(ROI池化层)
(1)ROI Pooling两个输入
RoI Pooling层负责收集proposal,并计算出proposal feature maps(从conv layers后的feature map中扣出对应位置),输入有两个:
·conv layers提出的原始特征feature map,大小(M/16)x(N/16)
·RPN网络生成的Proposals,大小各不相同。一堆坐标([x1,y1,x2,y2]
(2)为什么需要RoI pooling
全连接层的每次输入特征size必须是相同的,而这里得到的proposal大小各不相同。传统的有两种解决办法:
·从图像从crop(裁剪)一部分送入网络
·将图像wrap(resize)成需要的大小送入网络
图4
很明显看到,crop会损失图像完整结构信息,wrap会破坏图像原始形状信息。因此,需要一种能够把所有图像大小整合到一起又不会简单粗暴造成破坏的方法,这里使用的是RoI pooling,由SSP(Spatial Pyramid Pooling)发展而来。
(3)RoI pooling原理
它能将任意有效候选区域内的特征给转化成一个小的特征图,且小的特征图具有特定的一个空间范围,与空间金字塔池化做的是一个事。但SPPNet中用了三个不同的池化得到三个不同大小的输出,而Fast R-CNN中只用了一个池化来得到一个输出。RoI pooling会有一个预设的pooled_w和pooled_h,表明要把每个proposal特征都统一为这么大的feature map。其步骤如下:
* 由于proposals坐标是基于MxN尺度,先映射回(M/16)x(N/16)尺度
* 再将每个proposal对应的feature map区域分为pooled_w x pooled_h的网格
* 对网格的每一部分做max pooling
* 这样处理后,即使大小不同的proposal输出结果都是pooled_w x pooled_h固定大小,实现了固定长度输出,如图5所示:
图5
例子:考虑一个8*8大小的特征图,一个ROI,以及输出大小为2*2
* 输入固定大小的feature map
* egion proposal投影之后的位置(左上角(0,3),右下角坐标(7,8))
* 将其划分为2*2个sections(因为输出大小为2*2)
* 对每个section做max pooling
图6
(4)Back-propagation through ROI pooling layers(ROI池化层的反应传播)
和池化层的误差反向传播类似,由于通过SS算法获得候选框映射到特征图后发现很多区域会有重合,也就是说前一层的节点误差对后一层多个输出节点的误差有贡献,因此,前一层的误差应该等于后一层多个相关节点误差反向传播后的取值之和。
图7
4. Multi-task loss(多任务损失函数)
在R-CNN中的流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression进行候选框的微调。
Fast R-CNN则是将候选框目标分类与bbox regression并列放入全连接层,形成一个multi-task模型。
Fast R-CNN有两个并行的输出层,第一个输出用来产生K+1个类别,第二个输出框回归的偏移量。
图8
Fast R-CNN损失函数如下:
p是分类器预测的softmax概率分布
u对应目标真实类别标签
对应边界框回归器预测的对应类别u的回归参数
v对应真实目标的边界框回归参数
5. Mini-batch sampling(采样策略)
在微调期间,每个随机梯度下降的mini-batch都是随机采样两张图片,在每个图片上采样64个候选区域,这样就构成了128个候选区域的mini-batch,在128个候选区域里有25%也就是32个正样本,剩下的都是负样本,这跟R-CNN里算法中的一个采样策略是一样的,正样本的采样方法也跟R-CNN一样,以IoU≧0.5作为正样本,在剩下的候选区域里,以0.1≦IoU<0.5作为负样本,对于阈值低于0.1的样本都采用hard example mining(难力挖掘)方法来挑选难样本进行训练。在训练期间每个图片都随机的以0.5的概率去做水平翻转。
6. 尺度不变性
指的是有两个相同的目标,一个目标比较大,一个目标比较小,如果这两个目标都能够被模型识别出来,就说明这个模型有比较好的尺度不变性。作者提出了使用两种方式对规模不变的对象进行检测:brute-force(单一尺度)和(多尺度,图像金字塔)。
(1)”brute force”单尺度训练:在单尺度训练过程中每一张图片都被处理成一个预定义好的尺寸来进行训练或者是进行预测,目的是让网络来直接学会尺度不变性。
(2)“image pyramids”多尺度训练:在训练期间每一张图片都先被随机的采样成一个特定的尺度,这种多尺度的训练方法也是一种数据增强的方式。
7. Truncated SVD(截断的奇异值分解)
对于图像分类任务来说花费在全连接层上的时间比花费在卷积层上的时间要小,相反的,对于检测任务来说,由于ROI的数量非常大,因此几乎一半的前向传播时间都被花费在了计算全连接层上,这是因为在测试一张图片时,只需要通过一次前向传播把这一整张图的一个特征图提取出来,但在后面进行全连接层运算时,需要把这张图上所有的候选区域扣出来后的候选区域的特征图都给通过后边的全连接层去进行运算,所以后边的全连接层会占据大量的测试时间,所以必须要对后边的全连接层进行加速。通过截断的奇异值分解方法可以提高全连接层的推理速度。
8. 主要的实验结果
(1)在VOC07,2010和2012三个数据集上都取得了最优的mAP(平均精度)
(2)与R-CNN和SPPNet相比Fast R-CNN具有更快的训练速度和测试速度
(3)在VGG16上微调卷积层能够提高模型的mAP(平均精度)
9. 总结
(1)SPPNet与Fast R-CNN模型比较如图9所示:
图9
* SPPNet在最后一个卷积层后面跟上的是一个空间金字塔池化,但Fast R-CNN在最后一个卷积层后面跟上的是一个ROI池化层
* SPPNet在提取特征后,像R-CNN一样额外训练SVM来进行分类或回归,但Fast R-CNN是接了两个并行的FC层实现分类和回归
(2)Fast R-CNN优点
* 相比于R-CNN和SPPNet,既提高了训练和测试时的速度,又能增加检测的精度
* 训练过程是一个单阶段过程,损失函数使用了multi-task loss(多项损失)
* 由于是单阶段过程,因此不需要磁盘空间缓存特征
* 训练能更新所有网络层参数
(3)Fast R-CNN缺点
* 训练时间长:Fast R-CNN需要在ImageNet上预训练一个卷积神经网络,然后再在目标检测数据集上进行微调,这个过程需要大量的计算资源和时间。
* 检测速度慢:Fast R-CNN需要对整张图片进行卷积操作,这个过程比较耗时。
* 检测精度不高:Fast R-CNN使用Selective Search算法提取候选框,这个算法的召回率不高,可能会漏掉一些目标。