《CenterMask:Real-Time Anchor-Free Instance Segmentation》论文笔记
代码地址:CenterMask
1. 概述
导读:在这篇文章提出的新instance分割方法是基于FCOS的,首先,文章在FOCS的box检测的基础上通过添加一个SAG-Mask(spatial attention-guided mask)分支来实现像Mask RCNN中类似的分割效果。在FCOS检测的box结果基础上使用空间注意力特征(spatial attention map)帮助进行目标聚焦与抑制噪声。其次,在此基础上文章还对VoVNet进行了如下的有效改进:1)通过引入残差连接减轻更大VoVNet中的饱和问题;2)使用effective Squeeze-Excitation(eSE)解决原有SE中信息损失的问题;使用相同的ResNet101-FPN骨干网络情况下文章的方法性能达到了38.3% mask AP,超过了之前所有的网络,而且还快。与之对应的轻量级本班CenterMask-Lite也取得了33.4% mask AP与38% box AP,其速度在Titan Xp上能跑到35FPS。
在实例分割中比较出名是Mask RCNN与其基础上得到的改进算法,也有从速度上去考虑的算法YOLACT但是它是采用RetinaNet一阶段检测器做box检测,虽然在速度上相比Mask RCNN快了不少,但是在网络的性能表现上其与Mask RCNN还是有较大的差距的。在下图中展示了上面提到的实例分割算法与本文的算法在速度与性能上的比较:
这篇文章的算法是在FCOS检测器的基础上改进得到的,FCOS是一个anchor free的检测器,因而就少了很多超参数调整的过程。作者在FCOS的基础上添加了SAG-Mask来实现了实例分割。
在RoI区域的在FPN不同层的分配上不同与Mask RCNN,Mask RCNN在进行RoI区域分配的时候并没有考虑输入尺度信息,而这片文章考虑了输入的尺度,采用了自适应尺度的RoI区域分配方式,使得文章算法更加稳定。
在检测网络得backbone方面这里在VoVNet的基础之上进行改进(更深的网络带来更好的结果),解决了在堆叠OSA模块带来的性能饱和问题(由于反传梯度收到干扰),这是通过在OSA模块之间使用残差相连处理的(借鉴ResNet的思想)。
在原有的Squeeze-Excitation(SE)模块(channel attention)中使用两个FC会使得通道信息丢失,因而文章重新设计了SE模块,将其中的2个FC替换为1个FC,得到了新的SE模块eSE。
2. 方法设计
文章的算法结构见下图所示,其主要由三个部分组成:backbone+FPN、FOCS检测头、SAG-Mask分割分支。前面两个是FCOS检测网络中就有的,文章就是再次基础上添加分割分支。
2.1 自适应的RoI分配机制
在Mask RCNN网络中根据检测出来RoI的大小将其分布到不同FPN层上,之后再使用RoI Align进行特征对齐。其实现过程可以描述为如下的映射关系:
但是上面的公式并不是很适合本文的方法,其原因主要计入如下两点:
- 1)在原始的FPN网络中使用的特征是从到,而在文章使用的一阶段网络中使用的是到;
- 2)上面参数中的224是源自于ImageNet,这个对于其它尺寸的输入图片还按照这个尺寸进行分配就显得不是很合理,并没有和输入的尺度相关联起来;
基于上面的两点文章将RoI映射的关系调整为如下的形式:
其中,是最后的层级,分别代表输入图像数据的面积与RoI区域的面积。这样的映射关系相比Mask RCNN中的映射关系使得检测网络对小目标更加友好,这也体现在后面的小目标的检测性能上了。文章中对于层级的参数设置为:。
2.2 空间注意力引导的Mask分割
注意力机制是用来提升网络对于某些特征的关注度,这里使用了spatial attention去关注特征图中特定的块特征。其结构见下图所示:
其运算符过程可以描述为,对于输入的特征图,将其进行channel维度上的max与avg pooling得到池化之后的特征。之后将其通过一个的卷积(恢复channel)之后与原输入进行element-wise相乘得到最后的结果。则第一步可以描述为:
之后第二步就是使用attention之后的特征去增强原始的输入特征了:
2.3 VoVNet的改进
VoVNet是一个计算效率与性能都很不错的网络,文章就是在此基础上进行改进得到其改进的版本VoVNet-V2。其改进的地方主要体现在:
- 1)添加了输入到输出的残差连接网络,解除了随着网络深度叠加带来的性能饱和与梯度问题;
- 2)在输出的内部添加了一个channel上的attention模块eSE。原始的SE模块中使用两个FC去进行channel权重映射,但是为了减少计算量通常会将FC中的channel给剪裁一些(小于输入的channel),这就引入了一些信息的损失,为此文章直接将两个FC替换为了一个FC。
因而,按照上面的思路对原有的OSA模块进行改进,得到新的模块结构如下图所示:
2.4 网络的损失函数
这里的损失函数是在FCOS原有损失函数的基础上添加了一个mask分支的损失函数:
3. 实验结果
性能比较:
mask分割方法与backbone中相关变量的消融实验:
不同backbone对性能的影响: