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 H/n, W/n H/n,W/n)的一个cell上生成3个面积大小为base_size,长宽比分别为(0.5, 1, 2)的box,以cell为中心,放大box n n n倍;
  • step-2 在特征图的每一个cell上执行step1,共生成 H / n W / n 3 H/n \cdot W/n \cdot 3 H/nW/n3个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;(eg pre_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)损失计算
类别损失,前后景预测的损失,交叉熵损失。
L c l s ( p i ) = p i l o g ( p i ) ( 1 p i ) l o g ( 1 p i ) L_{cls}(p_i) = -p_i^*log(p_i) - (1-p_i^*)log(1-p_i) Lcls(pi)=pilog(pi)(1pi)log(1pi)

回归损失,边框位置回归损失, s m o o t h L 1 smooth_{L_1} smoothL1损失。

坐标变换系数
<mstyle displaystyle="true" scriptlevel="0"> t x </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( x x a ) / w a , t y = ( y y a ) / h a </mstyle> <mstyle displaystyle="true" scriptlevel="0"> t w </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = log ( w / w a ) , t h = log ( h / h a ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> t x </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = ( x x a ) / w a , t y = ( y y a ) / h a </mstyle> <mstyle displaystyle="true" scriptlevel="0"> t w </mstyle> <mstyle displaystyle="true" scriptlevel="0"> = log ( w / w a ) , t h = log ( h / h a ) </mstyle> \begin{aligned} t_{\mathrm{x}} &amp;=\left(x-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}=\left(y-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ t_{\mathrm{w}} &amp;=\log \left(w / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}=\log \left(h / h_{\mathrm{a}}\right) \\ t_{\mathrm{x}}^{*} &amp;=\left(x^{*}-x_{\mathrm{a}}\right) / w_{\mathrm{a}}, \quad t_{\mathrm{y}}^{*}=\left(y^{*}-y_{\mathrm{a}}\right) / h_{\mathrm{a}} \\ t_{\mathrm{w}}^{*} &amp;=\log \left(w^{*} / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}^{*}=\log \left(h^{*} / h_{\mathrm{a}}\right) \end{aligned} txtwtxtw=(xxa)/wa,ty=(yya)/ha=log(w/wa),th=log(h/ha)=(xxa)/wa,ty=(yya)/ha=log(w/wa),th=log(h/ha)

s m o o t h L 1 smooth_{L_1} smoothL1函数:
smooth L 1 ( x ) = { <mstyle displaystyle="false" scriptlevel="0"> 0.5 x 2 </mstyle> <mstyle displaystyle="false" scriptlevel="0"> <mtext>  if  </mtext> x &lt; 1 </mstyle> <mstyle displaystyle="false" scriptlevel="0"> x 0.5 </mstyle> <mstyle displaystyle="false" scriptlevel="0"> <mtext>  otherwise  </mtext> </mstyle> \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}{0.5 x^{2}} &amp; {\text { if }|x|&lt;1} \\ {|x|-0.5} &amp; {\text { otherwise }}\end{array}\right. smoothL1(x)={0.5x2x0.5 if x<1 otherwise 

L r e g ( t i ) = p s m o o t h L 1 ( t i , t i ) L_{reg}(t_i) = p^* smooth_{L_1}(t_i, t_i^*) Lreg(ti)=psmoothL1(ti,ti)

只计算前景的回归损失

联合两项损失:
L R P N = 1 N c l s <munder> i </munder> L c l s ( p i ) + λ 1 N r e g <munder> i </munder> L r e g ( t i ) L_{RPN} = \frac{1}{N_{cls}}\sum_{i}L_{cls}(p_i) + \lambda \frac{1}{N_{reg}}\sum_i L_{reg}(t_i) LRPN=Ncls1iLcls(pi)+λNreg1iLreg(ti)
其中 N c l s N_{cls} Ncls即用于计算损失的anchor个数,batch_size_per_image,而 N r e g N_{reg} 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尺寸设置为7featureschannel=256,则取出来的特征维度为512*256*7*7,reshape成512×12544
  • 送入两个全连接层(12544,1024)、(1024,1024),得到特征512*1024

predictor

  • 分支一,全连接预测类别 (1024, num_calsses)
  • 分支二,全连接预测坐标变换系数(1024, 8)

loss

  • 计算512个proposals的交叉熵分类损失
  • 计算正样本边框回归系数的 s m o o t h L 1 smooth_{L_1} 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尺寸设置为14featureschannel=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*28tensor

loss

  • 根据前景proposals和gt的IoU,得到每个proposals对应的实例及其mask
  • 用proposals裁剪mask,并将maskresize28×28,作为实际值用于计算loss
  • 取出预测tensor中对应实例类别的Channel,和上一步得到的mask_target计算交叉熵损失。
mask_loss = F.binary_cross_entropy_with_logits(
            mask_logits[positive_inds, labels_pos], mask_targets
        )
全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务