文 | 叶问
在这篇文章中,我们将探讨使用深度学习的图像分割。我们将讨论:
- 什么是图像分割
- 基于深度学习的图像分割
- 基于Mask R-CNN的主流图像分割方法
- 新实例分割方法 Deep Snake
图像分割技术介绍
数字图像处理是一个跨学科的领域,尽管其发展历史不长,但由于图像处理在军事、遥感、气象等大型应用中有不断增长的需求,并且心理学、生理学、计算机科学等诸多领域的学者们以数字图像为基础研究视觉感知,因此,针对图像处理和分析问题的新方法层出不穷,逐渐形成了自己的科学体系。
图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,简单的说就是在一副图像中,把目标从背景中分离出来。
基于深度学习的图像分割
目前,受到广泛关注的深度学习也应用于图像分割问题中。神经网络是深度学习中的重要方法,基于神经网络的图像分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。这种方法需要大量的训练数据。神经网络存在巨量的连接,容易引入空间信息,能较好地解决图像中的噪声和不均匀问题。
具体原理如下:
- 通过下采样+上采样:Convlution + Deconvlution/Resize
- 结合多尺度特征融合:特征逐点相加/特征channel维度拼接
- 像素级别的segbement map:对每一个像素点进行判断类别
网络结构的选择将直接影响图像分割效果,常见的网络结构包括:VGG、FCN、Deconvnet、SegNet、Mask-RCNN。
![69b79c14d615cbada88447684eb08994.png](https://i-blog.csdnimg.cn/blog_migrate/1b8088b7373fb277055f91343a51d3d3.png)
在图像分割的发展过程中,按照目的不同,逐渐从普通分割发展到语义分割,再从语义分割发展到实例分割:
- 普通分割
将不同分属不同物体的像素区域分开。 如前景与后景分割开,狗的区域与猫的区域与背景分割开。
- 语义分割
在普通分割的基础上,分类出每一块区域的语义(即这块区域是什么物体)。 如把画面中的所有物体都指出它们各自的类别。
- 实例分割
在语义分割的基础上,给每个物体编号。 如这个是该画面中的汽车A,那个是画面中的汽车B。
实例分割是目前最具挑战的任务之一,本文将主要对基于Mask R-CNN的主流图像分割方法和实例分割新方法Deep Snake进行介绍。
主流图像分割方法(Mask R-CNN)
图像分割技术发展至今,Mask R-CNN [1] 的Pipeline几乎是目前做instance segmentation的大多数工作参考的方案。
![6558a32c8a41e014d2d09e5cc0d3c64c.png](https://i-blog.csdnimg.cn/blog_migrate/c7e41197900527c1fe866889f9c56734.png)
Mask R-CNN将Object Detection与Semantic Segmentation合在了一起做。它的特点主要有以下几点:
第一,神经网络有了多个通道输出。Mask R-CNN使用类似Faster R-CNN的框架,Faster R-CNN的输出是物体的bounding box和类别,而Mask R-CNN则多了一个通道,用来预测物体的语义分割图。也就是说神经网络同时学习两项任务,可以互相得到反馈,训练模型参数权重。
第二,在语义分割中使用Binary Mask。原来的语义分割预测类别需要使用0 1 2 3 4等数字代表各个类别。在Mask R-CNN中,检测分支会预测类别。这时候分割只需要用0 1预测这个物体的形状面具就行了。
第三,Mask R-CNN基本的pipeline是先检测物体矩形框,然后在矩形框中做逐像素分割。并且提出了RoiAlign用来替换Faster R-CNN中的RoiPooling。RoiPooling的思想是将输入图像中任意一块区域对应到神经网络特征图中的对应区域。RoiPooling使用了化整的近似来寻找对应区域,导致对应关系与实际情况有偏移。这个偏移在分类任务中可以容忍,但对于精细度更高的分割则影响较大。为了解决这个问题,RoiAlign不再使用化整操作,而是使用线性插值来寻找更精准的对应区域。效果就是可以得到更好地对应。实验也证明了效果不错。
但是这样的处理方式其实有一些局限性,也是今天本文主要介绍的Deep Snake在处理实例分割时擅长解决的问题:
- 在Mask R-CNN矩形框中做逐像素分割会受限于矩形框的准确度。
如果矩形框精度差,如覆盖到一部分物体,那就算框中的分割精度做的再高,也无法得到正确的instance mask。
- 逐像素分割在生产和后续计算中计算量巨大
因为逐像素分割计算量大,所以网络一般将矩形框区域downsample为28x28的网格,然后进行分割,之后再把分割结果upsample到原图大小。这个upsample根据Mask R-CNN论文里的统计是有15ms的,比较费时。另一个问题是,在28x28网格上做分割会损失精度。即使28x28的网格上的分割结果完全正确,upsample到原图的mask仍然是很粗糙的。
- 逐像素分割不适用于一些物体
比如细胞和文本,因此不适合OCR(光学字符识别)。
Deep Snake
论文链接:https://arxiv.org/abs/2001.01629
论文代码:https://github.com/zju3dv/snake
针对主流图像分割方法在实例分割中面对的问题,Deep Snake考虑到逐像素分割有诸多限制,因此选择用contour来表示物体的形状。contour是一组有序的点,而且是首尾相连的。比如图片中猫的边缘就是一个contour。
![4201d124462d89c1233076b955eca742.png](https://i-blog.csdnimg.cn/blog_migrate/f659b1eeb41c3e33b248cadced35ddc6.png)
与稠密像素相比contour的两大优势
- 计算量远远小于稠密像素,参数量也比较少。
这样使得实例的分割的速度上限更高,也能更廉价地使用分割结果。这里举个例子就是跟踪任务。现在跟踪任务主要还是使用box做跟踪,用物体的像素点做跟踪任务计算量会很大。如果把像素点换成用contour做跟踪任务就会好很多。因此contour也更适用于细胞、文字这些物体的分割。
- 传统的图像分割领域一直都有用contour做分割。
有一个很经典的论文是Snakes:Active contour models. [2]。而本文中介绍的方法DeepSnake,顾名思义其实就是用深度学习的方法实现了传统Snake。传统Snake做图像分割的时候要求先给定一个初始的 contour。这个contour大概围绕着目标物体。
Deep Snake的优化
传统Snake的一个很大问题是他的目标函数和最优化都是人工设定的,对数据的噪声比较敏感,容易收敛到局部最优点。为了解决这个问题,Deep Snake用深度学习来做这个优化过程。
contour是一组有序的、首尾相连的点,可以看作一个cycle graph。这种cycle graph每个节点的邻居节点为2,顺序固定,所以可以定义卷积核。论文引入Circular convolution来处理contour,下图是Circular convolution的示例图:
![ebf301038cda05c8534685417855588e.png](https://i-blog.csdnimg.cn/blog_migrate/5ede941de4b989a70c7a240895a02306.png)
- Blue nodes 代表定义在contour的 输入特征值
![4e387bc65f9f61311360e6374cd0e3d0.png](https://i-blog.csdnimg.cn/blog_migrate/bfdb625aa87dc86eede9478f2a49b931.png)
- Yellow nodes 代表卷积核,Green nodes为卷积输出,circular convolution为
和传统Snake类似,给定一个初始 contour,基于图片的特征图,给contour的每个节点提取一个特征值,得到一个定义在contour上的特征。然后用Circular convolution构成的网络进行contour上的特征工程,最后映射为指向物体轮廓的补偿,用于变形contour。
传统的Snake要求有一个比较准确的初始化 contour才能比变形得比较好,所以初始化contour对后续的变形十分关键。
受到ExtremeNet [4] 的影响,作者用物体extreme points来构造初始contour。物体的extreme point是物体在图片中最上边、最左边、最下边和最右边的点。在每个点上延伸出一条线段,然后将线段连接起来,得到一个八边形,把这个八边形作为initial contour。
![9e16cfd3c3536d466b65a2ade9f235b7.png](https://i-blog.csdnimg.cn/blog_migrate/3d1fa5a7b7b601396efcdfcd9958dc37.png)
Pipeline for instance segmentation
- 通过预测extreme point来得到initial contour,然后将initial contour变形为物体边缘:
![157503d1ff85bb29cd458e364a6f71fa.png](https://i-blog.csdnimg.cn/blog_migrate/d5b78057b543a15a8c31d2a9e3c791e2.png)
- 用detector检测得到一个矩形框,将矩形框四条边的中点连接起来,就得到一个菱形contour。通过Deep Snake来处理这个轮廓,从而得到extreme point。用extreme point构造Octagon contour,然后用Deep Snake来处理这个contour,从而得到物体轮廓。
怎么处理碎片化实例
因为遮挡的原因,图片中的物体可能会分成多段。比如图中的车,因为柱子的遮挡,就分成了不连续的三段。要分割这辆车,就需要分别分割它的三部分,也就需要三个contour。但是根据前面的pipeline,一个矩形框只会出一个contour,所以无法处理碎片化实例。
为了解决这个问题,作者提出了Multi-component detection。给定一个物体矩形框,在矩形框里做二次检测,用于检测出物体的各个不连续的部分。这里的检测器用的是CenterNet [5]。
![3f50b967893971915a95e0aab510d589.png](https://i-blog.csdnimg.cn/blog_migrate/89a29cb3ee30c3ac143a479a27452b90.png)
Deep Snake实验结果分析
在实验中,首先验证了文中提出的做法的有效性,包括Initial contour和Circular convolution。实验在SBD数据集上进行。
![81ba2e42f44f46495f4e2c5a027fe693.png](https://i-blog.csdnimg.cn/blog_migrate/1b6b8c27ac81631a995465b841c71e79.png)
与其他方法的比较
通过在Cityscapes数据集上和之前的方法进行了比较,看出在 Cityscapes上效果和PANet差不多,在AP_val和AP_50上比PANet高一些。因为Cityscapes的图片是1024 x 2048,所以大家的速度都比较慢。PANet的fps小于1,Deep Snake是4.6 fps,也就是说Deep Snake在相同的准确率上速度是PANet的5倍左右。
![7212e2a4b0423bbac6c4760a923417dc.png](https://i-blog.csdnimg.cn/blog_migrate/cd1d8441bb25f84e483a8ec6dafa10ad.png)
此外,与其他基于contour分割物体的方法进行比较分割效果也有明显提升,用contour分割物体的方法一般是通过网络直接回归物体边缘点。而Deep Snack是通过变形initial contour来得到物体边缘。可以看到Deep Snake的预测准确率比之前的方法高出很多,而且提升效果明显,这说明Deep Snake比之前的方法分割得更精细。
![99047c5de5b63783f3b5243cf5c117b8.png](https://i-blog.csdnimg.cn/blog_migrate/9ef4bea244e138c64c4337ae4e7ec851.png)
论文中在PASCAL VOC上做了速度比较。在512 x 512的图片上,Deep Snake的速度有32.3 fps,达到了real-time的表现。
![23f6c175dddf498d3d2c19ab70c28433.png](https://i-blog.csdnimg.cn/blog_migrate/169401621e9463c1cf2b5afdd07600e6.png)
可视化结果可以看出Deep Snake的分割结果是比较精细的。通过实验可以看出Deep Snake是一种新的基于轮廓的实例实时分割模型。受传统Snake算法的启发,将初始轮廓变形到目标边界,得到目标形状。该算法引入了循环卷积来有效地学习轮廓特征,并对轮廓变形的顶点偏移进行了回归。基于Deep Snake开发了一个两阶段的管道分割实例:初始轮廓提议和轮廓变形。结果表明,与直接回归目标边界点坐标相比,这种方法具有更好的性能。此外还证明了圆卷积比图卷积更有效地学习轮廓的结构信息。为了克服轮廓线只能勾勒出一个连通分量的局限性,提出了在目标盒内检测目标分量的方法,并在城市景观中验证了该方法的有效性。该模型在城市景观、Kins和Sbd等数据集上取得了最新的结果表明具有更好的实时性。
![2e451aeda16eed96f56fd186dddd5336.png](https://i-blog.csdnimg.cn/blog_migrate/bddeae32848a73570acbaeadf2de66b3.png)
参考文献
[1] He, Kaiming, et al. "Mask r-cnn." In ICCV, 2017.
[2] Kass, Michael, Andrew Witkin, and Demetri Terzopoulos. "Snakes: Active contour models." In IJCV, 1988.
[3] Ling, Huan, et al. "Fast interactive object annotation with curve-gcn." In CVPR, 2019.
[4] Zhou, Xingyi, Jiacheng Zhuo, and Philipp Krahenbuhl. "Bottom-up object detection by grouping extreme and center points." In CVPR, 2019.
[5] Zhou, Xingyi, Dequan Wang, and Philipp Krahenbuhl. "Objects as points." In arXiv preprint arXiv:1904.07850, 2019.
图像分割 (Image Segmentation) 学习资源:
入门学习
A 2017 Guide to Semantic Segmentation with Deep Learning 概述——用深度学习做语义分割 / 中文翻译
从全卷积网络到大型卷积核:深度学习的语义分割全指南
Fully Convolutional Networks
语义分割中的深度学习方法全解:从FCN、SegNet到各代DeepLab
图像语义分割之FCN和CRF
从特斯拉到计算机视觉之「图像语义分割」
计算机视觉之语义分割
Segmentation Results: VOC2012 PASCAL语义分割比赛排名
进阶论文
U-NetSegNetDeepLabFCNENetLinkNetDenseNetTiramisuDilatedNetPixelNetICNetERFNetRefineNetPSPNetCRFasRNNDilated convolutionDeconvNetFRRNGCNDUC, HDCSegawareSemantic Segmentation using Adversarial Networks
综述
A Review on Deep Learning Techniques Applied to Semantic Segmentation Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, Victor Villena-Martinez, Jose Garcia-Rodriguez 2017
Computer Vision for Autonomous Vehicles: Problems, Datasets and State-of-the-Art
基于内容的图像分割方法综述 姜 枫 顾 庆 郝慧珍 李 娜 郭延文 陈道蓄 2017
Tutorial Semantic Image Segmentation with Deep Learning
A 2017 Guide to Semantic Segmentation with Deep Learning
Image Segmentation with Tensorflow using CNNs and Conditional Random Fields