YOLACT论文笔记

    YOLACT: Real-time Instance Segmentation.Daniel Bolya,Chong Zhou,Fanyi Xiao,Yong,Jae Lee.来自加州大学戴维斯分校.


摘要

    本文提出一个全卷积的、实时实例分割模型:YOLACT,使用Titan Xp在MS COCO上以33.5 fps达到29.8 mAP,可以说是第一个达到达到实时的现代的实例分割模型。这还是在单个GPU上训练就得到的结果。YOLACT将实例分割分成两个并行的子任务:(1)生成一组原型掩码(prototype masks),(2)预测每个实例的掩码系数(mask coefficients)。然后将原型与掩码系数进行线性组合得到实例分割。由于这个过程不依赖重池化(repooling),因此模型可以生成高质量的实例掩码,以及拥有良好时间稳定性。此外,本文还分析了原型掩码的emergent behavior,并展示了它以本身的转移方差(translation variant)学习到如何定位实例。最后,本文还提出了Fast NMS,比标准NMS快12ms。


引言

    “Boxes are stupid anyway though, I’m probably a true believer in masks except I can’t get YOLO to learn them”——Joseph Redmon在其论文YOLOv3的最后说了这句话。的确,在很多情况下,实例分割更加实用。最近几年,在目标检测基础上,实例分割领域也快速发展。SOTA的方法包括基于Faster R-CNNMask R-CNN,基于R-FCN的FCIS。但是这些方法主要提高的是精度,速度却一直上不去速度。因此,不像目标检测有SSDYOLO这些实时模型,目前还不存在可实时运行的实例分割模型。本文的目标是填补上这个窟窿,提出了一个实时的实例分割网络。

    实例分割比目标检测难得多。单阶段目标检测模型比如SSDYOLO,可以直接去掉两阶段目标检测模型的第二个阶段,通过其它方式来补偿损失的性能,以此来达到加快速度的目的。但是对实例分割来说这样做比较困难,SOTA的两阶段的实例分割模型极度依赖特征/实例定位(feature localization)来生成实例掩码(mask)。它们在RoI内重池化(repool)特征,比如进行RoIpool/align,然后将抽取的特征喂入掩码预测网络。由于这种方法是串行的,速度难以提升。而单阶段方法实例分割方法,比如FCIS,可以并行的执行这些步骤,但是由于实例定位后需要进行大量的后处理,故无法实现实时分割。

    为了解决这个问题,本文提出了YOLACT,即You Only Look At CoefficienTs(名字致敬YOLO),这是一个实时的实例分割模型。该模型不使用显式的定位步骤,而是将实例分割分成两个并行的任务:(1)在整个图像上生成原型(prototype),(2)对每个实例预测一组线性组合系数。然后将这两部分合并成完整的实例分割:对每个实例,使用预测的掩码系数(mask coefficient)原型掩码(prototypes mask)进行线性组合(系数乘以mask然后各通道相加),然后使用预测的包围框裁剪出实例。原型掩码的可视化例子如下:

图片1.jpg

    由于原型掩码的数量与类别数无关(比如这里设置的原型掩码张量的通道数是32,而类别数是81),YOLACT可以学习到一种分布式表示,每个实例通过跨类别共享的原型线性组合而成。这种分布式表示导致了原型空间中的emergent现象:一些原型在空间上分割图像、一些定位实例、一些检测实例的轮廓、一些编码position-sensitive directional maps(类似于FCIS中通过硬编码position-sensitive模块),其它大部分的原型则是前面这些原型的组合。

    YOLACT相对于现有模型的优势:第一点也是最重要的一点,由于YOLACT使用并行的结构,且将合并分枝结果非常简单,使得它相对于backbone额外增加的计算量很小。即使使用ResNet-101,运行速度也很容易达到30fps。在评估时,整个mask分枝只花了大约5ms。第二点,获得的掩码(mask)的质量高:因为mask利用了整个图像的信息,不会像两阶段方法一样因为重池化损失了包围框之外的信息,因此YOLACT对于大目标的分割掩码的质量显著高于其它方法。如下图:

