Mask R-CNN
arXiv : https://arxiv.org/pdf/1703.06870.pdf
github: https://github.com/matterport/Mask_RCNN
conf & anthor: ICCV17,Kaiming He et. al
intro: ROI Align, FCN
主要内容:
Mask R-CNN通过在Faster R-CNN的基础上,在RPN网络得到RoI之后,增加一个分支FCN网络,实现对BBox中的物体进行实体分割。
基本思路:
Faster R-CNN中通过RPN可以得到一些RoI,这些区域通过RoI pooling之后,再经过全连接网络计算目标的类别和坐标。在Mask R-CNN中,在RoI的基础上,新增一个全卷积分支网络,以实现目标的分割任务。
(1) ROI Align
: Fast R-CNN中使用的ROI pooling操作,首先要确定region在最后的feature map上的位置,这一步需要将像素坐标转换到feature map坐标上,比如
x
/
16
x/16
x/16然后取整;然后需要将feature map上的区域划分为
n
∗
n
n*n
n∗n(如
7
∗
7
7*7
7∗7)的格子,做pooling操作;这两步操作需要进行quantization(量化),会造成坐标精度的损失。因此,Mask R-CNN中提出了RoIAlign操作,避免了由于量化操作带来的坐标精度的损失。具体的做法如下图:在将像素坐标转换到feature map坐标这一步上,不进行取整,得到的是带小数位的feature map上的坐标,然后将该AlignBox划分为n*n的格子,每个格子中均匀采样四个点,每个点的值通过在feature map上进行双线性插值得到。最后在每个格子中通过平均或者最大池化得到输出。 在TensorFlow中,RoIAlign可以通过tf.image.crop_and_resize()
函数简化实现,简化的方面是将格子中心的插值结果最为输出,而不是取四个点再做池化。
(2) 分支网络
:Mask R-CNN中在ROIAlign之后增加了一条全卷积的分支网络,用于Mask的预测。文章中对以ResNet和FPN为主干网络分别设计了两种分支结构。以ResNet为例,如下图,经过deconv扩大feature map的尺寸,最后输出的mask的尺寸为
14
∗
14
∗
80
14*14*80
14∗14∗80,通道数目为80是为每一个类别预测了一个mask(coco数据集的类别数目为80)。
(3) 损失函数
: Mask R-CNN中使用了类别+坐标+mask的多任务损失函数
L
l
o
s
s
=
L
c
l
s
+
L
c
o
o
r
+
L
m
a
s
k
L_{loss}=L_{cls}+L_{coor}+L_{mask}
Lloss=Lcls+Lcoor+Lmask,其中类别和坐标损失与Fastre R-CNN中的一致。Mask R-CNN中最后输出的mask的尺寸为
m
∗
m
∗
K
m*m*K
m∗m∗K(如
14
∗
14
∗
80
14*14*80
14∗14∗80),通道数K表示目标类别数目。 计算
L
m
a
s
k
L_{mask}
Lmask时只使用RoI的真实类别的那一个通道的损失,其他通道均不贡献损失,具体计算时使用的是空间位置上所有点的sigmiod变换后的二元交叉熵损失的均值。
L
m
a
s
k
=
1
m
2
∑
i
K
(
1
k
)
∑
1
m
2
[
−
y
l
o
g
(
s
i
g
m
o
i
d
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
s
i
g
m
o
i
d
(
x
)
)
]
L_{mask}=\frac{1}{m^2}\sum_i^K(1^k)\sum_1^{m^2}[-ylog(sigmoid(x))-(1-y)log(1-sigmoid(x))]
Lmask=m21i∑K(1k)1∑m2[−ylog(sigmoid(x))−(1−y)log(1−sigmoid(x))]
其中:
- 1 k 1^k 1k 表示当第 k k k个通道对应目标的真实类别时为1,否则为0 ;
- y y y表示当前位置的mask的label值,为0或1;
- x x x当前位置的输出值, s i g m o i d ( x ) sigmoid(x) sigmoid(x)表示输出x经过sigmoid函数变换后的结果;