[实例分割] Single Stage Instance Segmentation — A Review

转载请注明作者和出处: http://blog.csdn.net/john_bh/

文章链接: Single Stage Instance Segmentation — A Review
会议及时间:2020.6

实例分割一直是计算机视觉中很热门的课题,这几年发展的很快,从 two stage 到 single stage , 从MaskRCNN 到SOLO,不断涌现出一些优秀的文章,分割的精度不断提高,速度也不断刷新。最近读了一篇关于single stage 实例分割的综述,简单梳理了实例分割的发展脉络,这里做一下简单的总结和整理,正在做实例分割方向的同学可以深入看一看文章中提到的paper。
码字不易,如果你觉得写的还可以,顺便点个赞,欢迎转发。

文章目录

    • 1. 实例分割
    • 2. Mask的表征方式
      • 2.1 局部mask的表征方法
      • 2.2 通过4D的张量构建mask
      • 2.3 Compact Mask Encoding
      • 2.4 全局Mask表征方式
      • 2.4 掩模的隐式表示
    • 3. 小结
    • 4. References

1. 实例分割

实例分割是一项具有挑战性的计算机视觉任务,需要预测对象实例及其逐像素分割掩码。这使得它混合了语义分割和目标检测。如下图所示:
[实例分割] Single Stage Instance Segmentation — A Review_第1张图片
从左到右,依次是目标检测任务,语义分割,实例分割任务。从图可以看出,实例分割不仅仅要求分割出物体的mask,识别出它的类别,还需要去区分同一类里面的不同instance。

自发明Mask R-CNN以来,最新的实例分割方法主要是Mask RCNN及其变体(PANet,Mask Score RCNN等)。 它采用先检测后分割的方法,首先执行对象检测以提取每个对象实例周围的边界框,然后在每个边界框内执行二进制分割以分离前景(对象)和背景。

但是,Mask RCNN速度很慢,因此无法使用许多实时应用程序。 此外,Mask RCNN预测的掩码具有固定的分辨率( 28 × 28 28\times 28 28×28),因此对于具有复杂形状的大型对象还不够完善。 在 anchor-free 目标检测方法(例如CenterNet和FCOS)的发展推动下,推动单阶段实例分割的研究,例如CenterMask,BlendMask。 这些方法中的许多方法都比Mask RCNN更快,更准确,如下图所示(该图来自SOLOv2):
[实例分割] Single Stage Instance Segmentation — A Review_第2张图片
该博客将回顾单阶段实例分割的最新进展,重点是 掩码表示 ----实例分割的一个关键方面。

2. Mask的表征方式

在实例分割中要问的一个核心问题是实例掩码的表示或参数化:

  1. 是使用局部掩码还是全局掩码?
  2. 如何表示/参数化掩码?

[实例分割] Single Stage Instance Segmentation — A Review_第3张图片
表示实例掩码的方式主要有两种:局部掩码和全局掩码。

  • 全局掩码: 这正是是我们最终想要的,它与输入图像具有相同的空间范围它的自然优势是对大小的物体都具有相同的分辨率(因此具有固定长度的特征)。可以以原图的方式来分割出mask,这不会让小物体丢失全局信息,同时也可以让小物体更容易被看见。对于大物体来说,它看的也更加清晰,边界也应当会更加的清晰。
  • 局部掩码: 它没有作为全局掩码过多的边界,因此通常更为紧凑。它必须与掩码位置一起使用才能恢复到全局掩码,而局部掩码的大小将取决于对象的大小。但是,要执行有效的批处理,实例掩码需要固定长度的参数化。最简单的解决方案是将实例掩码的大小调整为固定的图像分辨率,这是Mask RCNN所采用的。它优点其实也很明显,它同样很简单,可以和任何目标检测算法结合起来,同时它应该速度相对来说更快,占用的显存毫无疑问会更小。

根据使用的是局部掩码还是全局掩码,可以将单阶段实例分割大致分为基于局部掩码和基于全局掩码的方法。