图片2.jpg

    第三点,YOLACT的思想是通用的:其生成原型掩码(prototypes mask)和掩码系数(mask coefficients)的思路可以应用到到当前大部分目标检测器模型法中。

    YOLACT是第一个真正意义上的实时实例分割模型,在COCO数据集上与其他模型的对比如下:

图片3.jpg

    本文的后面,还分析了YOLACT中原型的emergent现象,以及通过实验使用不同的backbone、不同的原型数量、不同的图像分辨率获得速度和性能的平衡。本文还提了一个新的方法:Fast NMS,比传统的NMS快12ms,而仅仅损失非常小的精度。代码开源:https://github.com/dbolya/yolact 


相关工作

实例分割

    在这之前的很多方法都致力于提高实例分割的精度。最典型的两阶段实例分割模型是Mask R-CNN,第一阶段生成候选RoI,第二阶段将RoI进行分类和实例分割。随后的工作尝试提高它的精度。

    PANet:因为Mask-RCNN的信息传播还不够充分,低层特征到高层特征的传递路径过长,FPN中每个proposal只负责金字塔特定的一层,掩码预测只基于单一视角,故提出改进:1.自底向上的路径增强,为了缩短信息传播路径,同时利用低层特征的精准定位信息;2.动态特征池化,每个proposal利用金字塔所有层的特征,为了避免proposal的随意分配;3.全连接层融合,为了给掩码预测增加信息来源,文中的说法是capture diffrent view。

    MS R-CNN:Mask RCNN对每个类别独立地预测mask,没有引入类间竞争,每个mask的类别依靠网络RoI分类分支给出的分类置信度。但是,分类置信度与MaskIoU的相关性并不好。解决:模型学习每个Mask与gt之间的 IOU score 乘以分类 score。实例分割利用预测Mask与gt Mask之间的像素级 IoU 来描述实例分割质量,提出了一种直接学习 IoU 的网络。一旦我们在测试阶段得到了预测的Mask分数,通过将预测的 Mask 分数与分类分数相乘 来重新评估Mask分数。因此,Mask Score 同时考虑语义类别和实例 Mask 的完整性。

    两阶段实例分割方法需要对每个RoI都重池化特征,然后对提取的特征进行处理,这种串行性使得即使降低图像分辨率也难以达到实时分割。

    而单阶段实例分割方法生成position sensitive map,这些map通过position-sensitive pooling组合成最终的mask,比如(Instance-sensitive fully convolutional networks,Fully convolutional instance-aware semantic segmentation),或者组合语义分割和方向预测的输出,比如MaskLab。尽管从理论上说,这些方法要比两阶段方法更快,但是仍需重池化或其它non-trival计算(比如mask voting)。这样严重限制了运行速度。而YOLACT将并行结果组合的过程很简单,仅仅是线性组合,可以使用GPU并行计算,因此速度大大加快。

    还有些方法先进行语义分割,然后进行包围框检测(Instancecut: from edges to instances with multicut.),或者进行像素聚类( Deep watershed transform for instance segmentation,Proposal-free network for instance-level object segmentation.),或者学习嵌入以组成实例mask (Semantic instance segmentation with a discriminative loss function,Semantic instance segmentation via deep metric learning, Segmentation-aware convolutional networks using local attention masks, Associative embedding: End-to-end learning for joint detection and grouping)。这些方法要么有多个阶段,要么需要昂贵的聚类计算,都使得模型无法达到实时。

