【R-CNN系列目标检测】(3)FAST R-CNN算法

重点参考《读DL论文心得之Fast RCNN》

fast r-cnn【1】是Ross Girshick在2015年对上一年的SPP-Net算法做的改进。作者在VGG16网络的测试表明:fast r-cnn在训练阶段比r-cnn快了9倍,比spp-net快了3倍;在测试阶段比r-cnn快了213倍,比spp-net快了10倍;同时精度也有一定提升


r-cnn和spp-net的不足

1)r-cnn 和 spp-net 的训练都需要经过多个阶段:fine-tuning得到网络卷积层的特征输出、SVM对每组特征向量的学习、位置bounding box的回归

2)对r-cnn,训练和测试的时间空间开销大。每个图像提取的大量roi特征需要存储和通过cnn

3)对spp-net,虽然roi特征在最后一个卷积层才提取,省去了多次前向cnn。但由于SVM,roi特征仍需存储。此外,spp-net中的tunning无法更新spp层之前的所有权重,因此对于比较深得网络无能为力


fast r-cnn算法思路

如图1所示,算法首先通过 selective search方法生成约2K个ROI,连同图像一起输入到CNN网络;在最后一个卷积层后求取ROI位置的映射关系,使用1层的spp池化层将每个ROI统一到相同大小;最后通过两个全连接层,一个FC层后接softmax实现分类,一个FC层后接bounding box回归得到类别修正后的位置。

          【R-CNN系列目标检测】(3)FAST R-CNN算法_第1张图片
                          图1. fast r-cnn架构

ROI 池化层

是仅含1层的SPP pooling层,《论文笔记 《Fast R-CNN》》里猜测,这里之所以不使用多层是为了避免重新训练

ROI池化层的输入是N个特征映射(我的理解是N张图像)和R个ROI,每个特征映射的维度为H x W x C,每个ROI为(n, r, c, h, w),n是特征映射的索引,(r, c)是ROI左上角坐标,(h, w)是ROI高宽

ROI池化层的输出是大小一致的(max-pool)特征映射(H’ x W’ x C)

网络结构的调整

CNN网络需要经过3个调整才能应用fast r-cnn算法:
1)最后一个max pooling层替换为 ROI pooling层,输出尺寸H’ 和W’与后面的全连接层输入一致

2)最后一个全连接层+softmax层替换为两组:全连接层+softmax对K+1个类别(包括1个背景)的分类;全连接层+回归层对bounding box的调整

3)网络输入除了图像数据,还要增加ROI数据

fine-tuning训练

spp-net之所以不能tuning spp 层之前的网络,是因为每次SGD中包含了不同图像的样本,反向传播需要计算每个ROI感受野的卷积层(通常会覆盖整个图像),这样会导致梯度涣散

针对这个问题,fast r-cnn提出层次取样的方法:首先取样N个图像,对每张图像取 R/N 个ROI(R为全部ROI数),同一图像的ROI共享计算和内存

此外fast r-cnn在一次tuning中同时优化了softmax分类器和bbox回归
假定 p=(p0,...,pk) 是k+1个类别的softmax输出
假定 tk=(txk,tyk,twk,thk) 是bbox回归输出的第k类box的偏移(相对于ROI)
那么两者的损失为:

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)

其中 Lcls(p,u)=logpu 是对类别u的log损失
其中 Lloc(tu,v)=i{x,y,w,h}smoothL1(tuivi)
smoothL1(x)={0.5x2|x|0.5if |x|<1otherwise

1)当u=0时为背景,损失仅计算 Lcls
2)之所以不用 L2 是为了避免梯度爆炸
3) λ=1


尺度不变性

文章比较了两种方法:
1)brute force:直接将图像统一为某种尺寸,期望网络学会自适应sacle

2)image pyramids:生成一个图像金字塔,对于ROI,在金字塔上找到最接近标准尺寸(227x227)的一个来训练

经过比较,方法2比方法1在精度上仅提高了1个mAP,但耗时大大增加,因此最终使用方法1(spp-net使用方法2,这是fast r-cnn比他快的一个原因)


全连接层提速

文章认为全连接层非常耗时,提出将权重做SVD分解,通过数据降维的方式减小计算量

文章《【目标检测】Fast RCNN算法详解》对此有较为详细的分析


其他

此外,文章通过实验证明:
1)对于较深的网络(如VGG),卷积层和全连接层一起tuning会有较大精度的提升

2)浅层卷积层没必要tuning,因为对mAP基本没影响

3)训练数据越多越好

4)候选区域proposals并不是越多越好


代码实现

Girshick在github上开源了该算法的python代码
系列文章《r-cnn系列代码编译及解读(1)》会对代码做详细分析


参考文献

【1】Girshick R. Fast R-CNN[J]. Computer Science, 2015.


你可能感兴趣的:(机器学习)