FCN:全卷积网络

FCN(Fully Convolutional Networks)是深度学习应用在图像分割的代表作,是一种端到端(end to end)的图像分割方法,让网络做像素级别的预测直接得出label map。

图像分割的分类:

  • semantic segmentation:只标记语义,只要分割出某一类即可。
  • instance segmentation:标记实例和语义,不仅分割出某一类,还要分割出是该类中的哪一个,也就是具体实例。

CNN与FCN

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

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

在这里插入图片描述
简单来说,FCN与CNN的区别在于把CNN最后的全连接层换成卷积层,输出的是一张已经label好的图片。
在这里插入图片描述

  • 在CNN中,猫的图片输入到AlexNet,得到一个长为1000的输出向量,表示输入图像属于每一类的概率,其中在“tabby cat”这一类统计概率最高,用来做分类任务。
  • FCN与CNN的区别在于把于CNN最后的全连接层转换成卷积层,输出的是一张已经label好的图片,而这张图片可以做语义分割。

卷积层

CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:

  • 较浅的卷积层感知域较小,学习到一些局部区域的特征。
  • 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高,所以我们可以将卷积层看作是特征提取器
    在这里插入图片描述
    这些抽象的特征对分类很有帮助,可以很好的判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好的给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。

传统的基于CNN的分割方法

为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:

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

而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别,即从图像级别的分类进一步延伸到像素级别的分类。

全连接->卷积层

全连接层

卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。
全连接层(Fully Connected Layers, FC)在卷积神经网络中相当于分类器的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。例如把一个3x3x5的最后一层卷积的输出feature map(特征图),转换成FC中1x4096的形式。
在这里插入图片描述
其实相当于又做了一层卷积,但是这次的卷积核尺寸是3x3x5(filter,或者称为滤波器),即全连接层特意设计了和feature map中大小尺寸相同的卷积核。此处卷积不想CNN之前卷积核下采样过程会产生深度矩阵feature map。这一次每一次卷积都会产生一个值(因为卷积核和feature map大小尺寸相同)。在把3x3x5的卷积输出转换成全连接层中4096神经元中之一的过程中,通过filter的激活函数,对5张3x3特征图中的每一张进行卷积,然后再把这5张feature map卷积结果求和,和就是4096个神经元之一。

全连接层存在的意义:全连接层之前的卷积层作用本质是提取特征,而全连接层的作用是分类。

全连接成在实际的运用中往往是2~3层,因为只有一层全连接层,有些情况下解决不了非线性问题。

注意到全连接层参数非常多(整个网络参数80%左右),一些性能优异的网络模型如GoogLeNet等,换用全局平均池化(Global Average Pooling, GAP)替换全连接层融合学到的深度特征。

以图像分类任务为例,在对最后一个卷积层进行池化后一般会再接2~3个全连接层(Full Connected Layer),这是一个高维向低维特征映射的过程,多个全连接层的作用是增加函数非线性,可以理解为提升分类的准确度。但是全连接层的加入会使模型产生过量参数,这种结构在VGG系列中仍有使用,之后的网络都在想办法减少和避免全连接层的使用(全卷积)。

全连接层和全卷积层的相互转化

全连接层和卷积层之间不同在于:卷积核中的权值每次滑动计算时只是局部连接,且在卷积列中的神经元共享参数——计算局部信息,而全连接层神经元的权值与所有输入相连——计算全局信息。但二者都是采用的矩阵的点积运算,具有相似的函数计算形式,因此能够实现相互转换。

  • 卷积——>全连接:权重矩阵参数增大,权重补0,由于参数共享性质,在其中大部分块中,存在大量相等参数。
  • 全连接——>全卷积:将卷积核的尺寸设置为和输入数据体的尺寸一致(NxWxHxC)。除第一层全连接外,其他通道数都为1,N表示本层神经元的个数,为一个提前设定的超参数,结果与初始的那个全连接层一致。

