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

2023-10-28

原文链接: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

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,y1x2,y2x1,y1x2,y2x1,y1x2,y2Q22=(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节进行了详细的讲解,不懂的地方可以回过头不查看。)如下图所示:注,上下两个图表达相同的意思。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全卷积网络FCN详细讲解(超级详细哦) 的相关文章

  • wifi卡慢延迟高_如何解决家里的WiFi卡顿的问题

    作为不同网络之间互相连接的枢纽 路由器系统构成了基于TCP IP 的国际互联网络Internet 的主体脉络 也可以说 路由器构成了Internet的骨架 家里安装有WiFi的用户有没有注意到一个问题 就是在我们使用WiFi的时候 总会时不
  • 利用人工智能开启商业新时代

    ChatGPT是基于人工智能大模型架构的强大语言模型 它具备出色的自然语言处理和生成能力 能够与人类进行智能对话 无论是寻求创业灵感 市场调研 内容创作还是销售辅助 ChatGPT都可以为你提供强有力的支持 接下来 我将为大家详细介绍如何利
  • 第二章 数据迁移之Dolphinscheduler调度DataX从Mysql全量导入Hive

    绪 需求说明 将源系统mysql表数据全量抽取到hive中作为ODS层 不保留历史变化 create table T YYBZB TGH BANKINFO id int 8 bank id int 8 bank name varchar 2
  • 第四届蓝桥杯Java B组 马虎的算式

    马虎的算式 Description 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 x 495 396
  • unity航点寻径

    一 游戏框架 设置了六个路标 角色会在这六个路标之间一次移动 当移动到第六个路标后又会返回第一个路标 继续依次移动 road 道路 由五个立方体组成 sign 路标 由六个胶囊组成 enemy 寻路的角色 二 游戏实现 1 创建一个平面 赋
  • RGB颜色对照表大全

    常用颜色rgb 颜色对照表 一 R G B 值 R G B 值 R G B 值 黑色 0 0 0 000000 黄色 255 255 0 FFFF00 浅灰蓝色 176 224 230 B0E0E6 象牙黑 41 36 33 292421
  • pdf预览

    previewSop url axios get url responseType arraybuffer then res gt var data res data var blob new Blob data type applicat
  • 实现多线程爬取数据并保存到mongodb

    多线程爬取二手房网页并将数据保存到mongodb的代码 import pymongo import threading import time from lxml import etree import requests from queu
  • 什么是3d虚拟数字人?对未来发展有什么影响?

    3d虚拟数字人指的是以数字形式存在的人工智能 也被称为数字智能体 无论是在我们的周围 还是我们自己的体内 他们都能够利用数据和代码来进行模拟 操纵和创造各种不同的人类形态 基本上来说 数字人就是指那些具备大脑 眼睛 手和嘴等特性的数字化机器
  • 【Analyzing and Mitigating Interference in Neural Architecture Search】分析与缓解NAS权重共享方法中的子模型之间的干扰问题

    Analyzing and Mitigating Interference in Neural Architecture Search 论文地址 https proceedings mlr press v162 xu22h html 摘要
  • google-app-engine 上传下载 用户文件

    http blog notdot net 2009 9 Handling file uploads in App Engine http hi baidu com zjm1126 item 31d65e31962da022b3c0c56e
  • 数据库中如何将数据库文件转移到其他主机中

    目录 一 数据库文件 二 方法一 分离 gt 附加 三 方法二 脱机 gt 附加
  • VS问题总结记录(持续更新)

    1 error MSB8020 无法找到 v142 的生成工具 平台工具集 v142 若要使用 v142 生成工具进行生成 请安装 v142 生成工具 https blog csdn net weixin 39956356 article
  • 丰田工机安全plc编程软件pcwin safe

    丰田工机安全plc编程软件pcwin safe 14而且还是中文版的 绝对是难得的资源 toyopuc YID 17200678135439768 在现代工业领域 计算机技术的广泛应用已成为了工厂生产和管理的重要组成部分 同时也给工业安全带
  • node.js 如何读取json文件内容

    最简单的方式 const config require config json console log name config name console log age config age require方法的缺点 内容会被缓存 不适合动
  • cocos2d-x 浅析斗地主游戏分牌动作

    cocos2d x 浅析斗地主游戏分牌动作 分类 C C Cocos2d x学习笔记 2013 05 17 13 54 461人阅读 评论 0 收藏 举报 cocos2d x 斗地主 动作 最近在开发一款基于cocos2d x的斗地主棋牌游
  • MATLA技巧

    如何将MATLAB矩阵每列都归一化为单位向量 function matrix normalized norm matrix by column matrix column norms sqrt sum abs matrix 2 1 or v
  • 10款最著名的代码(文本)编辑器

    通常操作系统和软件开发包中都包含文本编辑器 可以用来编辑配置文件 文档文件和源代码 下面是笔者总结的 10 个最好的免费代码文本编辑器 1 NOTEPAD NOTEPAD 是一款免费又优秀的文本编辑器 支持在 MS Windows 环境下运

