Advertisement

【实例分割论文】SOLO v2: Dynamic, Faster and Stronger

阅读量:

论文名称:《SOLOv2: Dynamic, Faster and Stronger》

论文链接:https://arxiv.org/abs/2003.10152

该参考代码位于http://github.com/WXinlong/SOLO/(v1版本)已开源。

目录

综述

SOLO v1回顾

整体思路

操作流程(附源代码)

改进空间

SOLO v2

mask learning

Mask kernel branch

Mask feature branch

其他

mask NMS

实验结果

总结


综述

SOLO v2继承了SOLO设计的简洁与优雅,并在mask处理方面进行了优化:(1)引入了改进型mask学习机制(2)开发了一种高效矩阵NMS方法以降低计算开销。实验结果表明,在保证检测精度的前提下显著降低了前向推理时间。轻量化版本在COCO基准上实现了31.3帧/秒的平均速度并保持了37.1%的平均精度。此外,在目标检测和全景分割任务中SOLO v2均展现出优异性能,并进一步验证了SOLO设计理念在多模态视觉任务中的广泛适用性

COCO 性能指标

SOLO v1回顾

整体思路

SOLO v1 结构图

SOLO的核心理念在于将分割任务转化为定位分类问题,并在此基础上实现了三重突破:无需依赖锚框进行定位;无需归一化处理;无需进行边界框检测即可完成实例分割目标。具体而言,在图像中划分为S×S的小网格单元,在这些细粒度的空间单位内完成对目标实例的精确识别与刻画工作。当物体的质心落入某一特定网格时,则由该区域内的神经网络分支负责输出相应的类别信息与实例掩膜数据;而整个网络架构则由一个共享权重的学习器统一管理各层分支间的关联关系,并通过多尺度特征提取模块(即FPN)来适应不同尺寸的目标检测需求;其中,在骨干网络之后引入了FPN结构,并将其每一层后的输出结果分别接入两个并行处理支路中进行特征提取与信息融合操作;这种设计使得模型能够同时捕捉到目标实例在不同尺度下的特征表示,并通过自适应学习机制实现对复杂场景中的目标识别能力的有效提升。

Category Branch专注于推断物体的类别信息;每个单元格分别推断出S \times S \times C的数量与种类;这部分架构类似于YOLO.

值得重点了解Mask Branch的机制。在该模块中,每一个具有类别预测能力的网格单元都会生成与之对应的类别特定mask。具体而言,在这一机制中,第k个通道的作用域被分配给第(i,j)个网格单元,并负责生成该单元所属类别的mask信息。由此可知,在整个网络架构中,该模块能够以H×W×(S²)的空间复杂度实现对每一个网格单元与其所属类别的精确对应关系,并通过class-agnostic的方式生成具有明确归属感的实例掩膜。

操作流程(附源代码)

仅凭阅读论文可能难以透彻理解SOLO的两个分支。幸运的是,作者昨日发布了源码,并通过查看源码能够更深入地掌握head部分的操作流程。综上所述

(1)首先经过backbone网络和FPN,得到不同层级的图像特征;

对于Category分支而言,在进行处理时首先需要将FPN顶层特征从H乘以W乘以256的空间维度进行重新配置至新的尺寸下即变为S乘以S乘以256(其中256代表的是每个空间位置上的通道数量)。随后通过连续应用七个大小均为3x3的空间卷积操作来提取所需特征信息接着再利用一个额外的3x3尺寸的空间卷积操作使最终输出结果被精确配置为与目标区域对应的大小即为Sx S x C(这里C代表的是分类类别数量减一)。

复制代码
 # cate branch

    
 for i, cate_layer in enumerate(self.cate_convs):
    
     if i == self.cate_down_pos:
    
     seg_num_grid = self.seg_num_grids[idx]
    
     cate_feat = F.interpolate(cate_feat, size=seg_num_grid, mode='bilinear')
    
     # 将FPN最高层的特征从H*W*feat_channel 对齐到 S*S*feat_channel
    
     cate_feat = cate_layer(cate_feat) # 7个卷积 
    
 cate_pred = self.solo_cate(cate_feat) # 从 S*S*feat_channel 到 S*S*num_classes

(3)对于Mask分支来说,在FPN顶层特征的基础上应用CoordConv处理后,在经过一系列深度为7层的3×3卷积操作后提取出丰富的特征信息;当前得到的特征维度为H×W×256;随后通过反池化操作将其尺寸调整至双倍大小即为2H×2W,并保持通道数不变仍维持在256个通道;最终将该部分特征与目标区域对应的S^2维信息进行融合匹配(Decoupled SOLO模型中则对应输出大小为双倍空间尺寸即为 )

