锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

实例分割最全综述(入坑一载半,退坑止于此)

时间:2023-05-06 11:07:00 sk3351压力变送器5ka5t压力变送器

自21年初从语义分割的舒适圈跳到实例分割方向以来,已经一年半了。

读过一些文章,跑过一些实验,到目前为止还没有输出。

经过多次了很多次,要不要继续,最后决定后悔退出。

写点东西,记过去,弥补遗憾。

文章目录

  • 1. 实例分割简介
  • 2. 二阶段实例分割
    • 2.1 Mask R-CNN * * * * *
      • (1) RoI Align
      • (2) Mask 分支
      • (3) 总结
    • 2.2 Cascade Mask R-CNN * * * *
      • (1) Motivation
      • (2) Box级联
      • (3) Mask级联
      • (4) 总结
    • 2.3 HTC * * * *
      • (1) mask 信息流
      • (2) 语义监督
      • (3) 总结
  • 3. 一阶段实例分割
    • 3.1 局部mask与全局mask之争
    • 3.2 YOLACT * * * * *
      • (1) RetinaNet
      • (2) 实例Mask系数
      • (3) Mask特征
      • (4) 实例Mask预测
      • (5) 总结
    • 3.2 BlendMask * * *
      • (1) BlendMask vs YOLACT
      • (2) 总结
    • 3.3 EmbedMask * * *
      • (1) 卷积 vs 聚类
      • (2) 实例聚类阈值可以学习
      • (3) 总结
    • 3.4 CondInst * * * *
      • (1) Motivation
      • (2) 模型结构
      • (3) 总结
    • 3.5 SOLOv2 * * * *
      • (1) 网格正负样本分配策略
      • (2) classification分支和mask分支
      • (3) SOLOv2 动态卷积
      • (4) 总结
  • 4. Boundary Refinement
    • 4.1 Pointrend * * * *
      • (1) 测试阶段
      • (2) 训练阶段
      • (3) 总结
    • 4.2 Refinemask \* \* \*
      • (1) SFM(Semantic Fusion Module)
      • (2) BAR(Boundary-Aware Refinement)
      • (3) 总结
  • 5. Contour-based实例分割
    • 5.1 PolarMask * * * *
      • (1) Polar Centerness
      • (2) Polar IoU Loss
      • (3) 总结
  • 6. Query-Based实例分割
    • 6.1 QueryInst * * * *
      • (1) Box Head & Mask Head
      • (2) 动态卷积
      • (3) 总结
    • 6.2 SOLQ * * *
      • (1) Mask Resolution
      • (2) Mask压缩算法
      • (3) 总结
    • 6.3 Mask2former * * * *
      • (1) Pixel decoder
      • (2) Transformer Decoder
        • <1> masked attention
        • <2> 调换self-attention和cross-attention的顺序
      • (3) 采样点损失函数
      • (4) 总结
  • 5. 这一载半
  • 6. 参考

1. 实例分割简介

实例分割是结合目标检测和语义分割的更高层次任务。

  • 目标测试:区分不同的例子,使用box目标定位;
  • 语义分割:区分不同的类别,使用mask进行标记;
  • 实例分割:区分出不同实例,用mask进行标记;

因此:

  • 在目标检测的基础上,实例分割需要更精细地使用mask定位,而不是bbox;
  • 例子分割需要在语义分割的基础上区分不同类别的例子mask;

实例分割算法的发展也遵循这两条路线:

  • 一是基于目标检测的自上而下方案:首先,通过目标检测定位每个实例box,进而对box内部语义分割得到每个例子mask;
  • 另一种是基于语义分割的自下而上的方案:首先通过语义分割逐像素分类,然后通过聚类或其他测量学习方法区分同类的不同实例;

考虑基于语义分割的自下而上实例分割算法(如Semantic Instance Segmentation with a Discriminative Loss Function,Deep Watershed Transform for Instance Segmentation)通常后处理步骤繁琐,效果差。本文主要讨论基于目标检测的自上而下实例分割算法。

本文根据目标检测网络将实例分割算法划分为第二阶段实例分割,第一阶段实例分割,Query-based 实例分割介绍三类。此外,根据实例进行分割mask不同的表达方式,介绍 Contour-based 和 Boundary Refinement 实例分割。

此外,还有一些方法(如:FCIS,TensorMask,deepmask,AdaptIS,MEInst)这也是一项非常经典的工作。由于篇幅原因,本文没有涉及。

