文献阅读笔记:全卷积神经网络

文献阅读笔记:全卷积神经网络

  • 摘要
  • Abstract
  • 1. 全卷积神经网络
    • 1.1 文献摘要
    • 1.2 全卷积神经网络
      • 1.2.1 网络结构
      • 1.2.0 从分类器到密集 FCN
      • 1.2.2 上采样 Upsampling
      • 1.2.3 跳级结构
      • 1.2.4 FCN训练
    • 1.3 实验
    • 1.4 总结
  • 2. 代码实现

摘要

本周学习了全卷积神经网络,全卷积神经网络(Fully Convolutional Network,FCN)是深度学习在语义分割领域的开山之作,其特点在于将传统卷积神经网络(CNN)中的全连接层替换为卷积层,使得网络的输出为热力图而非类别,这种设计使得FCN可以接受任意尺寸的输入图像,并对其进行像素级的分类,从而解决了语义级别的图像分割问题,FCN的主要优势在于其灵活性和高效性。由于去除了全连接层,FCN可以适应任意尺寸的输入,这在处理不同尺寸的图像时非常有用。本文将详细介绍全卷积神经网络。

Abstract

This week, we learned about Fully Convolutional Neural Networks (FCN), which is the groundbreaking work of deep learning in the field of semantic segmentation, and is characterized by replacing the fully-connected layer in traditional Convolutional Neural Networks (CNNs) with a convolutional layer so that the output of the network is a heat map instead of a category, and this design allows FCNs to accept input images of arbitrary size and classify them at the pixel level, thus solving the problem of image segmentation at the semantic level.The main advantages of FCN are its flexibility and efficiency. Due to the removal of the fully connected layer, FCNs can adapt to inputs of arbitrary size, which is very useful when dealing with images of different sizes. In this paper, we will introduce Full Convolutional Neural Networks in detail.

Translated with DeepL.com (free version)

1. 全卷积神经网络

文献链接:

1.1 文献摘要

作者在本文中提出了全卷积神经网络,该网络接受任意大小的输入并通过有效的推理和学习产生相应大小的输出。作者在本文中定义并详细介绍了全卷积网络的空间,解释了它们在空间密集预测任务中的应用,并与先前的模型建立了联系。该网络中还有跳跃架构,它将来自深层、粗糙层的语义信息与来自浅层、精细层的外观信息相结合,以产生准确而详细的分割。

1.2 全卷积神经网络

卷积网络中的每一层数据都是一个大小为 h × w × d 的三维数组,其中 h 和 w 是空间维度,d 是特征或通道维度。第一层是图像,像素大小为 h × w,有 d 个颜色通道。较高层中的位置对应于它们路径连接到的图像中的位置,称为它们的感受野。

卷积网络建立在平移不变性的基础上。它们的基本组件(卷积、池化和激活函数)在局部输入区域上运行,并且仅依赖于相对空间坐标。将 x i j x_{ij} xij 写入特定层中位置 (i, j) 处的数据向量,并将 y i j y_{ij} yij 写入后续层,这些函数通过以下方式计算输出 y i j y_{ij} yij

1.2.1 网络结构

FCN网络结构主要分为两个部分:全卷积部分和反卷积部分。其中全卷积部分为一些经典的CNN网络(如VGG,ResNet等),用于提取特征;反卷积部分则是通过上采样得到原尺寸的语义分割图像。FCN的输入可以为任意尺寸的彩色图像,输出与输入尺寸相同,通道数为n(目标类别数)+1(背景)。FCN网络结构如下:
在这里插入图片描述

1.2.0 从分类器到密集 FCN

对于GoogLeNet,作者仅使用最终的损失层,并通过丢弃最终的平均池化层来提高性能。我们通过丢弃最终的分类器层来斩首每个网络,并将所有全连接层转换为卷积层。 作者附加一个通道维度为 21 的 1 × 1 卷积来预测每个粗略输出位置处每个 PASCAL 类(包括背景)的分数,然后是一个反卷积层,将粗略输出双线性上采样为像素密集输出,下表比较了初步验证结果以及每个网络的基本特征。
在这里插入图片描述
从分类到分割的微调为每个网络提供了合理的预测。即使是最差的模型也能达到最先进性能的 75%。

