实例分割最全综述(上):二阶段实例分割和一阶段实例分割

作者 | fresher

原文链接:https://zhuanlan.zhihu.com/p/533568152

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第1张图片

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 个bins, 并对每一个bins的边界量化为整数;

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

  • 遍历每一个候选区域, 保持浮点数边界不做量化;

  • 将候选区域分割成 k*k 个bins, 每个bins的边界也不做量化;

  • 在每个bins中sample四个point,使用双线性插值的方法计算出这四个位置的值, 然后取最大;

(2) Mask 分支

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第2张图片

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

(3) 总结

Mask R-CNN提出一种极简的思路来进行实例分割,借助目标检测领域的成熟发展,可以通过简单的替换Mask R-CNN的Faster R-CNN为更优的检测器便可以稳定提升实例分割的指标。

但是,RoI Align为了将不同尺寸的RoI统一到相同的[公式]尺寸进行batch运算,会导致大目标的空间特征出现信息损失,特别是在边缘部分,导致大目标特别是轮廓复杂的大目标的边缘预测效果较差。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第3张图片

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比之前少了许多,极容易产生过拟合。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第4张图片

(2) Box级联

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第5张图片

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 性能才最好。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第6张图片

2) 差异化R-CNN Head

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第7张图片

(3) Mask级联

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

  • (b)(c)(d)三种结构都只采用最后一个阶段输出的检测框裁剪RoI进行分割;

  • 不同之处在于,(d)结构中,最后一个stage输出的RoI会送入三个mask分支分别进行预测,然后取均值进行ensemble。(d)结构在文中的消融实验中也是性能最好的。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第8张图片

