本博客作为本人学习笔记。 本文重点介绍原论文中网络结构细节与损失函数,并分析其优缺点。 关于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部分,有效提高了模型性能。
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分支以及训练细节的小修改,实现了目标检测+关键点检测任务。
3. 解耦
在Mask分支,模型decouple
了Mask logits的生成与cls的预测。论文实验验证了:相较未解耦的情况,解耦操作获得了更好的效果。具体细节可见模型架构部分。
二、模型架构
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池化出的特征不够准确。如下图所示。
(2)RoI Align
RoI Align便是为了解决misalignment问题而对RoI Pooling所做的改进。RoI Align核心思想为:
- 取消原RoI Pooling在根据Proposals在feature map上找对应区域的取整操作,直接保留对应区域的浮点值
- 根据需要保留的子空间个数(Pooling后的size),计算每个子空间中心在feature map上的坐标
- 使用双线性插值算法得出子空间中心坐标插值(池化后结果)
原论文中设置的RoI Align后子空间size为14x14。
2. Mask分支
(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)+(1−y^)log(1−y)]
其中
y
^
\hat{y}
y^和
y
y
y分别代表GTmask中、生成的mask中前景的概率(即值为1像素的概率)。
四、Mask R-CNN总流程图
下图来源于博客:https://blog.csdn.net/weixin_43702653/article/details/124377487