尽管完全卷积分类器可以像上述所示进行微调以进行分割,甚至在标准指标上得分很高,但它们的输出却非常粗糙(见图 4)。最终预测层的 32 像素步长限制了上采样输出中的细节比例。作者通过添加跳跃融合连接来解决这个问题,该跳跃将最终预测层与具有更精细步长的较低层结合起来。这会将线型拓扑转变为 DAG,其边缘从较低层跳到较高层。由于他们看到的像素更少,更精细的尺度预测应该需要更少的层,因此从更浅的网络输出中制作它们是有意义的。结合精细层和粗略层,模型可以做出尊重全局结构的局部预测。
在这里插入图片描述

1.2.2 上采样 Upsampling

在卷积过程的卷积操作和池化操作会使得特征图的尺寸变小,为得到原图像大小的稠密像素预测,需要对得到的特征图进行上采样操作。可通过双线性插值(Bilinear)实现上采样,且双线性插值易于通过固定卷积核的转置卷积(transposed convolution)实现,转置卷积即为反卷积(deconvolution)。在论文中,作者并没有固定卷积核,而是让卷积核变成可学习的参数。转置卷积操作过程如下:

在这里插入图片描述

1.2.3 跳级结构

如果仅对最后一层的特征图进行上采样得到原图大小的分割,最终的分割效果往往并不理想。因为最后一层的特征图太小,这意味着过多细节的丢失。因此,通过跳级结构将最后一层的预测(富有全局信息)和更浅层(富有局部信息)的预测结合起来,在遵守全局预测的同时进行局部预测。

将底层(stride 32)的预测(FCN-32s)进行2倍的上采样得到原尺寸的图像,并与从pool4层(stride 16)进行的预测融合起来(相加),这一部分的网络被称为FCN-16s。随后将这一部分的预测再进行一次2倍的上采样并与从pool3层得到的预测融合起来,这一部分的网络被称为FCN-8s。图示如下:
在这里插入图片描述

1.2.4 FCN训练

阶段1:以经典的分类网络为初始化,最后两级为全连接(红色),参数弃去不用。
在这里插入图片描述
阶段2:FCN-32s 网络—从特征小图预测分割小图,之后直接升采样为大图。
在这里插入图片描述
阶段3:FCN-16s 网络—上采样分为两次完成。在第二次升采样前,把第4个pooling层的预测结果融合进来,使用跳级结构提升精确性。
在这里插入图片描述
阶段4:FCN-8s 网络—升采样分为三次完成。 进一步融合了第3个pooling层的预测结果。
在这里插入图片描述

1.3 实验

作者在语义分割和场景解析上测试 FCN,探索 PASCAL VOC、NYUDv2 和 SIFT Flow。尽管这些任务历史上区分了对象和区域,但作者将它们统一视为像素预测。我们在每个数据集上评估我们的 FCN 跳跃架构,然后将其扩展到 NYUDv2 的多模态输入以及 SIFT Flow 的语义和几何标签的多任务预测。下表给出了作者提出的 FCN-8 在 PASCAL VOC 2011 和 2012 测试集上的性能,并将其与之前最先进的 SDS和著名的 R-CNN。我们在平均 IU8 上取得了最佳结果,相对优势为 20%。推理时间减少了 114 倍(仅限卷积网络,忽略提案和细化)或 286 倍(总体)。
在这里插入图片描述
NYUDv2 是使用 Microsoft Kinect 收集的 RGB-D 数据集。它有 1449 张 RGB-D 图像,带有像素标签,已被 Gupta 等人合并为 40 类语义分割任务。我们报告了 795 个训练图像和 654 个测试图像的标准分割结果。 (注:所有模型选择均在 PASCAL 2011 val 上进行。)下表给出了我们的模型在几种变体中的性能。首先,我们在 RGB 图像上训练未经修改的粗略模型 (FCN-32s)。为了添加深度信息,我们对升级后的模型进行训练,以采用四通道 RGB-D 输入(早期融合)。
在这里插入图片描述