(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分支的特征语义上下文信息;

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第9张图片

(1) mask 信息流

为了在不同stage的mask分支之间添加信息流,作者将前一个stage的特征式经过一个卷积之后与当前stage RoI Align之后的特征进行sum融合并输入到当前mask分支。

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第10张图片

(2) 语义监督

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

  • 将FPN输出的不同level的特征图分别经过后插值到同一分辨率并sum融合;

  • 紧接着通过4层全卷积后,分别预测语义分割特征以及语义分割预测结果;

  • 语义分割特征通过RoIAlign及element-wise sum与box、mask特征进行融合;

  • 语义分割预测结果需要添加语义分割损失对该语义分支进行监督;

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第11张图片

(3) 总结

  • HTC算是二阶段实例分割的终结了,一直在COCO霸榜直至22年6月上旬被Mask DINO以微弱的优势超越;

  • 二阶段实例分割采用RoI Align的通病就不再赘述;

  • 本文所提出采用mask信息流级联与语义监督虽然都不是特别新颖的创新点,但是都可以作为实例分割算法的稳定提点策略;

3. 一阶段实例分割

3.1 局部mask与全局mask之争

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第12张图片

(1) 局部mask

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

其优点是:

  • mask分支简单易学:裁剪后的mask特征构成简单,只包含实例的前景和少量的背景,因此,mask分支设计简单,仅仅通过4层全卷积就可以得到mask;

  • 小目标效果较好:Mask R-CNN输出的mask分辨率为28×28,COCO的小目标定义是size<32×28,换算到1/4特征图就是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,包含到;

  • 最后在FPN的多个feature map上分别使用两个结构相同但是不共享参数的FCN子网络,从而完成目标框类别分类和bbox位置回归任务;

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

  • 不同分辨率上anchor的尺寸anchor-size:;

  • 每个anchor-size对应着三种放缩系数scale:;

  • 每个anchor-size对应着三种长宽比ratio:;

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

  • 每个anchor都会预测一个长度为c的类别向量(如下图分类分支预测的,c就是类别数,a=9,是anchor数);和一个长度为4的bbox回归向量(如下图回归分支预测的,4 就是box四个回归量,a=9,是anchor数)。

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

  • 当anchor与ground-truth的IoU大于等于0.5时,这一类anchor就是正样本;

  • 若IoU在[0,0.4)这个区间内,这一类anchor就是负样本,也就是背景。

  • IoU在[0.4,0.5)这个区间内的anchor在训练时是不计损失的。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第13张图片

(2) 实例Mask系数

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

(3) Mask特征

Mask特征直接在FPN 特征图上接一个全卷积网络,将分辨率上采样至1/4并将通道映射为,最终的shape为。

(4) 实例Mask预测

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

a03ccd95a3890cce73d71147e542a51a.png
  • P就是(3)中预测的Mask特征,shape为;

  • C为正样本的实例mask系数矩阵,shape为;

  • sigema为sigmoid激活函数;

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

(5) 总结

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

3.2 BlendMask

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

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第14张图片

(1) BlendMask vs YOLACT

  • 目标检测网络由RetinaNet替换为FCOS;

  • mask特征(Bases)的生成由YOLACT的几层简单的卷积替换为DeepLab V3+的decoder模块,也就是ASPP模块,能够产生更强的上下文语义特征。shape为。论文最终采用的K=4,这是一个令人惊讶的通道数字,难以想象这么少的通道可以支撑最终的实例mask预测效果;

  • mask系数(Boxes Attens)也由原本简单的每个通道一个的加权系数变成每个像素每个通道一个加权系数,粒度更细,即Boxes Attens已经学习出了实例空间位置分布信息。shape为,是正样本实例的数目;

  • mask合成这一块比YOLACT要复杂一些,将的mask特征用RoI Align裁剪并缩放为,R最终设置为56×56,Boxes Attens本身的shape为, M比R要小,这里设置为14,这主要是为了减少Boxes Attens预测分支的计算量和预测难度,所以这里需要先将Boxes Attens插值为 ,最终便可以如下图所示合成实例mask 。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第15张图片

(2) 总结

  • BlendMask不知道该说他是大杂烩还是集大成者 ,既有YOLACT似的实例mask系数预测,也存在Mask R-CNN似的RoI Align与局部mask;

  • 虽然BlendMask采用了RoI Align,但是其采用的尺寸是56, 比Mask R-CNN这一类方法采用28还是要精细一些的;

3.3 EmbedMask * * *

EmbedMask与YOLACT同样很相似,不同之处在于:

  • YOLACT采用共享全局特征与实例mask系数通过通道加权组合得到实例mask。之前讲过,这个通道加权相当于一个1×1卷积;

  • EmbedMask也是要预测一组实例特定的参数与全局共享特征图通过某种操作来得到实例mask,不过此处的操作不是卷积,而是聚类操作。具体来讲,给每个实例学习一组向量(相当于类心向量),然后计算实例向量与每个像素的向量之间的欧式距离,当距离小于给定阈值时则认为当前像素属于当前实例。

(1) 卷积 vs 聚类

EmbedMask的详细网络结构如下,基于FCOS目标检测网络进行实例分割设计,蓝色的部分是新添加的模块,主要包含实例Embedding预测模块(Proposal Embedding),全局特征图生成模块(Pixel Embedding),以及可学习实例聚类阈值预测模块(Proposal Margin)三个模块。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第16张图片

  • 全局特征图生成模块(Pixel Embedding):采用作为输入,后接4层3×3卷积层得到,最终的shape为;

  • Embedding预测模块(Proposal Embedding):在FCOS原有检测head(classification+box regression+centerness)的基础上新增一个分支,给每个像素(FCOS每个像素视为一个anchor,可以预测一个实例)预测一个实例embedding,那么正样本(FCOS正样本选取方式请移步FCOS原文)的实例embedding就构成了一个的矩阵;

  • 实例mask合成:有了实例embedding和pixel embedding,那么最直接的做法就是采用下列的公式来合成实例的mask。具体的逻辑就是聚类那一套,只不过这里我把类心也给你了,不用像kmeans一样反复优化类心了。当某个像素embedding与某个实例embedding的距离小于给定阈值时,就可以将该像素归属于该实例,这样就可以得到每个实例的mask。

53b6653e9f802b48ad103312cb19b79a.png

(2)可学习实例聚类阈值

(1)中介绍的是一种固定阈值聚类方案,那么,如下图所示(虚线圆半径代表聚类阈值),大目标应该用大的阈值,小目标应该用小的阈值。阈值取得大了,小目标就会和其他目标混淆被分割出来,阈值取得小了,大目标只能分割出一部分来。那么,可学习的阈值就应运上马了。

e01e0bc85240d3c628c5b4944a9369af.png实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第17张图片4984170270475dd2519546229722bce9.png实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第18张图片fecbc25b62ce1cf88c3ec70996f4129d.png实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第19张图片5dfc6bcd945fab4baa4b21e9c38a7a9b.png实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第20张图片实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第21张图片

(3) 总结

  • EmbedMask采用预YOLACT系列文章相似的做法,只不过合成实例mask的方式变成了聚类,想法新颖,也确实可行。这也为其他方法探索除了卷积和聚类之外的其他动态操作提供了可能,如动态BN(AdadpIS),动态ReLU,特征图共享,BN和ReLU的参数是依据实例预测的;

  • 但是,聚类操作的类心embedding和pixel embedding都是给定的,那就是要求mask特征图已经能够准确将不同实例区分开了。这在一些实例与背景差异比较大的情况下可行,但是当不同实例,特别是同类别实例挨得比较近的情况下,特征边界往往很难明显划分。

  • 而且,聚类操作嵌入到模型中,相比于卷积操作来讲不够自然,需要进行更多的后处理操作,如本文的高斯概率映射。

3.4 CondInst

(1) Motivation

当两个属于同一类别的目标同时出现时,要想将两者进行实例层面的区分,上述已经介绍的方法的解决思路如下:

  • 二阶段的方法通过RoI Cropping将目标区分开来,这样相当于显式引入了实例的box位置先验信息;

  • YOLACT这一类的一阶段方法并没有实例位置先验信息,所以只能强行让不同实例的语义特征学习的足够差异化;

那么,也给YOLACT这一类的一阶段方法引入位置先验信息,就可以减缓同类目标语义特征学习的足够差异化的压力,也就是说,两个同类目标虽然语义特征相似,但是位置特征是不同的,那这样也可以将两者在实例层面区分开来。

(2) 模型结构

CondInst同样采用FCOS作为目标检测网络;

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第22张图片

CondInst的全局特征图同时包含语义特征和位置特征:

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第23张图片

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第24张图片

Controller Head:CondInst类似YOLACT在检测head部分添加了一个并行的分支用来学习每个实例特定的动态卷积参数。此处的动态卷积与YOLACT中的mask系数是相似的操作:

  • 虽然YOLACT的mask系数相当于的卷积,但是YOLACT当时可能并没想那么深入;

  • CondInst明确了在此处使用动态卷积的方案,直接学习了三层所需的weights和biases共计169个参数,具体构成如下:(8是指语义特征channel为8,相对位置特征channel为2);

06686724ea24e65763aa5ff1d1101edf.png

(3) 总结

  • CondInst兼具YOLACT的简洁结构与实用性能(超过Mask R-CNN);

  • CondInst最终采用的特征图channel数为8,这并不是为了彰显模型的强大(能够在少量的通道情况下得到不错的效果),更多的原因是CondInst在实现过程中涉及到repeat操作,需要将特征图复制正样本的数目那么多份,如果通道数太多,肯定行不通的。

  • 至于为什么要repeat,主要是因为YOLACT,CondInst都是只将正样本输入到mask head,但是不同图片输出的正样本数目不一致,那就的需要在batch维度加一个for循环(时间成本增加),或者直接将特征图repeat多份(内存增加)。下图整理了几种全局mask具体生成实例mask的方案。

    • YOLACT可以采用for循环或者repeat两种方案;

    • CondInst只能采用repeat的方案,这主要是因为其采用了多层卷积,实现层面必须用组卷积来实现,也就必须要进行repeat;

    • Mask2former还没介绍,这里简单提一下,该算法在每张图设置固定的proposal数目,每次将所有proposal输入到mask head,并且采用类似YOLACT的mask组合系数,所以并不涉及for循环或者repeat。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第25张图片

这实际上是一个balanced的过程:

  • CondInst的卷积层更多,由于实现限制只能采用较少的特征图通道;

  • Mask2former直接一步bmm,所以通道可以保持正常的256;

  • 通道肯定多点好啦,特别是对于颜色复杂的大目标,具体合成实例mask的卷积操作也是一样啦,卷积层越多,能够对特征的变化和拟合就越强,如果能找到一种实现方式,同时采用多层卷积操作和大channel就最好啦。

3.5 SOLOv2

SOLO共出了两个版本,v1跟本章前面的几篇文章相关性都不大,v2在v1的基础上引入了动态卷积的方案。那就先介绍一下v1:

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第26张图片

SOLOv1在网格上进行实例分割的方案有点类似YOLO,都是在网格上进行实例目标的检出,SOLOv1是做实例分割,YOLO是进行目标检测。但是SOLOv1并不像CondInst这一类方法,其并没有保留目标检测网络的bbox分支,而是只有分类分支和mask分支。接下来分别从SOLOv1的网格正负样本分配和classification分支及mask分支的设计两个方面展开。

(1) 网格正负样本分配策略 具体来讲,SOLO会首先将FPN不同层的特征图等分为 S×S个格子。正负样本的分配涉及到两个方面:

  • 一是FPN同一层正负样本分配的策略;

  • 二是FPN不同层正负样本分配的策略;

FPN同一层:对于给定gt mask的质心、宽度w和高度h,设置比例因子,如0.2。被缩小后的box覆盖住的几个格子就是正样本,每一个gt平均有3个正样本。

FPN不同层:但是,如果两个目标同时覆盖某个网格呢,为了处理这种情况,作者首先做了个统计:在验证集中,绝大多数(约98.9%)的实例要么中心位置不同,要么大小不同。因此,如果两个目标中心位置接近,那就通过尺度将其分配到FPN的不同层去,这样就能解决掉98.9%的冲突。

论文设置scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)),分别对应不同FPN的输出层。当实例的尺度落入某一个区间,则该FPN分支负责该实例的预测。由于不同区间存在重叠的情况,因此会存在不同FPN层预测相同的目标,这样同样会增加正样本的数量。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第27张图片

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第28张图片实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第29张图片实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第30张图片