复制代码
 # ins branch

    
 # concat coord
    
 x_range = torch.linspace(-1, 1, ins_feat.shape[-1], device=ins_feat.device)
    
 y_range = torch.linspace(-1, 1, ins_feat.shape[-2], device=ins_feat.device)
    
 y, x = torch.meshgrid(y_range, x_range)
    
 y = y.expand([ins_feat.shape[0], 1, -1, -1])
    
 x = x.expand([ins_feat.shape[0], 1, -1, -1])
    
 coord_feat = torch.cat([x, y], 1)
    
 ins_feat = torch.cat([ins_feat, coord_feat], 1) # CoordConv
    
  
    
 for i, ins_layer in enumerate(self.ins_convs): # 7个3*3 Conv 提取特征
    
     ins_feat = ins_layer(ins_feat)  # H*W*feat_channel
    
  
    
 ins_feat = F.interpolate(ins_feat, scale_factor=2, mode='bilinear') # 上采样到2H*2W*feat_channel
    
 ins_pred = self.solo_ins_list[idx](ins_feat) 
    
 # 从2H*2W*feat_channel到2H*2W*(S^2) S^2的复杂度,这里也是Decoupled 和 Solo v2的优化之处

改进空间

不同的mask head对比

深入分析这一层时发现,在图(a)中展示了一个具体的结构设计:这是一个单像素尺寸的卷积操作。其中输入特征F具有H乘以W乘以E的维度,在经过该层处理后输出特征M具有H乘以W乘以(S²)的维度结构。具体而言,在这一层中我们设置了单像素尺寸的卷积核G其卷积核尺寸设定为1乘以1乘以E通道数乘以(S²)输出通道数。通过这一设计实现了一种高效的空间分割机制在图像分割任务中发挥重要作用

在SOLO v1中也提到了这一观点,在其中包含有 S \times S 输出通道的数量M被认为是冗余的。这是因为大多数情况下物体在图片中的分布通常是稀疏的,在起作用的有效通道数量远低于 S \times S 的数量级。基于此观察SOLO v1提出了一种改进方案即Decoupled SOLO算法如图所示其核心思想在于将这些分类器分解为X和Y两个方向从而使得输出通道的数量从 S \times S 减少到 S + S

SOLO v2引入了一种新思路,并且更为直观;如图所示(c)。在表达式M=F∗G中被定义为冗余项的情况下,在F被固定后,则可以直接专注于学习卷积核G;这些做法带来了三个主要优势:

通过从S \times S分类器中选择有效的(valid)部分来获得结果集,并降低了模型参数数量;卷积核参数基于输入预测生成,并且能够更加灵活地适应不同的情况;通过定位技术的应用,在位置基础之上构建了一个完整的分类体系;这一系统不仅与SOLO的核心理念(即依据位置分割物体)相契合,并且将这一理念进一步拓展至定位分割器的设计。

此外, 因为SOLO作为一个完全不依赖框的算法, 完全无需依赖任何框来生成mask, 因此无需进行Box NMS. 然而转而需要执行Mask NMS, 虽然Mask NMS确实是一个较为费时的操作, 其复杂度明显高于Box NMS. 这也是SOLO在优化过程中需要重点考虑的地方.

P.S: 关于SOLO的详情解读可以看我之前的论文笔记:

实例分割论文

实例分割论文

涉及其他单阶段实例分割方法例如YOLACT与BlendMask的读者,请参考我另一篇文章中的相关内容。

进展综述

综述进展

综述进展

综述进展

SOLO v2

mask learning

使用dynamic head的mask branch

在SOLO v2框架中,mask分支被划分为mask kernel分支与mask feature分支,并各自承担着卷积核学习与特征提取的任务。这些分支的计算结果最终整合形成整个mask分支的整体输出

Mask kernel branch

Mask kernel branch用于学习卷积核权重(即其对应的分类器权重),类似于STN和Dynamic Filter的设计理念。这里输入是一张H × W × E的空间位置特征图F(其中E代表输入通道的数量),输出生成一个大小为S × S的空间位置映射矩阵(其中S代表网格划分数目),该矩阵共有D个通道(其中D代表空间位置映射矩阵通道数量)。采用不同尺寸的空间位置映射矩阵时(其空间位置映射矩阵通道数等于源特征图各维度乘积累加的结果),其空间位置映射矩阵通道数等于源特征图各维度乘积累加的结果。值得注意的是,在此过程中无需引入激活函数项。

Mask feature branch

