Fully Convolutional Networks for Semantic Segmentation

声明

本文仅为学习笔记,不做任何商用,在编写过程中参考甚至复制了其他博主的文章,如有冒犯可联系我进行删除,在此十分抱歉。

基于全卷积网络的语义分割

一、概述

论文地址
GitHub 代码地址

卷积神经网络(CNN)一直在驱动图像处理领域的进步,无论是整张图片的分类(ILSVRC),还是物体检测,关键点检测都在CNN的帮助下得到了非常大的发,但是图像语义分割不同于以上任务,这是个空间密集型(spatial dense prediction)的预测任务,这需要预测一幅图像中所有像素点的类别。

以往的用于语义分割的CNN,每个像素点用包围其的对象或区域类别进行标注,但是这种方法不管是在速度上还是精度上都有很大的缺陷。

这篇论文提出了全卷积网络(FCN)的概念,针对语义分割训练一个端到端,点对点的网络,达到了state-of-the-art。这是第一次训练端到端的FCN,用于像素级的预测;也是第一次用监督预训练的方法训练FCN。其主要思想是建立一个“完全卷积”网络,它接受任意大小的输入,通过密集的前向计算和反向传播进行有效的推理和学习并产生相应大小的输出。在构建网络过程中,通过将当代分类网络(AlexNet、VGG网络和GoogleLeNet)调整为完全卷积网络,并通过微调将它们的学习表示传递给分割任务;之后定义了一个跳级结构,它将来自深层、粗层的语义信息与来自浅层、细层的外观信息结合起来,以产生精确和详细的分段。
在这里插入图片描述

论文核心看点

  • 不含全连接层(fc)的全卷积(fully conv)网络,可适应任意尺寸输入。
  • 上采样的转置卷积(deconv)层,能够输出精细的结果。
  • 结合不同深度层结果的跳级(skip)结构,同时确保鲁棒性和精确性。

二、语义分割(semantic segmention)

参考博客:什么是图像语义分割
关于Grab Cut

图像语义分割是指机器自动分割并识别出图像中的内容,比如给出一个人骑摩托车的照片,机器判断后应当能够生成右侧图,红色标注为人,绿色是车(黑色表示背景)
在这里插入图片描述

一些常用于训练语义分割模型的数据集:

  • Pascal VOC 2012(patternanalysis,statistical modelling and computational learning visual objectclasses) :有 20 类目标,这些目标包括包括:人类;动物(鸟、猫、牛、狗、马、羊);交通工具(飞机、自行车、船、公共汽车、小轿车、摩托车、火车);室内(瓶子、椅子、餐桌、盆栽植物、沙发、电视),可用于目标类别或背景的分割;
  • Cityscapes:50 个城市的城市场景语义理解数据集;
  • Pascal Context:有 400 多类的室内和室外场景;
  • Stanford Background Dataset:至少有一个前景物体的一组户外场景。

三、前向计算与反向传播( feedforward computation and backpropagation)

参考博客1:详细公式推导*****
参考博客2:前向传播与反向传播
参考博客3:神经网络学习 之 BP神经网络
参考博客4:通俗易懂反向传播***
参考博客5:反向传播算法公式推导及代码

待继续研究…
神经网络学习过程由信号的前向传播与误差的反向传播两个过程组成。
前向传播:输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传播阶段。
反向传播:将输出以某种形式(传递函数是非线性变换函数)通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为调整各单元权值(网络的权重和偏置)的依据。

反向传播算法的含义是:第L层的一个神经元的误差项等于该神经元激活函数的梯度,再乘上所有与该神经元相连接的第L+1层的神经元的误差项的权重和
在这里插入图片描述
反向传播算法流程如下(参考博客1):
在这里插入图片描述

四、FCN与CNN

通常CNN网络在卷积之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。
在这里插入图片描述
CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。

这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。在传统的基于CNN的分割方法中,为了对一个像素分类,往往使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有以下几个缺点:

  • 存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。
  • 计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
  • 像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

