原文链接:https://blog.csdn.net/qq_41760767/article/details/97521397?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

四、全卷积网络FCN详细讲解(超级详细哦)

  • 1、全卷积网络(FCN)的简单介绍
    • 1.1、CNN与FCN的比较
  • 2、FCN上采样理论讲解
    • 2.1、双线性插值上采样
    • 2.2、反卷积上采样
    • 2.3、反池化上采样
  • 2、 FCN具体实现过程
  • 3、 FCN模型实现过程
    • 3.1、模型训练
    • 3.2、FCN模型的简单总结

1、全卷积网络(FCN)的简单介绍

1.1、CNN与FCN的比较

CNN: 在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。如下图所示:

在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。

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

简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值。

2、FCN上采样理论讲解

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

2.1、双线性插值上采样

单线性插值(一个方向上)就是知道两个点的值,并将两点连成一条直线,来确定中间的点的值,假设,现在有两点 ( x 1 , y 1 ) 、 ( x 2 , y 2 ) ( x 1 , y 1 ) 、 ( x 2 , y 2 ) ( x 1 , y 1 ) 、 ( x 2 , y 2 ) (x1,y1)、(x2,y2)(x1,y1)、(x2,y2) (x_1,y_1 )、(x_2,y_2) (x1,y1)、(x2,y2)(x1,y1)、(x2,y2)(x1​,y1​)、(x2​,y2​)Q2​2=(x2​,y2​) 四个点的值。最常见的情况,f就是一个像素点的像素值。首先在 x 方向进行线性插值,得到:

然后在 y 方向进行线性插值,得到:

综合起来就是双线性插值最后的结果:

由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。opencv中的源码如下,用了一些优化手段,比如用整数计算代替float(下面代码中的*2048就是变11位小数为整数,最后有两个连乘,因此>>22位),以及源图像和目标图像几何中心的对齐

  • SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5
  • SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5,
    这个要重点说一下,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下。如果没有这个中心对齐,根据基本公式去算,就会得到左边这样的结果;而用了对齐,就会得到右边的结果:

2.2、反卷积上采样

怎样上采样: 普通的卷积操作,会使得分辨率降低,如下图33的卷积核去卷积44得到2*2的输出。

上采样的过程也是卷积,那么怎么会得到分辨率提高呢?之前我们看卷积时有个保持输出与输入同分辨率的方法就是周围补0。

其实上面这种补0的方法事有问题的,你想一下,只在四周补0会导致最边上的信息不太好,那我们把这个信息平均下,在每个像素与像素之间补0,如下图所示:

2.3、反池化上采样

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

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

2、 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个大小是7
7的特征图(称为heatmap),如下图所示:

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

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

最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来定。FCN可以接受任意大小的输入图像,但是FCN的分类结果还是不够精细,对细节不太敏感,再者没有考虑到像素与像素之间的关联关系,丢失了部分空间信息。

3、 FCN模型实现过程

3.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

从特征小图()预测分割小图(),之后直接升采样为大图。

3、 第二次反卷积步长为16,这个网络称为FCN-16s

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

4、 第三次反卷积步长为8,记为FCN-8s。

升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果。

其他参数:
• minibatch:20张图片
• learning rate:0.001
• 初始化:分类网络之外的卷积层参数初始化为0
• 反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习

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

• 想要精确预测每个像素的分割结果
• 必须经历从大到小,再从小到大的两个过程
• 在升采样过程中,分阶段增大比一步到位效果更好
• 在升采样的每个阶段,使用降采样对应层的特征进行辅助

缺点:

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

3.2、FCN模型的简单总结

FCN的卷积网络部分可以采用VGG、GoogleNet、AlexNet等作为前置基础网络,在这些的预训练基础上进行迁移学习与finetuning,对反卷积的结果跟对应的正向feature map进行叠加输出(这样做的目的是得到更加准确的像素级别分割),根据上采样的倍数不一样分为FCN-8S、FCN-16S、FCN-32S,图示如下:

详情:

对原图像进行卷积 conv1、pool1后原图像缩小为1/2;

之后对图像进行第二次 conv2、pool2后图像缩小为1/4;

继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的featureMap;

继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;

最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,

然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像大小依然为原图的1/32,此时图像不再叫featureMap而是叫heatMap。

实例

现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个差值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。(具体怎么做,本博客已经在3.1节进行了详细的讲解,不懂的地方可以回过头不查看。)如下图所示:注,上下两个图表达相同的意思。


http://www.taodudu.cc/news/show-5992423.html

