FCN_语义分割

1. 前言

  • FCN是深度学习用于语义分割领域的开山之作,是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map,主要核心贡献在于:
    • 全卷积:采样端对端的卷积网络,将普通分类网络的全连接层换上对应的卷积层(FCN)
    • 上采样(upsample):即反卷积(deconvolution),恢复图片的位置信息等,反卷积层可以通过最小化误差学习得到。
    • 跳跃连接(skip layer):通过连接不同卷积层的输出到反卷积层,来改善上采样很粗糙的问题。
  • 本文包含了论文Fully Convolutional Networks for Semantic Segmentation的内容,最近正在读这篇论文

2. 基础概念

  • 图像分类

    识别一张图属于什么类别,例如狗、猫、飞机、船。

  • 目标检测

    可将图中目标进行识别并标注相关信息。

  • 语义分割

    对图中的每个不同的类别进行像素级别的标注,例如一张图中的人和天空是两个不同的颜色构成。

  • 实例分割

    标记实例和语义,即在语义分割的基础上,对每个类别进行细分,例如将“人”分为哪几个人。

  • 上述如下图所示:

3. CNN与FCN

  • 通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。

    如下:下图中的猫, 输入AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。

  • FCN相对用于图片分类领域的经典网络如Alexnet, VGG, Googlenet等只是在最后几层稍作了修改,替换,以让它们适用在了semantic segmentation上面。前面提到,需要预测一幅图像中所有像素点的类别,这是个空间密集型的预测任务。

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

  • 下图中可看出FCN相当于分类CNN网络在模型后端所有的变化:

  • 两者的区别也可以如下图所示:

4. 全卷积

  • 模型前端的输入

    • 一般CNN分类网络选择使用固定大小的image patch来作为输入,这个patch往往是从原图当中剪切出来的;
    • 而FCN网络则使用整张原图来作为输入,允许图片大小不固定。
  • 模型后端

    • CNN分类网络会使用FC层对最后的CNN层生成出的feature map进行处理,从而丢掉由前端CNN各层处理所一直保存着的图片上敏感区域的位置信息,进而只抽象表达出它的类别信息来,以交由后面的softmax等层来最终预测出它的类别概率分布;
    • FCN则不同,它丢掉CNN分类网络后端的FC层,进而保留了图片上的区域位置信息,又在其后加上了几层CNN来进一步分析处理,整合主干网络输出特征,最终它生成出着C+1(C为目标类别数,+1是考虑进去图片背景)个channels的heat map(本质上可以理解为是cnn所产生的feature map)来。
  • 由于FCN网络前端CNN处理过程中会不断选择用Pool来整合、下采样特征,从而扩大后来层次的receptive fields,因此最终我们生成出来的heat map其大小肯定要小于原输入图片大小。实际上最终生成的feature map比原图片缩小s倍,s为图片中下采样层次stride的乘积即累积下采样步长。

  • 而我们Semantic segmentation的目标是要预测输入图片每个像素点的可能类别。因此我们要想办法将输出的heat map与input raw image关联起来。简单的话可以直接使用线性二次插值来解决。FCN中通过在网络最后加入步长为s的deconvolution(下采样或反卷积)层来使得最终的网络输出heat map具有与输入原图一样的大小

  • 全连接层->卷积层

    • 第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为k=7,padding = 0,stride = 1,共4096个卷积核,这样输出数据体就为[1x1x4096]了。
    • 第二个全连接层,令其滤波器尺寸为K=1,共有4096个卷积核,这样输出数据体为[1x1x4096]。
    • 对最后一个全连接层,令其K=1,共1000个卷积核,最终输出为[1x1x1000]

5. 上采样(upsample)

  • 在FCN网络的前半部分,先降采样(卷积+池化),降采样是为了更好的获取语义信息,直白说就是如果不卷积就没法正确的分类。但是卷积和池化之后,feature map就变得很小了,为了恢复到原有图像的大小,采用上采样(反卷积)方法。即下图中红色箭头所指示的该步骤。

  • 先看一下卷积和反卷积的区别图示如下

  • 反卷积方式1:Full padding

    下图是一个反卷积的过程,首先在feature map上增加padding,padding的大小为Kernel size - 1,padding部分用0来填充。随后使用卷积核在对该feature 进行卷积操作。该图是一个strides(步长)为1的反卷积,即FULL卷积方式:

    full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1+N2-1 x N1+N2-1

  • 附注

    • no padding:不去填充0。用这种方式做卷积,叫做valid convolution
    • half padding = same padding:填充“一半”的0,即p=⌊k/2⌋,输出规模与输入规模相等。
    • full padding:此时p=k−1,输出规模比输入规模大。
  • 步长为2的反卷积

    下图是步长为2的反卷积,可以使得图片变大,这时候原图中就会出现孔,可以这么理解,反卷积与卷积对应,当卷积stride为2的时候,表明下一次卷积将跨越两个像素当反卷积stride为2时,意味着反卷积的步长为0.5,即需要走2步才能走到下一个像素位置。如下图所示:

  • 反卷积的效果如下图:

6. 跳跃连接(skip layer)

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

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

7. 模型训练

7.1 基于AlexNet模型

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

7.2 FCN示例

  • 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet
  • 蓝色:卷积层
  • 绿色:Max Pooling层
  • 黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合
  • 灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出
  • 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变

  • 全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征
  • 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,上采样的具体参数经过训练确定

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

  • 从特征小图(16∗16∗4096)预测分割小图(16∗16∗21),之后直接上采样为大图。(21个类别)

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

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

  • 第二次反卷积步长为16,这个网络称为FCN-16s
  • 上采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果

  • 第三次反卷积步长为8,记为FCN-8s
-------------The End-------------
谢谢大锅请我喝杯阔乐~