Mask分支用于学习特征表征。其输入来源于backbone与FPN提取的不同层次特征,并经过计算得到H×W×E维度的mask表征变量F。SOLO框架中的一个重要创新点在于引入了FPN模块,在应对不同尺度目标时表现出色。不同层级特征的有效融合对于生成精确且完整的mask至关重要。常见的解决方案主要包括以下两种方法:一种基于注意力机制的方法;另一种则采用多级感知器进行非线性变换后进行融合计算。

  1. 统一的mask特征表示:为每一级特征图预测相应的mask特征,并将这些预测结果进行融合(predict the corresponding mask features for each FPN level and then fuse these predictions)。
  2. 独立的mask特征表示:直接针对所有级别的特征图预测一种统一的mask特征表示(directly predict a unified mask feature representation across all FPN levels)。

不同mask feature表达的对比实验

unified maskfeature representation

若干个3×3卷积 + group norm + ReLU + 2个双线性插值操作

若干个3×3卷积 + group norm + ReLU + 2个双线性插值操作

1 × 1 convolution + group norm + ReLU

通过实验对比分析发现, 作者采用了统一的mask特征表示法. 这种实现借鉴了Panotic FPN中的特征金字塔融合技术. 具体而言, 在FPN架构中从P2到P5层级依次进行了多次3×3卷积运算, 在每一步之后应用group normalization层并引入ReLU激活函数; 随后在每个层级之间插入两个双线性插值操作以增强特征融合效果. 所有提取到的特征被整合到原始图像尺寸的四分之一缩放层次上, 然后进行逐元素求和运算以整合不同层级的信息. 最终在整合后的特征图上执行一次1 × 1卷积操作并应用group normalization和ReLU激活函数以优化输出结果.

需要注意的是,在本研究中使用了CoordConv这一技术,在原始图像分辨率(即分辨率的1/32倍)上作为FPN(金字塔特征网络)的顶层模块,并位于3×3卷积操作及双线性插值过程之前执行。这项技术的功能与SOLO v1中的实现完全一致,并能够提供更多精确的位置感知信息以及实例特征信息。

其他

最多

最多

损失函数和标签分配方法等与SOLO v1保持一致。

在前向预测的过程中

mask NMS

在视觉任务领域中,NM S扮演着非常重要的角色. 其主要缺点在于计算过程繁琐且存在冗余.与 bbox NM S相比, mask NM S 的计算时间更为耗时.针对NM S的相关优化已有诸多研究,一般可划分为两大类问题.一类是 Soft NM S 和 Adaptive NM S,主要用于提升精度;另一类则为 YOLACT 中的 Fast NM S,侧重于提高速度.

SOLO v2中提出了一种名为Matrix NMS的方法,在思路上受到Soft NMS的影响,并与Fast NMS展现出相似的效果。该算法通过并行矩阵运算一次性完成NMS计算,在不到千分之一秒的时间内即可处理五百张mask,并较目前最快的Faster NMS实现了约百分之零点四的AP提升。

该策略通过反复计算每个目标框与其他候选框之间的IoU值来逐步减少其他候选框的检测置信度,并将置信度较高的候选框在经过降置信处理后会被用一个小阈值筛选出。经过改进后的方法,在处理流程上与传统Greedy NMS具有相似性,并且也无法并行实现。

Matrix NMS的思路是

对于一个预测得到的mask,它的decay factor主要受两部分影响:

所有得分超过j点的i对均需进行相应的惩罚这一项相对容易实现具体采用基于IoU的线性或高斯形式进行计算(线性衰减或高斯衰减)

feft

就能得到;

二是整个mask受到抑制的概率难以直接计算;然而它往往与IoU呈正相关关系。因此Matrix NMS建议直接采用最大重复的预测结果(对应最高IoU值)来近似这一概率。

f=in {orall s{k}>s_{i}} feft

最后得到的decay factor就是

peratorname{decay}{j}=in {orall s{i}>s{j}} rac{feft}{f}

,预测的分值就通过这个decay factor单步更新

s_{j}=s_{j} dot d e c a y_{j}

该矩阵NMS的实现方式可以一次性完成,无需循环迭代。具体细节在此不做展开,请参考附录中的伪代码及对比实验结果。

Matrix NMS的Python伪代码

Matrix NMS的对比实验

实验结果

实验结果的表现并无特别之处。总体而言,在速度和强度方面均表现出色,并适用于各类任务及多样化的数据集;在分割效果方面,则更为精确且细致。

COCO instance segmentation

COCO object detection

与Mask R-CNN对比

总结

延续了SOLO的良好思路,改进点也很扎实,期待继续出v3~

全部评论 (0)

还没有任何评论哟~