在前一篇博客目标检测——R-CNN、Fast R-CNN中已经对R-CNN和Fast R-CNN进行了介绍。
虽然Fast R-CNN相对于R-CNN有所改进,但是它仍依赖于外部区域的建议方法,如选择性搜索等。然而,这些算法运行在CPU上,速度很慢。在测试中,Fast R-CNN需要2.3秒进行预测,其中2秒用于生成2000 ROI。
Faster R-CNN
Faster R-CNN采用了与Fast R-CNN相似的设计,只是它将区域建议(region proposal)方法替换为内部深度网络,而ROI则来源于feature maps。新区域建议网络(RPN)更有效,生成ROI的速度为每幅图像10毫秒。
Faster R-CNN系统流程:
Faster R-CNN 架构:
Faster R-CNN 4步训练:
- 使用ImageNet预训练模型初始化RPN
- 用RPN生成的proposals训练FasterR-CNN
- 使用在2中训练的模型初始化RPN并再次训练
- 使用与第3步相同的共享卷积层微调Fast R-CNN的FC层
锚点(Anchors)
在介绍候选区域网络(RPN)之前先介绍一下锚点。锚点可以简单的理解为在特征图上每个位置都有一个中心点,都可以对应到原图的某个点,以这个点为中心按照不同大小长宽比例生成anchors boxes。
例如:原始输入图像为800×600。VGG将其下采样16次,并且特征图中的每个位置都有9个锚点。 因此,锚点的总数为:ceil(800/16)×ceil(600/16)×9 = 50×38×9 = 17100(ceil是向上取整的意思)。
需要理解的是,虽然锚点是基于卷积特征图定义的,但是最终的锚点是参考原始图像的。
为了选择锚点集,通常定义一组尺寸(例如64px,128px,256px)和一组框的宽度和高度之间的比率(例如0.5、1、1.5),并使用所有可能的尺寸组合和比率。
候选区域网络(RPN)
候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。它在特征图上滑动一个3×3的卷积核,以使用卷积网络(如下所示的ZF网络)构建与类别无关的候选区域。其他深度网络(如VGG或ResNet)可用于更全面的特征提取,但这需要以速度为代价。ZF网络最后会输出256个值,它们将馈送到两个独立的全连接层,以预测边界框和两个objectness分数,这两个objectness分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个objectness分数,但为简洁起见,Faster R-CNN使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别。
对于特征图中的每个位置,RPN进行k个猜测。 因此,RPN在每个位置输出4×k坐标和2×k分数。 下图显示了带有3×3卷积核的8×8特征图,它总共输出8×8×3 ROI(对于k = 3)。 右侧图演示了单个位置提出的3个建议。
假设最好涵盖不同的形状和大小。因此,Faster R-CNN不会创建随机边界框。相反,它会预测一些与左上角名为锚点的参考框相关的偏移量(如x, y)。我们限制这些偏移量的值,因此我们的猜想仍然类似于锚点。
要对每个位置进行k个预测,我们需要以每个位置为中心的k个锚点。每个预测与特定锚点相关联,但不同位置共享相同形状的锚点。
这些锚点是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的现实目标。这使得我们可以用更好的猜想来指导初始训练,并允许每个预测专门用于特定的形状。该策略使早期训练更加稳定和简便。
Faster R-CNN部署9个锚点框:3个不同宽高比的3个不同大小的锚点框。每一个位置使用9个锚点,每个位置会生成2×9个objectness分数和4×9个坐标。
RPN的训练
RNP在特征图(FPN生成的P2~P6)上生成20000多个anchor(每个特征点有9个),接下来RPN做的事情就是利用(AnchorTargetCreator)将20000多个候选的anchor选出256个anchor进行分类和回归位置。选择过程如下:
- 对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本
- 对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
- 随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256。
- 对于每个anchor, gt_label要么为1(前景),要么为0(背景),而gt_loc则是由4个位置参数(tx,ty,tw,th)组成,这样比直接回归座标更好。
RPN生成RoIs
RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。RPN生成RoIs的过程(ProposalCreator)如下:
- 通过得到的回归变换函数,修正anchor的位置,得到anchor 对应的 RoIs(原图上的)
- 根据得到的分类概率,选取是物体的概率较大的12000个anchor对应的RoIs
- 利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs(后面一节分析)
RoIHead/Fast R-CNN训练
RPN经过NMS后会产生大约2000个RoIs,这2000个RoIs不是都拿去训练,而是利用ProposalTargetCreator 选择128个RoIs用以训练。选择的规则如下:
-
RoIs和gt_bboxes 的IoU大于0.5的,选择一些(比如32个)
-
选择 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的选择一些(比如 128-32=96个)作为负样本。
-
为了便于训练,对选择出的128个RoIs,还对他们的gt_roi_loc 进行标准化处理(减去均值除以标准差)。对于分类问题,直接利用交叉熵损失。而对于位置的回归损失,一样采用Smooth_L1Loss,只不过只对正样本计算损失。而且是只对正样本中的这个类别4个参数计算损失。举例来说: 一个RoI在经过FC 84后会输出一个84维的loc 向量. 如果这个RoI是负样本,则这84维向量不参与计算 Smooth_L1Loss 。如果这个RoI是正样本,属于label K,那么它的第 K×4, K×4+1 ,K×4+2, K×4+3 这4个数参与计算损失,其余的不参与计算损失。