FCN与经典的CNN在卷积层后使用全连接层得到固定长度的特征向量再进行分类不同,如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
FCN可以接受任意尺寸的输入图像,采用反卷积层(deconvolution)对最后一个卷积层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,从抽象的特征中恢复出每个像素所属的类别,实现了从图像级别的分类延伸到像素级别的分类
在这里插入图片描述

五、全连接层->卷积层:可适应任意尺寸的输入

传统CNN主要由卷积层与全连接层组成,卷积层的参数和输入大小无关,但全连接层的参数就与输入图像大小有关。如下图所示,卷积层输出的特征图(feature map)与全连接层的权值参数矩阵进行卷积再求和,每一次卷积得到的值求和之后的值就是全连接层的一个元素,可以看出,如果输入向量的维数不固定,那么全连接层的权值参数的量也是不固定的,就会造成网络的动态变化,无法实现参数训练目的。
在这里插入图片描述
而FCN删去了全连接层,通过使用转置卷积层对最后一个卷积层输出的特征图(feature map)进行上采样(upsampling), 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息.

六、转置卷积(Upsampling is backwards strided convolution)

参考博客1:CNN中的卷积、反卷积与反池化
参考博客2:FCN中反卷积、上采样、双线性插值之间的关系
参考博客3:怎样通俗易懂的解释反卷积?

首先贴个图便于理解(注:蓝色图为输入,青色图为输出,无填充,无stride)
正向卷积过程图示如下:
在这里插入图片描述
反向卷积过程图示如下:在这里插入图片描述
接着讨论正向卷积与反向卷积的数学计算过程:
在这里插入图片描述
由上可推反卷积实现过程:
在这里插入图片描述
在这里插入图片描述
截个栗子:
在这里插入图片描述

七、网络结构

逐像素预测

采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测。

经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图。
在这里插入图片描述
得到高维特征的heat map之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小,也就是将高维特征图(heat map)翻译成原图时对应的分割图像。
在这里插入图片描述
最后的输出是21张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在21张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。
在这里插入图片描述

跳级结构(skip structure)

待细化…

仅仅对conv5中的卷积核中的特征进行操作还原,限于精度问题不能够很好地还原图像中的特征,因此向前迭代,把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个插值过程),把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

具体来说,就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,分为FCN-32s,FCN-16s,FCN-8s三种,第一行对应FCN-32s,第二行对应FCN-16s,第三行对应FCN-8s。这便是实现精细分割的跳级结构,具体结构如下:
在这里插入图片描述

FCN-32s

从特征小图(16164096)预测分割小图(161621),之后直接上采样(upsampling)为大图。 反卷积(橙色)的步长为32,这个网络称为FCN-32s。 这一阶段使用单GPU训练约需3天。
在这里插入图片描述

FCN-16s

上采样分为两次完成(橙色×2),在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来,使用跳级结构提升精确性。 第二次反卷积步长为16,这个网络称为FCN-16s。 这一阶段使用单GPU训练约需1天。
在这里插入图片描述

FCN-8s

上采样分为三次完成(橙色×3),进一步融合了第3个pooling层的预测结果,第三次反卷积步长为8,记为FCN-8s。 这一阶段使用单GPU训练约需1天。
在这里插入图片描述
虚线上半部分为卷积(convolution)层(蓝:卷积,绿:max pooling)。对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。
虚线下半部分为反卷积(deconvolution)层(橙色×3)可以把输入数据尺寸放大,和卷积层一样,上采样的具体参数经过训练确定。

三个结构对比

在这里插入图片描述

八、代码解析

九、FCN的优点和不足

FCN 的优势在于:

  • 可以接受任意大小的输入图像
  • 更加高效,避免了使用邻域带来的重复计算和空间浪费的问题。

其不足也很突出:

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

十、引用

参考博客1:语义分割–全卷积网络FCN详解
参考博客2:图像语义分割之FCN和CRF
参考博客3:FCN的学习及理解

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值