当前最快的实例分割模型:YOLACT 和 YOLACT++

版权所有,如需转载请联系作者。

本文是最近新出的实时实例分割的两篇论文的学习笔记,这两篇论文的方法代表目前实时实例分割的最高结果。

YOLACT

这篇文章的目标是解决实例分割的实时性问题。通过在现有one-stage目标检测模型的基础上添加mask分支来解决这一问题。与Mask R-CNN等明显使用特征定位步骤(特征repooling)的方法不同,在YOLACT中并不存在这一步。

为了达到这一目的,作者将实例分割任务划分为两个更简单的平行任务,通过对这两个任务的结果进行融合来得到最终的实例分割结果。具体如下:

  • 第一分支:使用全卷积网络(FCN)作为分支来产生一些具有整个图像大小的“prototype masks”,这些prototype masks不与任何实例相关;
  • 第二分支:在目标检测分支的基础上添加额外的head,该head针对每一个anchor都预测一个掩膜系数(mask coefficients)。这些系数的作用是在prototype空间对某个实例的表示进行编码。

最后,在使用NMS得到所有的实例后,对其中的每一个实例都通过对上述两个分支的结果进行线性组合来得到所对应的掩膜。结构如下图所示:

作者这么做的依据在于掩膜之间是空间相关的:例如相邻的两个像素更有可能属于同一个实例。卷积层很自然地利用了这一相关性,但全连接层没有。这会导致一个问题,对于one-stage目标检测器来说,其使用全连接层来针对每一个anchor输出类别预测和box系数,无法利用到掩膜的空间相关性;而类似于Mask R-CNN的two stages方法则使用额外的定位步骤(RoI-Align)来解决这一问题,定位步骤既保留了特征图中的空间相关性,也可以使用卷积运算得到掩膜输出。但是这一做法的代价是,定位层会引入额外的计算,降低算法的运行效率。

因而,将这一问题分为了两个平行的步骤:使用善于产生语义向量的全连接层来产生掩膜系数,而使用善于产生空间相关掩膜的卷积层来产生”prototype masks”。

Protonet由FCN构成,其最后一层输出k个通道,每一个通道对应一个类别的prototype mask。结构如下所示。

而在进行掩膜系数预测时,作者简单地在目标检测器的class和box分支的基础上,添加第三个分支来预测k个掩膜系数,每一个系数对应一个prototype。因而,对于每一个anchor,最终产生$4+c+k$个系数。为了能够通过线性组合来得到mask,从最终的mask中减去原型mask是很重要的。换言之就是,mask系数必须有正有负。所以,在mask系数预测时使用了tanh函数进行非线性激活,因为tanh函数的值域是(-1,1)。结构如下所示。

接着,将上述两个步骤得到的prototype mask和掩膜系数做矩阵乘法,并使用Sigmoid进行激活,便可以得到最终的实例掩膜。

其中,$P$的大小为$h\times w \times k$,$C$的大小为$n\times k$,$n$为经过NMS和阈值操作后留下的anchor。对于每一个anchor都会分别预测$k$个系数,使用这$k$个系数对$k$个prototype掩膜进行线性组合,便可以得到每一个anchor对应的掩膜。将结合过程进行可视化,如下图所示:

左侧为各个anchor所预测的$k$个掩膜系数,而右侧针对每一个anchor,使用系数和prototype的$k$个掩膜进行线性组合得到最终的预测结果,整个思路比较简单。

损失计算:有三个损失,依次是分类损失、边界框损失和掩膜损失,三个损失的权重分别为1、1.5和6.125。分类损失和边界框损失采用和SSD相同的计算方法;在计算掩膜损失时,使用的是预测掩膜和真实掩膜之间的二维交叉熵损失。

最后,在进行评估时,使用预测得到的边界框对得到的掩膜进行裁剪(边界框外的掩膜被清零);而在训练时,使用gound truth边界框对预测的掩膜进行裁剪,并对掩膜损失除以ground truth边界框的面积来照顾prototype中的小目标。

