1
主要是从roidb生成blobs的过程
以上便是整体的流程图,那么简单说一下detectron产生anchor的过程
相对于之前faster产生一系列的anchor不同,FPN在每一个level上面都会创建属于该level感受野的anchor,假设stride为4,8,16,32,64,那么在每一个stride上面,会产生一种面积的,长宽比分别为0.5,1,2的三种anchor,相比于之前的一下子产生多种面积多种长宽比的anchor要更加合理。
def _generate_anchors(base_size, scales, aspect_ratios):
"""Generate anchor (reference) windows by enumerating aspect ratios X #每一个base_size对应一个scales,固定为8
scales wrt a reference (0, 0, base_size - 1, base_size - 1) window.
"""
anchor = np.array([1, 1, base_size, base_size], dtype=np.float) - 1
anchors = _ratio_enum(anchor, aspect_ratios)
anchors = np.vstack(
[_scale_enum(anchors[i, :], scales) for i in range(anchors.shape[0])]
)
return anchors
在rpn.py里面有
# Add RPN targets
if cfg.FPN.FPN_ON and cfg.FPN.MULTILEVEL_RPN:
# RPN applied to many feature levels, as in the FPN paper
rpn_blobs = _get_rpn_blobs(
im_height, im_width, foas, all_anchors, gt_rois #这里的这个函数产生五个level的blob,保存成5个字典
)
for i, lvl in enumerate(range(k_min, k_max + 1)):
for k, v in rpn_blobs[i].items():
blobs[k + '_fpn' + str(lvl)].append(v) #将产生的五个字典对应到对应的blob里面
else:
# Classical RPN, applied to a single feature level
rpn_blobs = _get_rpn_blobs(
im_height, im_width, [foa], all_anchors, gt_rois
)
for k, v in rpn_blobs.items():
blobs[k].append(v)
最后在rpn部分,blob里面的键值一共有23个,是哪23个呢?
一共有5个level,每一个level都会有
rpn_labels_int32_wide_fpn_x,rpn_bbox_targets_wide_fpn_x, rpn_bbox_inside_weights_wide_fpn_x,rpn_bbox_inside_weights_wide_fpn_x这四个参数,所以一共有20个
再加上roidb,data和im_info这三个参数,最后一共是23个
解析一下这几个blob里面存储的是什么
rpn_labels_int32_wide_fpn_x:存储的是对应level的anchor的label也即是背景还是前景
rpn_bbox_targets_wide_fpn_x:存储的是对应level的anchor的bbox的target,也即回归的目标
rpn_bbox_inside_weights_wide_fpn_x: 存储的是对应的回归目标的权重,只对正样本的权重做出设置,其他的为0,x,y,w,h四个参数的权重设置为1
rpn_bbox_inside_weights_wide_fpn_x: 对整个minibatch做平均的时候用到的,只统计参与训练的样本的个数,然后用1除以这个个数做归一化
roidb:roidb里面存储的是最原始从数据的标注里面加在的一些列的信息,包括label等等,具体包含的内容如下
valid_keys = [
'has_visible_keypoints', 'boxes', 'segms', 'seg_areas', 'gt_classes',
'gt_overlaps', 'is_crowd', 'box_to_gt_ind_map', 'gt_keypoints'
]
data:存储的是对应的roidb里面的图片以及缩放的尺度信息;
im_info:缩放后的图片的大小以及尺度的信息
blob里面存储的是一个batch的图片信息,假设cfg.TRAIN.IMS_PER_BATCH=2,那么blob一次存储的将是两张图片的信息,例如,此时blobs['data']存储的是两张图片的RGB存储,以此类推