计算机系统应用教程网站

网站首页 > 技术文章 正文

结合代码谈一谈Faster RCNN的训练和测试

btikc 2024-08-31 17:16:40 技术文章 11 ℃ 0 评论

笔者在学习了目标检测的众多方法后,觉得faster-rcnn还是重中之重。这里结合代码和模型文件,详细介绍一下faster-rcnn的训练和测试。

faster-rcnn的网络结构

如图,笔者把faster-rcnn分成三个部分,分别称之为1、2、3。1和2构成了RPN网络结构,1和3(需要2的输出)构成了RCNN网络结构,1是公用的提取特征的部分。

训练阶段

faster-rcnn输入数据层

整个训练流程参见rbg大神py-faster-rcnn的github(此处不让上外站链接,各位同学去github上搜索即可找到)。我们以faster-rcnn采用vgg16模型为例子,采用end2end的训练方式,输入的数据层由上图所示。使用的是python的数据层roi_data_layer,该层的具体代码在

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位表示,前四位是坐标位置,最后一位是类别信息;

第一部分介绍的feature Map

步骤1(公共部分)结束后的featureMap是conv5_3,通道数是512,W和H不是固定的,和输入的图像大小相关。

RPN分类部分

RPN分类部分

如上两图表达的是同一意思,即由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生成anchors

输出

  • 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的loss

rpn用softmax处理分类,L1的loss处理回归,注意inside_weights和outside_weights都是系数乘在L1loss上。

rpn

在得到预测的rpn的分类和回归的后,ProposalLayer根据此计算得到了rpn_rois的信息。ProposalTargetLayer则进一步得到roi和roi的label信息(和rpn的label信息类似)。

后面的RCNN也就是第3部分,与rpn计算loss的方式十分类似,笔者将rcnn网络结构简单图示如下:

RCNN网络结构

测试阶段

在测试阶段,每次处理一张图像,图像尺度的预处理操作和训练相同(最小边resize到600)。整幅图像在conv5_3之后,经过RPN处理,featureMap上的点对应的anchor都计算得到了分类和回归的预测值。RCNN进一步以此为输入得到最终的结果。具体可参考py-faster-rcnn/tools/demo.py,笔者不在逐行代码解读。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表