现以图像分类问题为例,最后需要得到的是所属类别的得分,输出应该是一个向量的表示形式。假设经过多个卷积与池化层后准备输入到全连接的是一个4x4x3的一般特征图(或理解为一张彩色图片),如果进行全连接操作,需要先将特征reshape到1x1x48,下图给出了一次全连接的图像,然后再接softmax,最后一层全连接网络一般不使用激活函数和批归一化BN,而其他的所有层目前的做法是首先尝试BN+ReLU进行激活,两者的先后顺序不一定,一般是激活在前。

将这一步全连接转化为全卷积操作时,以相同的输出作为比较,卷积神经网络的输入是4x4x3的图像,使用10个与原特征图一致的卷积核操作变为1x1x10的输出。实际上,可以将这全连接层中的任意一个转化为卷积层。
在这里插入图片描述
显然最后得出的结果都是一个1x1x10的向量,分析上面计算的参数量,对于reshape的全连接参数量为48x10,全卷积操作的计算量为4x4x3x10,因此参数量相等。但是全连接训练出来的权重矩阵是48x10,如果要使用模型训练的参数进行测试,最后一层卷积池化后的特征图大小只能是4x4x3,即起始输入的图像大小必须固定(因为训练后的模型固定了)。如果仍想使用训练好的模型进行前向传播获得分类结构,需要对图片进行区域计算,即对原始图片进行裁剪,使其成为满足要求的图片后才可以进行输入。例如,训练时输入模型的图片大小为32x32x1,待测试图像为64x64x1,需要进行滑窗采样。由于全连接的参数不共享,所以最后分类的结果和准确度需要先后进行多次计算然后取平均值。

减少和避免全连接层额使用能够有效降低模型的参数,将全连接层转化为卷积层的作用:

  • 解决了输入尺寸的限制。
  • 全连接层会破坏图像的空间结构,卷积会降低这种破坏,如channel=全连接的神经元个数时,使用1x1卷积代替全连接,效果很好。

在两种变换中,将去连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是227x227x3的图像,一系列的卷积层和下采样层将图像数据变为尺寸为7x7x512的激活数据体,AlexNet的处理方式为使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。可以将这3个全连接层中的任意一个转化为卷积层:

  • 第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为[7x7x4096],这样输出数据体就为[1x1x4096]。
  • 第二个全连接层,令其滤波器的尺寸为[1x1x4096],这样输出数据体为[1x1x4096]。
  • 最后一个全连接层也做类似的,令其滤波器尺寸为[1x1x1000],最终输出为[1x1x1000]。

FCN网络结构

输入图像为任意大小

传统CNN输入图像为固定大小,对于CNN,一幅输入图片经过卷积和池化层时,这些层是不关心图片大小的。进入全连接层时,feature map要拉成一条向量,而向量中每个元素作为一个结点都要与下一个层的所有结点全连接,神经网络结构一旦确定,它的权值个数都是固定的,所以层层向回看,输出图片大小要固定。

把全连接层的权重重塑成卷积层的滤波器,这样的转化可以在单个向前传播的过程中,使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。例如,让224x224尺寸的浮窗,以步长为32在384x384的图像上滑动,把每个经停的位置都带入卷积网络,最后得到6x6个位置的类别得分(6=(384-224)/32 + 1),那么通过将全连接层转化为卷积层之后的运算过程为:如果224x224的输入图像经过卷积层和下采样层之后得到了[7x7x512]的数组,那么384x384的图像直接经过同样的卷积层和下采样层后会得到[12x12x512]的数组,然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12-7)/1 + 1=6),这个结果正是浮窗在原图经停的6x6个位置的得分。

面对384x384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224x224块进行多次评价,其效果和使用FCN把全连接层变换为卷积层后的卷积神经网络进行一次前向传播时一样的。

