FCN的理解(Fully Convolutional Networks for Semantic Segmentation)

全卷积神经网络(FCN)来自UC Berkeley的研究小组,开启了卷积神经网络解决语义分割问题的先河。FCN完成了一个像素级的端到端的语义分割框架,FCN可以接收任意尺寸的输入图像,通过反卷积对最后一个卷积层的feature map进行上采样,将它恢复到输入图像相同的尺寸。这样就可以对每一个像素产生一个预测,同时保留原始输入图像中的空间信息,最后在上采样的特征图上进行像素的分类。

Abstract:

主要成就: \textbf{主要成就:} 主要成就:本文的模型是那个时候开创性的全卷积网络,可以同时实现像素到像素,端到端的训练。
核心思想: \textbf{核心思想:} 核心思想:构建了全卷积网络,可以实现任意输入,并能通过有效推理和学习产生相同尺寸的输出。
主要方法: \textbf{主要方法:} 主要方法:将当前分类网络(AlexNet、VGGNet、GoogLeNet)改编成全卷积网络并进行微调设计了跳跃连接将全局信息和局部信息连接起来,作为补偿。
实验结果: \textbf{实验结果:} 实验结果:在PASCAL VOC、NYUDv2和SIFT Flow数据集上得到了state-of-the-art的结果

1.Introduction:

卷积神经网络在分类,检测,关键点预测,局部通信方面很有优势,因此自然可以想到把它用于对每个像素点的预测。
网络通过上采样层进行像素级别预测,并通过下采样池化学习,其中上采样部分可以从下采样网络中学习到特征,从而进行像素点的预测(类似于编码器-解码器)
语义分割一直存在着语义信息和细节信息的矛盾,语义信息足够,局部信息不足,细节就会模糊,边缘也就不精准;语义信息欠缺,局部信息准确,像素点预测就会错误,CNN就可以很好的编码语义信息和局部信息,整合到一个局部到全局的特征金字塔中。

2.Related work:

2.1 Fully convolutional networks:

主要介绍了CNN可以接受任意size输入这个想法的衍化过程,以及全卷积在之前的一些应用。

2.2 Dense prediction with convnets:

