faster-rcnn代码阅读-roi-data层
这一节讲述roi-data层,和这一层有关的结构图如下:
roi-data层的prototxt定义如下:
layer { name: 'roi-data' type: 'Python' bottom: 'rpn_rois' bottom: 'gt_boxes' top: 'rois' top: 'labels' top: 'bbox_targets' top: 'bbox_inside_weights' top: 'bbox_outside_weights' python_param { module: 'rpn.proposal_target_layer' layer: 'ProposalTargetLayer' param_str: "'num_classes': 2" } }
这一层接着上一节的proposal层,主要的操作是对RPN阶段输出的proposal做进一步的筛选,从中选出背景和前景,得到rois,然后计算rois的回归目标。因为第二阶段的rois回归是和类别一一对应的,第二阶段全连接网络预测出的回归目标值bbox_pred的shape为(num_rois, 4*num_classes),所以最后需要将计算出的rois的回归目标值放入与其类别相对应的位置。这一层的详细操作如下:
1、取gt的x1, y1, x2, y2列,再补个全是0的第一列(表示batch_inds),然后将前面proposal层得到的rpn_rois和这样一个新的矩阵在第一个维度上合并,得到all_rois;
2、用于训练的rois的BATCH_SIZE=128,其中前景rois占比为0.25,有32个,背景rois有96个,因此,需要从all_rois中采样;
3、在all_rois中,若某个rois和任意一个gt的overlap大于或等于0.5,则该rois为前景,其类别为与之overlap最大的那个gt的类别。若某个rois和所有gt的overlap的最大值大于或等于0.1,并且小于0.5,则该rois为背景。这样便筛选出了前景和背景rois,每个rois都和一个gt对应(和它overlap最大的那个gt);
4、计算每个rois相对于它的gt的偏移量(回归目标targets),这个过程和rpn-data层中计算RPN阶段的回归目标一样。然后还需要将targets减去事先设定的均值,除以事先设定的标准差,最后将rois的类别添加在targets的第一列,得到bbox_target_data;
5、将rois的回归目标值放入与rois的类别相对应的位置,得到bbox_targets,并将bbox_inside_weights对应位置的4个值赋为1,而bbox_targets, bbox_inside_weights其他位置的值都为0,bbox_outside_weights在bbox_inside_weights大于0的位置值为1,其他位置值为0。
总结一下,这一层的输出有rois, labels, bbox_targets, bbox_inside_weights, bbox_outside_weights。第二阶段全连接网络的输出bbox_pred将和其中的bbox_targets, bbox_inside_weights, bbox_outside_weights作为第二阶段loss_bbox的输入。roi-data层的代码链接见这里。