2. 二阶段实例分割

2.1 Mask R-CNN * * * * *

在这里插入图片描述
Mask R-CNN是典型的自上而下的实例分割算法,其扩展自目标检测网络Faster R-CNN,在此基础上新增mask预测分支。

  • Faster RCNN包括两个阶段, 第一个段, 是RPN结构, 用于生成RoI集合。第二个阶段利用RoI pooling从RoI中提出固定尺寸的特征, 然后进行class分类任务和box offset回归任务。
  • Mask RCNN使用了相同的two-stage结构, 第一阶段使用了相同的RPN网络。第二阶段, 利用RoI Align从RoI中提出固定尺寸的特征, 在执行class分类和box offset 回归任务的同时,MaskRCNN还会给每个RoI生成对应的二值mask

因此,Mask R-CNN的主要工作集中在RoI Align和mask分支的设计,以下分别进行介绍:

(1) RoI Align

由于RPN阶段得到的proposals box的大小是不一样的,而为了进行后续的class分类,box回归和mask分割任务,必须有一种操作将不同尺寸的box特征图归化到相同的空间尺寸以方便进行batch运算,RoI Pooling和RoI Align的作用就是如此。

RoI Pooling存在两次量化过程:

  • 将box量化为整数坐标值;
  • 将量化后的box区域分割成 k × k k\times k k×k个bins, 并对每一个bins的边界量化为整数;

RoI Pooling这种粗糙的量化方式对于Mask R-CNN新增的mask分支会产生很大的量化误差,因此,提出了RoI Align方法,取消RoI Pooling中涉及的两次量化操作, 使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值,其具体流程如下:

  • 遍历每一个候选区域, 保持浮点数边界不做量化;
  • 将候选区域分割成 k × k k\times k k×k个bins, 每个bins的边界也不做量化;
  • 在每个bins中sample四个point,使用双线性插值的方法计算出这四个位置的值, 然后取最大值;

(2) Mask 分支


由于mask分支需要对目标进行精细的mask预测,因此,mask分支采用比分类和回归分支更高的特征分辨率。具体来讲,将经过RPN阶段筛选出来的RoI经过RoI Align层将其尺寸统一为 14 × 14 14 \times 14 14×14,然后使用4层全卷积层和一层反卷积层以及最终的分类层为每个RoI预测一个 28 × 28 28 \times 28 28×28的mask。

(3) 总结

  • Mask R-CNN提出一种极简的思路来进行实例分割,借助目标检测领域的成熟发展,可以通过简单的替换Mask R-CNN的Faster R-CNN为更优的检测器便可以稳定提升实例分割的指标。
  • 但是,RoI Align为了将不同尺寸的RoI统一到相同的 28 × 28 28 \times 28 28×28尺寸进行batch运算,会导致大目标的空间特征出现信息损失,特别是在边缘部分,导致大目标特别是轮廓复杂的大目标的边缘预测效果较差。

2.2 Cascade Mask R-CNN * * * *

Cascade Mask R-CNN 也是探讨如何在检测器Cascade R-CNN基础上设计mask分支。

(1) Motivation

Cascade R-CNN主要针对 Faster R-CNN 中 R-CNN 部分采用单一 IoU 阈值进行正负样本选取会产生训练和测试过程中的不匹配的问题。 具体来讲:

  • training阶段,RPN网络提出了2000左右的proposals,这些proposals在送入R-CNN结构前,需要首先计算每个Proposals和GT之间的IoU,并通过一个IoU阈值(如0.5)把这些Proposals分为正样本和负样本,并对这些正负样本按一定比例采样,进而送入R-CNN进行class分类和box回归。
  • inference阶段,RPN网络提出了300左右的proposals,这些proposals被送直接入到R-CNN结构中,因为没有GT用于采样。

