【总结】图像语义分割之 FCN 和 CRF
前言
(呕血制作啊!) 前几天刚好做了个图像语义分割的汇报,把最近看的论文和一些想法讲了一下。所以今天就把它总结成文章啦,方便大家一起讨论讨论。本文只是展示了一些比较经典和自己觉得比较不错的结构,毕竟这方面还是有挺多的结构方法了。
介绍
图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类
从图像上来看,就是我们需要将实际的场景图分割成下面的分割图:
不同颜色代表不同类别。 经过我阅读 “大量” 论文(羞涩)和查看
PASCAL VOC Challenge performance evaluation server
,我发现图像语义分割从深度学习引入这个任务(FCN)到现在而言,一个通用的框架已经大概确定了。即:
- FCN - 全卷积网络
- CRF - 条件随机场
- MRF - 马尔科夫随机场
前端使用 FCN 进行特征粗提取,后端使用 CRF/MRF 优化前端的输出,最后得到分割图。
接下来,我会从前端和后端两部分进行总结。
前端
为什么需要 FCN?
我们分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。
而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,我们需要丢弃全连接层,换上全卷积层,而这就是全卷积网络了。具体定义请参看论文:Fully Convolutional Networks for Semantic Segmentation
前端结构
FCN
此处的 FCN 特指 Fully Convolutional Networks for Semantic Segmentation 论文中提出的结构,而非广义的全卷积网络。
作者的 FCN 主要使用了三种技术:
- 卷积化(Convolutional)
- 上采样(Upsample)
- 跳跃结构(Skip Layer)
卷积化
卷积化即是将普通的分类网络,比如 VGG16,ResNet50/101 等网络丢弃全连接层,换上对应的卷积层即可。
上采样
此处的上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe 和 Kera 里叫 Deconvolution,而 tensorflow 里叫 conv_transpose。CS231n 这门课中说,叫 conv_transpose 更为合适。
众所诸知,普通的池化(为什么这儿是普通的池化请看后文)会缩小图片的尺寸,比如 VGG16 五次池化后图片被缩小了 32 倍。为了得到和原图等大的分割图,我们需要上采样 / 反卷积。
反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。图解如下:
但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:
layer { name: "upscore" type: "Deconvolution" bottom: "score_fr" top: "upscore" param { lr_mult: 0 } convolution_param { num_output: 21 bias_term: false kernel_size: 64 stride: 32 } }
可以看到 lr_mult 被设置为了 0.
跳跃结构
(这个奇怪的名字是我翻译的,好像一般叫忽略连接结构)这个结构的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:
而不同上采样结构得到的结果对比如下:
当然,你也可以将 pool1, pool2 的输出再上采样输出。不过,作者说了这样得到的结果提升并不大。
这是第一种结构,也是深度学习应用于图像语义分割的开山之作,所以得了 CVPR2015 的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。
SegNet/DeconvNet
这样的结构总结在这儿,只是我觉得结构上比较优雅,它得到的结果不一定比上一种好。
SegNet
DeconvNet
这样的对称结构有种自编码器的感觉在里面,先编码再解码。这样的结构主要使用了反卷积和上池化。即:
反卷积如上。而上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填 0 即 OK。
DeepLab
接下来介绍一个很成熟优雅的结构,以至于现在的很多改进是基于这个网络结构的进行的。
首先这里我们将指出一个第一个结构 FCN 的粗糙之处:为了保证之后输出的尺寸不至于太小,FCN 的作者在第一层直接对原图加了 100 的 padding,可想而知,这会引入噪声。
而怎样才能保证输出的尺寸不会太小而又不会产生加 100 padding 这样的做法呢?可能有人会说减少池化层不就行了,这样理论上是可以的,但是这样直接就改变了原先可用的结构了,而且最重要的一点是就不能用以前的结构参数进行 fine-tune 了。所以,Deeplab 这里使用了一个非常优雅的做法:将 pooling 的 stride 改为 1,再加上 1 padding。这样池化后的图片尺寸并未减小,并且依然保留了池化整合特征的特性。
但是,事情还没完。因为池化层变了,后面的卷积的感受野也对应的改变了,这样也不能进行 fine-tune 了。所以,Deeplab 提出了一种新的卷积,带孔的卷积:Atrous Convolution. 即:
而具体的感受野变化如下:
a 为普通的池化的结果,b 为 “优雅” 池化的结果。我们设想在 a 上进行卷积核尺寸为 3 的普通卷积,则对应的感受野大小为 7. 而在 b 上进行同样的操作,对应的感受野变为了 5. 感受野减小了。但是如果使用 hole 为 1 的 Atrous Convolution 则感受野依然为 7.
所以,Atrous Convolution 能够保证这样的池化后的感受野不变,从而可以 fine tune,同时也能保证输出的结果更加精细。即:
总结
这里介绍了三种结构:FCN, SegNet/DeconvNet,DeepLab。当然还有一些其他的结构方法,比如有用 RNN 来做的,还有更有实际意义的 weakly-supervised 方法等等。
后端
终于到后端了,后端这里会讲几个场,涉及到一些数学的东西。我的理解也不是特别深刻,所以欢迎吐槽。
全连接条件随机场 (DenseCRF)
对于每个像素
具有类别标签
还有对应的观测值
,这样每个像素点作为节点,像素与像素间的关系作为边,即构成了一个条件随机场。而且我们通过观测变量
来推测像素
对应的类别标签
。条件随机场如下:
条件随机场符合吉布斯分布:(此处的
即上面说的观测值)
其中的
是能量函数,为了简便,以下省略全局观测
:
其中的一元势函数
即来自于前端 FCN 的输出。而二元势函数如下:
二元势函数就是描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个 “距离” 的定义与颜色值和实际相对距离有关。所以这样 CRF 能够使图片尽量在边界处分割。
而全连接条件随机场的不同就在于,二元势函数描述的是每一个像素与其他所有像素的关系,所以叫 “全连接”。
关于这一堆公式大家随意理解一下吧... ... 而直接计算这些公式是比较麻烦的(我想也麻烦),所以一般会使用平均场近似方法进行计算。而平均场近似又是一堆公式,这里我就不给出了(我想大家也不太愿意看),愿意了解的同学直接看论文吧。
CRFasRNN
最开始使用 DenseCRF 是直接加在 FCN 的输出后面,可想这样是比较粗糙的。而且在深度学习中,我们都追求 end-to-end 的系统,所以 CRFasRNN 这篇文章将 DenseCRF 真正结合进了 FCN 中。
这篇文章也使用了平均场近似的方法,因为分解的每一步都是一些相乘相加的计算,和普通的加减(具体公式还是看论文吧),所以可以方便的把每一步描述成一层类似卷积的计算。这样即可结合进神经网络中,并且前后向传播也不存在问题。
当然,这里作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取 10 以内的迭代次数),所以文章才说是 as RNN。优化结果如下:
马尔科夫随机场 (MRF)
在 Deep Parsing Network 中使用的是 MRF,它的公式具体的定义和 CRF 类似,只不过作者对二元势函数进行了修改:
其中,作者加入的
为 label context,因为
只是定义了两个像素同时出现的频率,而
可以对一些情况进行惩罚,比如,人可能在桌子旁边,但是在桌子下面的可能性就更小一些。所以这个量可以学习不同情况出现的概率。而原来的距离
只定义了两个像素间的关系,作者在这儿加入了个 triple penalty,即还引入了
附近的
,这样描述三方关系便于得到更充足的局部上下文。具体结构如下:
这个结构的优点在于:
- 将平均场构造成了 CNN
- 联合训练并且可以 one-pass inference,而不用迭代
高斯条件随机场 (G-CRF)
这个结构使用 CNN 分别来学习一元势函数和二元势函数。这样的结构是我们更喜欢的:
而此中的能量函数又不同于之前:
而当
是对称正定时,求
的最小值等于求解:
而 G-CRF 的优点在于:
- 二次能量有明确全局
- 解线性简便很多
感悟
- FCN 更像一种技巧。随着基本网络(如 VGG, ResNet)性能的提升而不断进步。
- 深度学习 + 概率图模型(PGM)是一种趋势。其实 DL 说白了就是进行特征提取,而 PGM 能够从数学理论很好的解释事物本质间的联系。
- 概率图模型的网络化。因为 PGM 通常不太方便加入 DL 的模型中,将 PGM 网络化后能够是 PGM 参数自学习,同时构成 end-to-end 的系统。
完结撒花
引用
[1]Fully Convolutional Networks for Semantic Segmentation
[2]Learning Deconvolution Network for Semantic Segmentation
[3]Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials
[4]Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
[5]Conditional Random Fields as Recurrent Neural Networks
[7]Semantic Image Segmentation via Deep Parsing Network
[8]Fast, Exact and Multi-Scale Inference for Semantic Image Segmentation with Deep Gaussian CRFs
[9]SegNet
转载须全文转载且注明作者和原文链接,否则保留维权权利
写下你的评论...文章的引用太乱,我重新整理成保持与文章小章节顺序一致,且所有超链接尽可能指向当前最新的 arxiv 且被格式化完整的 paper title.
FCN:
[1605.06211] Fully Convolutional Networks for Semantic Segmentation
SegNet:
A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
DeconvNet:
[1505.04366] Learning Deconvolution Network for Semantic Segmentation
DeepLab:
全连接条件随机场 (DenseCRF):
Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials
CRFasRNN:
[1502.03240] Conditional Random Fields as Recurrent Neural Networks
马尔科夫随机场 (MRF):
[1509.02634] Semantic Image Segmentation via Deep Parsing Network
高斯条件随机场 (G-CRF):
好棒~谢谢作者~~
有用就好~
非常感谢, 请问您写过关于 cnn 的文章吗 或者推荐的文章
就是普通的 CNN 吗?这个可以看看三巨头合出的 nature 的论文: Deep Learning
好棒~~
总结的不错,有兴趣来商汤实习么?会有非常多实际中需要用 segmentation 解决的问题,也会有不少适合 research 的 topic 有兴趣可以私聊