如下图所示,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中输入的图像大小是统一固定resize成227x227大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13x13。而FCN输入的图像是HxW大小,第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32。(其实真正代码当中第一层是1/2,一次类推。)
在这里插入图片描述
经过多层卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到H/32xW/32的时候图像是最小的一层时,所产生图叫heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步,也是最后的一步对原图进行upsampling,把图像进行放大,放大到原图像的大小。

在这里插入图片描述
最后的输出是1000张heatmap,经过upsampling变为原图大小的图像,为了对每个像素进行分类预测,label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素的求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图像,如下图所示右侧有狗狗和猫猫的图。
在这里插入图片描述
相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效很多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,一次来获得更好的结果。比如,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后再求这些分值的平均值。

上采样(upsampling)

上采样操作可以看成是反卷积(Deconvolution),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过BP算法学习得到的。反卷积层也是卷积层,不关心输入图像尺寸大小。Deconv并不是真正的Deconvolution(卷积的逆变换),应该叫transposed convolution,deconv的前向传播就是conv的反向传播。
在这里插入图片描述

跳级(skip)结构

对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,即把倒数第几层的输出和最后的输出做一个fusion,即加和。
在这里插入图片描述
试验表明,这样的分割结果更准确。在逐层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个橙色层)可以包输入数据尺寸放大。和卷积层一样,上采样的具体参数经过训练确定。
在这里插入图片描述

  • 第一阶段,使用数据集对模型的分类backbone进行预训练,以经典的AlexNet分类网络作为初始化,使卷积层获得提取相应特征的能力。最后两层红色的是全连接层,参数弃去不用。
    在这里插入图片描述

  • 第二阶段,从特征小图(16x16x4096)预测分割小图(16x16x21),之后直接采样为大图(500x500x21)。每个通道预测一类的像素。反卷积(橙色)的步长为32,故该网络被称为FCN-32s。
    在这里插入图片描述

  • 第三阶段,上采样分为两次完成(橙色x2)。在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)通过跃层结构融合进来,提升精确性。第二次反卷积步长为16,这个网络为FCN-16s。
    在这里插入图片描述

  • 第四阶段,这个阶段和第三阶段差不多,相较多了一次上采样。这大概是最终得出的FCN模型,因为同样的原因被称为FCN-8s。
    在这里插入图片描述
    比较这几个阶段的输出可以看出,要精确预测每个像素的分割结果,必须经历从大到小,再从小到大的两个过程,在采样过程中,分阶段增大比一步到位效果更好,跃层结构利用浅层信息辅助逐步上采样,有更精细的结果。

优缺点

优点

与传统用CNN进行图像分割的方法相比,FCN有两大明显的优点:

  • 可以接受任意大小的输入图像,而不用要求所有的训练图像和预测图像具有同样的尺寸。
  • 更加高效,避免了由于使用像素块而带来的重复存储和计算卷积的问题。

缺点

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

参考资料
全卷积网络 FCN 详解
全卷积网络-FCN学习复习总结
CNN全连接层和卷积层的转化
AI:卷积神经网络CNN中全连接层产生和意义
shelhamer/fcn.berkeleyvision.org

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FCN卷积神经网络)是一种神经网络结构,它的特点是可以接收任意大小的输入图片,而不需要固定大小。相比于传统的CNN(卷积神经网络),FCN在较深的卷积层中融入了浅层卷积的特征,并且使用了三种上采样的方式来恢复原始图片的尺寸,其中FCN-8s是效果最好的一种方式。 与CNN不同,FCN将CNN中的连接层替换为卷积操作,这种操作被称为1x1卷积。这样做的目的是为了保持空间信息的完整性,使得网络能够对输入图片的每个像素进行预测,而不仅仅是对整个图片进行分类。 总之,FCN卷积神经网络通过融入浅层卷积特征和使用1x1卷积操作,实现了对任意大小图片的处理,并且在图像语义分割等任务中取得了良好的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [卷积神经网络FCN](https://blog.csdn.net/zqqbb7601/article/details/120704827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [卷积神经网络(FCN)](https://blog.csdn.net/qq_37497304/article/details/126599402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值