论文学习笔记-YOLACT

『写在前面』

基于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过程的计算速度。

1 介绍

在目标检测模型设计上,主要有两大路线: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数据集上的表现对比如下图所示。

3 YOLACT

类比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的模型结构,速度极快。 

3.1 原型生成

称生成原型的网络分支为protonet。protonet基于FCN实现,最后会输出k个通道,每个通道可以视作一张原型mask。protonet的作用有些类似语义分割模型,不同之处在于protonet部分的训练不单独设置loss,只在整个网络最后输出的mask上进行监督

protonet的设计上有两个取舍:

1)从深的backbone中获取protonet可以产生更稳当的mask;

2)高分辨率的原型mask有利于提高分割精度和对小目标的效果。

YOLACT使用了FPN作为backbone,同时上采样到原图尺寸的1/4以改善对小目标的分割效果。

3.2 mask系数

典型的基于Anchor的检测模型会为每个Anchor预测4个值用于表征box信息,和C个值用于表征类别得分,共(4+C)个值。

YOLACT为 每个Anchor预测(4+C+k)个值,额外k个值即为mask系数

另外作者认为,为了能够通过线性组合来得到最终想要的mask,能够从最终的mask中减去原型mask是很重要的。换言之就是,mask系数必须有正有负。所以,在mask系数预测时使用了tanh函数进行非线性激活,因为tanh函数的值域是(-1,1).

3.3 mask合成

通过基本的矩阵乘法配合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尺度。

3.4 Emergent Behavior

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),而又不会带来模型性能的下降。

4 Backbone Detector

因为预测一组原型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

5 其他改进

Fast NMS

 提出了一种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

在训练阶段添加辅助loss。

具体做法是在最大的feature map后面接1×1卷积,输出一个通道数为c的feature map。它对应的ground truth从实例分割的标注中获得,因此没有强制要求每个像素只能属于单一类别。所以此处使用的loss计算方法是在c个通道上分别运行sigmoid,类似YOLO-v3多标签分类的loss设计。

6 结果

实例分割结果&掩码质量

一定程度上,YOLACT得到的mask质量较Mask R-CNN、FCIS更高。这得益于较大的mask尺寸和没有特征repooling带来的信息损失。

另外,作者建议,如果希望提高速度,建议压缩backbone大小,而不是直接压缩输入图像大小。

 时间稳定性

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

 7 讨论

通过实验分析,作者发现YOLACT的错误大多是由检测器引起的,比如错误分类或bounding box定位不准。

定位失败

当在画面某个位置存在多个重叠的实例时,则网络可能无法通过自身学习到的原型mask对其进行定位。在这种情况下,会输出更接近前景mask的内容,而不是某些实例的分割。如下图所示,红色飞机下面的两辆卡车没有被正确分开。

泄露

因为YOLACT默认mask是在合成以后裁剪得到的,所以没有抑制框外部噪声的功能。如果检测框定位不准,那么就会导致mask泄露现象。另外,当多个同类实例相隔较远但大小又很大的时候,也可能发生这种现象。因为网络可能认为这几个实例已经离得很远了,自身不需要去分开定位它们,裁剪分支会负责处理这种情况。如下图所示,就属于这种情况。

 

  • 35
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 72
    评论
《Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值