语义分割--全卷积⽹络FCN详解
语义分割--全卷积⽹络FCN详解
1.FCN概述
CNN做图像分类甚⾄做⽬标检测的效果已经被证明并⼴泛应⽤,图像语义分割本质上也可以认为是稠密的⽬标识别(需要预测每个像素点的类别)。
传统的基于CNN的语义分割⽅法是:将像素周围⼀个⼩区域(如25*25)作为CNN输⼊,做训练和预测。:cdc是什么
- 像素区域的⼤⼩如何确定
- 存储及计算量⾮常⼤
- 像素区域的⼤⼩限制了感受野的⼤⼩,从⽽只能提取⼀些局部特征
为什么需要FCN?
我们分类使⽤的⽹络通常会在最后连接⼏层全连接层,它会将原来⼆维的矩阵(图⽚)压扁成⼀维的,
从⽽丢失了空间信息,最后训练输出⼀个标量,这就是我们的分类标签。
⽽图像语义分割的输出需要是个分割图,且不论尺⼨⼤⼩,但是⾄少是⼆维的。所以,我们需要丢弃全连接层,换上全卷积层,⽽这就是全卷积⽹络了。具体定义请参看论⽂:
Berkeley团队提出 Fully Convolutional Networks(FCN)⽅法⽤于图像语义分割,将图像级别的分类扩展到像素级别的分类(图1),获得CVPR2015 的 best paper。
图1. FCN实现了 end-to-end 的图像语义分割
⽂章认为,发展到现在,基于深度学习的图像语义分割“通⽤框架已经确定”:前端 FCN(包含基于此的改进 SegNet、DeconvNet、DeepLab)+ 后端 CRF/MRF (条件随机场/马尔科夫随机场)优化
图2. 图像语义分割通⽤框架(摘⾃)
2.FCN原理及⽹络结构
⼀句话概括原理
FCN将传统卷积⽹络后⾯的全连接层换成了卷积层,这样⽹络输出不再是类别⽽是;同时为了解决因为卷积和池化对图像尺⼨的影响,提出使⽤上采样的⽅式恢复。
核⼼思想
本⽂包含了当下CNN的三个思潮:
- 不含全连接层(fc)的全卷积(fully conv)⽹络。可适应任意尺⼨输⼊。
- 增⼤数据尺⼨的反卷积(deconv)层。能够输出精细的结果。
- 结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。
⽹络结构
⽹络结构⽰意图:
⽹络结构详图。输⼊可为任意尺⼨图像彩⾊图像;输出与输⼊尺⼨相同,深度为:20类⽬标+背景=21。
3. 全卷积⽹络( Fully Convolutional Networks)
3.1 CNN 与 FCN
CNN
通常CNN⽹络在卷积层之后会接上若⼲个全连接层, 将卷积层产⽣的特征图(feature map)映射成⼀个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输⼊图像的⼀个数值描述(概率),⽐如AlexNet的ImageNet模型输出⼀个1000维的向量表⽰输⼊图像属于每⼀类的概率(softmax归⼀化)。
栗⼦:下图中的猫, 输⼊AlexNet, 得到⼀个长为1000的输出向量, 表⽰输⼊图像属于每⼀类的概率, 其中在“tabby cat”这⼀类统计概率最⾼。
FCN
考博士的条件
FCN对图像进⾏像素级的分类,从⽽解决了语义级别的图像分割(mantic gmentation)问题。与经典的CNN在卷积层之后使⽤全连接层得到固定长度的特征向量进⾏分类(全联接层+softmax输出)不同,FCN可以接受任意尺⼨的输⼊图像,采⽤反卷积层对最后⼀个卷积层的feature map进⾏上采样, 使它恢复到输⼊图像相同的尺⼨,从⽽可以对每个像素都产⽣了⼀个预测, 同时保留了原始输⼊图像中的空间信息, 最后在上采样的特征图上进⾏逐像素分类。
myanmar
最后逐个像素计算softmax分类的损失, 相当于每⼀个像素对应⼀个训练样本。下图是Longjon⽤于语义分割所采⽤的全卷积⽹络(FCN)的结构⽰意图:
简单的来说,FCN与CNN的区域在把于CNN最后的全连接层换成卷积层,输出的是⼀张已经Label好的图⽚。
CNN与FCN的区别与联系
其实,CNN的强⼤之处在于它的多层结构能⾃动学习特征,并且可以学习到多个层次的特征:
较浅的卷积层感知域较⼩,学习到⼀些局部区域的特征;
较深的卷积层具有较⼤的感知域,能够学习到更加抽象⼀些的特征。
这些抽象特征对物体的⼤⼩、位置和⽅向等敏感性更低,从⽽有助于识别性能的提⾼。下图CNN分类⽹络的⽰意图:
这些抽象的特征对分类很有帮助,可以很好地判断出⼀幅图像中包含什么类别的物体,但是因为丢失
了⼀些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
基于CNN的分割⽅法与FCN的⽐较
传统的基于CNN的分割⽅法:为了对⼀个像素分类,使⽤该像素周围的⼀个图像块作为CNN的输⼊⽤于训练和预测。这种⽅法有⼏个缺点:
⼀是存储开销很⼤。例如对每个像素使⽤的图像块的⼤⼩为15x15,然后不断滑动窗⼝,每次滑动的窗⼝给CNN进⾏判别分类,因此则所需的存储空间根据滑动窗⼝的次数和⼤⼩急剧上升。
⼆是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很⼤程度上的重复。
三是像素块⼤⼩的限制了感知区域的⼤⼩。通常像素块的⼤⼩⽐整幅图像的⼤⼩⼩很多,只能提取⼀些局部的特征,从⽽导致分类的性能受到限制。
⽽全卷积⽹络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进⼀步延伸到像素级别的分类。
3.2 全连接层-->卷积层
gm什么意思
全连接层与卷积层的相互转化原理
全连接层和卷积层之间唯⼀的不同就是卷积层中的神经元只与输⼊数据中的⼀个局部区域连接,并且在卷积列中的神经元共享参数。然⽽在两类层中,神经元都是计算点积,所以它们的函数形式是⼀样的。因此,将此两者相互转化是可能的:ourail
对于任⼀个卷积层,都存在⼀个能实现和它⼀样的前向传播函数的全连接层。权重矩阵是⼀个巨⼤的矩阵,除了某些特定块,其余部分都是零。⽽在其中⼤部分块中,元素都是相等的。
相反,任何全连接层都可以被转化为卷积层。⽐如,⼀个
全连接层转化为卷积层:在两种变换中,将全连接层转化为卷积层在实际运⽤中更加有⽤。假设⼀个卷积神经⽹络的输⼊是
针对第⼀个连接区域是[7x7x512]的全连接层,令其滤波器尺⼨为F=7,这样输出数据体就为[1x1x4096]了。
针对第⼆个全连接层,令其滤波器尺⼨为F=1,这样输出数据体为[1x1x4096]。
对最后⼀个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]
实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作⽤呢?它在下⾯的情况下可以更⾼效:让卷积⽹络在⼀张更⼤的输⼊图⽚上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。
实例:利⽤单个卷积层向前传播⽹络进⾏多位置评分
如果我们想让224×224尺⼨的浮窗,以步长为32在384×384的图⽚上滑动,把每个经停的位置都带⼊卷积⽹络,最后得到6×6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224×224的输⼊图⽚经过卷积层和下采样层之后得到了[7x7x512]的数组,那么,384×384的⼤图⽚直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组。然后再经过上⾯由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12 – 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6×6个位置的得分!
note:⾯对384×384的图像,让(含全连接层)的初始卷积神经⽹络以32像素的步长独⽴对图像中的224×224块进⾏多次评价,其效果和使⽤把全连接层变换为卷积层后的卷积神经⽹络进⾏⼀次前向传播是⼀样的。
Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32
pixels gives an identical result to forwarding the converted ConvNet one time.
将全连接层转化为卷积层-->全卷积⽹络
如下图所⽰,FCN将传统CNN中的全连接层转化成卷积层,对应CNN⽹络FCN把最后三层全连接层转换成为三层卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是⼀个长度为4096的⼀维向量,第8层是长度为1000的⼀维向量,分别对应1000个不同类别的概率。FCN将这3层表⽰为卷积层,卷积核的⼤⼩ (通道数,宽,⾼) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不⼀样的概念和计算过程,使⽤的是之前CNN已经训练好的权值和偏置,但是不⼀样的在于权值和偏置是有⾃⼰的范围,属于⾃⼰的⼀个卷积核。因此FCN⽹络中所有的层都是卷积层,故称为全卷积⽹络。
美国留学存款证明
CNN
下图是⼀个全卷积层,与上图不⼀样的是图像对应的⼤⼩下标,CNN中输⼊的图像⼤⼩是同意固定resize成 227x227 ⼤⼩的图像,第⼀层pooling后为55x55,第⼆层pooling后图像⼤⼩为27x27,第五层pooling后的图像⼤⼩为13*13。
⽽FCN输⼊的图像是H*W⼤⼩,第⼀层pooling后变为原图⼤⼩的1/4,第⼆层变为原图⼤⼩的1/8,第五层变为原图⼤⼩的1/16,第⼋层变为原图⼤⼩的1/32(勘误:其实真正代码当中第⼀层是1/2,)。
FCN
经过多次卷积和pooling以后,得到的图像越来越⼩,分辨率越来越低。其中图像到
FCN图像放⼤
最后的输出是1000张heatmap经过upsampling变为原图⼤⼩的图⽚,为了对每个像素进⾏分类预测label成最后已经进⾏语义分割的图像,这⾥有⼀个⼩trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最⼤数值描述(概率)作为该像素的分类。因此产⽣了⼀张已经分类好的图⽚,如下图右侧有狗狗和猫猫的图。
FCN获得图像语义
4. 上采样upsample
这⾥仅提供架构介绍,详见:
上采样,简单来说就是pooling的逆过程,pooling采样后数据数量减少,upsample采样后数据数量增多。FCN作者在论⽂中讨论了3种upsample⽅法,最后选⽤的是反卷积的⽅法(FCN作者称其为后卷积)使图像实现end to end,可以理解upsample就是使⼤⼩⽐原图像⼩得多的特征图变⼤,使其⼤⼩为原图像⼤⼩。
具体来讲,作者通过upsampling得到den prediction,研究过3种⽅案:
(1)shift-and-stitch:
设原图与FCN所得输出图之间的降采样因⼦是f,那么对于原图的每个f*f的区域(不重叠),“shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f." 把这个f*f区域对应的output作为此时区域中⼼点像素对应的output,这样就对每个f*f的区域得到了f^2个output,也就是每个像素都能对应⼀个output,所以成为了den prediction。
(2)filter rarefaction:
就是放⼤CNN⽹络中的subsampling层的filter的尺⼨,得到新的filter:
其中s是subsampling的滑动步长,这个新filter的滑动步长要设为1,这样的话,subsampling就没有缩⼩图像尺⼨,最后可以得到den prediction。
汽车发动机保养常识以上两种⽅法作者都没有采⽤,主要是因为这两种⽅法都是trade-off的,原因是:
对于第⼆种⽅法,下采样的功能被减弱,使得更细节的信息能被filter看到,但是receptive fileds会相对变⼩,可能会损失全局信息,⽽且会对卷积层引⼊更多运算,学习⽐较困难。
对于第⼀种⽅法,虽然receptive fileds没有变⼩,但是由于原图被划分成f*f的区域输⼊⽹络,使得filters⽆法感受更精细的信息(why?此部分正确性有待探究)。
(3)反卷积(deconvolutional)
upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数⼀样是在训练FCN模型的过程中通过bp算法学习得到。
反卷积(Deconvolution),当然关于这个名字不同框架不同,Caffe和Kera⾥叫Deconvolution,⽽tensorflow⾥叫conv_transpo。
CS231n这门课中说,叫conv_transpo更为合适。
众所诸知,普通的池化会缩⼩图⽚的尺⼨,⽐如VGG16 五次池化后图⽚被缩⼩了32倍。为了得到和原图等⼤的分割图,我们需要上采样/反卷积。
反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对⼀,前者是⼀对多。⽽反卷积的前向和后向传播,只⽤颠倒卷积的前后向传播即可。所以⽆论优化还是后向传播算法都是没有问题。图解如下:
5 跳跃结构
获取heatmap
经过前⾯操作,基本就能实现语义分割了,但是直接将全卷积后的结果进⾏反卷积,得到的结果往往⽐较粗糙。
如上图所⽰,对原图像进⾏卷积conv1、pool1后原图像缩⼩为1/2;之后对图像进⾏第⼆次conv2、pool2后图像缩⼩为1/4;接着继续对图像进⾏第三次卷积操作conv3、pool3缩⼩为原图像的1/8,此时保留pool3的featureMap;接着继续对图像进⾏第四次卷积操作conv4、pool4,缩⼩为原图像的1/16,保留pool4的featureMap;最后对图像进⾏第五次卷积操作conv5、pool5,缩⼩为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像⼤⼩依然为原图的1/32,此时图像不再叫featureMap⽽是叫heatMap。
跳跃结构实现精细分割
现在我们有1/32尺⼨的heatMap,1/16尺⼨的featureMap和1/8尺⼨的featureMap,1/32尺⼨的heatMap进⾏upsampling操作之后,因为这样的操作还原的图⽚仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征。因此在这⾥向前迭代,把conv4中的卷积核对上⼀次upsampling之后的图进⾏反卷积补充细节(相当于⼀个插值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进⾏再次反卷积补充细节,最后就完成了整个图像的还原。
具体来说,就是将不同池化层的结果进⾏上采样,然后结合这些结果来优化输出,分为FCN-32s,FCN-16s,FCN-8s三种,第⼀⾏对应FCN-32s,第⼆⾏对应FCN-16s,第三⾏对应FCN-8s。具体结构如下:
图中,image是原图像,conv1,conv2..,conv5为卷积操作,pool1,pool2,..pool5为pool操作(pool就是使得图⽚变为原图的1/2),注意con6-7是最后的卷积层,最右边⼀列是upsample后的end to end结果。必须说明的是图中nx是指对应的特征图上采样n倍(即变⼤n倍),并不是指有n个特征图,如32x upsampled 中的32x是图像只变⼤32倍,不是有32个上采样图像,⼜如2x conv7是指conv7的特征图变⼤2倍。(1)FCN-32s过程
只需要留意第⼀⾏,⽹络⾥⾯有5个pool,所以conv7的特征图是原始图像1/32,可以发现最左边imag
sympathy
e的是32x32(假设以倍数计),同时我们知道在FCN中的卷积是不会改变图像⼤⼩(或者只有少量像素的减少,特征图⼤⼩基本不会⼩很多)。看到pool1是16x16,pool2是
8x8,pool3是4x4,pool4是2x2,pool5是1x1,所以conv7对应特征图⼤⼩为1x1,然后再经过32x upsampled prediction 图⽚变回32x32。FCN作者在这⾥增加⼀个卷积层,卷积后的⼤⼩为输⼊图像的32(2^5)倍,我们简单假设这个卷积核⼤⼩也为32,这样就是需要通过反馈训gallery是什么意思
练32x32个权重变量即可让图像实现end to end,完成了⼀个32s的upsample。FCN作者称做后卷积,他也提及可以称为反卷积。事实上在源码中卷积核的⼤⼩为64,同时没有偏置bias。还有⼀点就是FCN论⽂中最后结果都是21×*,这⾥的21是指FCN使⽤的数据集分类,总共有21类。
(2)FCN-16s过程
现在我们把1,2两⾏⼀起看,忽略32x upsampled prediction,说明FCN-16s的upsample过程。FCN作者在conv7先进⾏⼀个2x conv7操作,其实这⾥也只是增加1个卷积层,这次卷积后特征图的⼤⼩为conv7的2倍,可以从pool5与2x conv7中看出来。此时2x conv7与pool4的⼤⼩是⼀样的,FCN作者提出对pool4与2x conv7进⾏⼀个fu操作(事实上就是将pool4与2x conv7相加,另⼀篇博客说是拼接,个⼈认为是拼接)。fu结果进⾏16x upsampled prediction,与FCN-32s⼀样,也是增加⼀个卷积层,卷积后的⼤⼩为输⼊图像的16(2^4)倍。我们知道pool4的⼤⼩是2x2,放⼤16倍,就是32x32,
这样最后图像⼤⼩也变为原来的⼤⼩,⾄此完成了⼀个16s的upsample。现在我们可以知
道,FCN中的upsample实际是通过增加卷积层,通过bp反馈的训练⽅法训练卷积层达到end to end,这时卷积层的作⽤可以看作是pool的逆过程。
(3)FCN-8s过程
这是我们看第1⾏与第3⾏,忽略32x upsampled prediction。conv7经过⼀次4x upsample,即使⽤⼀个卷积层,特征图输出⼤⼩为conv7的4倍,所得4x conv7的⼤⼩为4x4。然后pool4需要⼀次2x upsample,变成2x pool4,⼤⼩也为4x4。再把4x conv7,2x pool4与pool3进⾏fu,得到求和后的特征图。最后增加⼀个卷积层,使得输出图⽚⼤⼩为pool3的8倍,也就是8x upsampled prediction的过程,得到⼀个end to end的图像。实验表明FCN-8s优于FCN-16s,FCN-32s。
我们可以发现,如果继续仿照FCN作者的步骤,我们可以对pool2,pool1实现同样的⽅法,可以有FCN-4s,FCN-2s,最后得到end to end 的输出。这⾥作者给出了明确的结论,超过FCN-8s之后,结果并不能继续优化。
结合上述的FCN的全卷积与upsample,在upsample最后加上softmax,就可以对不同类别的⼤⼩概率进⾏估计,实现end to end。最后输出的图是⼀个概率估计,对应像素点的值越⼤,其像素为该类的结果也越⼤。FCN的核⼼贡献在于提出使⽤卷积层通过学习让图⽚实现end to end分类。
事实上,FCN有⼀些短处,例如使⽤了较浅层的特征,因为fu操作会加上较上层的pool特征值,导致⾼维特征不能很好得以使⽤,同时也因为使⽤较上层的pool特征值,导致FCN对图像⼤⼩变化有所要求,如果测试集的图像远⼤于或⼩于训练集的图像,FCN的效果就会变差。
6 训练过程
训练过程分为四个阶段,也体现了作者的设计思路,值得研究。
第1阶段
以经典的分类⽹络为初始化。最后两级是全连接(红⾊),参数弃去不⽤。
第2阶段joma
从特征⼩图(16*16*4096)预测分割⼩图(16*16*21),之后直接升采样为⼤图。
反卷积(橙⾊)的步长为32,这个⽹络称为FCN-32s。
这⼀阶段使⽤单GPU训练约需3天。
第3阶段
升采样分为两次完成(橙⾊×2)。
在第⼆次升采样前,把第4个pooling层(绿⾊)的预测结果(蓝⾊)融合进来。使⽤跳级结构提升精确性。
第⼆次反卷积步长为16,这个⽹络称为FCN-16s。
这⼀阶段使⽤单GPU训练约需1天。
第4阶段
升采样分为三次完成(橙⾊×3)。
进⼀步融合了第3个pooling层的预测结果。
第三次反卷积步长为8,记为FCN-8s。
这⼀阶段使⽤单GPU训练约需1天。
较浅层的预测结果包含了更多细节信息。⽐较2,3,4阶段可以看出,跳级结构利⽤浅层信息辅助逐步升采样,有更精细的结果。