实时实例分割

    实时目标检测模型有:SSDYOLOYOLO9000YOLOv3,而实时的语义分割模型有:Segnet、Blitznet、Enet、IcNet等,然而却很少人关注如何实现实时实例分割。Straight to Shapes和Box2Pix可以30fps帧率运行在Pascal SBD2012数据集上,Straight to Shapes可以在Cityscapes上以10.9fps运行,Box2Pix在KITTI上以35fps运行。但是它们的精度远低于当前的baseline。事实上,最快的实例分割方法是Mask R-CNN,它可以在COCO数据集以550分辨率达到13.5fps,尽管还是很慢。

图片4.jpg

Prototypes

    原型学习(又称为词汇或编码书),在计算机视觉领域得到了广泛研究。经典的表示包括texton和视觉单词,以及通过稀疏性和位置优先性进行的改进。还有人在目标检测上也应用了原型。这些工作使用原型来表示特征,而本文使用它们来组成用于实例分割的掩码。此外,本文对每个图像都学习原型,而不是学习整个数据集共享的全局原型。


YOLACT

    像Faster R-CNN改进为Mask R-CNN那样,本文目标是在一个现存的单阶段目标检测模型上增加一个mask分枝,但显式的添加实例特征定位步骤(比如重池化)。这里将复杂的实例分割任务分成两个并行的分枝,然后组合成最终的实例掩码。第一个分枝使用FCN生成原型掩码(prototype mask),此时不分割任何实例。第二个分枝是目标检测头,采用Anchor的思路,预测包围框和类别,此外对每个先验框还预测一组掩码系数(mask coefficients)在原型空间中对实例的表示进行编码。对预测的包围框执行NMS,然后通过线性组合两个分枝的预测结果来构造实例掩码。最后使用预测的包围框裁剪出单个实例并执行阈值化。整个YOLACT的架构如下:

图片5.jpg

原理

    这种方法能实现实例分割的原因是掩码在空间上是一致的,即相邻的像素可能是同一个实例的一部分。卷积层能充分的利用这种空间一致性,而FC则不行,这就带来了一个问题:由于单阶段目标检测模型使用FC层预测每个先验框的类别和包围框,如果直接在后面添加实例分割预测,则无法利用空间信息。而两阶段方法比如Mask R-CNN通过一个定位步骤(比如RoIAlign)来解决这个问题,这一步既保留了特征的空间一致性,也允许使用卷积层去预测实例分割。但是Mask R-CNN需要使用RPN生成包围框,无法保证实时性。

    也就是说,FC层擅长生成语义向量,而卷积层擅长生成空间一致性的掩码。因此,这里将实例分割分成两个并行的部分:一部分使用FC层生成掩码系数,另一部分使用全卷积生成原型掩码。原型和掩码系数可以被独立的计算,因此,相比与backbone目标检测器,额外增加的计算开销主要来自掩码系数与原型掩码的组合步骤,而这个步骤可以实现为单步矩阵乘法,故增加的计算量很小。通过这种方式,在保持特征空间的空间一致性的同时,仍然是单阶段而且快速的。

原型掩码

    原型生成分枝这里称为protonet,对整个图像预测k个原型掩码。以FCN的方式实现protonet,最后输出k通道的特征图。这有点像标准的语义分割,不同的地方在于这里不单独设置loss,只在最后才计算损失。

    这里有两个重要的设计:使用更深网络层可以得到更加鲁棒的掩码,而使用分辨率更高的网络层可以得到更高质量的掩码,并对小目标可以获得更好的精度。因此这里使用FPN,因为它的最大特征图也是最深的特征图,然后将放大(上采样)到输入图像的1/4,以提高对小目标的性能。

    Protonet的架构如下:

图片6.jpg

    作者还发现protonet能输出无界很重要的,因为这样使网络对它很自信的原型可以生成很大的激活值(比如很明显的背景)。可选的激活函数有ReLU或其它线性激活函数,这里选择ReLU。

