Mask R-CNN要点总结

本博客作为本人学习笔记。 本文重点介绍原论文中网络结构细节与损失函数,并分析其优缺点。 关于Mask R-CNN的优质博客供参考:第一篇;第二篇
部分图片来源于上述博客


目录

  • 零、介绍
  • 一、主要思想
    • 1. ROI Align代替ROI Pooling
    • 2. Faster R-CNN + 分支
    • 3. 解耦
  • 二、模型架构
    • 1. RoI Align
      • (1)RoI Pooling
      • (2)RoI Align
    • 2. Mask分支
      • (1)Mask的生成
      • (2)解耦Class与Mask
  • 三、损失函数
    • 1. 损失组成
    • 2. L o s s m a s k Loss_{mask} Lossmask
  • 四、Mask R-CNN总流程图

零、介绍

Mask R-CNN是two-stage目标检测模型,基于Faster R-CNN改进,一作是何恺明大神,还有Faster R-CNN系列的大神Ross Girshick。该论文获得了ICCV 2017的最佳论文奖(Marr Prize)。该网络提出后,霸榜了MS COCO的各项任务,包括目标检测、实例分割以及人体关键点检测任务。Mask R-CNN的结构简洁灵活,并且效果奇好。其仅仅是在Faster R-CNN的基础上根据任务需求加入一些新的分支即可完成不同的task。本文在Faster R-CNN部分将不会赘述。


一、主要思想

1. ROI Align代替ROI Pooling

Mask R-CNN沿用R-CNN系列的two-stage策略,依旧是先通过RPN生成兴趣区域,再根据ROI进行下游任务。由ROI进行下游任务的第一步便是根据ROI对feature map进行下采样。但是原来的ROI Pooling会由于强制取整而出现misalignment的问题,于是作者提出基于双线性插值(Bilinear interpolation)的ROI Align代替ROI Pooling部分,有效提高了模型性能。

Mask R-CNN要点总结_第1张图片

2. Faster R-CNN + 分支

Faster R-CNN就是在Fast R-CNN基础上,在ROI Pooling后加入检测头,进行cls以及bbox预测。Mask R-CNN沿用这种思想,在Faster R-CNN基础上添加mask分支,生成掩模,完成实例分割任务。也就是说,Mask R-CNN同时可以实现目标检测+分支任务。原论文中通过对mask分支以及训练细节的小修改,实现了目标检测+关键点检测任务

Mask R-CNN要点总结_第2张图片

3. 解耦

在Mask分支,模型decouple了Mask logits的生成与cls的预测。论文实验验证了:相较未解耦的情况,解耦操作获得了更好的效果。具体细节可见模型架构部分。

Mask R-CNN要点总结_第3张图片


二、模型架构

1. RoI Align

(1)RoI Pooling

先来说说Faster R-CNN中RoI Pooling的问题。RPN生成的Proposals是基于原输入img的,要进行RoI Pooling,便要先将Proposals找到在feature map上缩放后的准确定位。这里就会出现2个问题:1)缩放后feature map上的区域可能不是整数,需要强制取整。2)之后进行Pooling时不能均分feature map里的值。这在原论文中称为misalignment的问题,这会导致根据Proposals池化出的特征不够准确。如下图所示。
Mask R-CNN要点总结_第4张图片

(2)RoI Align

RoI Align便是为了解决misalignment问题而对RoI Pooling所做的改进。RoI Align核心思想为:

  • 取消原RoI Pooling在根据Proposals在feature map上找对应区域的取整操作,直接保留对应区域的浮点值
  • 根据需要保留的子空间个数(Pooling后的size),计算每个子空间中心在feature map上的坐标
  • 使用双线性插值算法得出子空间中心坐标插值(池化后结果)

Mask R-CNN要点总结_第5张图片
Mask R-CNN要点总结_第6张图片

原论文中设置的RoI Align后子空间size为14x14。

2. Mask分支

Mask R-CNN要点总结_第7张图片

(1)Mask的生成

论文中有两种Mask分支的形式。一种是backbone不加FPN的网络的branch(上图左侧);另一种是backbone+FPN的结构的branch(上图右侧)。一般我们都是使用的右侧结构,也就是使用FPN。论文里也证明了使用FPN带给了模型更好的效果

具体细节为:
经过Align后得到14x14x256的输出,之后经过连续四个3x3大小的卷积层,输出同样size的feature map;之后进行反卷积和1x1卷积层分别改变size和channels,得到28x28xnum_cls的输出。此输出再经过sigmoid函数(被压缩至0~1),然后根据阈值被二值化后成为logits原论文中num_cls设置为80。

(2)解耦Class与Mask

需要注意的一点是:模型针对每个Proposal都要生成28x28xnum_cls的掩模集logits,之后在根据传入的类别信息挑出其中对应类channel的掩模作为此区域对应类别的掩模。这就相当于解耦(decouple)了Mask与Class的计算,因为计算Mask时并未收到Class的影响,网络都一视同仁输出所有类别的掩模,避免了不同类别的掩模间的竞争。论文中提到此方法提升了模型的分割效果。


三、损失函数

1. 损失组成

损失函数的组成具体如下:
L o s s = L o s s r p n + L o s s f a s t r c n n + L o s s m a s k Loss = Loss_{rpn} + Loss_{fast_rcnn} + Loss_{mask} Loss=Lossrpn+Lossfastrcnn+Lossmask

其中 L o s s r p n + L o s s f a s t r c n n Loss_{rpn} + Loss_{fast_rcnn} Lossrpn+Lossfastrcnn就是Faster R-CNN的损失,想复习可以戳这里。 L o s s m a s k Loss_{mask} Lossmask则是Mask branch的损失。

2. L o s s m a s k Loss_{mask} Lossmask

在训练过程中,由此Proposals对应的GT cls确定挑选哪个类别对应的logits。计算 L o s s m a s k Loss_{mask} Lossmask首先要得到GT Mask:根据Proposals将原图裁剪缩放至28x28大小,并对其进行二值化(FG-1,BG-0)得到GY Mask计算GT Mask与Mask的BCE(BinaryCrossEntropy)即可。即:
L o s s m a s k = B C E ( y ,    y ^ ) = − [ y ^ l o g ( y ) + ( 1 − y ^ ) l o g ( 1 − y ) ] Loss_{mask} = BCE(y, \; \hat{y}) = -[\hat{y}log(y) + (1 - \hat{y})log(1- y)] Lossmask=BCE(y,y^)=[y^log(y)+(1y^)log(1y)]
其中 y ^ \hat{y} y^ y y y分别代表GTmask中、生成的mask中前景的概率(即值为1像素的概率)。


四、Mask R-CNN总流程图

下图来源于博客:https://blog.csdn.net/weixin_43702653/article/details/124377487

Mask R-CNN要点总结_第8张图片

你可能感兴趣的:(目标检测领域论文要点总结,目标检测,深度学习,视觉检测,计算机视觉)