因此,此处所描述的不匹配问题就在于:

  • training阶段的输入proposals质量更高(被采样过,IoU>threshold)
  • inference阶段的输入proposals质量相对较差(没有被采样过,可能包括很多IoU

通常threshold取0.5时,mismatch问题还不会很严重。而为了得到更精准的box,最直接的办法就是提高正样本的IoU阈值,那此时的mismatch问题就会更加严重。同时,提高IoU阈值会导致满足阈值条件的proposals比之前少了许多,极容易产生过拟合。

(2) Box级联

上述的实验表明,由于采用单一的IoU阈值会产生mismatch的问题,因此,无法通过一味提升IoU阈值来获取更精准的box预测。本文提出一种级联结构,并在不同层逐渐增大IoU阈值,来缓解mismatch问题并产生更精确的box预测。

Cascade R-CNN的结构如上图所示,首先在不同的stage采用不同的IoU阈值,同时不同stage也采用不同的H(H表示R-CNN Head)。

(1) 递增IoU阈值

下图中,横轴 Input IoU 表示 RPN 输出的 proposal 与 gt bbox 的 IoU,纵轴 Output IoU 是经过 R-CNN 的 box 分支回归输出后与gt bbox 的 IoU,不同线条代表不同阈值训练出来的 detector。可以发现,Input IoU 在 0.55-0.6 范围内 proposal 阈值设置为 0.5 时 detector 性能最好,在 0.6~0.75 阈值为 0.6 的 detector 性能最佳,而到了 0.75 之后就是阈值为 0.7 的 detector 性能最好了。只有输入 proposal 自身的 IoU 分布和 detector 训练用的阈值 IoU 较为接近的时候,detector 性能才最好

下图显示逐stage增大IoU后,正样本不仅没有减少,而且稍稍有增加。这是因为经过前一个stage的refinement,后一个stage的输出box变得更精确了,即与GT的IoU提升了。因此,Cascade R-CNN级联多个 R-CNN 模块,并且不断提高 IoU 阈值,不仅不会出现mismatch和过拟合,反而可以逐阶段修正box预测。

(2) 差异化R-CNN Head

下图显示经过每个stage的R-CNN Head后,输入到R-CNN Head的样本分布会发生变化,因此,采用共享的R-CNN Head无法有效适配变化的样本分布问题。因此,Cascade R-CNN在每个stage都采用独立参数的R-CNN Head。

(3) Mask级联

为了将Cascade R-CNN目标检测器推广到实例分割,作者提出了(b)(c)(d)三种策略来新增mask分支。在测试时:

  • (b)(c)(d)三种结构都只采用最后一个阶段输出的检测框裁剪RoI进行分割;
  • 不同之处在于,(d)结构中,最后一个stage输出的RoI会送入三个mask分支分别进行预测,然后取均值进行ensemble。 (d)结构在文中的消融实验中也是性能最好的。

(4) 总结

  • Cascade R-CNN通过级联box head 来进行逐阶段的box refinement;
  • Cascade Mask R-CNN在其基础上添加级联mask head并在测试阶段对三个stage的mask预测概率进行均值集成。
  • 然而,Cascade Mask R-CNN的三个stage的mask head之间没有类似box head的逐stage的refinement的过程,而是各自独立预测,最终进行集成,这也是后续HTC模型改进的关键点。
  • 此外,Cascade Mask R-CNN仍然存在类似Mask R-CNN的大目标边缘预测粗糙的问题,这也是二阶段实例分割算法的通病。

2.3 HTC * * * *

HTC的主要创新点有两个:

  • 设计mask分支的级联,以便将前一个stage的mask信息流传递到下一个stage;
  • 添加语义分支和语义分割监督来增强特征的上下文语义特征;

下图中展示了在Cascade R-CNN的基础上添加mask分支的四种依次递进的设计:

  • (a)图是标准的Cascade Mask R-CNN,当前 stage 会接受 RPN 或者 上一个 stage 回归过的框作为输入,并行预测box和mask;
  • (b)图中在每个stage是将refine后的box输入到mask分支;
  • (c)图在(b)图的基础上添加了mask分支之间的信息流,每次将前一个stage的mask特征输入到当前stage进行sum融合;
  • (d)图进一步引入了语义分割监督,来增强mask分支的特征语义上下文信息;

(1) mask 信息流

为了在不同stage的mask分支之间添加信息流,作者将前一个stage的特征 M i − 1 M_{i-1} Mi1 ( 14 × 14 × 256 14\times14\times256 14×14×256)经过一个 1 × 1 1\times1 1×1卷积之后与当前stage RoI Align之后的特征 M i M_{i} Mi进行sum融合并输入到当前mask分支。

在实际训练时,前一个stage的RoI和当前stage的RoI并不一致,那么如果直接将前一个stage的特征拿过来与当前stage特征sum融合便会遇到空间不对齐的问题。因此,在实际训练过程中,需要用当前stage的RoI重新执行一遍前一个mask分支,这样就解决了mask特征不对齐的问题。测试时,与Cascade Mask R-CNN一致,只采用了最后一个stage的RoI输出,也不会遇到mask特征不对齐的问题。

(2) 语义监督

为更好的区分前背景,进一步将语义分割引入到实例分割框架中,以获得更好的 spatial context。具体来讲:

  • 将FPN输出的不同level的特征图分别经过 1 × 1 1\times1 1×1后插值到同一分辨率并sum融合;
  • 紧接着通过4层全卷积后,分别预测语义分割特征以及语义分割预测结果;
  • 语义分割特征通过RoIAlign及element-wise sum与box、mask特征进行融合;
  • 语义分割预测结果需要添加语义分割损失对该语义分支进行监督;

(3) 总结

  • HTC算是二阶段实例分割的终结了,一直在COCO霸榜直至22年6月上旬被Mask DINO以微弱的优势超越;
  • 二阶段实例分割采用RoI Align的通病就不再赘述;
  • 本文所提出采用mask信息流级联与语义监督虽然都不是特别新颖的创新点,但是都可以作为实例分割算法的稳定提点策略;

3. 一阶段实例分割

3.1 局部mask与全局mask之争

在介绍一阶段实例分割前,我们引入局部mask和全局mask的概念,这也是二阶段实例分割与一阶段实例分割的本质差别。如果这一块看的时候有点懵逼,就先跳过,等看完一阶段部分再回来看也行。

(1) 局部mask

如上图所示,第二章介绍的二阶段实例分割采用的就是局部mask,将box内部的区域全部裁剪出来并通过RoI Align统一到相同的尺寸;

优点是:

  • mask分支简单易学:裁剪后的mask特征构成简单,只包含实例的前景和少量的背景,因此,mask分支设计简单,仅仅通过4层全卷积就可以得到mask;
  • 小目标效果较好:Mask R-CNN输出的mask分辨率为 28 × 28 28\times28 28×28,COCO的小目标定义是 s i z e < 32 × 32 size<32\times32 size<32×32,换算到1/4特征图就是 8 × 8 8\times8 8×8,所以小目标特征在经过RoI Align后会被放大,细节特征就可以较好的保留。此外,由于目标撑满整个mask,小目标的mask在监督时不会遇到正负样本严重不均衡的状况。

缺点是:

  • 大目标效果差:RoI Align后的尺寸较小,会导致大目标特别是轮廓复杂的大目标边缘分割较为粗糙;
  • box偏差:当box预测存在偏差时,仅仅对box内部进行实例mask预测无法预测box外的mask区域;

(2) 全局mask

全局mask不需要经过裁剪和RoI Align的过程,而是直接从整个特征图中预测某个实例。

优点是:

  • 大目标效果好:大目标的特征不会经过RoI Align操作导致细节特征严重丢失;而且大目标的损失函数优化时,正负样本还是相对均衡的。

缺点是:

  • 小目标效果差:为了减少计算量,全局mask通常在1/4或1/8特征图进行,小目标在此分辨率下边缘预测不佳;且交叉熵损失函数优化时会遇到背景负样本占据大多数的情况,优化效果不佳,需搭配Dice Loss这一类的损失函数进行优化;
  • 加大了模型学习难度:局部mask分支获取到的特征是已经用box剔除了大部分背景的实例特征,是有box这个强先验加持的;而全局mask拿到的是全局特征,那么全局mask分支就还需要具备定位能力,分别解析出不同的实例。

3.2 YOLACT * * * * *

之所以这篇文章给了五星,是因为在我看来,YOLACT算是后来的BlendMask,EmbedMask,Condinst这一系列文章的雏形。这一系列方法都是通过预测一组实例特定的参数与共享的1/4或者1/8的全局特征通过某种操作(通道加权求和,卷积或者聚类等)来预测一组实例的mask。

如果上面这句话理解有点困难的话,再拿Mask R-CNN举个例子:

  • 问 “Mask R-CNN是如何预测一组实例的mask的呢?” 答 “(1) 每个实例的特征都不一样;(2) 但所有实例共享相同的卷积参数;”
  • 那我们扩展一下,问 “如果所有实例共享相同的特征的情况下如何预测一组实例mask呢?” 答 “那就要处理每个实例的卷积的卷积核参数不一样。”
  • 继续扩展,问 “那每个实例的特征和卷积参数可不可以都不一样呢?”。答 “当然可以,这就是下文即将要介绍的文章BlendMask和QueryInst算法的思路。”
  • 总结来讲,每个实例具有不同的mask区域,那么用于合成该实例的实例特征或者卷积操作的卷积核参数总有一个要是实例特定的,即随着实例的不同而变化的。当然了,这里的操作并不一定非得是卷积。

接下来详细看一下YOLACT是怎么用共享的全局特征来进行实例分割的。YOLACT是在目标检测网络RetinaNet的基础上进行改造的。

(1) RetinaNet

RetinaNet本质上是由ResNet+FPN+两个FCN子网络(分类和回归)组成:

  • Backbone选择ResNet来作为特征提取网络;
  • FPN用来产生更强的包含多尺度目标区域信息的feature map,包含 P 3 到 P 7 P_3到P_7 P3P7
  • 最后在FPN的多个feature map上分别使用两个结构相同但是不共享参数的FCN子网络,从而完成目标框类别分类和bbox位置回归任务;

RetinaNet同时也是一个Anchor-based的模型:

  • 不同分辨率上anchor的尺寸anchor-size: [ 32 , 64 , 128 , 256 , 512 ] [32,64,128,256,512] [32,64,128,256,512]
  • 每个anchor-size对应着三种放缩系数scale: [ 2 0 , 2 1 / 3 , 2 2 / 3 ] [2^{0}, 2^{1/3}, 2^{2/3}] [20,21/3,22/3]
  • 每个anchor-size对应着三种长宽比ratio: [ 0.5 , 1 , 2 ] [0.5, 1, 2] [0.5,1,2]

也就是说,在 P 3 到 P 7 P_3到P_7 P3P7的每个特征图的每个像素网格上都会预设9个anchor:

  • 每个anchor都会预测一个长度为c的类别向量(如下图分类分支预测的 W × H × c a W \times H \times ca W×H×ca c 就 是 类 别 数 , a = 9 , 是 a n c h o r 数 c就是类别数,a=9,是anchor数 ca=9anchor);
  • 和一个长度为4的bbox回归向量(如下图回归分支预测的 W × H × 4 a W \times H \times 4a W×H×4a 4 就 是 b o x 四 个 回 归 量 , a = 9 , 是 a n c h o r 数 4 就是box四个回归量,a=9,是anchor数 4boxa=9anchor)。

训练时的anchor正负样本分配策略如下:

  • 当anchor与ground-truth的IoU大于等于0.5时,这一类anchor就是正样本;
  • 若IoU在[0,0.4)这个区间内,这一类anchor就是负样本,也就是背景。
  • IoU在[0.4,0.5)这个区间内的anchor在训练时是不计损失的。

(2) 实例Mask系数

实例mask系数就是在RetinaNet分类和回归分支的基础上,并行添加一个mask系数预测分支,也就是如上图所示,预测为 W × H × k a W \times H \times ka W×H×ka 的分支,即接下来的采用通道加权操作合成实例mask的通道加权的系数, k k k就是通道的数目。实际操作会对预测出来的系数采用 t a n h tanh tanh进行非线性变换。

(3) Mask特征

Mask特征直接在FPN P 3 P_3 P3特征图上接一个全卷积网络,将分辨率上采样至1/4并将通道映射为 k k k,最终的shape为 H × W × k H \times W \times k H×W×k

(4) 实例Mask预测

最终的实例mask的预测就采用下图所示的公式合成:

这个矩阵乘法背后的含义就是对预测的mask特征的每个通道采用对应的mask系数进行加权求和,其本质就是一个 1 × 1 × k × 1 1 \times 1 \times k \times 1 1×1×k×1 的卷积操作,卷积核为 1 1 1,输入通道为 k k k,输出通道也为 1 1 1

(5) 总结

  • YOLACT通过预测一组实例特定的mask加权系数与共享的全局mask特征来生成实例mask,省去了RoI Align生成局部特征图的过程,网络简洁,速度实时;
  • 由于YOLACT采用的RetinaNet检测网络的性能本身较差,YOLACT的整体指标与二阶段Mask R-CNN相比还是差了许多的, 29.8 29.8 29.8 vs 35.7 35.7 35.7

3.2 BlendMask * * *

BlendMask与YOLACT整体来讲是很像的,给检测head部分新增一个实例相关的参数(Boxes Attens)预测分支,在1/4特征图上生成mask特征(Bases)。接下来照旧挨个模块简介一下:

(1) BlendMask vs YOLACT

相关文章