论文:《Fast R-CNN》,Ross Girshick
源码:rbgirshick/fast-rcnn
前面说到目标检测的方法,比如RCNN,是multi-stage的,导致训练比较费时,并且中间需要保存特征等,对存储空间也有要求。当然后来提出了SPPNet,对整幅图抽取特征,一定程序上提高了速度,但是依然是multi-stage的,所以本文提出Fast R-CNN,用于解决这些问题。
如图1是Fast R-CNN示意图,
![b3899a8237dab736af0212b8f953a39b.png](https://i-blog.csdnimg.cn/blog_migrate/ee456181c02100a7b899598c8d999d03.jpeg)
整个图以及一系列的object proposals作为输入。CNN网络从整个图抽取特征,然后对于每个object proposal(也称ROI, region of interest),其映射到feature map上的那部分,经过ROI pooling layer形成一个固定长度的特征向量,特征向量再经过全连接层最终分为两支,一支为softmax用于分类预测,另一支用于目标定位回归。假设类别数量为K,那么加上背景bg,softmax层为(K+1)-way。bbox regressor为每个类比输出4个值,用于bbox定位微调。
由于是生成固定长度的ROI特征向量,所以也可以看作是SPP的特殊情况:只有一级金字塔,记scale为HxW。假设ROI映射到feature map上的那部分由(r,c,h,w)
定义,其他左上角坐标为(r,c)
,高宽为(h,w)
,那么ROI pooling 相当于将hxw
的输入 max pooling 到HxW
输出, 与普通max pooling类似,ROI pooling也是对每个channel分别独立进行。
CNN网络
Fast R-CNN中的CNN网络用于对整个image抽取特征,但是CNN网络是什么样的呢?论文中采用了三种网络,第一个来自于R-CNN中的网络,也就是AlexNet,记为
训练
首先对这三种网络使用ImageNet进行预训练,然后用预训练的模型来初始化Fast R-CNN模型,此时需要做一下调整:
- 最后一个max pooling层被ROI pooling替代,并配置HxW以适合其后的第一个fc层。由于第一个fc层之前有5个max pooling层,其输入是初始输入的
1/32
,而ImageNet的图像大小为224,故第一个fc层的输入大小为224/32=7
,所以HxW配置为7x7
。 - 最后一个fc层(对于ImageNet而言,其输出大小为1000)以及softmax层被替换为两支:如图1,第一支为 fc层+(K+1)-way softmax,第二支为fc层+bbox regressor。
- 网络的输入有两个:image 以及image的ROI
为目标检测任务做微调
- 分层采样得到SGD的mini-batch,首先采样N个images,然后每个image采样
R/N
个ROIs。来自同一个image的ROIs在前向后向传输时共享计算和内存,减小N 则能降低mini-batch的计算。这种分层采样的策略实际中不会减慢收敛速度。作者使用N=2, R=128
, 并发现SGD迭代次数比R-CNN的还少。 - softmax和bbox regressor的联合优化
多任务损失
R-CNN与SPPNet均使用SVM作为分类器,而Fast R-CNN使用softmax作为分类器。假设softmax层计算得到各分类得分为,
k
计算得到的定位偏移量为
(x,y,w,h)
,那么Test阶段 ,计算出预测box的坐标为,
Train阶段,假设object proposal对应的gt box坐标为
故object proposal对应的gt box分类为k,与对应gt box的实际偏移量为t,那么联合损失为,
所有object proposal的总损失为,
Mini-batch 采样
微调阶段,每次SGD迭代所用的mini-batch从N=2
个images中获取, 这N个images随机选择,mini-batch的大小为128,每个image中采样64个ROIs。与RCNN类似,选取25%的ROIs作为正例,即分类
[0.1,0.5)
范围的object proposals中采样。
使用水平翻转的方式扩增数据集大小。
对于数据集中的每个image,采用select-search方法生成object proposals,然后将gt boxes一同加入object proposals,得到所有的object proposals,然后计算这些object proposal与gt box的最大IOU,以及最大IOU所对应的gt box的分类。
尺寸不变性
使用两个方法达到目标检测的尺寸不变性。1. train和test阶段,处理每个image,使其尺寸为 预先定义好的值,由网络直接从训练数据中学习尺寸不变性。2. train阶段,随机修改image尺寸,形成多个尺寸(pyramid scale)的image,这也作为 数据增广的一种方法。
训练步骤
- 对一image中的所有ROIs,获取与gt box的最大IOU大于等于0.5的那部分ROIs,称之为期望boxes,记为
ex_boxes
,使用式(5-8)计算各ex_box
与其对应的gt box的偏移量,每组偏移量对应一个类别,gt box的类别。注意:最大IOU小于0.5的那部分ROIs没有计算偏移量。 - 按类别,计算偏移量的均值,以及标准差。然后将偏移量减去均值,并除以标准差进行归一化。
- 从数据集中随机获取两个images的相关数据,包含image 像素数据,以及object proposals的坐标,与gt box的最大IOU,gt box的类别,偏移量等。
- 将image的像素值减去像素均值,均值事先计算好了,为
(102.9801,115.9465,122.7717)
。记image的短边为min
,长边为max
, 并记image将被缩放的目标大小为s,那么缩放比例应为s/min
,检查长边缩放后的值max*s/min
是否超过一个最大值max_size
,若超出,则修改缩放比例为max_size/max
。 然后按照这个缩放比例对image 进行resize操作。 - 对resize后的两个image,找出最大的宽w,和最大的高h,然后创建blob
(2,w,h,3)
,这样能保证一次mini-batch中,所有image的空间尺寸相同, 然后将resize后的两个image从左上角的空间位置填充到blob中。不能保证每个SGD迭代时,w和h都相同,以VOC2007为例,采用VGG16作为特征抽取网络,此时h=600
,但是w可能是800,也可能时802等,当然不管大小如何,反正在ROI pooling层之前都是卷积层,参数数量都是相同的,而经过ROI pooling层之后,输出大小都相同(7x7),所以之后的全连接层参数也相同,所以不影响训练,与SPPNet类似,可以接受不同scale的image作为输入。 - 正如前面所讲,将image中最大IOU大于等于0.5的ROIs选出来作为正例,如果数量超过
128/4=32
,那么还需要随机选取其中32个作为正例,将最大IOU介于[0.1,0.5)
范围内的ROIs选作负例,如果数量超过128-32=96
,那么随机选取其中96个作为负例。 由于image是经过resize的,所以选定的这些ROIs的坐标也需要对应的乘以缩放比例。 - 当数据到达ROI pooling层时,经过了4个max pooling层,所以ROIs的坐标分别变为原来的
1/16
。
反向传播
记ROI pooling层的输入上某一点为
r
个ROI的第
j
个输出单元值记为
其中
检测
检测阶段,输入数据通过网络得到每个ROIs:各分类得分以及各分类下坐标偏移量。通过Select-Search方法得到2000个ROIs,不管具体使用多少个ROIs,反正记ROIs数量为N,分类数量为C(pascal voc数据集下C=21),那么网络最终的输出数据为:得分scores
维度为NxC
,坐标偏移量boxes
的维度为Nx4C
。分别在每个分类下,对于此分类的所有ROIs的得分,筛选出得分大于阈值CONF_THRESH
(源码中设置为0.8) 的那部分ROIs,根据这些ROIs的得分以及坐标,使用非极大抑制nms,剩下的就是这个分类下最终检测出来的ROIs。
对于整个图进行图像分类任务而言,全连接层的计算耗时相对于卷积层的计算耗时是非常小的,但是对于目标检测任务来说,由于ROI proposals数量巨大,使得全连接层的计算耗时接近前向传播总耗时的一半,解决办法之一是使用截断SVD进行加速。假设fc层的输入单元数为v,输出单元数为u,那么权重矩阵维度为uxv
,对权重矩阵进行截断奇异值分解 ,
其中U是由权重矩阵W起始的的t个左奇异向量组成,V是由W起始的t个右奇异向量组成,
t
较
u,v
小得多的,那么权重参数数量就由
uv
降低为
t(u+v)
。 网络中,原来由W指定的 fc 层,现在可用两个全连接层代替,第一个fc层使用权重矩阵
uxv
权重矩阵的单个fc层,改为用两个fc层,且第一个fc 层的权重矩阵维度为
txv
,无偏,第二个fc 层的权重矩阵维度为
uxt
,有偏,且所使用的
t
值比
u,v
都要小很多。
引用论文:
[1] 《Return of the devil in the details: Delving deep into convolutional nets》K. Chatfield