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

2023-05-16

作者 | 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

e29f656dd729f55d607e34736f048088.png

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 分支

c8b3be12b1eedade5faf7a76bf9e49ac.png

由于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运算,会导致大目标的空间特征出现信息损失,特别是在边缘部分,导致大目标特别是轮廓复杂的大目标的边缘预测效果较差。

6976f39cf93ec1a71d580076108e9c36.png

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的)。

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

85b715961b26e4a59d441607b1a51677.png

(2) Box级联

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

eb11c913c520483093ed6dfa14d04118.png

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

ea710e088dd9c50c75f564168c7be9e8.png

2) 差异化R-CNN Head

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

a2b1667c8dfdf5ada3b5e0d9a91d4b36.png

(3) Mask级联

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

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

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

dbe9f9d8787148c534b1eaddae8a6260.png

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

08a1a0e0f1f602a2da5e5fbc54a67c24.png

(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特征不对齐的问题。

1a6b84fd07af2f354c9a873afe802949.png

(2) 语义监督

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

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

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

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

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

1423da66c1b3ede98f09ec2abc723cfd.png

(3) 总结

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

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

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

3. 一阶段实例分割

3.1 局部mask与全局mask之争

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

a7e6b5d19ccea4d52023637dcb0b3f72.png

(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在训练时是不计损失的。

d9d4c7791bcbd1e5767d0b6b7950d78c.png

(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)。接下来照旧挨个模块简介一下:

85e213498efc5ea7aeea90c094781c97.png

(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 。

f5cf183853fcb576d0940ce9b2373b15.png

(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)三个模块。

0223a9224f6f185047d0517db01a944f.png

  • 全局特征图生成模块(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.png6b5f1d1eec539c54603eff3e866e27c3.png4984170270475dd2519546229722bce9.pngd7949d4424e28610bce6ef6ffec56867.pngfecbc25b62ce1cf88c3ec70996f4129d.png122ad50a1c5110eebaceb30f4f6e6d20.png5dfc6bcd945fab4baa4b21e9c38a7a9b.png40dee63e6a03593f5305c87cd159c546.pngac715bb707b6dbfd6f887aa40fcbf02c.png

(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作为目标检测网络;

5dc61d54b0cb45eeed5e1ff4bf9603d2.png

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

30a0e9e67821910e7d0355b95cd2da15.png

26278c1c7c5a91ad3609b9f1ca383ec1.png

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。

1db95eca2a5af3b4c0032f8d6897c470.png

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

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

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

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

3.5 SOLOv2

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

fa8286e2102bc361806ee2dd20aac51d.png

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层预测相同的目标,这样同样会增加正样本的数量。

bcef25dcb6ea521fbfab1a0d4af7b52a.png

494410404658935ec02713d42da45802.png630a230d60b222d942078ddd61d21cef.pngf2c8f02711dd7dfbf2c2791169f64759.png

(3) SOLOv2 动态卷积

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

f0efd685b52638d0b347e0532f2a9389.png

(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模型部署落地等方向;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例分割最全综述(上):二阶段实例分割和一阶段实例分割 的相关文章

随机推荐

  • RuntimeError mat1 dim 1 must match mat2 dim 0

    RuntimeError mat1 dim 1 must match mat2 dim 0 代码 self span class token punctuation span fc1 span class token operator 61
  • python 中 subprocess.Popen 总结

    python 中 subprocess Popen 总结 subprocess的目的就是启动一个新的进程并且与之通信 subprocess模块中只定义了一个类 Popen 可以使用Popen来创建进程 xff0c 并与进程进行复杂的交互 它
  • 相机标定(Camera calibration)原理、步骤

    相机标定 xff08 Camera calibration xff09 原理 步骤 简介 在图像测量过程以及机器视觉应用中 xff0c 为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系 xff0c 必须建立相机成像的几何
  • python3-rosdep2 : Depends: python3-catkin-pkg but it is not going to be installed

    python3 rosdep2 Depends python3 catkin pkg but it is not going to be installed 今天在 Ubuntu18 04 中安装ros莫名其妙的出现了上述问题 xff0c
  • 旋转矩阵求导

    旋转矩阵的导数 证明 quad 假设旋转矩阵为 R mathbf R theta
  • VINS中陀螺仪零偏的估计

    VINS中关于陀螺仪零偏的初始化估计 对于窗口中得连续两帧 b k b k b k 和 b
  • 非线性优化问题基本形式概述

    非线性优化问题以及在视觉SLAM中的应用 1 0 最小二乘基础概念 定义 quad 找到一个 n 维的变量 x
  • Ceres 自动求导解析-从原理到实践

    Ceres 自动求导解析 从原理到实践 文章目录 Ceres 自动求导解析 从原理到实践1 0 前言2 0 Ceres求导简介3 0 Ceres 自动求导原理3 1 官方解释3 2 自我理解 4 0 实践4 1 Jet 的实现4 2 多项式
  • 如何在付费页面复制走想要的文字

    1 按F12打开控制台 出现如下界面 xff1a 2 点击图中方框按钮或者按Ctrl 43 B选择元素 xff0c 出现如下界面 xff1a 3 在左边点击想要复制的文字 xff0c 右边就会弹出对应的元素 xff0c 然后双击右边元素就可
  • 锂电池容量下降怎么办?锂电池容量下降修复方法

    锂电池容量下降怎么办 锂电池容量下降修复方法 据存能电气小编所知 xff0c 锂离子电池的容量在300 500次充放电循环后会下降到80 xff5e 85 xff0c 想要恢复初始续航性能必须更换新电池 近日声称有科研人员发明了能让锂离子电
  • 2021-02-18

    多旋翼飞行器学习笔记 二 机架设计 2 1布局设计 1 机身基本布局 交叉型 xff1a 目前常用的是X字型布局 xff0c 因为 xff1a xff08 1 xff09 机动性更强 xff1b xff08 2 xff09 前视相机的视场角
  • UDP协议

    文章目录 UDP协议1 UDP协议概述1 1基于IP协议略微改进1 2不可靠性1 3无连接1 4UDP协议存在的意义 2 UDP报文段2 1UDP报文段格式2 2校验和及其计算 UDP协议 Internet 协议集支持一个无连接的传输协议
  • ROS小车,乐视深度相机+cartographer+move_base从零开始配置导航

    ROS小车导航 制作教程链接小车制作stm32ide配置PWM小车蓝牙控制使用说明 ROS小车驱动板如何从编码器得到转速 xff1f 任务划分小车与ROS的串口通信cartographer安装运行cartographer示例建图仿照back
  • kalibr标定realsenseD435i(二)--多相机标定

    kalibr标定板 xff08 棋盘格 xff09 用师兄的 xff08 长这样 xff09 步骤一 xff1a 建立的ROS中的Kalibr的工作空间 xff0c 建立一个名为 xff1a checkerboard yaml的文件 xff
  • Ubuntu下python2与python3之间的切换

    由于ubuntu中python2与python3一般都有安装 xff0c 所以必要时需要进行切换 1 我们设置一下python2为默认 sudo update alternatives install usr bin python pyth
  • vscode终端无输出

    两个原因 1是code runner设置造成 xff0c 可以在设置中搜索输入run in terminal xff0c 勾选即可 2是因为解决include路径是安装Mingw的版本问题 xff0c 可以通过更换版本解决 更换版本首先删除
  • 简历上银行项目

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • ‘pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    pip不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 到底有多么神秘 xff1f 不亲身体验 xff0c 怎可知道 xff1f 博主最近就体验了一把 本来想用 pip install 几个包的 xff0c 后来它提示我 pi
  • HTMLTestRunner生成测试报告报错 ModuleNotFoundError: No module named ‘StringIO‘

    今天在学习使用HTMLTestRunner生成测试报告时遇到一个报错 xff0c 如图所示 xff1a 网上搜索了下 No module named 39 StringIO 39 解决方法 xff0c 原来我用的是Python 3 X版本
  • 实例分割最全综述(上):二阶段实例分割和一阶段实例分割

    作者 fresher 原文链接 xff1a https zhuanlan zhihu com p 533568152 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 1 实例分割简介 实例分割是