随机推荐

  • 全网最完整php禁用eval函数讲解

    1 eval是什么 eval是一个语言构造器 并不是系统组件函数 因此我们在php ini中使用disable functions是无法禁止它的 2 eval的危害 eval 对于php安全来说具有很大的杀伤力 因此一般不用的情况下为了防止
  • Linux下 C 遍历目录(opendir,readdir函数)

    opendir 函数 头文件 include
  • 如何用清华 ChatGLM 微调一个私域大模型

    曹政 曹大是我们圈子里公认的大佬 他在技术上不仅早早领先 在思维认知领域更是帮助很多小伙伴快速成长 没有 ChatGPT 之前 我一直在想 能否将曹大的思维 直接植入过来 就跟无崖子传输功力 头碰头就行 当然我多想了 ChatGPT 出来后
  • EXT.JS2.2表单上传文件

    var uploadFile new Ext form TextField fieldLabel 上传文件 id file name uploadFile height 25 width 860 blankText 请上传文件 itemCl
  • React中怎么实现状态自动保存(KeepAlive)?

    什么是状态保存 移动端中 用户访问了一个列表页 上拉浏览列表页的过程中 随着滚动高度逐渐增加 数据也将采用触底分页加载的形式逐步增加 列表页浏览到某个位置 用户看到了感兴趣的项目 点击查看其详情 进入详情页 从详情页退回列表页时 需要停留在
  • 关于STM32 定时器PWM输出,关闭PWM时,输出引脚电平控制。

    STM32的定时很多 功能也比较全面 pwm功能更是比较常用的功能 特别是对直流电机调速使用 但是有时我们停止PWM的时候希望 PWM的输出通道输出固定电平 下面我说一下其中的一种实现方法 根据数据手册得知 只要将OC1M设置为 100或者
  • 鞋子AJ,表格AG,ag-grid社区版排序错误问题

    ag grid表格数字格式排序是按照1 10 11 2 3 4这样排序的 相信很多小伙伴都知道怎么解决 只需要在sort方法内arr sort function a b return a b 就可以 我之前在源码里找到了这个 但是没法解决
  • 李峋同款爱心Python代码版来了

    最近看到不少关于李峋同款爱心的视频 文章 今天我们也分享一下李峋同款爱心 Python 代码版 简单来说李峋同款爱心就是一个动态的 型效果 主要 Python 代码实现如下 def init self generate frame 20 原
  • Python自动化测试的配置层实现方式对标与落地

    Python中什么是配置文件 配置文件如何使用 有哪些支持的配置文件等内容 话不多说 让我们一起看看吧 1 什么是配置文件 配置文件是用于配置计算机程序的参数和初始化设置的文件 如果没有这些配置程序可能无法运行或是影响运行 运行速度 便捷性
  • C# 使用SqlDataReader读取数据库数据

    本文主要讲述如何使用SqlDataReader方法来读取数据 来完成数据库增删改查中查的工作 这是C 读取数据库的主要方法 一 环境介绍 Visual Studio 2015 SQL Server 2012 控制台应用程序 使用的数据库名称
  • 在Gitee搭建属于自己的博客

    搭建属于自己的私人博客 工具安装 1 安装 git git 版本控制工具 链接 https pan baidu com s 19V8BH4kO9h6eVNFhMzAU4w 提取码 chgo 1 1 选择 next 1 2 选择安装路径 1
  • 全球十大即时通信软件最新排名

    第十名 Signal 1亿用户 Signal是一款提供加密通信的即时通讯软件 用户可以进行点对点的私密聊天和通话 优势 客户端及服务器开源 默认私聊 群聊端对端加密 纯净无广告 没有复杂功能 局限 注册使用Signal必须与手机捆绑 无法在
  • SQL数据库编写及示例

    一 数据库编写 1 数据库常用约束 主键约束 primary key 外键约束 foreign key references 唯一值约束 unique 默认值约束 default 检查约束 check 非空约束 not null 标识列 i
  • Apolo学习

    安装 java1 8 mysql 5 6 5以上 下载quickStart的包 早apollo下执行两个sql 如果不执行这两个sql apollo是执行不起来的 会有两个表来记录apollo的执行情况 其中一个表叫apolloportal
  • Sass语法(三)之循环

    一 数据类型 1 数字 如 1 2 13 10px 2 字符串 有俩种类型 a 有引号字符串 quoted strings 如 Lucida Grande http sass lang com b 无引号字符串 unquoted strin
  • C语言--指针:最底层的解释(慢慢懂~)

    指针 又可以叫它为地址 他表示的就是变量的被存储的地址 举个例子 创建整型变量a 于是a被存储到了内存中 我们就可以通过创建指针来找到他被存储到了哪个位置 取地址操作符 我们可以打印出a的指针 在这里 p为指针变量 指向a 不同于指针 打印
  • C++STL之vector与list

    文章目录 关于vector的用法 关于List的用法 vector和list的区别 关于vector的用法 include
  • C++ 享元模式

    什么是享元模式 享元模式是一种结构型设计模式 实现了在较少内存开销的同时 又支持了大量的对象 主要在资源有限的情况下 对创建大量对象行为的一种约束行为 享元模式的适用特征 当程序中有大量的相同对象 这些对象消耗了大量的内存 这些对象的状态可
  • centos7系统引导自动重启_Linux老鸟给出的Linux系统故障问题汇总,值得永久收藏...

    一 处理linux系统故障的思路 作为一名优秀的linux运维工程师 一定要有一套清晰 明确的解决故障思路 当问题出现时 才能迅速定位 解决问题 在开始本文学习之前 我根据多年工作和处理问题和故障的经验 总结出了一套处理问题的一般思路 供大
  • 全卷积网络FCN详细讲解(超级详细哦)

    原文链接 https blog csdn net qq 41760767 article details 97521397 depth 1 utm source distribute pc relevant none task utm so