2.1 局部mask的表征方法

基于局部掩码的方法直接在每个局部区域上输出实例掩码。

从某种意义上说,边界框是一个粗糙的掩码,它以最小的边界矩形近似于掩码的轮廓。 ExtremeNet(通过将极端点和中心点分组进行自下而上的对象检测,CVPR 2019)使用 four extreme points(因此具有8个自由度的边界框而不是传统的4自由度)执行检测,并且可以自然扩展这种更丰富的参数化通过在其相应边缘上的两个方向上将一个 extreme points 扩展到整个边缘长度的1/4的片段,从而将其生成八边形掩码。
[实例分割] Single Stage Instance Segmentation — A Review_第4张图片
从那时起,有一系列工作尝试将实例掩码的轮廓编码/参数化为固定长度的系数,并给出不同的分解基础。这些方法使每个实例的中心(不一定是bbox中心)和相对于该中心的轮廓回归。

  • ESE-Seg(用于实时实例分割的显式形状编码,ICCV 2019)为每个实例设计一个内部中心半径形状签名,并将其与Chebyshev多项式拟合。
  • PolarMask(PolarMask:具有极地表示法的单镜头实例分割,CVPR 2020)利用从中心以恒定角度间隔的光线来描述轮廓。
  • FourierNet(FourierNet:使用可微分的形状解码器进行实例分割的紧凑型掩码表示)引入了使用Fourier变换的轮廓形状解码器,并实现了比PolarMask更平滑的边界。

[实例分割] Single Stage Instance Segmentation — A Review_第5张图片
这些方法通常使用20到40个系数来参数化掩码轮廓。 它们可以快速推断并且易于优化。 但是,它们的缺点也很明显。 首先,从视觉上看,它们看上去都非常糟糕。 他们无法精确描绘掩码,也无法描绘出在中心有孔的对象。

2.2 通过4D的张量构建mask

TensorMask(TensorMask:密集对象分割的基础,ICCV 2019)是通过在每个特征图位置预测遮罩来展示密集遮罩预测思想的第一批作品之一。 TensorMask仍会预测感兴趣区域的掩码而不是全局掩码,并且它能够运行实例分割而无需运行对象检测。

TensorMask利用结构化的4D张量来表示空间域上的掩码(2D迭代输入图像中的所有可能位置,2D表示每个位置的掩码),还引入对齐的表示和张量双锥体以恢复空间细节,但是这些对齐操作 使网络甚至比两阶段的Mask R-CNN慢。 另外,为了获得良好的性能,需要使用比标准COCO对象检测管道(6倍计划)长六倍的计划来对其进行培训。
[实例分割] Single Stage Instance Segmentation — A Review_第6张图片

@ 知乎 林大佬
wh可以理解,vu可以看做是什么?像素点的坐标?不对,wh就已经包含了位置坐标信息了。应该是中心点在xy坐标处的mask,表示方式就是uv。这个方法要说巧妙吧,倒也满巧妙,毕竟何凯明出品,必出精品,但它的速度竟然比MaskRCNN还慢,有点杀第一百自损三千的赶脚。除此之外它需要更多的训练时间,是MaskRCNN训练时间的6倍。这简直无法忍受。

2.3 Compact Mask Encoding

自然对象掩码不是随机的,类似于自然图像,实例掩码的固有维数比像素空间的内维数低得多。 MEInst(用于单镜头实例分割的掩码编码,CVPR 2020)将遮罩提取为紧凑且固定尺寸的表示形式。 通过PCA的简单线性变换,MEInst能够将 28 × 28 28×28 28×28 的局部掩码压缩为60维特征向量。 本文还尝试在一级目标检测器(FCOS)上直接回归 28 × 28 = 784 − d i m 28×28 = 784-dim 28×28=784dim 特征向量,并且在AP点下降1-2个情况下也得到了合理的结果。 这意味着直接预测高维掩码(每个TensorMask以自然表示)并不是完全不可能的,但是很难优化。 掩码的紧凑表示使其更易于优化,并且在推理时也可以更快地运行。 它与Mask RCNN最相似,可以直接与大多数其他对象检测算法一起使用。
[实例分割] Single Stage Instance Segmentation — A Review_第7张图片