1.4 总结

全卷积网络是一类丰富的模型,现代分类卷积网络是其中的一个特例。认识到这一点,将这些分类网络扩展到分段,并通过多分辨率层组合改进架构,可以显着提高最先进的水平,同时简化和加速学习和推理。全卷积神经网络(Fully Convolutional Network,FCN)是深度学习在语义分割领域的开山之作,其特点在于将传统卷积神经网络(CNN)中的全连接层替换为卷积层,使得网络的输出为热力图而非类别。这种设计使得FCN可以接受任意尺寸的输入图像,并对其进行像素级的分类,从而解决了语义级别的图像分割问题。FCN的主要优势在于其灵活性和高效性。由于去除了全连接层,FCN可以适应任意尺寸的输入,这在处理不同尺寸的图像时非常有用。此外,FCN使用转置卷积(也称为反卷积)层对特征图进行上采样,使其恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测。这种设计保留了原始输入图像中的空间信息,使得预测结果更加精确。在实际应用中,FCN已被广泛应用于目标分割、目标检测、目标分类等研究领域,并取得了令人瞩目的成果。例如,在医学图像分割中,FCN可以精确地识别出病变区域;在自动驾驶领域,FCN可以用于识别道路、车辆和行人等关键元素。

然而,值得注意的是,虽然FCN在图像分割方面取得了显著进展,但它仍然存在一些挑战和限制。例如,对于某些复杂的场景或物体,FCN可能难以准确地进行分割;此外,由于FCN需要进行像素级的预测,因此其计算复杂度相对较高,可能需要大量的计算资源和时间。

2. 代码实现

此处使用paddle深度学习框架进行网络模型的搭建,以下为网络结构代码:

