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 RCNN 给出的Vgg16作为base model的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**函数
设卷积的输出为 C*H*W 传递给两个分支部分,上面一个分支负责预测给RoI区域打分,下面一个分支负责对Anchor 进行回归,用来提高RoI的准确性。
Anchor :所谓anchors,实际上就是一组预先定义好长宽比和尺寸的矩形,使用这些矩形进行Region Proposal的粗粒度初始化,通过RPN的回归进行细粒度调整,Anchors的尺寸长宽比可以根据实际情况进行调正。Paper的实验中选择了三种尺寸的长宽比,同时选择了三种不同的尺寸,因此可以组成3*3中尺寸长宽比不同的Anchors
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不变。
作者认为,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 表示为,ground truth box 表示为 ,那么回归任务即找到一种变换方式使得,且
在这里固定变换的形式,而是学习的参数,的形式为
前两个对应平移变换,后两个对应缩放。因此,对于bounding box回归任务来说,学习和预测的结果是
其中,分别对应回归输出,archor,ground truch。对于RPN来说,总损失函数如下
其中,使用对数损失函数,使用smooth L1损失函数。实验时,,而,因此默认设置,实验表明算法对该超参数不敏感。
Faster R-CNN训练
论文中采用四步迭代法进行训练
- 在ImageNet pretrained模型上finetune,训练RPN网络
- 使用第一步中训练好的RPN模型进行Region Proposal,在ImageNet pretrained model上finetune Faster R-CNN,此时没有卷积层共享
- 使用Faster R-CNN的卷积层替换RPN的卷积层,进行共享,固定卷积参数,finetune RPN模型
- 保持卷积参数固定,finetune 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的基础上进行改进和加工。