@ 知乎 林大佬
这个编码方式是很精妙的,完美的规避了端到端对齐的问题,什么是端到端对齐?一张图片里面的box数目,box大小都是不一样的,因此MaskRCNN这样的局部Mask的分割方式都会不可避免的引入RoIAlign这样的操作,导致了每一个batch都需要一个对齐的操作。MEInst这里做的工作就是一个标准化。不过令人遗憾的是,理想很丰满,但是现实却很骨感,虽然论文证明了这种表征方式可行,速度却没有和MaskRCNN高出多少,源自于这里面的编码和解码的操作比较耗时。

2.4 全局Mask表征方式

基于全局掩码的方法首先基于整个图像生成中间和共享特征图,然后组合提取的特征以形成每个实例的最终掩码。这是最近的一阶段实例分割方法中的主流方法。

原型和系数

  • YOLACT(YOLACT:实时实例分割,ICCV 2019)是尝试进行实时实例分割的首批方法之一
    YOLACT将实例分割分为两个并行任务,生成一组原型掩码并预测每个实例的掩码系数。原型掩码是使用FCN生成的,可以直接受益于语义分割的进步。系数被预测为边界框的额外特征。这两个并行步骤之后是组装步骤:通过矩阵乘法实现的简单线性组合,并使用每种实例的预测边界框进行裁剪操作。裁剪操作减轻了网络抑制边界框外部噪声的负担,但如果边界框包含同一类的另一个实例的一部分,仍然会发现一些泄漏。
    由于yolact里面采用了全局的Mask,并且最终生成的mask质量只取决于全图的分辨率,与mask的数目无关,这就使得yolact在计算mask的速度上,可以和mask的数目无关,它是一个常量。这也是Yolact速度比较快的原因之一;
    [实例分割] Single Stage Instance Segmentation — A Review_第8张图片
  • InstanceFCN(实例敏感的全卷积网络,ECCV 2016)和 FCIS(全卷积实例感知语义分割,CVPR 2017)
    它们似乎是YOLACT的特例。 InstanceFCN和FCIS都使用FCN生成多个实例敏感的分数图,其中包含对象实例的相对位置,然后将组装模块应用于输出对象实例。位置敏感的分数图可以看作是原型掩码,但是IntanceFCN和FCIS代替了学习的线性系数,而是使用一组固定的空间池化操作来组合位置敏感的原型掩码。
    [实例分割] Single Stage Instance Segmentation — A Review_第9张图片
  • BlendMask(BlendMask:自上而下遇到实例分割,自下而上,CVPR 2020),是一个比较精妙,精度很高,速度也做的很快的方法。
    建立在YOLACT之上,但是BlendMask并未预测每个原型掩码的标量系数,而是预测了低分辨率(7×7)的注意力图来混合 边界框内的掩码。 该关注图被预测为附加到每个边界框的高维特征(7×7 = 49-d)。 有趣的是,BlendMask使用的原型掩码为4,但是即使只有1个原型掩码也可以使用。 CenterMask(CenterMask:具有点表示的单镜头实例分割,CVPR 2020)几乎以完全相同的方式工作,并明确使用1个原型掩码(称为全局显着图)。
    [实例分割] Single Stage Instance Segmentation — A Review_第10张图片

