笔者在学习了目标检测的众多方法后,觉得faster-rcnn还是重中之重。这里结合代码和模型文件,详细介绍一下faster-rcnn的训练和测试。
如图,笔者把faster-rcnn分成三个部分,分别称之为1、2、3。1和2构成了RPN网络结构,1和3(需要2的输出)构成了RCNN网络结构,1是公用的提取特征的部分。
训练阶段
整个训练流程参见rbg大神py-faster-rcnn的github(此处不让上外站链接,各位同学去github上搜索即可找到)。我们以faster-rcnn采用vgg16模型为例子,采用end2end的训练方式,输入的数据层由上图所示。使用的是python的数据层roi_data_layer,该层的具体代码在
训练的部分配置信息笔者贴出下如下:
IMS_PER_BATCH: 1
__C.TRAIN.SCALES= (600,)
__C.TRAIN.RPN_BATCHSIZE=256
即每个batch输入一张图像,把图像的最小边resize到600大小的尺度,在图上取256个候选区进送到到训练。数据层输出有3个:
data,归一化处理的图像数据;
im_info,图像的宽高信息,由于图像不是归一化到统一尺度,需要记录其宽高信息;
gt_boxes,groundtruth的信息(训练中对应的xml数据),5位表示,前四位是坐标位置,最后一位是类别信息;
步骤1(公共部分)结束后的featureMap是conv5_3,通道数是512,W和H不是固定的,和输入的图像大小相关。
如上两图表达的是同一意思,即由conv5_3经过两个卷积处理后(第一个卷积不改变featureMap的W和H,图中的256-d对应的是ZF模型,vgg模型则对应512-d),其featureMap上每个点对应18个label信息(每个点对应9个anchors,每个anchors输出是bg/fg的类别信息),注意是以featureMap上的每个点为单位,不要被论文上3*3的红色区域框所影响。可以简单理解为通道数由512(vgg16)变成了18(后面会对数据排列方式进行reshape),每个通道代表该点对应的一个类别信息。anchor是以这个点(featureMap上的一个点,对应到原始图像上是一个区域)对应到原始图像上的区域的中心点为中心,根据1:1,1:2,2:1的长宽比,尺度大小选取了128,256,512三种。同样的,每个anchor对应的bounding box 回归同理,只是每个点对应了9*4=36个label信息。
经过上述操作后得到了rpn_cls_score(channel个数18)、rpn_bbox_pred(channel个数36),rpn_cls_score_reshape(reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } },对分类得分reshape, channel个数变成了2,height变成以前9倍大小)。这三个rpn相关的输出都是神经网络预测出来的,那真实的label信息又是如何得到的呢?我们接着看AnchorTargetLayer,也是python代码实现的layer层,相关输入输出见下图。
输出
rpn_labels, 1表示该rpn有目标(与gt的overlap大于0.7),0表示不包含目标(与gt的overlap小于0.3),0.3到0.7之间的不参与训练
rpn_bbox_targets, 表示到真实gt的偏移量
rpn_bbox_inside_weights,与L1的loss相乘,rpn_labe为1时该值取1,否则为0
rpn_bbox_outside_weights, 此处笔者不是十分理解,因此贴上相关代码
num_examples = np.sum(labels >=0)
positive_weights = np.ones((1, 4)) *1.0/ num_examples
negative_weights = np.ones((1, 4)) *1.0/ num_examples
bbox_outside_weights[labels ==1, :] = positive_weights
bbox_outside_weights[labels ==0, :] = negative_weights
也就是rpn_bbox_outside_weights取值为每个batchsize参与训练样本数的倒数(1/num)
rpn用softmax处理分类,L1的loss处理回归,注意inside_weights和outside_weights都是系数乘在L1loss上。
在得到预测的rpn的分类和回归的后,ProposalLayer根据此计算得到了rpn_rois的信息。ProposalTargetLayer则进一步得到roi和roi的label信息(和rpn的label信息类似)。
后面的RCNN也就是第3部分,与rpn计算loss的方式十分类似,笔者将rcnn网络结构简单图示如下:
测试阶段
在测试阶段,每次处理一张图像,图像尺度的预处理操作和训练相同(最小边resize到600)。整幅图像在conv5_3之后,经过RPN处理,featureMap上的点对应的anchor都计算得到了分类和回归的预测值。RCNN进一步以此为输入得到最终的结果。具体可参考py-faster-rcnn/tools/demo.py,笔者不在逐行代码解读。
本文暂时没有评论,来添加一个吧(●'◡'●)