CRF+FCN

图像语义分割之FCNCRF

介绍

图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类

从图像上来看,就是我们需要将实际的场景图分割成下面的分割图:

CRF+FCN_第1张图片 
不同颜色代表不同类别。

经过我阅读"大量"论文(羞涩)和查看Pascal VOC 2012 Learderboard,我发现图像语义分割从深度学习引入这个任务(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

卷积化

卷积化即是将普通的分类网络,比如VGG16ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。如下图: 
CRF+FCN_第2张图片

 

上采样

此处的上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,CaffeKera里叫Deconvolution,而tensorflow里叫conv_transposeCS231n这门课中说,叫conv_transpose更为合适。

众所诸知,普通的池化(为什么这儿是普通的池化请看后文)会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。

反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。图解如下:

CRF+FCN_第3张图片

但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:

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.

跳跃结构

(这个奇怪的名字是我翻译的,好像一般叫忽略连接结构)这个结构的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:

CRF+FCN_第4张图片

而不同上采样结构得到的结果对比如下: 
CRF+FCN_第5张图片

当然,你也可以将pool1 pool2的输出再上采样输出。不过,作者说了这样得到的结果提升并不大。 
这是第一种结构,也是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。

SegNet/DeconvNet

这样的结构总结在这儿,只是我觉得结构上比较优雅,它得到的结果不一定比上一种好。

SegNet

CRF+FCN_第6张图片

DeconvNet

CRF+FCN_第7张图片

这样的对称结构有种自编码器的感觉在里面,先编码再解码。这样的结构主要使用了反卷积和上池化。即: 
CRF+FCN_第8张图片 
CRF+FCN_第9张图片

反卷积如上。而上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0OK

 

DeepLab

接下来介绍一个很成熟优雅的结构,以至于现在的很多改进是基于这个网络结构的进行的。

首先这里我们将指出一个第一个结构FCN的粗糙之处:为了保证之后输出的尺寸不至于太小,FCN的作者在第一层直接对原图加了100padding,可想而知,这会引入噪声。

而怎样才能保证输出的尺寸不会太小而又不会产生加100padding这样的做法呢?可能有人会说减少池化层不就行了,这样理论上是可以的,但是这样直接就改变了原先可用的结构了,而且最重要的一点是就不能用以前的结构参数进行fine-tune了。所以,Deeplab这里使用了一个非常优雅的做法:poolingstride改为1,再加上1padding。这样池化后的图片尺寸并未减小,并且依然保留了池化整合特征的特性

但是,事情还没完。因为池化层变了,后面的卷积的感受野也对应的改变了,这样也不能进行fine-tune了。所以,Deeplab提出了一种新的卷积,带孔的卷积:Atrous Convolution.即: 
CRF+FCN_第10张图片

而具体的感受野变化如下: 
CRF+FCN_第11张图片

a为普通的池化的结果,b"优雅"池化的结果。我们设想在a上进行卷积核尺寸为3的普通卷积,则对应的感受野大小为7.而在b上进行同样的操作,对应的感受野变为了5.感受野减小了。但是如果使用hole1Atrous Convolution则感受野依然为7.所以,Atrous Convolution能够保证这样的池化后的感受野不变,从而可以fine tune,同时也能保证输出的结果更加精细。即:

CRF+FCN_第12张图片

总结

这里介绍了三种结构:FCN, SegNet/DeconvNetDeepLab。当然还有一些其他的结构方法,比如有用RNN来做的,还有更有实际意义的weakly-supervised方法等等。

 

后端

终于到后端了,后端这里会讲几个场,涉及到一些数学的东西。我的理解也不是特别深刻,所以欢迎吐槽。

全连接条件随机场(DenseCRF)

对于每个像素i具有类别标签xi还有对应的观测值yi,这样每个像素点作为节点,像素与像素间的关系作为边,即构成了一个条件随机场。而且我们通过观测变量yi来推测像素i对应的类别标签xi。条件随机场如下: 
CRF+FCN_第13张图片

条件随机场符合吉布斯分布:(此处的x即上面说的观测值

P(X=x|I)=1Z(I)exp(−E(x|I))


其中的E(x|I)是能量函数,为了简便,以下省略全局观测I 

E(x)=iΨu(xi)+i<jΨp(xi,xj)


其中的一元势函数iΨu(xi)即来自于前端FCN的输出。而二元势函数如下: 

Ψp(xi,xj)=u(xi,xj)m=1Mω(m)k(m)G(fi,fj)


二元势函数就是描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个"距离"的定义与颜色值和实际相对距离有关。所以这样CRF能够使图片尽量在边界处分割。而全连接条件随机场的不同就在于,二元势函数描述的是每一个像素与其他所有像素的关系,所以叫"全连接"

关于这一堆公式大家随意理解一下吧… …而直接计算这些公式是比较麻烦的(我想也麻烦),所以一般会使用平均场近似方法进行计算。而平均场近似又是一堆公式,这里我就不给出了(我想大家也不太愿意看),原意了解的同学直接看论文吧。

CRF as RNN

最开始使用DenseCRF是直接加在FCN的输出后面,可想这样是比较粗糙的。而且在深度学习中,我们都追求end-to-end的系统,所以CRFasRNN这篇文章DenseCRF真正结合进了FCN。这篇文章也使用了平均场近似的方法,因为分解的每一步都是一些相乘相加的计算,和普通的加减(具体公式还是看论文吧),所以可以方便的把每一步描述成一层类似卷积的计算。这样即可结合进神经网络中,并且前后向传播也不存在问题。当然,这里作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取10以内的迭代次数),所以文章才说是as RNN。优化结果如下: 
CRF+FCN_第14张图片

感悟

  • FCN更像一种技巧。随着基本网络(如VGG ResNet)性能的提升而不断进步。
  • 深度学习+概率图模型(GPM)是一种趋势。其实DL说白了就是进行特征提取,而GPM能够从数学理论很好的解释事物本质间的联系。
  • 概率图模型的网络化。因为GPM通常不太方便加入DL的模型中,将GPM网络化后能够是GPM参数自学习,同时构成end-to-end的系统。

完结撒花

引用

[1]Fully Convolutional Networks for Semantic Segmentation 
[2]Learning Deconvolution Network for Semantic Segmentation 
[3]SegNet 
[4]Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials 
[5]Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs 
[6]Conditional Random Fields as Recurrent Neural Networks 
[7]DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, 
and Fully Connected CRFs
 
[8]Semantic Image Segmentation via Deep Parsing Network 
[9]Fast, Exact and Multi-Scale Inference for Semantic Image Segmentation with 
Deep Gaussian CRFs

 

 

 

-----------------------------------分割线--------------------------------------------

 

 

 

 

CRF as RNN语义分割

原文地址http://blog.csdn.net/hjimce/article/details/50888915

作者hjimce

一、相关理论

本篇博文主要讲解文献《Conditional Random Fields as Recurrent Neural Networks》,实现了图像语义分割的再次突破。首先我觉得这篇文献的题目应该翻译成:把CRF迭代推理过程看成是RNN;可能很多人看到文献题目就把它翻译成:CRFRNN的结合,以至于后面看文献觉得迷迷糊糊不知所云,然而这篇文献实质上是FCNCRF的端到端结合训练。

文献最大的意义在于CRF的求解推理迭代过程看成了RNN的相关运算,嵌入CNN模型中,达到了真正的算法之间的融合。想要深入理解这篇文献,需要先学会文献《Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials》、《Fully Convolutional Networks for Semantic Segmentation》、《Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs》。特别是需要深入理解稠密条件随机场,并且要理解其代码层面的实现,后面才能看懂文献是怎么把CRF看成是RNN的。

众所周知,近几年CNN在图片分类、物体检测取得了不俗的成绩,于是人们开始探索像素级的标注分类,也就是图片的语义分割,其中语义分割的开山之作当属FCN。然而FCN得到的结果很粗糙,比如物体分割的边缘还不够精确,比如下面:

CRF+FCN_第15张图片 

本来那只马的两只腿之间,有部分的像素是草地,但是分割结果是把那一小块的草地,判别为了马。具体原因如下:

一来是因为CNN感受野过大、以至于我们最后的分割输出很粗糙(在网络最后一层的时候,每个神经元对应到原始图片的一块很大区域)FCN最后放大比例是32倍,分割不粗糙才怪;

二来是因为CNN缺少对空间、边缘信息等约束。CNN是一种端到端的模型,没有加入任何已有的先验约束,我们是希望图像分割的时候,在边缘的地方裂开的概率大一些(梯度越大的地方)。或者说我们希望两个相邻的像素如果差别越大,那么这两个像素属于不同类别的概率应该越大;如果两个相邻像素点的颜色非常接近,那么它们属于不同类别的概率应该越小。因此如果能够把这些人工已有的先验约束信息加入其中,那算法就会有进一步的提升。

二、FCN粗分割+CRF精分割—概述

根据上面FCN分割结果存在的不足是:感受野过大、边缘约束不够强。于是根据这两点不足,文献DeepLab:《Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs》提出的算法是:先利用FCN做粗分割、然后再利用CRF进行精分割。具体FCN改进如下:

1、把第一层卷积层的卷积核大小由7*7改为3*3(减小感受野)

2、减小下采样比例,本来我们FCN下采样比例是32,通过减小stride大小,下采用比例为8(减小感受野)

3、采用全连接条件随机场,对FCN分割结果进行精细化分割(增强边缘约束)

我们需要清楚的是这篇文献的算法,粗分割和精分割是完全分开的,并不是一个端到端的训练模型,算法有点low。也就是FCNCRF扯不上关系,只不过CRF利用了FCN的结果作为一元势函数

所以如果我们能够把CRFFCN把这两个强大的招式融汇贯通,搞出一个端到端的训练模型,那么精度必然可以进一步提升,这也正是《CRF as RNN》这篇文献的思想,这篇文献把CRF的学习、推理过程看成是RNN,然后嵌入CNN模型中,搞出了一个新的招式,完成了端到端的训练、预测。

三、全连接条件随机场概述

1、全连接条件随机场与稀疏条件随机场的区别

学习本部分,默认你已经学过条件随机场的图像处理相关算法,这边只做简单的概述。在以前我们所接触到的条件随机场基本上都是稀疏条件随机场,你所看到的教程也大部分指的是稀疏条件随机场。

这里我们先回顾一下条件随机场图像分割能量函数的构造:定义隐变量Xi为像素点i的分类标签,它的取值范围是就是我们要分类的语义标签L={l1,l2,l3……}Yi为每个随机变量Xi的观测值,也就是每个像素点的颜色值。条件随机场的图像语义分割的目标就是:通过观测变量Yi,推理出潜变量Xi的对应类别标签。

CRF+FCN_第16张图片 

对于一张图像来说,我们把它看成图模型G=(V,E),图模型的每个顶点对应一个像素点,即V={X1X2,……Xn}。对于边来说,

(1)如果是稀疏条件随机场,那么我们构造图模型的边集合E就是:每对相邻的像素点间可以构造一条边。当然除了4邻域构造边之外,你也可以用8邻域模型。

(2)全连接条件随机场与稀疏条件随机场的最大差别在于:每个像素点都与所有的像素点相连接构成连接边。这就恐怖了,如果一张图像是100*100,那么就相当于有10000个像素点,因此如果采用全连接条件随机场的话,那么就会构造出约10000*10000条边。如果图像大小再大一些,那么就会变得非常恐怖,普通条件随机场推理算法,根本行不通。好在文献《Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials》给出了快速推理算法。接着我们就简单讲解具体的求解算法。

2、条件随机场的目标函数是

E表示边集合。

最小化上面的能量就可以找到最有可能的分割。

(1)能量方程的第一项Ψu(xi),称之为一元势函数,用于衡量当像素点i的颜色值为yi时,该像素点属于类别标签xi的概率。这个从直观上可以这么理解:假如一个像素点的颜色值yi是绿色,那么它属于草地的概率应该比较大;假如一个像素点颜色值是蓝色,那么它属于天空的概率应该比较大,这就是这个能量项的作用。在深度还未杀入这个领域之前,以前的算法第一项一元函数势能一般是通过SVM等分类器训练得到的,或者通过构建每个类别的高斯混合模型(构建每个类别的高斯混合模型,这样当一个像素点的值为yi的时候,我们就可以计算出此像素点属于每个类别的概率值,类似图像分割Grab cut算法)。

不过现在有了CNN了,这一个能量项我们可以直接通过CNN计算出来,因为CNN训练完毕后,可以输出每个像素点,属于每个类别的概率值DeepLab这篇文献的算法就是用CNN输出,作为CRF的一元势能量。

(2)能量方程的第二项成对势函数Ψp(xi,xj)。用于衡量两事件同时发生的概率p(xi,xj),或者说的简单一点就是:我们希望两个相邻的像素点,如果颜色值yiyj非常接近,那么这两个像素点xixj属于同一个类别的概率应该比较大才对;反之如果颜色差异比较大,那么我们分割的结果从这两个像素点裂开的概率应该比较大才对。这一个能量项正是为了让我们的分割结果,尽量的从图像边缘的地方裂开,也就是为了弥补前面所说的FCN分割的不足之处

这个我们可以用如下公式计算:

其中Kg是一个高斯核,用于度量像素点ij的特征向量相似度的一个高斯权重项。特征向量fi我们可以用(x,y,R,G,B)表示,也就是以像素点的像素值和坐标位置作为特征向量。然后u(xi,xj)就表示两个标签之间的一个兼容性度量。通过最小化上面的CRF能量函数,我们就可以实现CRF的隐变量X的推理。接着我们就来说说怎么稠密条件随机场怎么推理,求解能量函数。

3求解方法

成对势函数Ψp(xi,xj),也就是相当于图模型的每一条边的能力值,上面我们说到对于一个稠密条件随机场来说,边数数目是非常多的:

四、CRF as RNN

OK,言归正传,我们接着就来讲讲怎么把CRF的推理过程看成是、卷积层、SoftMax层等神经网络层的组合,同时又和RNN有什么样的渊源。下面公式中的下标i表示第i张特征图。

4.1  

Zi是归一化因子。其实这个计算公式就是softmax函数,所以这一步的计算我们可以把它看成是神经网络的softmax层,所以我们用神经网络的softmax层替代这个步骤。

4.2

 Q(l)是一张概率图片,对应着原始图像每个像素点属于类别l的概率,这个就像引导滤波一样。如果我们语义分割有21个类别,那么CNN softmax层输出就是21张这样的概率图,每一张对应一个分类类别的概率图。

OK,这一步操作又是什么意思呢?K(fi,fj)是一个高斯核权重,或者说白了上面的公式就是要对图像Q(l)进行高斯模糊,这就相当于神经网络的卷积运算一样。

具体K(fi,fj)一般包含:位置、颜色度量等作为特征。比如我们就是用了这两种特征(见文献《Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials)

颜色特征:

位置特征:

   

这样我们可以每一张概率图Q(l),我们经过不同的特征滤波器之后,都可以得到两张滤波结果。这两张之间用加权组合在一起:

   

4.3

这一步可以看成是采用1*1的卷积层,对多个特征图进行卷积层运算。经过运算完后,每两张特征图又输出一张新的概率

 

 

-----------------------------------分割线--------------------------------------------

 

 

 

FCN & CRF 论文笔记

本篇文章涉及4篇论文分别是

Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials

Conditional Random Fields as Recurrent Neural Networks

SEMANTIC IMAGE SEGMENTATION WITH DEEP CON-VOLUTIONAL NETS AND FULLY CONNECTED CRFS

FULLY CONVOLUTIONAL MULTI-CLASS MULTIPLE
INSTANCE LEARNING

Weakly-_and_Semi-Supervised_Learning_of_a_Deep_Convolutional_Network_for

第一篇是介绍CRF在分割图片区域的算法(Mean Field)
第二篇是在VOC2012上排在前排的一个模型,它的特点是在fcn-8s的后面添加CRF层,与普通的算法不同的是,CRFasRNN模型会把Mean Field算法嵌入在网络层中,进行EndToEnd的训练(虽然效果并不是那么理想)
第三篇和第四篇是同一个算法,第三篇介绍是FCN-8S+CRF的调参大法,第四篇则是利用弱标签生成更多的训练数据,以优化网络参数。

CRF

CRF stands for Condition Random Field.

我们由于篇幅限制,在此处不过多讨论CRF的普遍的数学意义。我们简要地介绍CRF在图片区域分割的作用。

直观上的图片分割

我们使用Photoshop的魔术棒抠图作为例子。
实际上两个物体在边界的附近会有很明显的分别。这个"分别"表现为RGB值不平滑地变化。

CRF+FCN_第17张图片

PS

CRF+FCN_第18张图片

PS

CRF和最大熵

此处引入部分必要的数学公式。原文:

CRF+FCN_第19张图片

derivation1.png

derivation2.png

简而言之就是考虑以下的条件,以达到最小的Loss(最大熵)

  1. fcn-8s生成的每个点属于每一个类的概率。
  2. 相近且相似的点是否属于同一类,若属于同一类则penalty比较小,若不属于同一类则penalty比较大。

用公示表达则为:

Formula1

仅仅考虑1.的话就是裸的fcn-8s算法。我们来解释一下2.

考虑下图:

CRF+FCN_第20张图片

High Penalty

很明显,在瓶身的部分,绿色边界的两边RGB值是平滑的。而瓶子和白色背景部分RGB值不平滑。
在平滑的部分若存在区域与区域的切分,则会产生很高的loss
在不平滑的部分若不存在区域与区域的切分,则会产生很高的loss

比起上图,下图的loss会更低:

CRF+FCN_第21张图片

Low Penalty

用公示表达则为:

CRF Kernel

Mean Field Iteration

第一篇论文介绍了一种类似于Flood Fill和遗传算法的算法来求这个分割,这个算法叫做Mean Field

这个算法的过程如下:

Mean Field Formula 1

CRF+FCN_第22张图片

Mean Field Formula 2

整个过程分成4步:

  1. Initialize: 首先从fcn-8s生成一个很粗糙的分割(如下图中虚线部分)
  2. Message Passing. 传递相邻像素label之间的互相影响的关系。我们之前定义过k(fi, fj)的意义:
    在平滑的部分若存在区域与区域的切分,则会产生很高的loss
    在不平滑的部分若不存在区域与区域的切分,则会产生很高的loss
    也就是说这种Message Passing会很难穿过不平滑的部分(下图中实线的部分),所以label会像flood fill那样填充(如下图箭头方向)
  3. Compatibility Transform. 此部分是均衡一下各种二元关系之间的系数(Appearance Kernel & Smoothness Kernel)
  4. Local Update. 更新权值。输出结果或者将Update后的dense label map作为新的Q进行新的一轮Iteration

CRF+FCN_第23张图片

Mean Field Iteration Direction

 

你可能感兴趣的:(CRF+FCN)