除此之外,为了进一步提升速度,作者还使用Fast NMS替换了NMS算法,虽然会降低检测性能,但进一步提高了检测速度。

实验结果

有着更高的大目标分割质量:由于该方法使用了大小为$138\times 138$的特征图,且直接在原始特征图上产生掩膜(没有repooling步骤),因而在大目标上有着更好的掩膜质量。

在COCO上的对比结果:

一些消融实验:

总结

大多数错误来自于目标检测部分:误分类、边界框误对准。但是,除此之外,掩膜生成算法部分也有两个典型的错误:

  • 定位失败:如果在一个场景中的某一个点上有着太多的目标,那么网络则无法在prototype中定位每一个目标。在这种情况下,网络将输出与前景掩膜更为接近的而不是这一组中的一些目标实例分割。
  • 泄露:该算法的裁剪步骤是在掩膜集成后进行的,因而无法过滤裁剪区域之外的噪声。当边界框是准确的时候,这一方法有着较好的效果,但当边界框不准确的时候,噪声将被裁剪进实例的掩膜中,导致裁剪区域之外的掩膜的泄露。同时,当预测的边界框太大时,掩膜中也会包含一些离得很远的实例掩膜。
  • 导致AP差距的原因:作者认为这一差距是由检测器相对差的性能所导致的,而不是产生masks的方法。

YOLACT++

在YOLACT的基础上,作者进一步进行了如下修改,来得到一个准确度更高的实例分割模型。

  • 在backbonde网络中加入可变形卷积(deformable convolutions);
  • 使用更好的anchor尺度和比例对prediction head进行优化;
  • 加入新的mask re-scoring支路。

最终,在MS COCO上,YOLACT++可以获得34.1mAP和33.5fps的成绩,其精度已经非常接近SOTA模型。

Fast Mask Re-Scoring分支

对于模型来说,其分类置信度和预测的掩膜的质量之间是存在差异的。为此,作者引入了一个fast mask re-scoring分支,该分支依据所预测的掩膜与ground-truth的IoU对掩膜进行评分。具体来说,Fast Mask Re-Scoring网络由6层FCN组成,每一层卷积层之后跟一层ReLU,最后一层为全局池化层。该网络以YOLACT所输出的裁剪过的mask(未经过阈值)为输入,输出mask对于每一个目标种类的IoU。接着,将分类分支预测的类别所对应的mask IoU与相对应的类别置信度的乘积作为该mask最终的分数。

与Mask Scoring R-CNN相比,作者提出的方法有以下不同:

  • 输入为全尺寸的图像的mask(预测框之外的区域值为0),而Mask Scoring R-CNN输入的是RoI repooled的掩膜与来自于掩膜预测分支的特征图所拼接得到的;
  • 没有全连接层,因而本方法更快,加入Fast Mask Re-Scoring分支后时间仅增加了1.2ms。

可变形卷积

通过加入可变形卷积,mAP提高了1.8,速度慢了8ms。作者认为性能提升的原因有以下几点:

  • 通过和目标实例进行对准,使得网络可以处理不同尺度、旋转角度和比例的实例;
  • YOLACT本身没有再采样策略,因而一个更好、更灵活的采样策略更重要。

同时作者发现,在引入可变形卷积时需要选择合适的插入位置才能取得性能的提升。

对Prediction Head进行优化

YOLACT是基于anchor-based检测器的,因而选择正确的anchor超参数是很重要的。作者尝试了以下两种策略:

  • 保持anchor的尺度不变,增加比例的数目:$[1,\frac{1}{2},2]$到$[1,\frac{1}{2},2,\frac{1}{3},3]$;
  • 保持比例不变,将每一个FPN等级的尺度数目增加三倍($[1\times,2^{\frac{1}{3}}\times,2^{\frac{2}{3}}\times]$)。

上述两种方法分别将anchor的数目增加为原来的$\frac{5}{3}\times$和$3\times$。

实验结果

下图为YOLACT和YOLACT++的实验结果对比:

下表为加入改进措施后的性能提升:

不同尺度的结果:

可变形卷积的不同插入位置的结果对比:

参考