这是沈春华团队在实例分割领域的又一力作,被收录于ECCV2020 oral。
论文地址:https://arxiv.org/pdf/2003.05664.pdf
代码地址(非官方):https://github.com/Epiphqny/CondInst
代码地址(含各类方法):https://github.com/aim-uofa/AdelaiDet/
本文提出了一个简单而有效的实例分割框架,称为CondInst(用于实例分割的条件卷积)。效果最好的实例分割方法(例如Mask R-CNN)依靠ROI操作(通常为ROI Pool或ROI Align)来获取最终的实例mask掩码。相反,本文从新的角度解决实例分割问题,没有使用按实例的ROI作为固定权重网络的输入,而是采用了以实例为条件的动态实例感知网络。 CondInst具有两个优点:1)通过全卷积网络解决了实例分割,无需进行ROI裁剪和特征对齐。2)由于动态生成的条件卷积的容量大大提高,因此mask head可以非常紧凑(例如3个卷积层,每个仅具有8个通道),从而可以显着加快推理速度。在COCO数据集上,本文的方法优于一些最近的方法,包括经过调整的Mask R-CNN,同时无需更长的训练时间。
简介
实例分割是计算机视觉中一项基本但具有挑战性的任务,目前,实例分割的主要框架仍然是两阶段方法Mask R-CNN ,它将实例分割投射到两阶段的检测和分割任务中。使用目标检测器Faster R-CNN预测每个实例的边界框。然后针对每个实例,使用ROI Align操作从网络的特征图中裁剪出感兴趣区域(ROI)。为了预测每个实例的最终mask,将紧凑的全卷积网络(FCN)(即mask head)应用于这些ROI,以进行前景/背景分割。
但是,这种基于ROI的方法可能具有以下缺点:1)由于ROI通常是轴对齐的边界框,对于形状不规则的对象,它们可能包含过多的不相关图像内容,例如在边界框内包含了背景和其他实例。通过使用旋转的ROI可以缓解此问题,但是其代价更高。2)为了区分前景实例和背景实例,mask head需要相对较大的感受野来对足够大的上下文信息进行编码。因此,在mask head中需要大量的3×3卷积(例如在mask R-CNN中具有4个256通道的3×3卷积)。这大大增加了Mask head的计算复杂度,从而导致推理时间随实例数的变化而显着变化。3)ROIs通常大小不同。为了在深度学习框架中使用有效的批量计算,通常需要进行大小调整操作以将区域调整为相同大小的patch。例如,Mask R-CNN将所有裁剪区域的大小调整为14×14(使用反卷积将其上采样为28×28),这限制了实例分割的输出分辨率,因为大型实例需要更高的分辨率才能在边界保留细节。
图1 CondInst利用实例感知的mask head预测每个实例的mask,即要预测的实例数。mask head中的卷积随不同实例而变化,这些实例是动态生成的并以目标实例为条件。在mask head中,除了最后一层卷积操作其余都使用ReLU作为激活函数,此处不使用诸如批归一化BN之类的归一化层。最后一次卷积层使用Sigmoid来预测mask前景的可能性
在计算机视觉中,最接近实例分割的任务是语义分割,在语义分割领域全卷积网络(FCN)表现出了巨大的成功。FCN在许多其他逐像素预测任务上也表现出色的性能。但是,几乎所有基于FCN的实例分割方法都落后于基于最新ROI的方法。为什么FCN在实例分割上的表现不令人满意?本文观察到将FCN应用于实例分割的主要困难在于,相似的图像外观可能需要不同的预测,但是FCN在实现这一目标方面遇到了困难。例如,如果输入图像中两个具有相似外观的人A和B,在预测A的实例mask时,则FCN需要将B预测为背景,这可能很难因为它们看起来相似。本质上,实例分割需要两种类型的信息:1)外观信息以对对象进行分类;2)位置信息以区分属于同一类别的多个对象。几乎所有方法都依赖于ROI cropping,这可以对实例的位置信息进行明确编码。相反,CondInst通过使用位置/实例敏感的卷积以及附加到特征图的相对坐标来利用位置信息。
主要贡献:
1、尝试从新的角度解决实例分割。为此,提出了CondInst实例分割框架,该模板实现了比Mask R-CNN等现有方法更高的实例分割性能,同时速度更快。
2、CondInst是完全由卷积组成的,并且不依赖于ROI操作。无需调整特征图的大小即可获得具有更高精确度的高分辨率实例mask。
3、与以前的方法不同,CondInst的mask head中的卷积会动态生成并以实例为条件。由于仅要求卷积预测一个实例的掩码,因此极大地减轻了学习要求,从而减轻了卷积的负载。与边界框检测器FCOS相比,CondInst仅需要多花费约10%的计算时间,甚至可以处理每个图像的最大实例数(即100个实例)。
FCOS:检测中心点 + 到框的四个距离
论文地址:https://arxiv.org/abs/1904.01355
代码地址:https://github.com/tianzhi0549/FCOS
通过消除预定义的锚框,FCOS避免了与锚框相关的复杂计算,例如在训练期间计算重叠等,并且显著减少了训练内存。更重要的是,FCOS还避免了设定与锚框相关的所有超参数,这些参数通常对最终检测性能非常敏感。FCOS算法凭借唯一的后处理:非极大值抑制(NMS),实现了优于以前基于锚框的one-stage检测算法的效果。
FCOS的网络结构还是FPN的结构,就是在生成p3~p7的时候,没有在C5上采样得到P6,而是直接用P5采样得到P6。
网络的输出有三个branch,classification branch输出每个点的类别, regression branch输出每个点的四个值, (l,t,r,b)。其实这两个branch都和keypoint detection思想很像,网络最主要的贡献在于提出了centernet-ness branch这个方法。以下分别介绍:
1.逐像素回归预测
YOLOv1中也使用了无anchor策略,但基于YOLOv1在预测边界框的过程中,提出的cell概念,导致YOLOv1只预测了目标物体中心点附近的点的边界框。这很显然预测的框少,召回率自然也就低了。基于此,FCOS算法为了提升召回率,则对目标物体框中的所有点都进行边界框预测。当然这种逐像素的边界框预测肯定会导致最终预测得到的边界框质量不高,因此作者在后续还会提出弥补策略。FCOS目标检测算法在边界框预测中使用的策略和YOLOv1有所不同,F提出的预测策略如下:
如上两张图所示,FCOS算法在对目标物体框中所有的点进行目标框回归时,用到各个边的距离长度来计算损失。之所以使用这种策略,而不使用主流目标检测算法的策略,其主要原因是为了后续使用center-ness准备。
由于FCOS算法是基于目标物体框中的点进行逐像素回归的,因此执行回归的目标都是正样本,所以作者使用了exp()函数将回归目标进行拉伸,可以此操作是为了最终的特征空间更大,辨识度更强。最后,逐像素回归预测除了能够带来更多的框以外,更重要的是利用了尽可能多的前景样本来训练回归器,而传统的基于anchor的检测器,只考虑具有足够高的IOU的anchor box作为正样本。作者认为,这可能是FCOS优于基于anchor的同类检测器的原因之一。
2. 多尺度策略
对于基于anchor的检测算法,由于较大的降采样操作而导致的低召回率可以通过降低正anchor所需的IOU阈值做一定程度上的补偿,进行召回率的提升。然而对于FCOS算法,如果降采样的尺度过大,那么网络不可能回忆起一个在最终特征图上没有位置编码的对象的初始框的,基于此作者提出了基于FPN的多尺度策略。(虽然作者在文中说,即使没有FPN策略,逐像素检测网络在召回率上表现的也不逊色基于anchor的网络)
如上图所示,FCOS算法那使用了{P3, P4, P5, P6, P7}这五个尺度的特征映射。其中P3、P4、P5由主干CNNs网络的特征层 C3、C4、C5经过一个1*1的卷积得到的,而,P6、P7则是接着P5进行了步长为2的卷积操作得到的(相当于降采样,看注解)。最终对这五个尺度都做逐像素回归。
当然,为了能够更好的利用这种多尺度特征,在每一个尺度的特征层都限定了边界框回归的范围。具体步骤如下:
- 计算当前层级中的回归目标:l、t、r、b
- 判断max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1是否满足。
- 若满足,则不对此边界框进行回归预测。
- mi是作为当前尺度特征层的最大回归距离。
而且这种约束带来的额外的效果在于,由于不同尺寸的物体被分配到不同的特征层进行回归,又由于大部分重叠发生在尺寸相差较大的物体之间,因此多尺度预测可以在很大程度上缓解目标框重叠情况下的预测性能。
3. center-ness
由于FCOS算法使用了逐像素回归策略,在提升召回率的同时,会产生许多低质量的中心点偏移较多的预测边界框。基于此,作者提出了一个简单而有效的策略center-ness来抑制这些低质量检测到的边界框,且该策略不引入任何超参数。
如上图所示,center-ness策略在每一个层级预测中添加了一个分支,该分支与分类并行,相当于给网络添加了一个损失,而该损失保证了预测的边界框尽可能的靠近中心。
具体来说,FCOS添加单层分支,与分类分支并行,以预测Center-ness位置。
从图中可以看出,box的中心处响应值最高, 随后逐次降低,值的范围在0~1之间。centet-ness branch中每个featuremap位置上的值计算是根据回归计算得到的(l, t, r, b), 可以看出, 越是中间位置, centerness值就越高, 越偏离中心处,centerness值就会越低,centerness-branch的loss用BCE来计算。
center-ness(可以理解为一种具有度量作用的概念,在这里称之为中心度,中心度取值为0,1之间,使用交叉熵损失进行训练。并把损失加入前面提到的损失函数中。测试时,将预测的中心度与相应的分类分数相乘,计算最终得分(用于对检测到的边界框进行排序)。因此,中心度可以降低远离对象中心的边界框的权重。因此,这些低质量边界框很可能被最终的非最大抑制(NMS)过程滤除,从而显着提高了检测性能。
本文的方法:Instance Segmentation with CondInst
图3. CondInst的网络结构图。C3,C4和C5的是主干网络(例如ResNet-50)的特征图。P3到P7是FPN特征图。Fmask是mask分支的输出。分类head预测位置(x,y)处目标实例的类别概率p(x,y),与FCOS中相同。controller head(在虚线框中)应用于P3···P7。mask head是实例感知的,其转换每种情况下都会动态生成卷积核θx,y,并且将其应用于Fmask的次数与图像中实例的数量相同(请参见图1)。
可以看出,整体结构可分为两大部分:
一、FCOS: 上半部分,整个pipeline和FCOS没啥差别,只是head层的输出略有不一样,那么对于FPN每一个layer的每一个pixel,主要输出:
1、Classification Head: 和原版FCOS含义一样
2、Center-ness Head:这个定义也是和原版FCOS一致的,用来抑制不太好的预测结果
3、Controller Head:具有与Classification Head相同的架构,是本篇论文的核心了,负责生成Mask FCN Head的参数,假设Mask FCN Head的总参数量是X,那么Controller Head的维度就是X,论文中当X取169的时候性能就比较不错了。
二、Mask FCN Head: 下半部分是论文的核心点,它的结构就是一般的FCN,但是它的特点在于FCN的参数是动态的,不同的instance有不同的参数,这就会造成多个Mask FCN Head的感觉,同时功能上也类似Mask RCNN出框的作用-区分Instance。
Mask FCN Head接在P3 Layer之后, 经过几层Conv之后得到一个H x W x C的feature map, 论文中C = 8,C的取值对分割的性能影响不大,甚至C = 2的时候性能也只是下降0.3%!因为Mask FCN Head负责出instance,而其参数又是由P3 - P7的head层所得,所以为了构建两者的联系,在Mask FCN Head输入层Fmask Concat了Fmask到P3 - P7的相对位移,假设Fmask的维度为H x W x C,Pi的维度为Hi x Wi x Ci, 那么把Fmask的每一个pixel映射到Pi,映射前后坐标的offset就会和原始的Fmask Concat到一起作为Mask FCN Head的输入。
Mask FCN Head具有3个1×1卷积,每个卷积具有8个通道,并使用ReLU作为激活函数(最后一个除外),不使用诸如批处理归一化之类的归一化层,最后一层具有1个输出通道,并使用sigmoid来预测成为前景的概率。
损失函数
实验与结果
消融实验
对比实验
可视化实验
更多细节可参考论文原文。