主要介绍了将CNN应用于密集点预测的一些方法,并总结了一些特点
和这些现有的方法不同的是,作者改编和扩展了深度分类架构,使用图像分类作为预处理,从全部图像的输入和ground truth(用于supervised 训练中训练集的分类准确性,也就是已经标注好的分割图片ground truth介绍:https://www.zhihu.com/question/22464082,通过全卷积微调来进行学习

3.全卷积网络:

介绍了输入和感受野是什么,强调CNN具有平移不变性

3.1. Adapting classififiers for dense prediction:

  1. 传统图像分类模型,输入尺寸固定,在全连接层也固定并抛掉空间坐标信息,但是全连接层可以看作是 kernel size完全覆盖到input size 的卷积(一种特殊的卷积),将全连接层换为卷积层之后就可以得到任意size的输入,比如在AlexNet中,4096个7×7×512的卷积核与最后输出的7×7×512的特征图进行卷积运算,最后得到1×1×4096的,与全连接层得到的4096个神经元是等价的,基于这个原理,也可以将输出表示成一个heatmap。将全连接层转化成全卷积层有两个好处,第一个就是可以任意size输入,第二个就是前向传导的时候会更快,对于前向传导更快的原因我是这么理解的:如果没有把全连接层转化成全卷积层的话,那么384×384的图像就必须切割成36张224×224的图像送进网络(因为含有全连接层的传统卷积神经网络只接受fixed size的输入),所以花费的时间更多了,但是转化为全卷积层后,就可以进行运算,只不过最后得到的结果是6×6×1000,就相当于36个1×1×1000,相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效的多,因为36次计算都在共享计算资源。

  2. 增大输入的尺寸,可以使输出的vectors变成map

  3. 由于作者将分类网络重新解释为针对任何大小的输入的全卷积的输出映射,但是输出维度会被下采样降维,使得这些网络的全卷积版本的输出变得很粗糙。
    以下介绍了三种方法来upsample到origin image,分别是Shift-and-stitch, decrease subsampling 以及 deconvolution,并表明,Shift-and-stitch计算量太大,虽然这一不足可以通过decrease subsampling 弥补,但是作者通过实验发现,使用deconvolution 非常有效。

3.2. Shift-and-stitch is fifilter rarefaction

这里可以看介绍:https://zhuanlan.zhihu.com/p/56035377

3.3. Upsampling is backwards strided convolution:

上采样是下采样的逆过程,若下采样将尺寸缩小为1/s,那上采样就要将尺寸扩大s倍,常用的上采样方法有:双线性插值(人工操作,不需要学习参数),详情见:
https://blog.csdn.net/zhanly19/article/details/99718242
转置卷积:
https://mp.weixin.qq.com/s?__biz=MzI4MjM1NzQ0OA==&mid=2247487960&idx=3&sn=aed9cd089d5bbbd05855f6409878babe&chksm=eb9a6a7fdcede3696e08f88c1ae910f0d0f39494629628aa426e2c49c27216e8207ddfce7c2a&mpshare=1&scene=23&srcid=0821exKrg2t6aqMqpy6ApZJP&sharer_sharetime=1598357668831&sharer_shareid=ea8d8c48cba7993df10a73b9f44730d1#rd
(在upsampling 操作后,再进行卷积的目的是–通过学习获得权值,因为转置卷积是要学习参数的)

3.4. Patchwise training :

  1. 在cs231n中有一个相关解释:即若要预测一个像素点的分类,需要输入一个n×n的patch(中心像素及附加周围的一些像素),将其喂给分类网络,以这个patch的分类结果就作为中心像素点的分类结果,在训练时将一个个patch组成一个batch作为网络输入,由于patchs可能高度重叠,所以需要一些sampling方法选取一些patchs作为训练集。但是为什么这么做,原来不是很懂,看完这个回答就清楚很多了:https://stackoverflow.com/questions/42636685/patch-wise-training-and-fully-convolutional-training-in-fcn
    Patchwise是因为图片信息有冗余,所以在每个batch中截取不同的含有目标的小图片,就能减少冗余信息(这里的冗余我是这么理解的:在大致相同场景下,背景像素基本不变,且经常出现),这样做可以使收敛更快,且一方面可以平衡类别(一般背景点都是远大于实例像素的),另一方面可以解决空间相关性等问题(一般在进行全图训练时,会出现一个问题,就是输入图像有太多空间相关性,为了解决这个问题,要么采样patch训练,要么对全图训练采样loss,这也就正好映证标题的“Patchwise training is loss sampling”)
  2. 在本文中提出没有必要使用patchwise training,因为如果一个batch刚好对应整张图片的感受野,那就跟输入整张图片没太大区别,而patch之间很容易重复,反而降低了效率,如果想要平衡类,可以对loss进行分配权重或者对loss进行采样,采样loss的方法就是随机忽视掉最后层的一些神经元,这样它的loss就不会被计算。但作者认为对FCN来说,进行分类的平衡其实没有必要,因为图像大部分都是背景。

4.分割结构(Segmentation Architecture)

4.1. From classififier to dense FCN

相当于把分类的model(预训练过的),移除了全连接层,加上上采样层,进行性能比较,该实验说明了一个观点:即使分类性能接近,但在分割上却有不同的效果(“Despite similar classifification accuracy, our implementation of GoogLeNet did not match this segmentation result.”)
在这里插入图片描述

4.2. Combining what and where

这段主要讲述了融合的方式。
在下采样结构中,一共有五个下采样层,前三层是浅层网络,能提取到局部信息,物体的几何信息比较丰富,对应的感受野比较小,可以有助于分割尺寸较小的目标,有利于提高分割的精确程度,后两层是深层网络,提取全局信息,物体的空间信息比较丰富,对应的感受野较大,有助于分割尺寸较大的目标,随着网络结构逐渐加深,特征图尺寸越来越小,这些局部信息都被处理成了全局信息,一开始的局部信息如果不做一个跳跃连接保留的话,后面就丢失了,那么就需要用一个跳跃结构对局部信息做一个备份,然后后面再和全局信息去进行融合。
在这里插入图片描述

如下图所示:对原图进行卷积conv1,pool1后图像缩小为1/2;对图像进行第二次卷积conv2,pool2后图像缩小为1/4;对图像进行第三次卷积conv3,pool3后图像缩小为1/8,此时保留pool3的feature map;对图像进行第四次卷积conv4,pool4后图像缩小为1/16,此时保留pool4的feature map;对图像进行第五次卷积conv5,pool5后图像缩小为1/32,然后把原来CNN操作过程中的全卷积层变成conv6,conv7,图像的feature map依旧为原图的1/32,此时图像不再叫feature map,而叫heatmap

上采样过程是通过反卷积(deconvolution)实现的。FCN-32s是直接对第五层输出放大32倍得到的,FCN-32s是FCN中最不好的一个输出,后面也能看出来,作用是做对比试验,为了验证跳跃式连接是有作用的;FCN-16s是将第五层输出上采样放大两倍,与pool4产生的feature map直接相加,再上采样16倍得到的;FCN-8s是将FCN-16s进行上采样放大两倍,与pool3产生的特征图相加,再放大8倍得到的,在这三个对比实验中,FCN-8s的效果最佳。
在这里插入图片描述

在这里插入图片描述

算法整体架构: \textbf{算法整体架构:} 算法整体架构:
在这里插入图片描述

首先将conv7拿出来做一个1×1的卷积,把通道改变成21(对应PASCAL VOC的分类),然后反卷积,进行尺度的扩大,变为34×34,pool4(就是第四个绿块)拿出来,进行一定的裁剪(灰色的块)得到34×34大小的尺寸(黄色的块),然后与上面的橙色块进行融合,再反卷积扩大尺寸到70×70,随后去找pool3的feature map(就是第三个绿块),同样先经过一个裁剪,裁剪成与70×70相同大小,得到黄色的块,之后与上面的橙色块融合,最后进行八倍的反卷积,求出的尺寸是568×568×21,原图是500,那么就把其做最后的裁剪,变成500×500×21,这样就做到了端到端同尺寸输入输出的目的。

4.3. Experimental framework

  1. Optimization
    配置了一些超参数:
    训练使用带动量的SGD
    mini-batch:20 images
    Fixed learning rate:103,104,5^-5(FCN-AlexNet, FCN-VGG16, FCN-GoogLeNet)
    Momentum:0.9
    weight decay:5^-4 or 2^-4

  2. Fine-tuning
    要对整个网络端到端地进行反向传播,如果只fine-tune分类网络(主干网络),相对于对所有层进行微调,则只有70%地性能表现。

  3. Patch Sampling
    作者发现patch sampling相对于整张图片训练没有性能的提升,反而在大的数据集上需要更多时间进行收敛,所以作者最后就抛了这种方式。

  4. Class Balancing
    全卷积可以通过对loss设置权重或者采样loss来平衡类别,但是对于作者使用的label,大约有3/4都是背景,所以类平衡并没有必要。

  5. Dense Prediction
    上采样使用了双线性插值来初始化转置卷积

  6. Augmentation
    作者尝试使用随机镜像以及在每个方向上将图像随机“抖动”0-32个像素,但并没有明显的改善。

  7. Implementation
    用Caffe写的,而且开源。

6.实验结果

主要是和别的方法在不同数据集上作比较,指标主要是pixel accuracy、mean accuraccy、mean IU(intersection over union)和frequency weighted IU。

7.结论

全卷积网络可以看作是分类网络的一种特例,基于这一点,将分类网络扩展到分割,并改进具有多分辨率层组合的体系结构,极大的改进了最新技术,同时简化并加速了学习和推理。

8.training trick

个人觉得这篇文章的Training Trick有如下几点:

  1. 加载预训练模型
  2. 初始化反卷积参数:用双线性插值来初始化反卷积核,目的是为了让module更快收敛
  3. 至少175个epoch后算法才会有不错的表现:作者进行大量实验得到的经验之谈
  4. 学习率在100次之后进行调整:后期对学习率调整应该更精细一点,这样才不会错过loss 最小值
  5. Pool3之前的特征图不需要融合:作者在文章中用实验证实了,如果融合了pool1,pool2的话,会起到负优化的作用,对结果影响很小,所以不需要
    在这里插入图片描述
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值