@ 知乎 林大佬
你如果仔细思考BlendMask的做法,你会看到MaskRCNN的引子,但是也会看到Yolact的引子。因为它依赖于detector,同时也用到了全局的Mask。这篇paper,在它的Blender模块里面,使用了全局的Mask,同时通过FCOS检测到的position来融合局部的mask和对应位置的全局Mask,进而得到一个更加准确的Mask回归。结果也确实如此,BlendMask渲染出来的Mask边框更加完美。

  • CondInst(实例分割的条件卷积)
    又向前迈了一步,并完全消除了对边界框的任何依赖,彻底的去掉了detector,完全完全的不需要检测器来辅助。 它没有组装裁剪的原型掩码,而是借鉴了动态滤镜的思想,并预测了轻质FCN头的参数。 FCN头共有三层,共有169个参数。 令人惊讶的是,作者表明,即使原型模板仅是2通道的CoordConv,该网络也可以预测COCO为31 AP时的良好结果。
    [实例分割] Single Stage Instance Segmentation — A Review_第11张图片
BlendMask / CenterMask和CondInst都是YOLACT的扩展。

BlendMask / CenterMask正在尝试将裁剪的原型掩码与每个bbox中的更细粒度的掩码混合。 YOLACT是BlendMask或CenterMask的一种特殊情况,其中注意图的分辨率为1×1。
CondInst尝试将裁剪的原型掩码与由动态预测的滤镜组成的更深转换进行混合。 YOLACT是CondInst的一种特殊情况,其中FCN是1 1×1 conv层。
使用分支来预测原型掩码可以使这些方法受益于使用语义分割的辅助任务(通常在AP中提高1到2点)。它也可以自然扩展以执行全景分割。

关于代表每个实例掩码所需的参数,下面列出了一些技术细节。这些具有全局掩码和系数的方法每个实例掩码使用32、196、169个参数。

 - YOLACT使用32个原型掩码+ 32个昏暗掩码系数+盒子裁剪; 
 - BlendMask使用4个原型掩码+ 4个7×7注意图+盒子裁剪;
 - CondInst使用coordConv + 3 1×1动态转换(169个参数)

  • SOLOv1 & SOLOv2
    原作者在知乎上回答了 如何看待SOLO: Segmenting Objects by Locations,是实例分割方向吗?:

语义分割可预测图像中每个像素的语义类别。 类似地,例如分割,我们建议预测每个像素的“实例类别”。 现在的关键问题是,我们如何定义实例类别?

如果输入图像中的两个对象实例具有完全相同的形状和位置,则它们是相同的实例。 任何两个不同的实例具有不同的位置或形状。而且由于通常难以描述形状,因此我们用大小来近似形状。

[实例分割] Single Stage Instance Segmentation — A Review_第12张图片
因此,“实例类别”由位置和大小定义。位置按其中心位置分类。 SOLO通过将输入图像划分为S x S个单元格和 S × S S\times S S×S 类的网格来近似中心位置。通过将不同大小的对象分配给要素金字塔(FPN)的不同级别来处理大小。因此,对于每个像素,SOLO只需决定将哪个像素(以及相应的实例类别)分配给哪个SxS网格单元和哪个FPN级别。因此,SOLO仅需要执行两个像素级分类问题,类似于语义分割。现在,另一个关键问题是口罩如何代表?

实例掩码由堆叠到 S × S S\times S S×S通道中的全局掩码直接表示。这是一个巧妙的设计,可以同时解决许多问题。首先,许多先前的研究将2D遮罩存储为平坦向量,当遮罩分辨率提高导致通道数量激增时,这很快变得很棘手。全局遮罩自然保留了遮罩像素内的空间关系。其次,全局遮罩生成可以保留遮罩的高分辨率。第三,预测遮罩的数量是固定的,而与图像中的对象无关。这类似于原型掩码的工作,我们将看到这两个流如何在SOLOv2中合并。

