之前对Faster R-CNN一直模棱两可,最近将Faster R-CNN进行了深入了解。用此文对Faster R-CNN讲透。
参考:https://zhuanlan.zhihu.com/p/32404424
https://zhuanlan.zhihu.com/p/31426458
1. Faster R-CNN架构
主体为3部分。
- Extractor用于对图像提取特征,得到feature map.
- RPN提供感兴趣区域
rois
- ROIHead 对
rois
进行分类与坐标回归
2.数据处理
Faster R-CNN有对原始图像进行resize成HxW的操作。使得长边小于等于1000,短边小于等于600(至少有一个等于)。可直接理解为resize为1000*600.
3.特征提取
以VGG16为例,conv层feature map尺寸不变,经过四次pooling后,原始图像尺寸下降为1/16。原始图片resize之后尺寸为3×H×W,四次下采样后的feature map尺寸为C×(H/16)×(W/16)
4.RPN
4.1 anchor生成
RPN对feature map的每一个点生成9中尺寸的anchor,即大小为(128,256,512),长宽比为(1:1,1:2,2:1)。
对于1000×600尺寸的图片,经过四次下采样的feature map 尺寸为62×37(即(1000/16)×(600/16))每个点取9个anchor即62×37×9约为20000个anchor。
4.2 RPN训练
RPN的训练过程是对anchor进行分类与坐标回归。20000个anchor全部进行训练不现实,所以
AnchorTargetCreator
用于从20000个anchor选择256个。
- 对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本
- 对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
- 随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256。
简单地说正负样本1:1选择256个anchor传入RPN网络进行训练。RPN网络结构为全卷积,所以不限制形状。经过33卷积层后是两个11卷积层分别用于分类(positive与negative样本)与位置回归。分类是个1(前景),0(后景)的二分类问题。
回归是对四个参数进行回归,注意只有当GT与需要回归框位置比较接近时,才可近似线性变换成立。
总结来说,RPN训练的作用是对anchor的二分类与坐标回归。
4.3 RPN生成ROIs
RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。RPN生成RoIs的过程(ProposalCreator
)如下: - 对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。
- 选取概率较大的12000个anchor
- 利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
- 利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs
- 注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.
NMS的作用是消除冗余框,希望只有一个框来代表目标
操作过程,1)对所有框的得分排序,选中得分最高的框,2)将与该框IOU比例高于阈值的框删去,3)从未选过的框再选择得分最高的框,重复这个过程。
5.Fast R-CNN/ROI Head
RPN给ROIHead传给2000个ROIs,
ProposalTargetCreator
将2000个ROIs减少为128个RIOs,传给RIO Pooling,其作用是将128个尺寸各异的RIOs pooling成相同尺寸的feature map(7*7),pooling成相同的尺寸因为后面分类与回归用的是全连接层,需要固定尺寸。ROIPooling后两个全连基层与特征提取网络的FC尺寸相同,可是用预期参数共享,作为初始化参数。再接FC21用于目标分类(20个类别+1背景)FC84坐标回归(21个类别,每个类别4个位置参数)。
5.1ProposalTargetCreator
ROIHead不是讲RPN给的2000个ROIs全部训练,而是ProposalTargetCreator
将2000个ROIs减少为128个RIOs。
- iou>0.3选择32个,作正样本
- iou<=0.1作负样本。
即正负样本1:3共128个ROIs训练ROIHead。
5.2 训练细节
对128个ROIs的坐标进行标准化处理(减去均值除以标准差)。
对于分类问题,直接利用交叉熵损失. 而对于位置的回归损失,一样采用Smooth_L1Loss, 只不过只对正样本计算损失.而且是只对正样本中的这个类别4个参数计算损失。
5.3测试
测试的时候对所有的RoIs(大概300个左右) 计算分类(21类)概率,并利用位置参数调整预测候选框的位置。然后再用一遍极大值抑制(之前在RPN的ProposalCreator用过)。
细节
- 测试时候,RPN生成ROIs时候,使用NMS降低数量,到ROIHead,再用NMS降低目标框数量。(两次NMS)
- 测试时候,RPN生成ROIs时候,对6000个anchor进行了位置回归,到ROIHead,再对位置进行回归。(两次位置回归)
- RPN分类是二分类,ROIHead是21分类(20类目标+1背景)
- 在训练Faster RCNN的时候总损失是四个损失的和:
RPN 分类损失:anchor是否为前景(二分类)
RPN位置回归损失:anchor位置微调
RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
RoI位置回归损失:继续对RoI位置微调
- 三个creator
AnchorTargetCreator
: 负责在训练RPN的时候,从上万个anchor中选择一些(比如256)进行训练,以使得正负样本比例大概是1:1. 同时给出训练的位置参数目标。 即返回gt_rpn_loc和gt_rpn_label。
ProposalTargetCreator
: 负责在训练RoIHead/Fast R-CNN的时候,从RoIs选择一部分(比如128个)用以训练。同时给定训练目标, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)
ProposalCreator
: 在RPN中,从上万个anchor中,选择一定数目(2000或者300),调整大小和位置,生成RoIs,用以Fast R-CNN训练或者测试。
其中AnchorTargetCreator
和ProposalTargetCreator
是为了生成训练的目标,只在训练阶段用到,ProposalCreator
是RPN为Fast R-CNN生成RoIs,在训练和测试阶段都会用到