(3) SOLOv2 动态卷积

SOLOv2采用类似CondInst的动态卷积方式,给每个网格代表的实例预测一组卷积参数,将其FPN各个分辨率融合后的特征图进行动态卷积来得到实例mask。

实例分割最全综述(上):二阶段实例分割和一阶段实例分割_第31张图片

(4) 总结

433f51b81c647c4f5a5fb1be6803ef9d.png

SOLOv2的mAP刚刚与Mask R-CNN齐平,但是在小目标和大目标的性能上出现了明显的反差

  • 对于小目标效果差,我认为这是由于SOLOv2始终没有放弃网格的方案导致的,网格稀疏的情况下会导致小目标的召回率较低,网格过密计算代价就高了;

  • 大目标效果好,我认为有三方面原因:

    • 一方面是由于采用全局mask,会比Mask R-CNN好是自然的;

    • 另一方面是预测实例mask的特征是FPN融合后的,比仅使用1/4特征图语义信息更丰富;

    • 最后是与同为全局mask的condinst相比的,SOLOv2的特征图通道为256,这能够编码更丰富的信息相比于CondInst的8个通道。下图是CondInst中关于通道数的一个超参实验,当通道数为16时,Apl能产生一个点的提升相比于通道数为8时。

59037be52e15d0af8a293118618b491d.png

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D感知、多传感器融合、SLAM、高精地图、规划控制、AI模型部署落地等方向;

加入我们:自动驾驶之心技术交流群汇总!

你可能感兴趣的:(卷积,大数据,算法,python,计算机视觉)