mask-rcnn原理
主干网络
作用:用来提取图片特征
就是一般的VGG/RESNET等特征提取网络,在mask_rcnn中使用了FPN,使用了不同下采样的feature maps去预测。
PPN
作用: 两阶段网络用来区分前景与背景(并无分类能力)。
借用一张faster rcnn的图:
在PRN中会首先再经过一个3x3卷积,然后分两支使用1x1卷积进行confidence预测与box的偏置量预测,在faster rcnn中使用的是softmax,且base_anchor是9个,每个点用九个anchor去匹配,每个点的预测信息就是confidence(9x2)+box(9x4),所以在box回归分支输出是(36x32x32),confidence分支输出是(18x32x32)。
可能没接触过caffe的炼丹师看着中间的两个reshape不知所以然,实际是框架实现的差异(在caffe中需要利用reshape将信息转换成需要的维度),caffe中caffe softmax_loss_layer.cpp原文注释:
"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be NHW, "
“with integer values in {0, 1, …, C-1}.”;
在pytorch中是不需要中间两个reshape层的,最后在confidence分支加上softmax层进行分数的归一化。此时可以得到在feature maps上每个点所有匹配anchor的对应类型信息(背景与前景):18x32x32,与每个点每个anchor的框回归值:36x32x32。
在训练中:会根据anchor经过回归后的box与GT的iou以及confidence来选出前面topk个框进行训练,
此处会有9216(32x32x9)个anchor, 区分正负样本、忽略样本后,会先取PRE_NMS_TOPK_TRAIN个正样本,然后nms后取POST_NMS_TOPK_TRAIN个作为预选的正样本(仍然不是最终用来训练的正样本),然后在预选的正样本中随机选择128个,另外随机选择128个负样本,组成256样本进行训练
在测试中:根据confidence选出topk个预测框,最终的预测就是POST_NMS_TOPK_TEST个。
在得到最后的box信息后,可以在主干网络提取的特征上根据坐标找到对应的特征,但是由于对应后每个框都是不一样大小,后续还需要将这些box特征送入第二阶段来得到我们最终所需的检测框种类、更精确的定位、keypoints信息,所以需要ROIAlign。
ROIAlign
作用:将RPN 选择的box在主干网络提取feature maps所对应的不规则box features统一化。
详解可以参考:ROIAlign
box分支
在经过ROIAlgin后,所得信息是256x7x7,
KeyPoints
此分支的输入不再是256x14x14,box feature的个数是box最后得到的检测框的个数,且是其检测框所所对应的proposal box feature,每个类型点用过一个heatmap 找到响应最大的点然后映射回原坐标就可以得到关键点的预测。
基于detectron2实现及注意事项
有时间再慢慢将各个阶段的细节以及detectron2的实现填写完整。