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损失。

坐标变换系数
t x = ( x − x a ) / w a , t y = ( y − y a ) / h a t w = log ⁡ ( w / w a ) , t h = log ⁡ ( h / h a ) t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a t w ∗ = log ⁡ ( w ∗ / w a ) , t h ∗ = log ⁡ ( h ∗ / h a ) \begin{aligned} t_{\mathrm{x}} &=\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}} &=\log \left(w / w_{\mathrm{a}}\right), \quad t_{\mathrm{h}}=\log \left(h / h_{\mathrm{a}}\right) \\ t_{\mathrm{x}}^{*} &=\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}}^{*} &=\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 ) = { 0.5 x 2  if  ∣ x ∣ &lt; 1 ∣ x ∣ − 0.5  otherwise  \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 ∑ i L c l s ( p i ) + λ 1 N r e g ∑ i 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
        )
  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值