Mask R-CNN结构细节回顾
急急如律令!offer速来见我!
Mask R-CNN
Dataset
输入数据的格式
读入COCO标注格式的标注文件,可以得到图片及对应的标注。
标注的数据格式如下:
输入网络的targets:
- batch为2,因此targets长度为2
- 第一张图片***有4个box,标注信息包括box坐标、box类别、实例polygon格式的mask
网络结构
总体结构
网络总体由三部分组成,backbone、RPN、ROI Head,三者的输入输出关系如下图所示。
Backbone
backbone由ResNet和FPN组成。
RPN
(3.1)RPN Head
(3.2)anchor生成
- step-1 在一个特征图( H/n,W/n)的一个cell上生成3个面积大小为
base_size
,长宽比分别为(0.5, 1, 2)的box,以cell为中心,放大box n倍; - step-2 在特征图的每一个cell上执行step1,共生成 H/n⋅W/n⋅3个anchor;
- step-3 删除anchor范围超出原始图片的anchor(也可设定为超出一定阈值)
使用相同的
base_size
,对于较小的特征图来说,生成的anchor比较大,说明用来检测较大的物体。
(3.3)proposals生成(RPN后处理)
- 对5种不同尺度的特征图,都执行以下操作
- i) 以大小为
H/n, W/n
的特征分支为例,其anchor个数为H/n * W/n * 3
; - ii) 取出置信度前
pre_nms_top_n
的anchors;(egpre_nms_top_n=2000
) - iii) 根据regression结果和anchor坐标,计算出proposals坐标
- iv) 执行一次NMS(第一次),并限制proposals最大个数为
post_nms_top_n
- 收集5个特征分支的proposals,选择置信度最高的
fpn_post_nms_top_n
个
最后再把真实的gt-box
加入到proposals中
(3.4)计算损失
i)为所有anchor制作label
首先为分配前景后景标签。
满足以下条件的anchor设置为正标签1
(前景):
- 与gt最大IoU超过
high_threshold=0.7
的anchor - 与gt IoU最大的anchor(有可能最大的IoU没有超过阈值,通过该规则将其捡回来)
满足以下条件的anchor设置为负标签0
(背景):
- 与gt最大IoU小于
low_threshold=0.3
的anchor
其他与gt最大IoU介于阈值之间的(0.3,0.7)记为其他类,不算损失。
再计算anchor与对应gt的回归目标
ii)正负样本均衡化(筛选)
batch_size_per_image
:每张图片用于计算损失的anchor数目,eg 256
positive_fraction
:正样本所占比例, eg 0.5
正样本取num_pos=min(0.5*256, fg)
,即若生成的anchor中正样本数目超过128,则取128;若少于128,则保留所有正样本。
负样本取num_neg = batch_size_per_image - num_pos
iii)损失计算
类别损失,前后景预测的损失,交叉熵损失。
Lcls(pi)=−pi∗log(pi)−(1−pi∗)log(1−pi)
回归损失,边框位置回归损失, smoothL1损失。
坐标变换系数
txtwtx∗tw∗=(x−xa)/wa,ty=(y−ya)/ha=log(w/wa),th=log(h/ha)=(x∗−xa)/wa,ty∗=(y∗−ya)/ha=log(w∗/wa),th∗=log(h∗/ha)
smoothL1函数:
smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
Lreg(ti)=p∗smoothL1(ti,ti∗)
只计算前景的回归损失
联合两项损失:
LRPN=Ncls1i∑Lcls(pi)+λNreg1i∑Lreg(ti)
其中 Ncls即用于计算损失的anchor个数,batch_size_per_image
,而 Nreg则为正样本的个数,num_pos
ROI Head
(4.1) RoI Box Head
- feature extractor
- predictor
- post_processor
- loss
feature extractor
- 先对2000个proposal做筛选。计算proposals与gt的IoU,大于0.7的设置为前景,小于0.3的设置为背景。总共取512个proposals,正样本最多为
0.25×512=128个
,其余为负样本。 - 使用ROI Align取出proposal对应的特征。
ROI
尺寸设置为7
,features
的channel=256
,则取出来的特征维度为512*256*7*7
,reshape成512×12544
- 送入两个全连接层
(12544,1024)、(1024,1024)
,得到特征512*1024
predictor
- 分支一,全连接预测类别
(1024, num_calsses)
- 分支二,全连接预测坐标变换系数
(1024, 8)
loss
- 计算512个
proposals
的交叉熵分类损失 - 计算正样本边框回归系数的 smoothL1
post processor
(4.2) RoI Mask Head
- ROI Align
- feature extractor
- predictor
- post_processor
- loss
ROI Align
- 取出
512
个proposals中的前景proposals,假设有20个 - 使用ROI Align取出proposal对应的特征。
ROI
尺寸设置为14
,features
的channel=256
,则取出来的特征维度为20*256*14*14
feature extractor
- 4个连续的
3*3
卷积 - 输出
20*256×14*14
的tensor
predictor
- 输入
20*256×14*14
的tensor - 经过一个转置卷积,输出
20*256×28*28
的tensor - 再经过一个
1×1
的卷积,输出20×num_class×28*28
tensor
loss
- 根据前景proposals和gt的IoU,得到每个proposals对应的实例及其mask
- 用proposals裁剪mask,并将mask
resize
到28×28
,作为实际值用于计算loss - 取出预测tensor中对应实例类别的Channel,和上一步得到的
mask_target
计算交叉熵损失。
mask_loss = F.binary_cross_entropy_with_logits(
mask_logits[positive_inds, labels_pos], mask_targets
)