class FCN8s(nn.Layer):def __init__(self, num_classes=21):super(FCN8s, self).__init__()# num_classes要包含背景,如果是PASCAL VOC则是20+1self.layer1 = self.make_block(num=2, in_channels=3, out_channels=64)self.layer2 = self.make_block(num=2, in_channels=64, out_channels=128)self.layer3 = self.make_block(num=3, in_channels=128, out_channels=256)self.layer4 = self.make_block(num=3, in_channels=256, out_channels=512)self.layer5 = self.make_block(num=3, in_channels=512, out_channels=512)# 下面的两个卷积层代替了原来VGG网络的全连接层(原本为4096,此处可根据gpu性能,设置为其他数,此处设为2048)mid_channels = 2048self.conv6 = nn.Conv2D(in_channels=512, out_channels=mid_channels, kernel_size=7, padding=3)self.conv7 = nn.Conv2D(in_channels=mid_channels, out_channels=mid_channels, kernel_size=1)# 3个1*1的卷积,用于改变pool的通道数,为了后续融合语义信息self.score32 = nn.Conv2D(in_channels=mid_channels, out_channels=num_classes, kernel_size=1)self.score16 = nn.Conv2D(in_channels=512, out_channels=num_classes, kernel_size=1)self.score8 = nn.Conv2D(in_channels=256, out_channels=num_classes, kernel_size=1)# 3个转置卷积,用于扩大特征图# 若参数kernel_size:stride:padding=4:2:1,此时stride为扩大倍数weight_8x = paddle.ParamAttr(initializer=paddle.nn.initializer.Assign(bilinear_kernel(num_classes, num_classes, 16)))self.up_sample8x = nn.Conv2DTranspose(in_channels=num_classes,out_channels=num_classes,kernel_size=16, stride=8, padding=4,weight_attr=weight_8x)weight_16x = paddle.ParamAttr(initializer=paddle.nn.initializer.Assign(bilinear_kernel(num_classes, num_classes, 4)))self.up_sample16x = nn.Conv2DTranspose(in_channels=num_classes,out_channels=num_classes,kernel_size=4, stride=2, padding=1,weight_attr=weight_16x)weight_32x = paddle.ParamAttr(initializer=paddle.nn.initializer.Assign(bilinear_kernel(num_classes, num_classes, 4)))self.up_sample32x = nn.Conv2DTranspose(in_channels=num_classes,out_channels=num_classes,kernel_size=4, stride=2, padding=1,weight_attr=weight_32x)  def make_block(self, num: int, in_channels: int, out_channels: int, padding=1):"""根据传入的in,out和需要构建的块数搭建网络块"""blocks = []blocks.append(nn.Conv2D(in_channels=in_channels, out_channels=out_channels, kernel_size=3, padding=padding))blocks.append(nn.ReLU())for i in range(num-1):blocks.append(nn.Conv2D(in_channels=out_channels, out_channels=out_channels, kernel_size=3, padding=1))blocks.append(nn.ReLU())blocks.append(nn.MaxPool2D(kernel_size=2, stride=2, ceil_mode=True))return nn.Sequential(*blocks)def forward(self, inputs):# inputs [3, 1, 1],以原始输入图像尺寸为1# featuresout = self.layer1(inputs)  # [64, 1/2, 1/2]out = self.layer2(out)  # [128, 1/4, 1/4]pool3 = self.layer3(out)  # [256, 1/8, 1/8]pool4 = self.layer4(pool3)  # [512, 1/16, 1/16]pool5 = self.layer5(pool4)  # [512, 1/32, 1/32]x = self.conv6(pool5)  # [mid_channels, 1/32, 1/32]x = self.conv7(x)  # [mid_channels, 1/32, 1/32]score32 = self.score32(x)  # [num_classes, 1/32, 1/32]up_pool16 = self.up_sample32x(score32)  # [num_classes, 1/16, 1/16]score16 = self.score16(pool4)  # [num_classes, 1/16, 1/16]fuse_16 = paddle.add(up_pool16, score16)up_pool8 = self.up_sample16x(fuse_16)  # [num_classes, 1/8, 1/8]score8 = self.score8(pool3)  # [num_classes, 1/8, 1/8]fuse_8 = paddle.add(up_pool8, score8)heatmap = self.up_sample8x(fuse_8)return heatmap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acer宏碁非凡Swift SFG16-71工厂模式原厂Win11系统,预装OEM系统恢复开箱状态

宏基笔记本电脑SFG16-71原装出厂Windows11系统安装工厂包下载,带恢复重置功能 链接:https://pan.baidu.com/s/1JK02kBbwKG_cIBNlEOzrOw?pwdzdfm 提取码:zdfm 原装工厂包系统自带所有驱动、Office办公软件、出厂时自带主题壁纸图片、系统…

如何免费获取基于公网 IP 的 SSL 证书 (无需域名)

现在给网站安装SSL证书来实现网站的HTTPS安全访问已经成了大多数人的共识,但是有一些特殊情况:比如对于个别的应用IP地址不需要绑定域名,只是单纯用IP来访问网站,这种情况下,可以实现HTTPS访问吗? 先说答案…

vue-创建vue项目记录

安装node.js 先安装node.js的运行环境node.js的下载地址 安装后就可以使用npm命令 1、清除npm缓存:npm cache clean --force 2、禁用SSL:npm config set strict-ssl false 3、手动设置npm镜像源:npm config set registry https://registry.…

揭密无文件勒索病毒攻击,思考网络安全新威胁

前言 最近几年基于无文件攻击的网络犯罪活动越来越多,一些网络犯罪团伙开发了各种基于无文件攻击的恶意软件攻击套件,这些恶意软件攻击套件可用于勒索病毒、挖矿病毒、RAT远控、僵尸网络等恶意软件,在过去的几年时间里,无文件感染…

L1-8 静静的推荐(Python)

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的: 只考虑得分不低于 175 分的学生;一共接受 K 批次的推荐名单;同一批推荐名单上…

Day35:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

目录 Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发&…

pandas plot函数:数据可视化的快捷通道

一般来说,我们先用pandas分析数据,然后用matplotlib之类的可视化库来显示分析结果。而pandas库中有一个强大的工具--plot函数,可以使数据可视化变得简单而高效。 1. plot 函数简介 plot函数是pandas中用于数据可视化的一个重要工具&#xff0…

