FCN(Fully Convolutional Network)全卷积网络笔记

本文只是个人学习笔记
参考自:
全卷积网络FCN详细讲解(超级详细哦)
转置卷积(Transposed Convolution)

一、FCN讲解

1.1 FCN与CNN的区别

CNN:CNN就是卷积神经网络,在最后的卷积层之后会连接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。

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

两者区别:FCN和CNN的区别就是,FCN将CNN最后的全连接层也换成了卷积层,其输出是一张已经标记好的图,而不是一个概率值。

1.2 FCN如何进行上采样

为什么要进行上采样: FCN网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需要一个上采样将最后得到的输出上采样到原图的大小。上采样对于低分辨率的特征图,常常采用上采样的方式将它还原高分辨率,以下是上采样的三种方法。

1.2.1 双线性插值上采样

单线性插值(一个方向上)就是知道两个点的值,并将两点连成一条直线,来确定中间的点的值。是一个二维的坐标系。
相当于是求正方形主对角线上的点的值。
所以双线性插值(两个方向上)是一个三维的坐标系,因此需要找到4个点来确定中心点坐标,相当于是求正方体的主对角线上的点的值。我暂时没明白,详看这篇博客。

1.2.2 转置卷积上采样(也称为反卷积)

普通的卷积:会降低分辨率,提取特征,如下图33的卷积核卷积一个44的特征图得到2*2的输出。

而转置卷积上采样会使得分辨率提高,当然转置卷积也是卷积操作,不是卷积的逆运算。
转置卷积的运算步骤可以归为以下几步:
1、在输入特征图元素间填充s-1行、列(其中s表示转置卷积的步距)
2、在输入特征图四周填充k-p-1行、列(其中k表示转置卷积的kernel_size大小,p为转置卷积的padding,注意这里的padding和卷积操作中有些不同)
3、将卷积核参数上下、左右翻转
4、做正常卷积运算(填充0,步距1)

下面假设输入的特征图大小为2x2(假设输入输出都为单通道),通过转置卷积后得到4x4大小的特征图。这里使用的转置卷积核大小为k=3,stride=1,padding=0的情况(忽略偏执bias)。

1、首先在元素间填充s-1=0行、列(等于0不用填充)
2、然后在特征图四周填充k-p-1=2行、列
3、接着对卷积核参数进行上下、左右翻转
4、最后做正常卷积(填充0,步距1)

下图展示了转置卷积中不同s和p的情况:

s=1, p=0, k=3 s=2, p=0, k=3 s=2, p=1, k=3

转置卷积操作后特征图的大小可以通过如下公式计算:

其中stride[0]表示高度方向的stride,padding[0]表示高度方向的padding,kernel_size[0]表示高度方向的kernel_size,索引[1]都表示宽度方向上的。通过上面公式可以看出padding越大,输出的特征矩阵高、宽越小,你可以理解为正向卷积过程中进行了padding然后得到了特征图,现在使用转置卷积还原到原来高、宽后要把之前的padding减掉。
更多关于转置卷积的操作见转置卷积(Transposed Convolution)

1.2.3反池化上采样

反池化可以用下图来理解,再池化时需要记录下池化的位置,反池化时把池化的位置直接还原,其他位置填0。

上面三种方法各有优缺,双线性插值方法实现简单,无需训练;反卷积上采样需要训练,但能更好的还原特征图。

1.3 FCN具体实现过程

FCN与CNN的核心区别就是FCN将CNN末尾的全连接层转化成了卷积层:以Alexnet为例,输入是2272273的图像,前5层是卷积层,第5层的输出是256个特征图,大小是66,即25666,第6、7、8层分别是长度是4096、4096、1000的一维向量。如下图所示:

在FCN中第6、7、8层都是通过卷积得到的,卷积核的大小全部是1 * 1,第6层的输出是4096 * 7 * 7,第7层的输出是4096 * 7 * 7,第8层的输出是1000 * 7 * 7(7是输入图像大小的1/32),即1000个大小是77的特征图(称为heatmap),如下图所示:

经过多次卷积后,图像的分辨率越来越低,为了从低分辨率的热图heatmap恢复到原图大小,以便对原图上每一个像素点进行分类预测,需要对热图heatmap进行反卷积,也就是上采样。论文中首先进行了一个上池化操作,再进行反卷积(上述所提到的上池化操作和反卷积操作,其实可以理解为上卷积操作),使得图像分辨率提高到原图大小。如下图所示:

跳级(strip)结构:对第5层的输出执行32倍的反卷积得到原图,得到的结果不是很精确,论文中同时执行了第4层和第3层输出的反卷积操作(分别需要16倍和8倍的上采样),再把这3个反卷积的结果图像融合,提升了结果的精确度:

1.4 FCN模型实现过程