掩码系数

    一个经典的基于Anchor的目标检测网络由两个分枝组成:一个分枝预测c个类别的置信度,另一个分枝预测包围框的4个回归值。这里增加另一个分枝预测预测掩码系数,每个包围框预测k个系数。因此,每个包围框预测4+c+k个参数。

    为了能够通过线性组合来得到最终想要的mask,最终的mask能减去原型mask也是很重要的,即,mask系数必须有正有负。因此在mask系数预测时使用tanh激活函数,因为tanh函数的值域是(-1,1)。Prediction Head网络架构如下:

图片7.jpg

YOLACT网络结构图

    下面是参数化的YOLACT网络结构图(来自https://blog.csdn.net/u012160945/article/details/100608557):

图片8.jpg

合成实例分割掩码

    为了生成实例掩码,这里将之前两个分枝得到的原型掩码(prototype mask)掩码系数(mask coefficient)进行线性组合,然后经过一个sigmoid非线性激活函数,得到实例掩码。这个过程可以通过矩阵运算实现:M=σ(PCT),其中P是h*w*k的原型掩码张量,C是n*k的掩码系数矩阵,n是最终实例的数量。

损失函数:使用3个损失函数:分类损失Lcls,包围框回归损失Lbox,掩码损失:Lmask。三个损失函数的权重分别是1,1.5,6.125。Lcls和Lbox的定义与SSD一样。掩码损失采用逐像素二元交叉熵损失:Lmask=BCE(M,Mgt)。

掩码裁剪:使用预测的包围框在组合后的掩码上裁剪出实例。在训练期间,使用gt包围框裁剪,并通过除以对应ground truth框面积来平衡loss尺度。

Emergent Behavior

    实例分割的普遍共识是:由于FCNs是平移不变的,所以需要在模型中添加转移方差(translation variance)。类似FCIS和Mask R-CNN这样的方法尝试显式增加translation variance:directional maps和position-sensitive repooling,或将掩码分枝放到第二阶段使得它们不需要处理实例定位问题。在YOLACT中,唯一添加的translation variance是使用预测的包围框裁剪出最终的实例掩码。但其实这只是为了改善对小目标的分割效果。作者们发现对大中型目标,即使不裁剪,效果也足够好。所以YOLACT其实是通过其原型的不同激活学习到了如何定位目标。这是如何实现的?为什么原型可以定位到实例?原型的例子如下:

图片9.jpg

    如上图所示。对于图a,若在无padding的FCN中,像下面那种激活是不可能的。因为卷积操作共享卷积核,若输入图像每个像素相同,则输出的特征图的每个像素肯定是相等的。另一方面,像ResNet这样的现代FCN中,一致的边缘填充使得网络能判断像素离边缘有多远。作者认为,像ResNet这样现代的FCNs通过连续的padding0,使其具有隐式学习图像边界距离的能力。如上图b和图c,目标相同但是位置不同,则响应也不同。

作者还观测到很多原型掩码只在图像的某些部分上激活,即只激活位于隐式边界的一侧。如上图的1-3原型。通过这些原型的组合,模型可以区分同一类别的不同实例(哪怕是重叠的实例),比如上图d将原型2减去原型3可以将绿色伞从红色伞中区分出来。

    此外,原型学习是可压缩的。如果protonet将多个原型的功能合并成一个,那么掩码系数分支就会去对应学习相应的组合方法。也就是说,一个原型兼职多个功能。比如上图中的原型2是一个用于分区的原型,但对左下角的实例激活也最强烈。原型3也类似但是对右边的实例。这就解释了为什么在实践中,即使使用k=32的原型,模型的性能也不会下降。另一方面增加k值也是无效的,因为预测组合系数比较困难。由于线性组合的性质,如果某个系数上存在较大的误差,生成的掩码也可能消失或包含来自其它对象的泄漏。因此网络必须能平衡各参数才能产生正确的组合系数,若是通道数更多会使这种平衡更加困难。事实上,下面的消融实验说明,对于k值较高的情况,网络只是增加了冗余的原型,其edge-level变化很小,只能稍微增加了一点AP95。

图片10.jpg


Backbone目标检测器

    在backbone的选择上,作者的要求是速度快、特征鲁棒。由于预测原型掩码和掩码系数是一个困难的任务,需要基于好的特征。这里的Backbone参照RetinaNet,但是更注重速度。这里选择ResNet-101FPN作为默认的backbone,输入分辨率为550x550。为了对每张图片得到一致的评估时间,这里不保留长宽比。原始的FPN+ResNet如下:

图片11.jpg

    这里与RetinaNet一样,修改FPN删去P2,添加P6和P7。P6由P5经过3x3卷积得到,P7由P6经过3x3卷积得到,具体的网络可参见前面的网络结构图。

    在先验框设置方面,每个位置设置3个包围框,长宽比分别为[1,1/2,2]。对于P3-P7特征图,先验框的感受野分别是[24,48,96,192,384]。每个特征图上预测头如下:

图片12.jpg

    与RetinaNet相比,YOLACT的预测头更加轻量和快速。与SSD一样,包围框回归采用smooth-L1损失,分类损失采用softmax交叉熵损失。训练样本采用OHEM策略,正负样本比例为3:1。这里不和RetinaNet一样采用focal loss,它不适用于本文的场景。使用这些策略后,这个backbone的速度快于SSD。


其它改进

Fast NMS

    在对每个先验框生成回归系数和类别置信度之后,像大多数目标检测模型一样,这里执行NMS抑制重复的检测。在很多目标检测系统,比如Mask R-CNN,RetinaNet,SSDYOLO9000YOLOv3Faster R-CNN中,NMS是顺序执行的。也就是说,对每个类别,首先按照置信度对包围框进行排序,然后去掉那些置信度低于阈值和与gt的IoU高于阈值的包围框。这种方法毫无疑问不够快。

    因此这里提出Fast NMS,可以并行的执行NMS。为此,这里只允许已经移除的包围框抑制其它包围框。这个策略可以让Fast NMS使用矩阵实现,也就是可以在GPU上运行。具体的计算过程如下:

1)对每一个类别ci,按置信度降序排列,取top-n个候选目标;

