Faster R-CNN

Paper : https://arxiv.org/pdf/1506.01497.pdf
Code : official

摘要

Fast R-CNN将多阶段训练合并到单阶段,并将目标检测算法的结构改进为Region Proposal + CNN classifier/regressor的结构。由于Selective Search 算法进行Region Proposal时,SS算法本身并不是深度学习算法,运行在CPU上,因此计算的瓶颈位置在于SS算法上。Faster R-CNN开创性地提出了RPN网络用来进行Region Proposal的工作,而由于RPN的结构与classifier/regressor相近,都是多层卷积后接全连接的结构,因此作者提出共用卷积部分的参数,加速训练和测试。我认为这篇文章值得关注的有以下几点

  • RPN的结构
  • 使用DNN进行回归任务时,损失函数的设计
  • 对于共用卷积层的网络,训练的方式

正文

Faster R-CNN整体框架

Faster R-CNN
上图是论文中的原图,比较粗糙,下图是源自一文读懂Faster RCNN 给出的Vgg16作为base model的Faster R-CNN模型的结构
Faster R-CNN

  • 首先将输入图片缩放至固定大小MxN,然后将MxN图像送入网络
  • Conv layers部分包含了13个conv层+13个relu层+4个pooling层
  • RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box偏移量,然后计算出proposals
  • 后面的与Fast R-CNN结构相同,RoI Pooling层利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作物体分类和更加精细的bounding box位置的回归

RPN

RPN接受任意尺寸的图片输入,输出矩形窗的集合表示RoI,每个RoI还会输出一个分数表示是物体还是背景。RPN使用全卷积神经网络实现,前若干层卷积的参数与Fast R-CNN共用,如框架中所示。为了生成RoI,RPN在共享的卷积层生成的特征图上使用固定长度的窗口进行滑动,在图中显示为3*3的卷积层接ReLU**函数
Faster R-CNN
设卷积的输出为 C*H*W 传递给两个分支部分,上面一个分支负责预测给RoI区域打分,下面一个分支负责对Anchor 进行回归,用来提高RoI的准确性。

Anchor :所谓anchors,实际上就是一组预先定义好长宽比和尺寸的矩形,使用这些矩形进行Region Proposal的粗粒度初始化,通过RPN的回归进行细粒度调整,Anchors的尺寸长宽比可以根据实际情况进行调正。Paper的实验中选择了三种尺寸的长宽比{1:1,1:2,2:1}\{1:1,1:2,2:1\},同时选择了三种不同的尺寸{1282,2562,5122}\{128^2,256^2,512^2\},因此可以组成3*3中尺寸长宽比不同的Anchors

Faster R-CNN

RPN采用了遍历的方式来测试Archors的表现,对于上一步卷积输出 C*H*W,需要将9种Archors以每个像素为中心进行计算,因此总共有 H*W*9 个 Archors 进行计算,对于每个Archors都需要使用RPN进行打分和bounding box的回归,打分采用二分类的方式,因此输出规模为 2*9*H*W,而bounding box回归需要对 x,y,w,h 四个参数进行回归,输出规模为 4*9*H*W。FPN采用1*1的卷积核来进行feature map到结果的转换,因此在上图中标有18和36。

下图也说明了类似的事情,在原文中使用的是ZF model中,其Conv Layers中最后的conv5层channel=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
在conv5之后,做了3x3卷积且channel=256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变。

Faster R-CNN
作者认为,Anchors具有以下两点优势

  • 平移不变性
  • 相比于图片金字塔处理和多尺寸滑动窗口,Anchors使用多尺寸的Anchor来处理检测目标具有尺寸的问题,节省计算力

RPN的训练:RPN的训练包含两部分,第一部分是根据feature map 和 Archor进行打分,第二部分是根据feature map和Archor进行回归

RPN将满足以下条件的Archor标记为positive

  • 与ground truth box IoU最高的Archor
  • 与ground truth box IoU得分高于0.7的Archor

将以下的Archor标记为negtive

  • 与所有ground truth box IoU得分都低于0.3

其他的Archor对训练目标无贡献,这一步用来生成训练RPN打分部分的样本。实际上,我们每个mini batch 都是从一张图片上抽取出来的正负样本比例相当的Archor来训练,全部anchors拿去训练太多了。

假定 (x,y,w,h) 分别表示一个矩形的中心点坐标,宽度和高度,那么Archor 表示为A=(Ax,Ay,Aw,Ah)A = (A_x,A_y,A_w,A_h),ground truth box 表示为 G=(Gx,Gy,Gw,Gh)G = (G_x,G_y,G_w,G_h),那么回归任务即找到一种变换方式使得F(A)=GF(A) = G‘,且GGG'\approx G
Faster R-CNN
在这里固定变换FF的形式,而是学习FF的参数,FF的形式为

Gx=Awtx(A)+AxGy=Ahty(A)+AyGw=Awexp(tw(A))Gh=Ahexp(th(A)) \\G'_x = A_w \cdot t_x(A)+A_x \\G'_y = A_h \cdot t_y(A)+A_y \\G'_w = A_w \cdot \exp(t_w(A)) \\G'_h = A_h \cdot \exp (t_h(A))

前两个对应平移变换,后两个对应缩放。因此,对于bounding box回归任务来说,学习和预测的结果是 tx,ty,tw,tht_x,t_y,t_w,t_h
Faster R-CNN
其中,x,xa,xx,x_a,x^*分别对应回归输出,archor,ground truch。对于RPN来说,总损失函数如下

L({pi},{ti})=1NclsiLcls(pi,pi)+λNregipiLreg(ti,ti) L(\{p_i\},\{t_i\}) = \frac{1}{N_{cls}}\sum_i L_{cls}(p_i,p_i^*) +\frac{\lambda}{N_{reg}}\sum_i p_i^* L_{reg}(t_i^*,t_i)

其中,LclsL_{cls}使用对数损失函数,LregL_{reg}使用smooth L1损失函数。实验时,Ncls=256N_{cls} = 256,而Nreg2400N_{reg} \sim 2400,因此默认设置λ=10\lambda = 10,实验表明算法对该超参数不敏感。

Faster R-CNN
Faster R-CNN

Faster R-CNN训练

论文中采用四步迭代法进行训练

  1. 在ImageNet pretrained模型上finetune,训练RPN网络
  2. 使用第一步中训练好的RPN模型进行Region Proposal,在ImageNet pretrained model上finetune Faster R-CNN,此时没有卷积层共享
  3. 使用Faster R-CNN的卷积层替换RPN的卷积层,进行共享,固定卷积参数,finetune RPN模型
  4. 保持卷积参数固定,finetune Faster R-CNN模型

更多的迭代根据实验来看并没有产生更好的效果,说明算法收敛了

Faster R-CNN

论文中的实现细节:

  • 作者首先将图片短边放大到600px,然后传入网络,此时对应的archor选取为

    For anchors, we use 3 scales with box areas of 1282, 2562, and 5122 pixels, and 3 aspect ratios of 1:1, 1:2, and 2:1.

  • 在训练中,对于穿过图片边界的Archor,我们忽略掉它们

    If the boundary-crossing outliers are not ignored in training, they introduce large, difficult to correct error terms in the objective, and training does not converge.

  • 测试时,对于RPN生成的穿过边界的RoI,我们clip到边界内,然后使用NMS取IoU threshold = 0.7进行舍弃,选择最高的若干个传递给后面的检测器

总结

Faster R-CNN的核心贡献包括以下几点:RPN结构,卷积参数共享结构的训练,Archor的提出。目前大多数双阶段目标检测模型都是在Faster R-CNN的基础上进行改进和加工。