论文:SOLOv2: Dynamic, Faster and Stronger 代码:https://github.com/WXinlong/SOLO
主要提出了作者在SOLOv2中实现的优秀的实例分割方法,旨在创建一个简单、直接、快速的实例分割框架:
通过提出动态学习对象分割器的mask head,使mask head依赖于位置。具体来说,将mask branch分解为mask kernel branch和mask feature branch,分别负责学习卷积核和卷积特征 – mask learning提出Matrix NMS显著减少了由于mask的NMS导致的推断时间开销。 – Matrix NMSSOLOv2 可以用于目标检测和全景分割SOLOv2首先引入了一个动态方案,它允许按位置动态分割对象。具体来说,mask learn 可以分为两部分:convolution kernel learning 和 feature learning。
文章提出的Matrix NMS有很好的性能优势,文章表示Matrix NMS在准确性和速度上均胜过现有的NMS和同类产品。
通过这些改进,SOLOv2的AP性能比SOLOv1高出1.9%,速度也提高了33%。 文章给出了在单个V100 GPU卡上的评估结果,在MS COCO数据集上,Res-50-FPN SOLOv2在18 FPS时可实现38.8%的mask AP。
SOLOv1框架的核心思想是按位置分割对象。将输入图片划分为S X S的网格。如果一个对象的中心落在一个网格单元格中,该网格单元格负责预测语义类别以及分配每个像素的位置信息。主要包括两个分支:category branch and mask branch。
Category branch:预测语义类别,掩码分支对对象实例进行分段。具体地说,类分支输出S×S×C形张量,其中C为对象类的个数。Mask branchSOLOv2 的网格,多层次的预测,coordConv和损失函数都是继承于SOLOv1,提出了一套动态方案 动态方案:将原始的mask branch解耦为mask kernel branch以及mask feature branch,分别用于预测卷积核和卷积特征。
如图2所示,在SOLOv1中,mask branch如2(a)所示,由于参数量较多,预测结果存在冗余信息,因此进行解耦如图2(b)所示,本文考虑到都是从预测结果层面出发。对此作者想到为什么不从卷积核角度出发,由此得到2(c),上面为mask kernal分支,下面为mask特征分支。
Mask kernel 分支位于prediction head内,与语义类别分支一起。prediction head 在 FPN 输出的特征图金字塔上工作。Head内的两分支由4个卷积组成用于特征提取,最后一个卷积用于预测。Head 的权重在不同的特征图层级上共享。 作者通过给第一个卷积添加归一化的坐标,即连接两个附加的输入通道,将空间功能添加到内核分支。 对每个网格来说, kernel分支预测D维输出来表示预测的卷积核权值,其中D为参数的数量。当为了生成具有E个输入通道的1 × 1卷积的权重,D = E,当 3 × 3卷积D = 9E。这些生成的权重取决于位置,即网格单元。 如果将输入图像划分为S × S 个网格,则输出空间将为 S × S × D。注意到这里不需要激活函数。 这里输入为 H × W × E的特征 F,其中 E是输入特征的通道数;输出为卷积核 S × S × D,其中S是划分的网格数目,D 是卷积核的通道数。对应关系如下:1 × 1 × E 的卷积核,则 D = E ,3 × 3 × E的卷积核,则 D = 9E。
由于Mask Feature和Mask Kernel是解耦并分别预测的,因此有两种构造Mask Feature Branch的方法:
predict the mask features for each FPN levels:可以把它和Kernel分支一起放到head中,这意味着我们可以预测每个FPN级别的掩码特征predict a unified mask feature representation for all FPN levels:为所有FPN级别预测一个统一的掩码特征表示文中采用的是第二种方法。
作者采用了特征金字塔融合来学习统一的高分辨率掩码特征表示。将FPN P2 至 P5层分别依次经过 【3 × 3 conv,group norm,ReLU和 2x bilinear upsampling,这样FPN特征P2至P5 被合并到了一个相同的输出(原图的1/4),然后再做逐点相加(element-wise summation),最后一层做【1x1卷积,group norm 和ReLU】操作。如图3所示。应该注意的是,在进行卷积和双线性上采样之前,将归一化的像素坐标输入到最深的FPN级别(以1/32比例)。 提供的准确位置信息对于启用位置敏感度和预测实例感知功能非常重要。
对于每个单元格(i,j),首先得到掩码核 G i , j , : ∈ R D G_{i,j,:} \in R^D Gi,j,:∈RD 然后将G_{i,j}与F卷积得到实例掩码。总的来说,每个预测级别最多有S^2掩码。最后,使用Matrix NMS 得到最终的实例分割结果。
Loss 函数和 SOLOv1 一样,如公式2所示:
L = L c a t e + λ L m a s k L = L_{cate}+λL_{mask} L=Lcate+λLmask
其启发自soft-NMS,soft-NMS 是每次选择置信度最高的候选mask(或框)降低与其存在重叠的候选mask(或框)的置信度。这种过程像传统的Greedy NMS一样是顺序的,无法并行实现。作者反其道而行之,既然是降低每个mask的置信度,那就想办法按照一定规则对所有mask挨个降低置信度。
某一候选mj置信度被降低,和两方面因素有关:其衰减因子受以下因素影响:
The penalty of each prediction mi on mj (si > sj) 各预测mi对mj (si > sj)的罚值;The probability of mi being suppressed. mi被抑制的概率对第一个来说, 可以通 f ( i o u i , j ) f(iou_{i, j}) f(ioui,j)轻松计算mj上每个预测mi的惩罚值
第二个比较麻烦,概率通常与IoUs呈正相关。所以在这里作者直接用the most overlapped prediction on mi预测来近似概率:
为此,最终的衰变因子变成公式4:
更新后的分数由 s j = s j ⋅ d e c a y j s_j=s_j \cdot decay_j sj=sj⋅decayj计算得出 考虑两个最简单的递减函数,表示为线性函数:
Gaussian:
Matrix NMS的所有操作都可以一次性实现,不需要递归。
对按分数降序排列的前N个预值计算一个N×N的两两IoU矩阵。对于二进制掩码,IoU矩阵可以通过矩阵运算有效地实现;计算得到了IoU矩阵上的最大列数重叠的IoU;计算所有较高得分预测的衰减因子,通过逐列最小值选取各预测的衰减因子作为最有效的衰减因子(Eqn. (4));最后,通过衰减因子对分数进行更新。为了使用,只需要threshing和选择 top-k 得分掩码作为最终的预测。
图4显示了Pytorch风格的 Matrix NMS 伪代码:
The outputs of mask feature branch.作者使用的模型具有64个输出通道(即,在mask prediction之前的最后一层特征图的通道 E = 64。 这里有两种主要模式:首先,最重要的是,mask features是position-aware。它显示了水平和垂直扫描图像中对象的明显行为。另一个明显的模式是某些特征图负责激活所有前景对象,例如在白框中的那个。
与Mask R-CNN分割结果的比较:
最终的输出如图8所示。不同的物体有不同的颜色,SOLOv2方法在不同的场景中显示了良好的效果,值得指出的是,边界处的细节被很好地分割,特别是对于大型对象。
在表1中,将SOLOv2与MS COCO test-dev上最先进的实例分割方法进行了比较。
参考:http://blog.csdn.net/john_bh/