相关文章:

  • 基于HTML+CSS制作一个简单的家乡网页制作作业,广州介绍旅游网页设计代码 学生个人html静态网页制作成品代码...
  • 爱旅游,爱幻想 - 厦门 - 有家的感觉
  • 泰国旅游请看
  • android 回车键、换行检索
  • C#中的textbox怎么在代码中打出回车键?
  • html回车符号展示
  • linux系统vim下输入回车换行符号的解决方法
  • 回车与换行在notepad中的应用
  • Winform 执行完 KeyPress后TextBox 文本多出来回车键符号(vbCrLf)解决方案
  • JQuery 回车键换行符转换
  • Office Word中回车符号变为奇怪的符号如何修正!
  • 计算机换行符号,计算机中的换行符、回车符、#92;n、#92;r、#92;n#92;r 怎么区分啊?...
  • html怎样回车,html回车
  • android回车键
  • \r、\n、“回车键”,三者的关系与区别?
  • android软键盘的回车键,Android中处理软键盘上“回车键”的2种方法
  • linux脚本回车键是什么,1秒自动按回车键的脚本
  • 修改echarts的x轴y轴的刻度和刻度线文本颜色和xy轴的轴线颜色和标题title的字体颜色
  • echarts中x轴 y轴配置(字体颜色,线的颜色,分割线,y周单位颜色)。vue中直接使用echarts以及vue中使用vue-echarts如何配置横向渐变与纵向渐变(后者适用于前者)
  • echarts如何优雅的去掉x轴y轴
  • python怎么交换xy轴_如何在matplotlib中更改x和y轴?
  • echarts 设置X轴Y轴字体大小不成功问题处理
  • r语言plot函数x轴y轴名字_R语言中绘图的注释函数小结
  • 御银股份(002177)首次公开发行股票网上路演公告,核心观点询价结论:御银股份 快速扩张的ATM运营龙头
  • 名帖175 苏轼 行书《寒食帖》
  • 如何在mac本上安装android sdk(转-完美解决)
  • 照猫画虎学太极(杨)
  • 杨式太极拳85势用法(上)
  • 智慧安全·御见未来 蓝盾股份重磅发布六款安全产品及解决方案
  • 面试官:对于 JavaScript 的加载问题你怎杨理解?

全卷积网络FCN详细讲解(超级详细哦)相关推荐

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

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

  2. 全卷积网络FCN详解

    转载自:  点击打开链接 背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题.神经网络大神Jonathan Long发表了<Fully Co ...

  3. 全卷积网络FCN与卷积神经网络CNN的区别

    背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题.神经网络大神Jonathan Long发表了<Fully Convolutional N ...

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

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

  5. 全卷积网络FCN的缺陷

    its inherent spatial invariance does not take into account useful global context information FCN没有考虑 ...

  6. FCN全卷积网络随笔

    参考:四.全卷积网络FCN详细讲解(超级详细哦) 这篇文章已经写的很好了,这里说两个我考虑的点. 第一个就是:FCN在缩小成heat map,为什么要通过上采样还原回原图大小? 我觉得这个的原因是因为 ...

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

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

  8. 全卷积网络(FCN)实战:使用FCN实现语义分割

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

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

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

最新文章

  1. python typing typescript_Python的价值,对比Java/Typescript
  2. java中判断字段真实长度(中文2个字符,英文1个字符)的方法
  3. 上手 Docker 容器,不应该是个问题
  4. 码云、coding拉取项目代码
  5. 可以储存照片的字段类型是_在sql server中,储存图片的数据类型是什么呀?
  6. 日常开发需要掌握的Maven知识
  7. 一次性搭建Hadoop高可用集群
  8. Java基本类型占用字节数(或 bit数)
  9. 最大报销额(HDU 1864)
  10. 矩阵范数与向量范数的公式及其理解
  11. SD卡格式化咋办?数据恢复看这里!
  12. 无线路由器怎么改密码
  13. web安全工具库(笔记)----端口扫描(端口扫描器.exe)
  14. 什么是Autorun病毒?它的运作原理是什么?如何手工清除?
  15. T229470 A. 小智的疑惑(暴力)
  16. 禁用ubuntu来宾账户
  17. 如何使用SC7A20
  18. node-js——将excel表格转换成json文件
  19. 京东到家开放平台消息系统-进阶之路
  20. 市场调研及发展前景分析报告有什么作用

热门文章

  1. 2016深圳房价上涨有感
  2. 人工智能,天使还是魔鬼
  3. 要跑得快,还需跑的稳
  4. 优朋普乐大数据_优朋普乐发5亿广告红包 开拓互联网电视价值空间
  5. HIVE攻略 JFK_异星蜂巢Alien Hive玩法进阶攻略大全
  6. PPTP协议、L2TP协议和SSTP协议的介绍
  7. 字符串相关,字符串结束符,sprintf_s
  8. storm drpc实例
  9. 服务器系统分多大合适,一般服务器的内存多大合适
  10. DC LAB8 SDC约束 四种时序路径分析