2)得到一个c*n*n的IOU张量,记作X,其中每个n×n矩阵表示对该类n个候选框,两两之间的IOU;

3)因为自己与自己的IOU=1,而且IOU(A,B)=IOU(B,A),所以这个IOU矩阵进行处理:将每一个通道的对角线元素和下三角部分置为0;

4)去除 与得分更高的包围框 的IoU大于阈值的包围框。具体做法是对上一步得到的张量,按列取最大值,然后对取完最大值的矩阵按阈值划分,只留下小于指定阈值的部分,即为Fast NMS过滤的结果。

    因为这个方法会删除稍微多一点的包围框,可能会轻微影响精度。但是与其提高的速度幅度相比,对精度的影响微不足道。如下表:

图片13.jpg

    在作者的实现中,Fast NMS比Cython实现的传统NMS快11.8ms,而仅仅降低0.1d的mAP。

语义分割损失

    这里增加额外的损失函数可以在不降低速度的情况下提高精度。具体做法是在最大的特征图(P3)后面接1×1卷积,输出一个通道数为c的特征图。它对应的gt从实例分割的标注中获得。因为没有强制要求每个像素只能属于单一类别,所以此处使用的loss计算方法是在c个通道上分别运行sigmoid。

    这里设置该损失函数的权重为1,结果表明其mAP提高了0.4。


实验结果

    本文在MS COCO和Pascal 2012 SBD上进行评估。

实现细节

    所有的模型都在单个GPU上训练,batch_size=8,使用ImageNet预训练模型。作者发现这个batch size足以使用bn层,因此解冻了预训练的bn,但是没有增加额外的bn。对于COCO数据集,使用动量系数为0.9的SGD优化器,迭代800k。初始学习率为10^-3,在280k、600k、700k、750k时学习率除以10。所有的数据增强与SSD相同。对于Pascal数据集,总共迭代120k。在60k、100k时学习率除以10。对所有的Anchor的尺度4/3,因为目标往往更大。在TitanXp上训练COCO需要花费4-6天,Pascal少于一天。

