FCN网络--基于bestrivern的blog和自己的理解

1,402 阅读10分钟

一.概述

FCN是深度学习应用在图像分割的代表作, 是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map。因为FCN网络中所有的层都是卷积层,故称为全卷积网络。

全卷积神经网络主要使用了三种技术:

  1. 卷积化(Convolutional)

  2. 上采样(Upsample)

  3. 跳跃结构(Skip Layer)

二.网络结构

FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类

output_5.png

三.全卷积详解

1.全连接与全卷积相互转化的可能性

全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:

  • 对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。
  • 任何全连接层都可以被转化为卷积层。全连接层实际就是卷积核大小为上层特征大小的卷积运算,卷积后的结果为一个节点,就对应全连接层的一个点。即若全卷积上一层的feature map尺寸为:NHNWNCN_H * N_W * N_C。全卷积层为:11K1 * 1 * K

则可以通过一个卷积操作来代替全连接层,该卷积核大小为NHNWNCN_H * N_W * N_C,且共有K个。

  • 卷积层到全连接层的实现:可以通过一个W和b完成卷积层到全连接层的转化,W:[K,W],b:[K,1]。

2.为什么传统CNN的输入图片是固定大小?

对于CNN,一幅输入图片在经过卷积和pooling层时,这些层是不关心图片大小的。比如对于一个卷积层,outputsize = (inputsize - kernelsize) / stride + 1,它并不关心inputsize多大,对于一个inputsize大小的输入feature map,滑窗卷积,输出outputsize大小的feature map即可(主要是这里的卷积核个数K可以自己指定)。pooling层同理。但是在进入全连接层时,feature map(假设大小为n×n)要拉成一条向量,而向量中每个元素(共n×n个)作为一个结点都要与下一个层的所有结点(假设4096个)全连接,这里的权值个数是4096×n×n,而我们知道神经网络结构一旦确定,它的权值个数都是固定的,所以这个n不能变化,n是conv5的outputsize,所以层层向回看,每个outputsize都要固定,那每个inputsize都要固定,因此输入图片大小要固定。

3.把全连接层的权重W重塑成卷积层的滤波器有什么好处?

一个确定的CNN网络结构之所以要固定输入图片大小,是因为全连接层权值数固定,而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层,经过这一层,还是得到二维的feature map,同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制

如下图所示,FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层 :           output_9.png

output_10.png

  • 全连接层转化为全卷积层 : 在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核
  • CNN中输入的图像大小是统一固定成227x227大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13x13, 而FCN输入的图像是H* W大小,第一层pooling后变为原图大小的1/2,第二层变为原图大小的1/4,第五层变为原图大小的1/8,第八层变为原图大小的1/16
  • 经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大几次到原图像的大小

相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算优化模型,然后再对36个位置做预测,使用转化后的卷积神经网络进行一次前向传播计算要高效得多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后在求这些分值的平均值。

三. 反卷积

 Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。    反卷积参数: 利用卷积过程filter的转置(实际上就是水平和竖直方向上翻转filter)作为计算卷积前的特征图。    反卷积的运算如下所示:

output_11.png               蓝色是反卷积层的input,绿色是反卷积层的outputFull padding, transposed Full padding, transposed。

四.跳级(skip)结构

  对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和:

output_12.png

实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。

五.模型训练

用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,全部都fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。 采用whole image做训练,不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。 对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。

FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet

  • 蓝色:卷积层

  • 绿色:Max Pooling层

  • 黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒

  • 灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出

  • 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变

  • 全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征

  • 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定 output_13.png

  1. 以经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用

output_14.png

2.从特征小图()预测分割小图(),之后直接上采样为大图。 

output_15.png

反卷积(橙色)的步长为32,这个网络称为FCN-32s

3.上采样分为两次完成(橙色×2), 在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性                       

output_16.png

第二次反卷积步长为16,这个网络称为FCN-16s

4.升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果

output_17.png

其他参数:

  • minibatch:20张图片

  • learning rate:0.001

  • 初始化:分类网络之外的卷积层参数初始化为0

反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习           output_18.png

六.FCN总结 FCN总结:

想要精确预测每个像素的分割结果必须经历从大到小,再从小到大的两个过程 在升采样过程中,分阶段增大比一步到位效果更好 在升采样的每个阶段,使用降采样对应层的特征进行辅助 缺点:

  • 得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感
  • 对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性