1.4.1 模型训练

  • 用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。

  • 采用全图做训练,不进行局部抽样。实验证明直接用全图已经很高效。
    FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。

  • 蓝色:卷积层

  • 绿色:Max Pooling层。

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

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

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

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

  • 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定。
    1、以经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用。

    2、 第一次反卷积(橙色)的步长为32,这个网络称为FCN-32s
    从16164096用11卷积成1616*21的特征图,之后直接上采样成大图。

    3、 第二次反卷积步长为16,这个网络称为FCN-16s
    上采样分为两次完成(橙色×2), 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。

    4、 第三次反卷积步长为8,记为FCN-8s。
    升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果。

    总体来说,本文的逻辑如下:

  • 想要精确预测每个像素的分割结果

  • 必须经历从大到小,再从小到大的两个过程

  • 在升采样过程中,分阶段增大比一步到位效果更好

  • 在升采样的每个阶段,使用降采样对应层的特征进行辅助

1.4.2 实例

现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap。
1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。
把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节。
最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

FCN(Fully Convolutional Network)全卷积网络笔记相关推荐

  1. GCN (Graph Convolutional Network) 图卷积网络

    这几个同时看一下,感觉能理解不少: B站视频:https://www.bilibili.com/video/BV1ta4y1t7EK GCN论文原文和代码:https://github.com/tki ...

  2. 【caffe-windows】全卷积网络特征图分析

    前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析 ...

  3. 【语义分割】全卷积网络(Fully Convolutional Networks, FCN)详解

    论文题目:<Fully Convolutional Networks for Semantic Segmentation> 论文地址:https://arxiv.org/abs/1411. ...

  4. Fully Convolutional Networks for Semantic Segmentation ————全卷积网络 FCN论文解读

    Fully Convolutional Networks for Semantic Segmentation 作者: Jonathan Long, Evan Shelhamer, Trevor Dar ...

  5. FCN(Fully Convolutional Network)与Unet:谈到语义分割不得不提的两个网络

    转载请注明出处:https://blog.csdn.net/wyzjack47/article/details/81107980 语义分割经典之作:FCN(Fully Convolutional Ne ...

  6. 机器学习笔记 - 全卷积网络(FCN)

    计算机视觉任务大致分为以下四种类型 1. Classification(分类)对图像内的对象进行分类(识别对象类). 2. Object Detection(目标检测)使用包围盒的对象对图像内的对象进 ...

  7. Udacity机器人软件工程师课程笔记(二十九) - 全卷积网络(FCN)

    全卷积网络(FCN) 1.全卷积神经网络介绍 FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题.与经典的CNN在卷积层之后使用全连接层得到固 ...

  8. 计算机视觉——全卷积网络(FCN)的学习笔记

    1 前言 最近语义分割的课程中讲到了全卷积网络FCN,感觉还是挺有趣的, FCN有一些独特的特点,其中我觉得最重要的特点,就是:输入图像大小的任意性,不过这种任意性不是通过resize操作实现的: 从 ...

  9. 全卷积网络(FCN)与图像分割

    全卷积网络(FCN)与图像分割 从图像分类到图像分割 卷积神经网络(CNN)自2012年以来,在图像分类和图像检测等方面取得了巨大的成就和广泛的应用. CNN的强大之处在于它的多层结构能自动学习特征, ...

最新文章

  1. 判断有向图g中顶点i到顶点j是否有路径_号称图的最短路径算法--Floyd算法
  2. python多维数据存储_在Python中存储和重新加载大型多维数据集
  3. tomcat - JVM 配置
  4. android自定义optionmenu,android - 自定义onOptionMenu外观 - 堆栈内存溢出
  5. Windows 2008 R2 中 IE9无法播放HTML5视频文件的解决方法!
  6. 校友邮箱_freeCodeCamp校友网络:FCC校友的自主指导网络
  7. LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)
  8. C/C++混淆点-转义字符
  9. as3 转义html,html和xml中的转义字符在Flash as3中的用法浅析
  10. 20150430 调试分析之 根据内核报错信息栈信息分析错误
  11. css border流光效果
  12. linux recv函数 参数,linux send recv函数详解
  13. 流媒体 直播细节优化
  14. 计算机网络地址怎么办,电脑ip地址错误怎么办 电脑ip地地址错误解决方法
  15. vue项目目录详细解读
  16. sql日期格式转换函数_SQL转换日期函数和格式
  17. 008 使用MyBatis,easyUI实现CRUD操作样例-CUD(CRUD完毕)
  18. java 获取est时间_java – 在EST时区获取XMLGregorianCalendar日期
  19. 山中无甲子,寒尽不知年
  20. 生成一个点开跳出情人节快乐和鲜花的python代码文件

热门文章

  1. linux db2 数据源配置文件,为 DB2 UDB 系列配置数据源
  2. TDSQL-C for PostgreSQL 主从架构详解
  3. 使用PyPI来发布FPGA Overlays
  4. 王者荣耀吃鸡哪款蓝牙耳机好用?手游电竞党最爱五款低延迟蓝牙耳机
  5. 我这半年到底干了啥(附多家详细面经)
  6. HBO视频服务仅获80万订户 挑战Netflix仍属空谈
  7. PHP mysql_connect()连接-已淘汰
  8. 2021年N1叉车司机模拟考试题库软件及N1叉车司机全国真题汇总
  9. 中国建筑设计行业发展现状及趋势分析,建筑理念更加人性化「图」
  10. 通过ip地址查询物理地址显示谷歌地图