SOLO将实例细分公式化为仅分类问题,并消除了任何依赖于回归的问题。这使得SOLO自然独立于对象检测。 SOLO和CondInst是直接在全局掩码上运行的两个方法,并且是真正的 bounding box free。
[实例分割] Single Stage Instance Segmentation — A Review_第13张图片

  • 分辨率的权衡
    从SOLO预测的全局掩码中,我们可以看到这些掩码对定​​位误差相对不敏感,因为相邻通道预测的掩码非常相似。这带来了对象定位的分辨率(以及精度)与实例掩码之间的折衷。

    TensorMask的4D结构张量的想法在理论上是完全合理的,但在当前NHWC张量格式的框架中很难在实践中实现。将具有空间语义的2D张量展平为1D向量将不可避免地丢失一些空间细节(类似于对完全连接的网络进行语义分割),并且甚至在表示128×128的低分辨率图像时也有其局限性。位置的2D或掩码的2D必须牺牲分辨率。以前的大多数研究都认为位置分辨率更为重要,并且降低采样率/压缩掩码尺寸会损害掩码的表现力和质量。 TensorMask试图达到一种平衡,但是乏味的操作导致缓慢的训练和推理。 SOLO意识到我们不需要高分辨率的位置信息,而是通过将位置压缩为一个粗略的S²网格来借鉴YOLO。这样,SOLO可以保持全局掩码的高分辨率。

  • Decoupled SOLO & Dynamic SOLO
    如上所述,SOLO在S²通道中预测的全局掩码非常冗余且稀疏。 即使在S = 20的粗略分辨率下,也有400个通道,而且图片中的对象也不大可能每个通道都包含有效的实例掩码。

    在解耦的SOLO中,形状为 H × W × S 2 H \times W \times S^2 H×W×S2的原始M张量由两个形状为 H × W × S H \times W \times S H×W×S的张量 X X X Y Y Y代替。对于位于网格位置 ( i , j ) (i,j) ij的对象, M i j M_{ij} Mij近似为 逐元素相乘 X i ⊗ Y j X_i⊗Y_j XiYj。 这将400个通道减少到40个通道,并且实验表明性能没有降低。
    [实例分割] Single Stage Instance Segmentation — A Review_第14张图片
    现在自然要问我们是否可以通过预测更少的掩模并预测每个网格单元的组合系数来借鉴YOLACT的原型掩模思想? SOLOv2正是这样做的。

    在SOLOv2中,有两个分支,一个功能分支和一个内核分支。 特征分支预测E个原型掩码,而内核分支预测每个S²网格单元位置的大小为D的内核。 正如我们在上面的“ YOLACT”部分所看到的,这种动态过滤方法是最灵活的。 当D = E时,它是原型掩码(或1×1转换)的简单线性组合,与YOLACT相同。 本文还尝试了3×3的conv内核(D = 9E)。 通过预测轻量级多层FCN的权重和偏差(例如在CondInst中),可以采取进一步的措施。
    [实例分割] Single Stage Instance Segmentation — A Review_第15张图片
    现在,由于全局掩码分支与其专用位置分离,我们可以观察到,新兴的原型掩码展示的图案比SOLO中的更加复杂。 它们仍然对位置敏感,并且与YOLACT更相似。

2.4 掩模的隐式表示

最初,CondInst和SOLOv2中使用动态滤波器的想法听起来很辉煌,但是如果您将其视为线性组合系数列表的自然扩展,则实际上非常简单。

还可以认为使用系数或注意力图将掩膜参数化,或者最终将其参数化为用于小型神经网络头部的动态过滤器。 最近在3D学习中也探索了使用神经网络对几何实体进行动态编码的想法。 传统上,3D形状通过体素,点云或网格进行编码。 占用网络(Occupancy Networks:Learning 3D Reconstruction in Function Space,CVPR 2019)建议通过将深度神经网络的连续决策边界视为3D表面,将形状编码为神经网络。 网络接受3D点,并告诉它是否在编码的3D形状的边界上。 这种方法可以在推理过程中以任何分辨率提取3D网格。
[实例分割] Single Stage Instance Segmentation — A Review_第16张图片
我们是否可以学习一个由每个对象实例的动态过滤器组成的神经网络,以便该网络以2D形式获取一个点,并在该点属于或不属于该对象掩码的情况下进行输出? 这自然会输出全局掩码,并且可以具有任何所需的分辨率。 回顾CondInst的消融研究,结果表明即使没有原型掩码,也只有CoordConv输入(用作执行统一的空间采样)。 由于此操作与原型掩码的分辨率分离,因此有趣的是,以更高的分辨率单独输入CoordConv以获取更高分辨率的全局掩码,以查看这是否会提高性能。 我坚信实例掩码的隐式编码将是未来。