凌鲨本地接口架构

本地API通过监听本地端口,提供http服务,让本地应用可以获取信息和操作凌鲨客户端。 本地API架构 #mermaid-svg-seodZa6VsI4Qc8Cj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-seodZa6VsI4…

辽宁博学优晨教育:视频剪辑培训的安全正规之路

在当今数字化时代,视频剪辑已成为一项炙手可热的技能。为满足广大学习者的需求,辽宁博学优晨教育推出了一系列专业的视频剪辑培训课程。本文将重点介绍辽宁博学优晨教育的视频剪辑培训如何在保障学员安全和学习效果方面做出了卓越的努力。 一、正规资质&…

Linux操作系统-06-进程与服务管理

使用ps命令查看进程。包括过滤进程信息 使用systemctl命令管理和运行Linux服务 进程(Process):操作系统正在运行的应用程序。任意一个进程,都会消耗CPU和内存资源, 服务(Service)&#xff1a…

Word中解决插入脚注导致的分页位置错误问题

先放一个截图: 上面的截图中,样式为标题3的段落“四、固执的念头”前插入了连续型分节符,并且该分节符的样式为正文,前后的正文段落中有脚注,结果在分页时,标题3段落“四、固执的念头”后的正文段落自动进入…

【JAVA】我和“JAVA“的细水长流,输入输出

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Ck59fYFNNdpuGmVT {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

JVM-3

HotSpot虚拟机对象 我在网上看了很多相关的文章,发现在创建对象和对象的结构中内容都不太一样,一些关键字也很不同,于是我通过参考《深入理解Java虚拟机》这本书,自己总结了一篇。 1.对象的创建 当JVM收到一条创建对象的字节码…

全面的 DevSecOps 指南:有效保护 CI/CD 管道的关键注意事项

数字化转型时代带来了对更快、更高效、更安全的软件开发流程的需求。DevSecOps:一种将安全实践集成到 DevOps 流程中的理念,旨在将安全性嵌入到开发生命周期的每个阶段 - 从代码编写到生产中的应用程序部署。DevSecOps 的结合可以带来许多好处&#xff0…

交叉编译x264 zlib ffmpeg以及OpenCV等 以及解决交叉编译OpenCV时ffmpeg始终为NO的问题

文章目录 环境编译流程nasm编译x264编译zlib编译libJPEG编译libPNG编译libtiff编译 FFmpeg编译OpenCV编译问题1解决方案 问题2解决方案 总结 环境 系统:Ubutu 18.04交叉编译链:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 我的路径/opt/toolch…

Java零基础入门-Comparable vs Comparator(上)

哈喽,各位小伙伴们好,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。 我是一名java开发,所以日常接触到最多…

System是什么?为什么不能直接输出null?

在看学习下面的知识前,得先对java核心类库有个大致的了解,详情可参考链接 java基本概念-扩展点-CSDN博客 1、System 1.1 System是什么? System是一个类,它包含了一些有用的属性和方法。 1.2 System实现的功能 (1&…

【深度学习】换脸新科技,InstantID: Zero-shot Identity-Preserving Generation in Seconds

论文:https://arxiv.org/abs/2401.07519 代码:https://github.com/InstantID/InstantID demo:https://huggingface.co/spaces/InstantX/InstantID 文章目录 1 引言2 相关工作2.1 文本到图像扩散模型2.2 主题驱动的图像生成2.3 保持ID的图像生成 3 方法3.…

zabbix5监控tomcat

zabbix tomcat客户端配置 1、配置tomcat catalina.sh文件 CATALINA_OPTS"$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port12345 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -Djav…

smart-doc 社区 Committer 晋升公告

我们非常荣幸地宣布,经过 PMC 委员会的提名和讨论,社区成员李星志(GitHub ID: netdied)、陈琪(GitHub ID: chenqi146)和李兵(GitHub ID: abing22333)正式晋升为同程旅行 smart-doc 开…