『写在前面』
基于One-stage型目标检测模型提出的One-stage型实例分割模型,可能是首个真正意义上达到实时性(>30fps)的实例分割模型。
作者机构:Daniel Bolya等,University of California, Davis
文章标题:《YOLACT: Real-time Instance Segmentation》
论文出处:ICCV 2019
原文链接:https://arxiv.org/abs/1904.02689
相关repo:https://github.com/dbolya/yolact
目录
摘要
1 介绍
3 YOLACT
3.1 原型生成
3.2 mask系数
3.3 mask合成
3.4 Emergent Behavior
4 Backbone Detector
5 其他改进
Fast NMS
语义分割loss
6 结果
实例分割结果&掩码质量
时间稳定性
7 讨论
定位失败
泄露
本文提出一种FCNs型实时实例分割模型YOLACT。 在MS COCO数据集上,mAP达到了29.8,使用单块Titan XP推理速度达到了33fps。
YOLACT将实例分割拆分成两个并行的子任务:一个分支去生成一系列的原型mask;另一个分支预测每个实例对应的mask系数。
由于在YOLACT没有进行repooling类操作,所以得到的分割mask更为精细。
此外,本文还提出了一种Fast NMS算法,在轻微降低精度的同时,显著提升了NMS过程的计算速度。
在目标检测模型设计上,主要有两大路线:Two-stage型网络更加重视精度,代表作R-FCN、Faster-RCNN等;One-stage型网络更加重视提升速度,代表作YOLO、SSD等。作者通过引用YOLO作者Redmon的一段话表明了自己的观点。
Mask R-CNN是实例分割模型的典范,它基于Faster-RCNN改进,奠定了Two-stage型实例分割的基调,同样Mask R-CNN的重点也是在于精度的提升。受此影响,作者希望基于One-stage目标检测器设计出一种One-stage实例分割模型。
SSD/YOLO等通过移除第二个stage,并以其他方式弥补性能缺失来加速Faster R-CNN。然而这种思想不易直接应用在实例分割任务上,因为实例分割为了产生mask,严重依赖于特征定位。在Two-stage模型中,通过repooling型操作(如ROI align、ROI pooling)来将特征映射到包围框中,这种做法从逻辑上就是串行的,所以很难加速。FCIS虽然将这些操作进行并行化,但由于后处理步骤太多,同样很难达到加速的目的。
基于以上考虑,本文提出了YOLACT,它摒弃了隐含的特征定位步骤,将实例分割任务拆分成两个并行的子任务:(1)生成一系列覆盖全图的原型mask;(2)对每个实例,预测一系列的线性组合系数。最后,在进行推理时,对每一个实例,使用其对应预测出的mask系数,与原型mask简单乘加,然后根据bounding box裁剪,阈值化,即得到每个实例对应的mask。
经过实验分析,作者认为YOLACT通过原型mask去自适应的学习如何定位实例目标。原型mask的数量与类别数目无关,也就是说每张原型mask都包含了跨类别的信息,YOLACT旨在学习一种分布的表示方法,这样每个实例可以通过该表示方法对多张原型mask进行线性组合,来得到自己的mask。通过训练,每张原型mask会学习到去抽象输入图像的一些细节信息,比如边缘信息、位置信息,或对特定区域响应的信息。
YOLACT有三个显著的优势:
1)速度快,因为one-stage;
2)mask质量高,因为不包含repooling类操作;
3)普适性强,这种生成原型mask和mask系数的思路可以应用在目前很多流行的检测器上。
与人类视觉系统相比,YOLACT也很直观:线性系数组合和检测分支更像是在解决“是什么”的问题,原型mask的生成像是在解决“在哪里”的问题。
YOLACT与其他一些现有的实例分割模型在COCO数据集上的表现对比如下图所示。
类比Mask R-CNN之于Faster R-CNN,YOLACT旨在现有的one-stage型检测器上添加一个mask分支来达到实例分割的目的,但这一过程中不希望引入特征定位步骤。
YOLACT通过添加两个并行的分支来完成该任务:第一个分支使用FCN去产生一系列独立于单一实例的原型mask;第二个分支在检测分支上添加额外的头去预测mask系数,以用于编码一个实例在原型mask空间的表示。最后,在NMS步骤后,通过将两分支的输出结果进行线性组合来得到最后的预测结果。
YOLACT的网络结构如下图所示。
可行性分析
因为分割任务的目标是得到mask,而mask的特点是存在天然的空间联系,所以YOLACT采用了上述组织形式。从NN的角度来说,Conv层天然利用了空间相关性,但FC层不会。这就导致了一个问题,因为大多数One-stage检测器通过FC层预测box参数和所属类别。Two-stage通过ROI Align等特征定位步骤保留了空间信息,同时使用Conv层输出mask,但是这些操作都必须等待RPN来完成,极大地影响了效率。
在YOLACT中,FC层负责预测语义标签,Conv层负责预测原型mask和mask系数。两分支并行,最后通过矩阵乘法组装,这样一来既保留了空间的相关性,又保持了One-stage的模型结构,速度极快。
称生成原型的网络分支为protonet。protonet基于FCN实现,最后会输出k个通道,每个通道可以视作一张原型mask。protonet的作用有些类似语义分割模型,不同之处在于protonet部分的训练不单独设置loss,只在整个网络最后输出的mask上进行监督。
protonet的设计上有两个取舍:
1)从深的backbone中获取protonet可以产生更稳当的mask;
2)高分辨率的原型mask有利于提高分割精度和对小目标的效果。
YOLACT使用了FPN作为backbone,同时上采样到原图尺寸的1/4以改善对小目标的分割效果。
典型的基于Anchor的检测模型会为每个Anchor预测4个值用于表征box信息,和C个值用于表征类别得分,共(4+C)个值。
YOLACT为 每个Anchor预测(4+C+k)个值,额外k个值即为mask系数。
另外作者认为,为了能够通过线性组合来得到最终想要的mask,能够从最终的mask中减去原型mask是很重要的。换言之就是,mask系数必须有正有负。所以,在mask系数预测时使用了tanh函数进行非线性激活,因为tanh函数的值域是(-1,1).
通过基本的矩阵乘法配合sigmoid函数来处理两分支的输出,从而合成mask。
其中,P是h×w×k的原型mask集合,C是n×k的系数集合,代表有n个通过NMS和阈值过滤的实例,每个实例对应有k个mask系数。
Loss设计
Loss由分类损失、框回归损失和mask损失三部分组成,其中分类损失和框回归损失同SSD,mask损失为预测mask和ground truth mask的逐像素二进制交叉熵。
Mask裁剪
为了改善小目标的分割效果,在推理时会首先根据检测框进行裁剪,再阈值化。而在训练时,会使用ground truth框来进行裁剪,并通过除以对应ground truth框面积来平衡loss尺度。
YOLACT取得的效果可能有点出人意料,因为围绕实例分割任务的一个共识是:因为FCNs是平移不变的,所以需要在模型中添加转移方差。因此,在Mask R-CNN和FCIS中,通过显式方法添加了转移方差:方向图、位置存档,或是把mask预测分支放在第二个stage,都使得它们不需要再处理定位问题。
在YOLACT,唯一算是添加转移方差的地方是使用预测框裁剪feature map时。但其实这只是为了改善对小目标的分割效果,作者发现对大中型目标,不裁剪效果就很好了。所以,YOLACT似乎通过其原型的不同激活学习到了如何定位目标。
怎么理解YOLACT隐式学习到了转移方差?
对于上图a,使用无padding的FCNs是得不到的,因为输入图像处处相同,卷积权值又共享,那么输出肯定也一样。 作者认为,像ResNet这样现代的FCNs通过连续的padding0,使得其具有隐式学习图像边界距离的能力。所以,ResNet隐含了转移方差于其中,YOLACT得益于此。如图b和图c,明显不同的feature map对不同位置的目标具有不同的响应。
许多原型mask只在图像的某些部分上激活,即它们只激活位于隐式学习边界一侧的对象。例如,上图中原型6学习的是背景信息。通过对这些原型进行组合,网络可以区分同一语义的不同(甚至重叠)的实例,比如在图d中,原型4减去原型5,可以区分开红色伞和绿色伞。
此外,原型学习是可压缩的。也就是说,如果protonet将多个原型的功能合并成一个,那么mask系数分支就会去对应学习相应的组合方法。例如,上图中,原型4具有分割的能力,但同时它又对左下角部分图像具有较高响应,原型5也类似,但它就对右下角部分响应更大。这也就解释了为什么可以根据实际情况调整原型数量(即protonet的输出通道数,默认为32),而又不会带来模型性能的下降。
因为预测一组原型mask和mask系数是一个相对比较困难的任务,需要更丰富更高级的特征,所以在网络设计上,作者希望兼顾速度和特征丰富度。因此,YOLACT的主干检测器设计遵循了RetinaNet的思想,同时更注重速度。
YOLACT使用ResNet-101结合FPN作为默认主干网络,默认输入图像尺寸为550×550.
与原版RetinaNet相比,YOLACT检测头(如下图)的设计更轻量,速度更快。
使用平滑-L1 loss训练bounding box参数,并且采用了和SSD中相同的bounding box参数编码方式。
使用softmax交叉熵训练分类部分,共(C+1)个类别。同时,使用OHEM方式选取训练样本,正负样本比例设为1:3.
注意一点,没有像RetinaNet一样采用focal loss。
提出了一种NMS的近似算法,在轻微降低精度的同时,显著提高了效率。主要思想是将传统NMS计算方法转为矩阵运算,从而受益于一些快速矢量运算库。
算法流程:
1)对每一个类别ci,取top-n个候选目标,并按得分降序排列;
2)计算一个c×n×n的IOU矩阵,其中每个n×n矩阵表示对该类n个候选框,两两之间的IOU;
3)因为自己与自己的IOU=1,IOU(A,B)=IOU(B,A),所以对上一步得到的IOU矩阵进行一次处理。具体做法是将每一个通道,的对角线元素和下三角部分置为0;
4)去除与得分高的候选框重叠比例较大的框,具体做法是对上一步得到的矩阵,按列取最大值,然后对取完最大值的矩阵按阈值划分,只留下小于指定阈值的部分,即为Fast NMS过滤的结果。
Fast NMS的效果如下表所示。
在训练阶段添加辅助loss。
具体做法是在最大的feature map后面接1×1卷积,输出一个通道数为c的feature map。它对应的ground truth从实例分割的标注中获得,因此没有强制要求每个像素只能属于单一类别。所以此处使用的loss计算方法是在c个通道上分别运行sigmoid,类似YOLO-v3多标签分类的loss设计。
一定程度上,YOLACT得到的mask质量较Mask R-CNN、FCIS更高。这得益于较大的mask尺寸和没有特征repooling带来的信息损失。
另外,作者建议,如果希望提高速度,建议压缩backbone大小,而不是直接压缩输入图像大小。
作者实验发现,YOLACT在连续帧(视频)上的分割效果更加稳定,一方面因为mask质量本身就比较高,另一方面,作者认为Two-stage方法过多地依赖于第一阶段的区域提议,对YOLACT来说,虽然检测框可能会有波动,但因为原型mask的预测比较稳定,所以产生的分割效果也会更稳定。
通过实验分析,作者发现YOLACT的错误大多是由检测器引起的,比如错误分类或bounding box定位不准。
当在画面某个位置存在多个重叠的实例时,则网络可能无法通过自身学习到的原型mask对其进行定位。在这种情况下,会输出更接近前景mask的内容,而不是某些实例的分割。如下图所示,红色飞机下面的两辆卡车没有被正确分开。
因为YOLACT默认mask是在合成以后裁剪得到的,所以没有抑制框外部噪声的功能。如果检测框定位不准,那么就会导致mask泄露现象。另外,当多个同类实例相隔较远但大小又很大的时候,也可能发生这种现象。因为网络可能认为这几个实例已经离得很远了,自身不需要去分开定位它们,裁剪分支会负责处理这种情况。如下图所示,就属于这种情况。