Fast R-CNN

论文链接:https://arxiv.org/abs/1504.08083

Fast R-CNN是RBG大神于2015年发表的目标检测网络,其在SPP-Net的基础上,通过进一步的改进,使得目标检测精度以及检测速度有了进一步的提升,下面详细介绍Fast R-CNN的创新点。

Q1:SPP-Net存在哪些待改进问题?

  1. SPP-Net仍然采用R-CNN的策略,需要将CNN提取的特征存储到disk中,然后利用SVM分类器进行分类,效率比较低。
  2. SPP-Net在训练CNN的过程中,对于ROI-pooling前面的卷积层并没有进行参数的更新,这带来了一定精度的损失,在本篇论文中,作者也有对比。
  3. SPP-Net的训练仍然是multi-pipeline的,无法做到端到端,总体而言比较费劲。

Q2:Fast R-CNN做了哪些创新点呢?

  1. Fast R-CNN设计了multi-loss方式进行目标分类以及位置回归,不需要进行特征存储到disk,使得效率有了大大的提升,如图1所示。
  2. 不需要multi-pipeline。
  3. CNN参数全更新。
  4. 单个ROI-pooling不再是SPP-Net的多级pooling.
  5. 使用mini-batch SGD方式进行训练。
  6. 利用SVD方式进行速度的提升。

Fast R-CNN_第1张图片

Fast R-CNN结构图

Q3:ROI-pooling

fast r-cnn网络的roi-pooling没有选择与spp-net相同的多级金字塔式的池化,而是选择了单级固定大小的池化,作者也通过实验证明,其实选择多级金字塔池化对精度会有一定的提升,但是影响不大,但是会降低速度,所以有点鸡肋。

Q4: Fast R-CNN训练整个网络,而SPP-net只训练了roi-pooling后面的网络

为什么SPP-Net没有训练全网络,而只是训练了roi-pooling后面的网络呢?
作者给的解释如下:(此处有些没有看懂,为啥感受野大就效率低?)

The root cause is that back-propagation through the SPP layer is highly inefficient when each training sample (i.e.RoI) comes from a different image, which is exactly how R-CNN and SPPnet networks are trained. The inefficiency stems from the fact that each RoI may have a very large receptive field, often spanning the entire input image. Since the forward pass must process the entire receptive field, the training inputs are large (often the entire image).

Fast R-CNN给的方法如下:

作者采用分层SGD训练的方法,默认每次选取2张图像,并在每张图像选取64个roi进行训练
作者说,这种方法有可能导致不收敛,但是实验证明并没有发生不收敛的现象。

Q5: 多任务损失设计

Fast R-CNN含有两个输出层,分别用于计算分类结果以及计算检测框的坐标结果。第一个输出层通过softmax计算相应ROI在各个类别中的概率。第二个输出层计算相应ROI的检测框的坐标值。算法采用多任务的损失函数对每个标定的ROI的类型和检测框坐标进行回归计算,损失函数公式如下。其中 Lcls L c l s 用于计算分类概率损失的函数,是一个softmax损失函数, Lloc L l o c 是检测框坐标的损失函数, 定义如下:

L(p,u,tu,v)=Lcls(p,u)+λ[u>=1]Lloc(tu,v) L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u >= 1 ] L l o c ( t u , v )

Lloc(tu,v)=iin(x,y,w,h)smoothL1(tuivi) L l o c ( t u , v ) = ∑ i i n ( x , y , w , h ) s m o o t h L 1 ( t i u − v i )

if|x|<1,smoothL1(x)=0.5x2,else,smoothL1(x)=|x|0.5 i f | x | < 1 , s m o o t h L 1 ( x ) = 0.5 x 2 , e l s e , s m o o t h L 1 ( x ) = | x | − 0.5

Q6: Back-propagation through RoI pooling layers.

简单来说,就是对于每一个mini-batch的ROI区域,如果对应的点被选中为最大值,则对其导数进行累加,得到反向传播的梯度:

Lxi=rj[i=i(r,j)]Lyr,j ∂ L ∂ x i = ∑ r ∑ j [ i = i ∗ ( r , j ) ] ∂ L ∂ y r , j

In words, for each mini-batch RoI r and for each pooling output unit yrj, the partial derivative ∂L/∂yrj is accumulated if i is the argmax selected for yrj by max pooling.

Q7:利用奇异值分解进行提速

作者提到,在进行前向传播中,将近一半的时间在全连接层,所以如果可以在此进行加速,将对整个网络的速度提升有较大帮助,因此作者提出可以利用奇异值分解。

Fast R-CNN_第2张图片

图2,奇异值分解效果

Q8: Fast R-CNN实验效果

看图最清晰了。

Fast R-CNN_第3张图片

Q9:Which layers to fine-tune

作者通过实验证明,训练CNN网络的时候,前面几层训练带来的精度提升不明显,说明前面提取的特征如:边缘等比较固定有效,对于后面几层的训练对于精度提升比较明显。
对于越深的网络越需要训练。

Q10: 作者其他的说明
  1. 对于尺度不变的说明,作者实验证明了通过多尺度可以提高检测精度。
  2. 增加proposal有用吗?实验证明不是越多越好,越多反而会下降。

你可能感兴趣的:(深度学习-目标检测)