[实例分割] Single Stage Instance Segmentation — A Review_第17张图片

3. 小结

大多数单阶段实例分割工作都基于anchor-free 对象检测,例如CenterNet和FCOS。 也许不足为奇,以上许多论文来自阿德莱德大学创建FCOS的同一实验室。 他们最近在https://github.com/aim-uofa/AdelaiDet/上开放了其平台的资源。

最近的许多方法都非常快,可以实现实时或接近实时的性能(30+ FPS)。 NMS通常是实时实例分割的瓶颈。 为了实现真正的实时性能,YOLACT使用Fast NMS,SOLOv2使用Matrix NMS。

  • 通过更高维度的encoding来表征Mask是很棘手的问题,现在大多数的算法都把mask encoding在低纬度,比如20到200,事实上可能也是这个方法的瓶颈所在,不然大家都用更高的了;
  • 手工制作的contour的方法,不是很好的办法,这类方法看起来没啥前途,事实上我的其他post也讲到过实例分割的用途,一个最大的用途就是在无人驾驶里面用,如果你的Mask不够准,我也就没啥用了;
  • 局部Mask的方法大多数依赖于detector,我任务这样的方法过于复杂了,它也没有使得精度提高多少,反而使得部署过于困难,比如BlendMask需要全局的mask和location融合,还会引入类似于ROIAlign和ROIPooling的操作,在后处理阶段,实际使用上是很复杂的;
  • 全局的Mask表征有时候比较昂贵,显存和速度都可能成为瓶颈,ConsInst这种方式其实应该速度会比SOLOV2慢一点,因为它的分支数更多;
  • SOLOv2这个思路延续下去,或许会有更好的方法产生。

4. References

  1. SOLO: Segmenting Objects by Locations ,Arxiv 12/2019,ECCV 2020
  2. SOLOv2:Dynamic, Faster and Stronger,Arxiv 03/2020
  3. CondInst: Conditional Convolutions for Instance Segmentation, Arxiv 03/2020 ECCV 2020 oral
  4. PolarMask: Single Shot Instance Segmentation with Polar Representation, CVPR 2020 oral
  5. PointRend: Image Segmentation as Rendering, CVPR 2020 oral
  6. BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation, CVPR 2020
  7. CenterMask: single shot instance segmentation with point representation, CVPR 2020
  8. MEInst: Mask Encoding for Single ShotInstance Segmentation, CVPR 2020)
  9. ESE-Seg: Explicit Shape Encoding for Real-Time Instance Segmentation, ICCV 2019
  10. YOLACT: Real-time Instance Segmentation, ICCV 2019
  11. TensorMask: A Foundation for Dense Object Segmentation, ICCV 2019
  12. FCOS: Fully Convolutional One-Stage Object Detection, ICCV 2019
  13. Occupancy Networks:Learning 3D Reconstruction in Function Space, CVPR 2019
  14. Mask Scoring R-CNN, CVPR 2019
  15. PANet: Path Aggregation Network for Instance Segmentation, CVPR 2018
  16. CoordConv: An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution, NeurIPS 2018
  17. Mask R-CNN, ICCV 2017 Best paper
  18. FCIS: Fully Convolutional Instance-aware Semantic Segmentation, CVPR 2017
  19. Associative Embedding: End-to-End Learning for Joint Detection and Grouping, NeuRIPS 2017
  20. InstanceFCN: Instance-sensitive Fully Convolutional Networks, ECCV 2016)
  21. FCN: Fully Convolutional Networks for Semantic Segmentation, CVPR 2015

This article was originally published on Towards Data Science and re-published to TOPBOTS with permission from the author.

你可能感兴趣的:(分割,分割,实例分割,SOLO,MaskRCNN,Segmentation)