掩码结果

    下表是YOLACT与SOTA模型的比较:

图片14.jpg

    因为本文的主要目标是速度,上表中所有的模型都在Titan Xp上运行,有些模型的结果可能比原始论文更快。从上表可知,YOLACT-550在比其它最快的模型还快3.8倍的情况下,精度仍然过得去。与其他的模型相比,YOLACT的表现有一些不同之处:YOLACT-550使用AP50时与Mask R-CNN相差9.5 AP,使用AP75时相差6.5 AP,这与FCIS明显不同。而使用AP95时,YOLACT是1.6 mAP超过了Mask R-CNN的1.3mAP。这就定量证明了:YOLACT生成的实例掩码质量更高

    从上表中还可以看到,对于YOLACT,输入分辨率越低,速度越快,精度越低。不同backbone对速度和精度的影响也不相同,在优先速度的情况下,ResNet-50可能是比较好的选择。

    下表是YOLACT在Pascal 2012 SBD数据集上的评估结果:

图片15.jpg

掩码质量

    YOLACT最终生成的掩码的分辨率为138x138,而且中间没有经过重池化步骤,因此生成的实例掩码的质量优于Mask R-CNN和FCIS。如下图所示:

图片16.jpg

时间稳定性

    YOLACT在连续帧(视频)上的分割效果更加稳定,一方面因为掩码的质量更好,另一方面,作者认为Two-stage方法过多地依赖于第一阶段的区域生成,对YOLACT来说,虽然检测框可能会有波动,但因为原型掩码的预测比较稳定,所以产生的分割效果也会更稳定。


讨论

    尽管YOLACT在速度和分割质量上优于SOTA模型,但在分割精度上有很大的差距。大部分的误差来自目标检测器:误分类、包围框不对准。然而作者同样发现了掩码生成算法引起的两个误差。

定位失败

    如果场景中有重叠的目标时,则网络可能无法在原型中定位所有的目标。在这种情况下,网络会输出更接近前景掩码的内容。如下图所示,红色飞机下面的两辆卡车没有被正确的分割开:

图片17.jpg

泄露

    YOLACT默认实例掩码是在原型与系数组合后得到的,因此没有抑制包围框外噪声的能力。若是定位很精确时没问题,若是定位不精确,则噪声会影响到实例掩码,则会产生一些泄漏现象。若是两个实例离得很远时也会发生这种现象,因为网络可能认为这几个实例已经离得很远了,自身不需要去分开定位它们,裁剪分支会负责处理这种情况。然而如果预测的包围框很大,会裁剪到离得很远的哪个目标,如下图就是这种情况:

图片18.jpg

罪魁祸首

    定位失败和泄漏这两个问题不足以解释YOLACT与SOTA的差距,问题在于YOLACT的backbone目标检测器性能不高。


附录

包围框实验结果

    YOLACT除了可以掩码之外,也可以生成包围框,因此这里也可以与其它实时目标检测模型进行比较。此外,把YOLACT作为目标检测器意味着不需要生成实例分割掩码,因此速度可以更快。下表是YOLACT与YOLOv3的对比:

图片19.jpg

    可以看到YOLACT可以达到与YOLOv3相似的精度和速度,但却没有使用YOLOv3中的trick比如多尺度训练、最佳包围框、基于位置的回归编码、目标置信度等。作者猜想YOLACT能达到如此精度的原因是使用了FPN和使用mask一起训练。此外,上面的结果显示,加入了mask分枝后仅仅多了6ms,这表明掩码的计算量是非常小的了。

定性结果

图片20.jpg

图片21.jpg




上一篇:
下一篇: 没有了

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于