文章目录
论文链接: https://arxiv.org/abs/2003.10152
代码链接: http://github.com/WXinlong/SOLO
一、背景
在 SOLOv1的基础上的两个提升:
-
1、Mask Learning
SOLOv2要进一步动态学习目标分割器的 mask head,mask head 被解耦成 mask kernel branch 和 mask feature branch,分别来学习卷积核和卷积特征。mask learning 可以分为两部分:
- convolutional kernel learning:当把 pixel 分类到不同的网格中时,网络会自动预测要使用的分类器,并根据输入图像进行调整。
- feature learning:很多的语义分割技术都可以用来提高性能,受FPN 启发, SOLOv2 为实例分割构建了一个统一,且有高分辨率 mask 特征表达。
-
2、Mask NMS
在 SOLOv1的基础上,SOLOv2提出了一个 Matrix NMS 来降低 inference 的时间。Matrix NMS 是并行矩阵乘法,能够一次性实现 NMS。
对于 mask NMS,NMS 的缺点被放大了,相比 bbox,mask NMS 需要更多的时间来为每个 mask 计算 IoU,导致更大的开销。通过引入矩阵 NMS,可以并行的第一性执行完成。
二、相关工作
Instance Segmentation:
本文的方法是从SOLO[33]发展而来的,直接将原始的 mask 预测解耦为 kernel 学习和特征学习。不需要anchor、归一化、边界框检测。直接将输入图像映射到所需的类别和 mask。训练和推理都简单得多。因此,该框架简单得多,但实现了显著的更好的性能(相同速度下提升了6%的AP);最佳模型实现了41.7 AP,而YOLACT的最佳31.2%AP。
Dynamic Convlutions:
传统的卷积层中学习的卷积核是固定的,且和输入无关,也就是说一幅图像共享一个相同的卷积核。
也有一些工作在探究能否给传统的卷积中引入更灵活的思想。
Spatial Transform Networks[15] 预测全局参数变换来 wrap 特征图,使得网络能够根据输入来自适应的变换特征图。
Dynamic filter[16] 用于预测卷积核的参数,以特定样本的方式将动态生成的卷积核应用于图像。
Deformable Convolutional Networks [8] 通过预测每个图像位置的偏移量来动态学习采样位置。将动态方案引入到实例分割中,实现了基于位置的实例分割学习。
三、重看 SOLOv1
SOLOv1框架的核心思想是按位置分割对象。
见博客:https://blog.csdn.net/jiaoyangwm/article/details/105491010
四、SOLOv2
4.1 Dynamic Instance Segmentation
将 SOLOv1 的原始 mask branch 解耦为 mask kernel branch + mask feature branch,如图2所示。
4.1.1 Mask kernel branch
mask kernel 分支和类别预测分支一起位于预测 head 中。
head 在 FPN 生成的特征图金字塔中作用,两个 head 中的 4x conv 用于特征抽取,最后一个 conv 用于预测。head 的权重是共享的。通过给第一个卷积机上归一化后的坐标,来给 kernel 分支加上空间功能。也就是给第一个卷积层输出那里增加两个额外的通道,一个输入i,一个输入j。
对于每个 grid,kernel branch 预测 D 维输出,表示预测的卷积核权重,D 是参数的个数。为了给输出为 E 个通道的1x1卷积产生权重,设定 D=E。对 3x3 卷积,D=9E。这种weights是根据位置生成的,也就是 grid cell。如果将图像分割成 S × S S \times S S×S 个格子,输出为 S × S × D S \times S \times D S×S×D
4.1.2 Mask feature branch
mask feature branch 需要预测每个实例的特征图 F ∈ R H × W × E F \in R^{H\times W \times E} F∈RH×W×E,E 是 mask feature 的维度。F 是和 mask kernel branch 预测的 kernel 卷积的得到的。如果所有预测的权重都使用了,也就是 S 2 S^2 S2 个分类器,则最后一层卷积后输出的实例 mask 是 H × W × S 2 H \times W \times S^2 H×W×S2,和 SOLOv1相同。
由于 mask feature 和 mask kernel 是解耦开的且分别预测的,因此有两种方法来构造 mask feature 分支:
- ① 直接和 kernel branch 一起放到 head处,这就意味着可以预测每个 FPN level 的 mask feature
- ② 给所有的 FPN level 预测相同的 mask feature 表达。
对比两者,最后作者使用了第二种方法。
为了学习一个统一且高分辨率mask 特征表达,作者使用特征金字塔融合的方法。 经过重复的 3x3 卷积+group norm+relu+2x 双线性上采样,FPN 特征 P2 到 P5 被合并成一个相同的输出(1/4 scale)。
逐点相加之后,最后一层是由 1x1 卷积+group norm+ReLU 实现的,如图3所示。
作者将坐标加到了最深层的 FPN 输出(1/32)上,这种提供精确位置信息的做法能够引入位置敏感性并且预测得到与 instance-aware 特征。
4.1.3 Forming Instance Mask
对于每个网格 ( i , j ) (i,j) (i,j),首先获得 mask kernel G i , j , : ∈ R D G_{i,j,:}\in R^D Gi,j,:∈RD,然后将 G i , j , : ∈ R D G_{i,j,:}\in R^D Gi,j,:∈RD 和 F F F 卷积,来得到实例 mask。每个预测 level 总共有 S 2 S^2 S2 个mask。最后,使用 Matrix NMS 来得到最终的实例分割结果。
五、Experiments
5.1 Instance segmentation
5.1.1 Main results
5.1.2 SOLOv2 visualization
作者从两个方面可视化了 SOLOv2 学习到的东西:
- mask feature的输出
- 经过动态学习后的最终输出
Mask feature branch 的输出: 使用最终输出 64 个通道的模型(mask prediction 前的最后一层特征图的通道 E=64)。图5展示了每个 channels 。
- 首先,mask feature 是 position-aware 的
- 其次,一些特征图对所有的前景目标响应(白色框)
最终输出: 如图8所示,不同的目标是不同的颜色,可以看出本文方法分割边界的细节很好,尤其是对大目标。
SOLOv2和 Mask R-CNN 的对比如图6,SOLOv2表现更好。
5.1.3 Ablation Experiments
Kernel shape: 最优的是 1x1x256,文章中所有试验都用的这个参数
Effectiveness of coordinates: 由于本文是使用位置,或更确切的说,是利用位置来学习目标分割器。如果 mask kernel branch 对位置不敏感,则外观相同的目标将会有相同的kernel,导致相同的输出 mask。如果 mask feature branch 对位置不敏感,则它将不知道如何按照 mask 匹配的顺序将像素分配给不同通道。如表4所示,如果没有 coordinates 输入,则只能达到 36.3% AP。
这个结果还比较理想,因为 CNN 可以从 zero-padding 操作中隐式的学习到绝对位置信息。但这种隐式的学习是不准确的,使用 coordconv 时,可以增加 1.5 AP。
Unified Mask Feature Representation: 对于 mask 特征的学习,有两种选择:
- 分别学习 FPN 每个 level 的特征(solov1)
- 统一学习一个表示(图3)
表5中对比了这两种不同的方法,后者取得了好的效果,这也很容易理解,在 solov1中,大尺寸对象被分配到高层特征中去分割,高层特征的分辨率较低,会导致边界估计比较粗略。
Dynamic and Decoupled: 动态学习 head 和 decoupled head 在表6中进行了对比,dynamic head 比 decoupled head 高 0.7% AP。这种提升,作者觉得来源于网络根据输入来动态的学习 kernel weights。
Matrix NMS:
来源:oschina
链接:https://my.oschina.net/u/4269854/blog/3236117