论文地址:https://arxiv.org/abs/2001.01629v2
开源代码:https://github.com/zju3dv/snake/
这篇文章介绍了一种基于轮廓的实时实例分割方法,名为 deep snake 。与其它方法直接回归物体边界坐标点的方法不同,deep snake 利用了神经网络以给定的初始边框为基础,以基于学习的snake算法不断迭代修正,达到拟合物体的边界的效果。这种思想可以说是Deep Learning与snake算法的结合运用,因而称之为 deep snake。为了更好地利用物体轮廓是一个周期图(闭合)的结构,论文采用了circular convolution (称为 圆卷积或者循环卷积都可以 ) 替代了通用的 graph convolution (图卷积)来提取物体轮廓的特征。
deep snake 分为两个阶段的流程:
initial contour proposal (初始轮廓的建议)
contour deformation (轮廓的修正)
该模型可以实时的进行实例分割, 能达到32.3 fps对于512 × 512的图像在 GTX 1080ti GPU上,而且在Cityscapes、Kins和Sbd数据集上表现SOTA (State of the Arts —— 一般就是指在一些benchmark的数据集上跑分非常高的那些模型)。
许多一流(stae-of-the-art)的实例分割方法都采用逐像素(pixel-based)的方式,但这会十分依赖于bounding box,一旦bounding box不准确,那么逐像素的准确度也会受到影响。并且,这种方式的后处理过程的时间代价是比较昂贵的。
与逐像素方式不同的是,逐轮廓的方式不再过分依赖于bounding box,并且参数也更少。
Figure 1. 首先给出一个初始轮廓,图像的特征被提取在(a)中的各个顶点里面。由于该轮廓是一个(类似)圆形图,因此用circular convolution(循环卷积)来对轮廓进行特征学习,如(b)所示。其中蓝色代表输入的特征,黄色代表循环卷积的卷积核,绿色代表输出的特征。最后,对每个顶点回归的偏移量用来对轮廓进行调整。
这里再简要提一下snake算法,也称为主动轮廓算法。首先,将人为地给一个初始轮廓(这个初始轮廓不一定非要特别准确),然后snake算法就会根据能量函数不断迭代地调整物体轮廓,使得能量函数最小化。对于能量函数本人理解是,类似于深度学习中的损失函数。但是snake算法有局限的地方,首先这种方法很可能找到的是局部最优解而不是全局最优解,其次函数还得人为地设定(设定出来还可能是非凸的),比较麻烦。snake算法的更多内容可参考此篇博客:https://blog.csdn.net/zouxy09/article/details/8712287。
早在作者之前,也Ling等人尝试结合snake算法与神经网络来对初始轮廓进行演变来拟合物体真实轮廓。Ling等人的思路是这样的:将输入的初始轮廓看出是图结构,然后使用**graph convolution network(GCN)图卷积来预测给定轮廓点与目标真实轮廓点的偏移量。当然这种方法获得了很好的效果,速度也比逐像素的方法快了很多。然后这种方法还存在可以改进的地方,这就是论文的亮点之一:使用图卷积(GCN)**把轮廓视为普通的图实际上并没有充分利用轮廓特殊的拓扑结构,因而作者提出使用循环卷积来提取轮廓的特征,效果会更佳。
在Ling等人的启发下,deep snake将初始轮廓当成输入,并通过回归轮廓顶点的偏移量来不断修正轮廓。论文的创新点就在于:利用循环卷积能更好地对轮廓特征学习。因为轮廓就是由一系列的点连接在一起,形成了一个闭合的环,每个顶点的度都为2,我们就可以对顶点特征进行1维的卷积,效果更佳。我们可以认为物体的轮廓是周期性的(闭合的),在进行1维卷积时,该卷积的循环卷积核既编码了每个顶点的特征,又编码了每个顶点与相邻点的关系。实验中,circular convolution比graph convolution更具表达性(更好地提取特征),实验结果也更好。
那么怎么给定初始的边框呢(也就是怎么 initial contour proposal )?首先作者在deep snake中集成了一个object detector 物体检测器(在实验中用的是CenterNet),将图片输入物体检测器中,物体检测器就会输出建议(检测)框。通过检测器得到的建议框变成一个菱形的轮廓, 然后通过DeepSnake模型对四个顶点进行变形得到包围对象的极端点。 然后通过极端点构建一个八边形,第一阶段结束。这个八边形就是初始化的轮廓, DeepSnake模型对其进行迭代的变形来贴合目标的边界 。
论文主要有以下几点贡献:
许多方法在建议框(region proposal)内对像素进行实例分割,用标准的卷积神经网络就已经表现极好。其中最有代表性的就是Mask R-CNN。
当然也存在不基于建议框(region proposal)的逐像素方法,这些方法的每个像素点通常都会产生辅助信息,然后基于这些信息用聚类方法将像素点分组到物体实例中去。其中用到的辅助信息和分组算法都是多种多样的。因为掩膜(Mask)是由许多密集的像素点组合在一起的,所以后处理过程中的聚类算法是比较耗时的。
DeepSnake根据来自主干网络(CNN backbone)的图像特征获取轮廓作为输入,并预测对象边界的每个顶点的偏移量。为了充分利用轮廓的拓扑结构,提出了用循环卷积对轮廓进行特征学习,并促进了后续的修正轮廓的阶段。
传统的snake算法需要手工设定的能量函数,以最小化能量函数为目标对初始边框进行修正。然而,种方法很可能找到的是局部最优解而不是全局最优解,其次函数还得人为地设定(设定出来还可能是非凸的)。
相反,deep snake算法直接学习以端对端(end-to-end)的方式来演变物体轮廓。(deep snake的公式推导可看论文)
Figure 2.循环卷积 ,蓝色的节点代表在轮廓上定义的特征,黄色的节点代表卷积核函数,绿色的节点是输出的特征。其中高亮的绿色节点是卷积核和高亮的蓝色输入部分做内积得到的结果,和标准的卷积操作一样。循环卷积输出的特征长度和输入特征长度相同。
Figure 3.基于轮廓建议的实例分割模型 ,(a) DeepSnake模型由三部分组成:一个主干网络,一个融合模块和一个预测的头模块。模型以轮廓作为输入,输出轮廓每个顶点的偏移量来对轮廓进行变形。(b)基于DeepSnake模型论文提出了一个两阶段的实例分割流程:初始化建议轮廓,轮廓变形。通过检测器得到的建议框得到一个菱形的轮廓, 然后通过DeepSnake模型对四个顶点进行变形得到包围对象的极端点。 然后通过极端点构建一个八边形,第一阶段结束。这个八边形就是初始化的轮廓, DeepSnake模型对其进行迭代的变形来贴合目标的边界 。
Figure 3. 展示了网络结构原理图的细节,DeepSnake网络由三部分组成:一个主干网络、一个融合模块、和一个预测头。其中主干网络由8个CirConv-Bn-ReLU组成,所有层直接都使用了残差跳跃连接的方式,CirConv就是循环卷积。融合模块的功能是融合contour上所有点的多尺度的信息。它合并了主干网络中所有层的特征,然后传入到1x1的卷积层中,再进行一次最大池化操作,这样融合的特征就和每个顶点的特征合并在了一起。预测头对于顶点特征采用了3个1x1的卷积层,然后映射到每个顶点的偏移量上输出。
给定一个目标检测框,从中提取四个点分别是上、下、左、右四条边的中点,记为{ x i b b x^{bb}_i xibb|i=1,2,3,4},连接这四个点得到一个菱形轮廓,之后把这个菱形轮廓输入到DeepSnake中。
DeepSnake通过对菱形轮廓进行推理输出对应菱形轮廓4个顶点的4个偏移量,把通过菱形轮廓和偏移量计算得到的四个极端点记为 { x i e x ∣ x^{ex}_i| xiex∣i=1,2,3,4},这四个偏移量也就是 x i e x − x i b b x^{ex}_i - x^{bb}_i xiex−xibb。
实际上,为了提取更多的上下文信息,菱形轮廓是均匀上采样得到的40个点,然后DeepSnake相应的输出40个offset。损失函数只考虑 x i b b x^{bb}_i xibb的偏移量。
通过得到的四个极端点得到4个线段,连接线段的端点,得到一个八边形。具体来说,4个极端点对应一个水平框,对于每个极端点沿着相应水平框边的方向,向两边延伸为一个线段,线段的长度为相应边长的1/4,线段延伸如果遇到水平框端点就截断。然后连接四条线段的端点,就得到了八边形。
先对八边形采样N个点,从极端点的顶点作为第一个点开始沿着边均匀采样,gt也是同样的采样方式。然利用图3所示的网络结构,通过循环卷积进行特征提取,然后通过1x1卷积映射到偏移量上。实验中论文设置N=128,能够均匀的覆盖绝大多数的物体形状了。
一次就能准确的回归偏移量是一件很有挑战的事,尤其是那种顶点距离对象较远的情况,为了解决这个问题 ,论文使用了可迭代的方法,具体来说,先基于当前的contour预测N个偏移量,然后通过该偏移量对contour进行第一轮变形作为新的contour,重复这个过程,论文实验中迭代的次数为三次。
contour也是目标空间扩展性的另外一种表示方法。通过对其进行变形是能够解决检测器的定位问题的。
由于遮挡,许多实例不只是一个完全连接的组件,而是可能由遮挡部分切开的多个连接组件组成一个实例。而一个轮廓只能用于描述一个连接的组件,为了解决这个问题作者建议对目标框内的目标组件进行检测。具体来说就是使用一个检测框通过ROIAlign来提取特征映射图上的特征,然后对特征映射图加一个检测分支,来产生组件的框。我们的方法包含最终的整个目标形状通过对同一个目标框内的contour组件进行合并。
算法相关的损失函数(loss function)如下:
Detector部分,作者在整个实验过程中都采用CenterNet作为检测器(Detector)。
Datasets部分,作者对Cityscapes、KINS、SBD和COCO四种数据集进行了训练和测试。
上面的是图卷积得到的结果,下面的图是循环卷积得到的结果在Sbd数据集上。可以发现循环卷积两轮迭代的结果已经优于图卷积三轮迭代的结果了。