论文链接:https://arxiv.org/pdf/1904.02689.pdf
1 实例分割已有工作
【实例分割】
鉴于其重要性,大量的研究投入到实例分割的准确性。
- 两阶段:Mask-RCNN [18]是一种具有代表性的两阶段实例分割方法,它首先生成候选感兴趣区域(roi),然后在第二阶段对这些roi进行分类和分割。后续工作试图通过提高其准确性,例如,丰富FPN特性[29]或解决掩码的置信度分数与其定位精度[20]之间的不兼容性。这两阶段的方法需要为每个ROI重新池化特性,并进行随后的计算处理,这使得它们即使在减少图像大小时也无法获得实时速度(见表2c)。
- 单阶段:单阶段实例分割方法生成位置敏感maps,这些位置敏感maps通过位置敏感池[6,24]组装成最终的掩码,或者将语义分割logits和方向预测logits结合。虽然它们在理论上比两阶段的方法更快,但它们仍然需要repool或其它大量的计算(例如,掩码投票)。这严重限制了它们的速度,使它们不够实时性。
- 最后,一些方法首先进行语义分割,然后进行边界检测[22]、像素聚类[3,25],或者学习嵌入来形成实例掩码[32,17,9,13]。同样,这些方法有多个阶段和/或涉及昂贵的聚类过程,这限制了它们在实时应用程序中的可行性。
【实时实例分割】
虽然有实时目标检测和语义分割方法存在,但关注实时实例分割的研究很少。Straight to
Shapes和box2Pix可以实时完成实例分割,但他们的准确性远未达到一般基准。事实上,Mask R-CNN 仍然是在语义上具有挑战性的数据集上最快的实例分割方法之一(在550*550 px图像上为13.5fps;见表2c)。
【原型】
学习原型已经在计算机视觉中得到了广泛的探索。但这些工作使用原型来表示特征,而我们使用它们来组装掩码。在YOLACT中,我们学习了特定于每个图像的原型(掩码字典),而不是在整个数据集上共享的全局原型。然后对这些原型掩码进行线性的组合得到最终的实例掩码。
2 YOLACT的提出
实例分割是很困难的——比目标检测要困难得多。
- 1)目标检测的 两阶段到单阶段:像SSD和YOLO这样的单阶段目标探测器,删除第二阶段以其他方式弥补损失的性能,从而加快R-CNN等现有的两阶段探测器。
- 2)实例分割的 两阶段到单阶段(同样的方法并不容易扩展到实例分割)。
两阶段:最先进的两阶段实例分割方法严重依赖于特征定位来产生掩码。这种方法本质上是顺序的,因此很难加速。
单阶段:像FCIS这样并行执行这些步骤的一步方法确实存在,但它们需要定位后大量的后处理,因此仍然远非实时。
【YOLACT相关内容】
YOLACT的流程为:(这是一个放弃了显式定位步骤的实时实例分割框架)
- YOLACT将实例分割分解为两个并行任务:
(1)生成一组掩码;
(2)预测每个实例的掩码系数;
(3)我们通过将原型掩码(prototype masks)和系数线性结合来生成实例掩码,然后用一个预测的边界框进行裁剪。
我们发现,由于这个过程不依赖于repooling,这种方法可以产生非常高质量的掩码,并展现出时间维度上的稳定性。此外,我们分析了我们的掩码的 emergent behavior,并表明它们学习以一种平移变化性的定位实例,尽管它们是完全卷积的。
1. prototype masks:是YOLACT的一个分支的预测的整个掩码字典,这里就称呼其为原型掩码。原型掩码不是我们想要的最终每个实例目标的掩码,而是需要对这些原型掩码进行线性的组合得到最终的掩码。
2. 时间维度上的稳定性:一个连续帧的图片序列中,有同一个静态物体,分割时结果基本不抖动的现象。
YOLACT的输出原型:
- 此外,由于原型掩码的数量与类别的数量无关(例如,可能有比原型更多的类别),YOLACT学习了一个分布式表示,其中每个实例通过跨类别共享的原型组合进行分割(这里的意思是一个原型可能存在多个实例物体,通过多个原型进行线性加减,即可得到独立的实例目标)。
这种分布式表示导致一些现象:一些原型空间分区图像,一些定位实例,一些检测实例轮廓,一些编码位置敏感方向图(类似于获得位置敏感硬编码模块FCIS [24]),和大多数做这些任务的组合(见图5)。
YOLACT的优点:
- 快速的:该模型在一个GPU TitanXp上训练MSCOCO数据集以33.5帧ps的速度达到29.8 mAP,比以往任何竞争方法都要快得多。
- 高质量的:由于掩码充分利用了图像空间,而不会因为repooling而造成任何质量损失,因此我们对于大型目标的掩码的质量明显高于其他方法(见图7)。
- 易于泛化:生成原型和掩码系数的想法可以添加到几乎任何现代目标探测器中。
我们的主要贡献:
- 方案:第一个实时(>30 fps)实例分割算法,在具有挑战性的MS COCO数据集上具有具有竞争力的结果(见图1)。
- 实验:我们分析了YOLACT原型的相关内容,并提供实验来研究使用不同骨干架构、原型数量和图像分辨率获得的速度与性能的权衡。
- Fast NMS:我们提供了一种新的Fast NMS方法,它比传统的NMS快12 ms,但性能损失可以忽略不计。YOLACT的代码可以在https://github.com/dbolya/yolact上找到。
图一:在COCO上的各种实例分割方法的速度-性能权衡。据我们所知,我们的方法是第一个在COCO测试开发上实时的方法(超过30 FPS)掩码映射的方法。
3 YOLACT的详细内容
对于我们的主干检测器,我们优先考虑速度和特征丰富度,因为预测这些原型和系数是一项困难的任务,需要良好的特征才能做好。因此,我们的主干探测器的设计密切遵循RetinaNet[27],并强调速度。
YOLACT Detector
- 【backbone】我们使用ResNet-101 和FPN 作为我们的特征提取主干,其基本图像大小为550×550。
- 【input】我们不保留纵横比,以获得一致的每幅图像的评估时间。
- 【neck】与RetinaNet一样,我们修改FPN,而不产生P2,产生P6和P7,从P5开始连续的3×3步幅2层,并在每个层上放置3个长宽比的锚[1,1/2,2]。P3的锚点面积为24像素的平方,后续每一层的比例都是前一层的两倍(结果产生在不同尺度[24,48,96,192,384])。
- 【head】对于每个附加的预测头 P i P_i Pi,我们有三个分支共享一个3×3 conv,然后每个分支并行得到自己的3×3 conv。与RetinaNet相比,我们的预测头部设计(见图4)更轻、更快。
图4:总体架构。我们使用了一个比RetinaNet更浅的预测头,并添加了一个掩码系数分支。
其中,c为类别数量,Pi为第i个特征层,a为anchor的个数,k为原型个数。- 【Loss】我们将smooth-L1损失应用于训练目标框的回归,目标框的编码形式与SSD相同。为了训练类预测,我们使用具有c个正标签和1个背景标签的softmax交叉熵,使用3:1的负:正的比例的OHEM 选择训练样本。因此,与RetinaNet不同,我们不使用focal loss,focal loss在我们的工作中不可行。
有了这些设计选择,我们发现这个主干比使用ResNet-101 [19]修改的SSD [30]性能更好、更快。
3.1 原型的生成
原型生成分支(质子集)为整个图像预测了一组k个原型掩码。我们使用一个有k个通道的FCN(每个原型一个)作为最后一层,来输出整个质子集,并将其附加到一个主干特征层(插图见下图)。虽然这种方式类似于标准语义分割,但不同的是YOLACT在原型上没有明确的损失。相反,这些原型的所有监督都来自组装后Mask Loss。
- 图3:该标签表示图像大小为550×550时的特征大小和通道。箭头表示3个×3的conv层,除了最终的conv是1×1。size的提升通过在conv后进行上采样。
我们注意到两个重要的设计选择:从更深的主干特征中提取质子集可以产生更健壮的掩码,更高分辨率的原型则可以产生更高质量的掩码,并在更小的物体上获得更好的性能。
- 我们使用FPN 中的P3,是因为它最大的特征层是最深的(参见图2)。然后,我们将其重新采样到输入图像维度的四分之一(上采样一次),以提高对小物体的性能。
- 我们发现掩码的输出是无界的很重要,因为这允许网络为它非常可信的原型产生大的优秀的激活(例如,明显的背景)。我们可以选择遵循具有ReLU或没有非线性的质子集。在本工程中我们选择ReLU。
这里的激活就是指特征图中关注的信息被学习到,可视化起来就是在关键位置特征明确
3.2 mask 的输出参数
- 典型的基于锚点的目标检测器在其预测头部中有两个分支:
一个分支用于预测c类的得分
一个分支用于预测4个目标框的xywh- 对于掩码系数的预测:
我们简单地并行添加第三个分支,预测k个掩码系数,每个原型对应一个。因此,我们对每个锚产生4 + c + k系数。- 非线性化:
我们发现能够从最终的掩码中获取原型是很重要的。因此,我们将tanh应用于k掩码系数,它在没有非线性时产生更稳定的输出。这种设计选择的相关性在图2中很明显,需要通过原型掩码相加减,构建出最终的掩码。
3.3 Mask 的组装
【组装】
为了生成实例掩码,我们将原型分支和掩码系数分支的工作相结合,使用前者与后者作为系数的线性组合。然后我们用一个sigmoid非线性来产生最终的掩码。这些操作可以使用单矩阵乘法和sigmoid有效实现: M = σ ( P C T ) M = σ(P C^T) M=σ(PCT) 其中:P是原型掩码的 h × w × k h×w×k h×w×k 矩阵;C是经过NMS和得分阈值的掩码系数 n × k n × k n×k 的矩阵。利用P和C计算M,其他更复杂的组合步骤也是可能的;但是,我们用一个基本的线性组合来保持简单和快速。
【Losses】
我们使用三种损失来训练我们的模型:class损失Lcls、box回归损失Lbox、mask损失Lmask,权重分别为1、1.5和6.125。Lcls和Lbox的定义方式与[30]中定义的相同。然后为了计算Lmask,我们简单地取组装好的掩码M和真实标签的掩码Mgt: Lmask = BCE(M, Mgt)之间的像素级二值交叉熵。
【Cropping Masks】
在评估期间,我们用预测的边界框来裁剪最终的掩码。在训练过程中,我们使用真实标签的目标框进行裁剪,并将Lmask除以真实标签的目标框,以保留原型中的小物体。
3.4. Emergent Behavior
因为关于实例分割的普遍共识是因为FCN是平移不变的,所有需要在[22]中添加平移可变性。类似于FCIS[22]和Mask R-CNN[16]的方法尝试着添加平移可变性,如利用方向性特征图和对位置敏感的repooling,或者将mask分支送入第二级,就不用对实例进行定位了。
本文用于添加平移可变性的方法是对最终的mask利用预测的b-box进行裁剪,但是我们发现本文的方法在不对中等和大的目标进行裁剪的情况下仍然可以有效工作,所以这并非是裁剪所带来的效果,YOLACT学习到了如何通过模板的不同激活情况来自己进行实例的定位。
图5:原型行为。在不同的图像(x轴)上激活相同的六个原型(y轴)。原型1-3响应到柔软的隐式边界(用虚线标记)一侧的对象。原型4在物体的左下角激活(例如,图像d中雨伞的左下角);原型5在背景和物体之间的边缘激活;原型6分割了网络感知到的图像中的地面。这最后3种模式在图像d-f中最为清晰。
- 【可区分同一语义的不同实例】我们观察到不同的原型 激活了图像的不同区域。通过结合这些分区映射,网络可以区分同一语义类的不同实例(甚至重叠);例如,在图像d中,可以通过从原型2中减去原型3,将绿色伞与红色伞分离出来。
- 【原型的数量是可压缩的】作为被学习的对象,原型的数量是可压缩的。也就是说,如果质子集将多个原型的功能组合成一个,掩码系数分支可以了解哪些情况需要哪种功能。例如,在图5中,原型2是一个分区原型,但也对左下角的实例影响最强烈。原型3也很类似,但是对于右边的例子。这就解释了为什么在实践中,即使是低到k=32个原型,该模型的性能也不会下降(见表2b)。
- 【增加k很可能是无效的】因为预测系数是困难的。如果网络在甚至一个系数上有很大的误差,由于线性组合的性质,所产生的掩码可能会消失或包括来自其他对象的泄漏。因此,网络必须发挥平衡作用来产生正确的能力,而添加更多的原型使这变得更加困难。事实上,我们发现,对于更高的k值,网络只是添加了具有小边缘级变化的冗余原型,略微增加 A P 95 AP_{95} AP95,但没有太多。
5 Other Improvements
我们还讨论了其他改进,要么提升速度同时很小影响性能,要么提升性能不加速。
【Fast NMS】
- 【传统NMS问题】
像大多数对象检测器一样,在为每个锚点产生目标框的系数和类置信度后,我们执行NMS来抑制重复检测。在以前的许多工作中,[35,36,30,37,18,27],NMS是按顺序执行的。也就是说,对于数据集中的每个c类,根据证据对检测到的box进行排序,然后对于每个检测,删除所有那些置信度低且IoU重叠大于某个阈值的box。虽然这种顺序方法在5帧/秒左右的速度下足够快,但它成为获得30帧/秒的一大障碍(例如,5帧每秒提高10 ms会导致0.26帧/秒的提升,而30帧每秒提高10 ms会导致12.9帧/秒的提升)。- 【提出Faster NMS】
为了修复传统NMS的顺序性质,我们引入了Fast NMS,这是NMS的一个版本,它可以决定并行地保留或丢弃每个实例。为了做到这一点,我们只是允许已经移除的检测来抑制其他检测,这在传统的NMS中是不可能的。这种松弛允许我们完全在标准的gpu加速矩阵操作中实现快速NMS。- 【Faster NMS的实施】
为了执行Fast NMS,我们首先计算一个 c × n × n c×n×n c×n×n 的成对的IOU矩阵,对于每个c个类的前n个检测结果 按照分数向下排序。在GPU上的批量排序很容易获得,计算IoU可以很容易地向量化。然后,我们删除 相应的IoU大于t的阈值的检测框。我们首先将X的下三角形和对角线设置为0: X k i j = 0 , ∀ k , j , i ≥ j X_{kij}=0,\,∀k,j,\,\,i≥j Xkij=0,∀k,j,i≥j 来有效地实现这一点,这可以在一个批处理的triu call中执行,然后取列级最大值: K k j = max i ( X k i j ) ∀ k , j K_{kj} = \max_{i}(X_{kij})\,\,\,\,\,\ ∀k, j Kkj=imax(Xkij) ∀k,j 就这样计算每个检测的最大IoU值的矩阵K。最后,用 t (K- 【Faster NMS带来的影响】
由于松弛,Fast NMS的效果是删除有点太多的盒子。然而,与速度的显著增加相比,这种方法所造成的性能影响可以忽略不计(见表2a)。在我们的代码库中,Fast NMS比传统NMS的Cython实现快11.8 ms,而只降低了0.1 mAP的性能。在Mask R-CNN基准测试套件[18]中,Fast NMS比传统NMS的CUDA实现速度快15.0 ms,性能损失仅为0.3 mAP。
【Semantic Segmentation Loss】
- 虽然Fast NMS用少量的性能换取速度,但有一些方法可以在不影响速度的情况下提高性能。其中一种方法是在训练期间增加额外的损失函数,而测试时无需添加。这有效地增加了特征的丰富度,而没有降低速度。
- 因此,我们在仅在训练期间进行评估的层后的特征空间上应用语义分割损失。请注意,因为我们对这种损失从实例标注中构建了对应的标签,所以这并没有严格获取语义分割(即,我们不强制执行标准的每像素一个类)。为了在训练过程中得到预测,我们只需将一个带有c输出通道的1x1 conv层直接连接到我们的主干中最大的特征图(P3)上。由于每个像素可以分配给多个类,我们使用sigmoid和c通道,而不是softmax和c + 1。该损失的权重为1,并带来+0.4mAP的提升。
6 Results
我们报告了在MS COCO [28]和Pascal 2012 SBD [16]上使用标准指标的实例分割结果。对于MS COCO,我们在train2017上进行训练,并在val2017进行评估和测试。
【实施细节】
- 我们使用ImageNet [10]预训练权重,在一个GPU上训练 batchsize为8的模型。
- 保留预训练的BN未冻结,但不添加任何额外的bn层。
- 优化器SGD
- 800k迭代、初始学习速率10−3和除以10在迭代280k,600k,700k,和750k
- 使用重量衰减5×10−4,动量为0.9,在SSD中对所有数据进行增强。
- 对于Pascal,我们训练了120k次迭代,并在60k和100k时的划分了学习速率。
- 我们还将锚定比例乘以4/3,因为物体往往更大。
- 在一台TitanXp上的训练COCO需要4-6天(取决于配置),训练Pascal需要不到1天。
【掩码结果】
表1中展示了将YOLACT与在MSCOCO的测试集上的最新方法进行了比较。这些都是在一个TitanXp上计算的所有速度。
表1 MS COCO [28] Results。我们比较了在COCO测试集上的最先进的掩码的mAP和速度方法,并包括了我们的基本模型的几种消融,不同的主干网络和图像大小。
- 我们用网络深度特征表示主干结构,其中R和D分别指ResNet [19]和DarkNet [36]。
- 使用ResNet-101的YOLACT-550,比Mask R-CNN 快3.9倍(如图7展示效果)。
- Mask R-CNN 比 YOLACT-550 在 A P 50 AP_{50} AP50高9.5,在 A P 75 AP_{75} AP75 高6.6。
- Mask R-CNN 比 FCIS 在 A P 50 AP_{50} AP50和 A P 75 AP_{75} AP75高出相同程度,分别为 7.5和7.6。
图7:掩码质量。我们的掩码通常比Mask R-CNN [18]和FCIS [24]的质量更高,因为掩码尺寸更大,同时没有特征重池化。- 我们还在表1中报告了可选模型配置的编号。除了我们的基础550×550图像大小模型,我们训练了400×400(YOLACT-400)和700×700(YOLACT-700)模型,相应地调整锚定比例(sx=550/550∗x)。提高图像大小可以显著降低速度,但也可以提高性能。
- 除了ResNet-101 的基础骨干之外,我们还测试了ResNet-50和DarkNet-53 ,以获得更快的结果。如果想要更高的速度,我们建议使用ResNet-50或DarkNet-53 而不是降低图像大小,因为这些配置的性能比YOLACT-400好得多,但只是稍微慢一些。
最后,我们还在表3中的Pascal 2012 SBD上训练和评估了我们的ResNet-50模型。YOLACT显然优于其他的流行方法,同时也要快得多。
【掩码质量】
- 因为我们生成了一个大小为138×138的最终掩码,而且我们直接从原始特征获取掩码(没有重新池转换和可能的错位特征),我们对大型目标的掩码质量明显高于Mask R-CNN 和FCIS。
- 例如,在图7中,YOLACT 产生了一个干净的手臂边界的掩码,而FCIS和Mask R-CNN都有更多的噪声。此外,尽管总体上mAP差5.9,但在95%的IoU阈值下,我们的基本模型达到1.6 AP,而Mask R-CNN获得1.3AP。这表明重新池化确实导致掩码质量的可量化下降。
【时间稳定性】
- 现象:虽然我们只使用静态图像进行训练,没有应用任何时间平滑,但我们发现我们的模型在视频上比Mask R-CNN产生更稳定的掩码,即使图片中物体静止,Mask R-CNN的掩码会在帧间抖动。
- 原因:我们认为我们的掩码更稳定,部分原因是它们的质量更高(因此帧之间的误差空间更小),但主要是因为我们的模型是一个阶段的。采用两阶段方法产生的掩码高度依赖于第一阶段的区域建议。与我们的方法相比,即使模型预测了跨帧的不同box,原型也不会受到影响,产生更多时间稳定的掩码。
7 Discussion
尽管我们的掩码质量更高,并且具有很好的属性,如时间稳定性,但我们在整体性能上落后于最先进的实例分割方法,尽管其速度要快得多。大多数错误是由检测器中的错误引起的:误分类错误、框错位等。然而,我们已经确定了由YOLACT的掩码生成算法引起的两个典型的错误。
- 【Localization Failure 定位失败】
如果在场景的一个点有太多的对象,网络可能无法在自己的原型中定位每个对象。在这些情况下,网络将为组中的某些对象输出更接近前景掩码而不是实例分割的东西;例如,在图6的第一张图像(第1列第1行)中,红色飞机下的蓝色卡车没有正确定位。
- 【Leakage 漏出部分】
我们的网络利用了组装后裁剪的实例,并且没有试图抑制裁剪区域之外的噪音。当边界框准确时,这工作得很好,但当它不是准确时,噪声可能会渗透到实例掩码中,从裁剪区域之外产生一些“泄漏”。当两个实例彼此远离时,也会发生这种情况,因为网络已经知道它不需要定位遥远的实例——裁剪将处理它。但是,如果预测的边界框太大,掩码也将包括一些遥远的实例的掩码。例如,图6(第2行,第4列)显示了这种泄漏,因为掩码分支认为这三个滑雪者的距离足够远,不必将它们分开。
【了解 AP Gap】
Localization Failure和Leakage 本身并不足以解释YOLACT的基本模型和Mask R-CNN之间的近6 mAP差距。事实上,我们在COCO上的基本模型在测试集上的mask和box的mAP(29.8mask,32.3box)之间只有2.5 mAP的差异,这意味着即使使用完美的掩码,我们的基本模型也只能获得少数mAP点。此外,Mask R-CNN具有相同的mAP差异(35.7mask,38.2 box),这表明两种方法之间的差距在于我们的检测器的性能相对较差,而不是我们生成掩码的方法。