上采样技术在语义分割中的应用
目录
概要
一、概述
二、实现方法
1.转置卷积
2.反池化
3.双线性插值法
三、在经典网络中的的应用
1.U-Net
2.FCN
总结
概要
上采样是用于深度学习中提高语义分割精度的技术,可以实现图像放大和像素级别标注
一、概述
神经网络的基本结构为:输入层->隐藏层->输出层。而在传统卷积神经网络中,隐藏层往往由多个卷积层和池化层、(激活函数层和批标准化层)全连接层组成。而为了提高模型的泛化性能,演变出了可以与卷积层或输出层结合使用的Dropout、softmax等技术。本文将以语义分割任务为背景,通过分析U-net、FCN等经典网络结构,介绍上采样(up-sampling)技术在神经网络模型中的应用。
传统卷积神经网络结构如图:
输入图像经过多次卷积、池化等操作,图像尺寸不算缩小,最后在全连接层转化为向量,经过处理(如softmax等)得到预测得分 W。这样的网络输出结果是一个数字或向量,在分类问题中可以起到很好的效果,但它存在以下问题:
固定输入尺寸: 传统CNN通常采用固定大小的输入图像,在实际应用中可能需要对图像进行裁剪或缩放,这会导致信息丢失或扭曲。
特征图分辨率损失: 在传统CNN中,随着网络层数的增加,特征图的尺寸会逐渐减小,导致分辨率损失。这会影响对图像中细节信息的捕获和重建。
语义信息丢失: 传统CNN在进行卷积和池化操作时会丢失部分像素级别的细节信息,导致对语义信息的表达不够准确。
上下文信息不足: 传统CNN通常只关注局部区域的特征提取,缺乏对整体上下文信息的充分利用,导致在处理全局语义信息时效果不佳。
缺乏跳跃连接: 传统CNN中各层之间通常是串行连接,信息传递受限,难以实现跳跃连接的功能,而跳跃连接有助于提高网络的信息传递效率和性能。
如果说对传统端到端需求尚无太大影响的话,这些缺陷在语义分割任务中的表现就不可谓不突出了。语义分割任务当中对原始图像的处理是模型构建面临的主要难题之一,即如何实现对图片像素级的标注。
2014年,Long等人发表了FCN网络结构。2015年,为了解决生物医学图像分割问题,Olaf Ronneberger等发表了《U-Net: Convolutional Networks for Biomedical Image Segmentation》,在这篇文章中,UNet网络结构中使用了一种称为转置卷积(transpose convolution)或反卷积(deconvolution)的上采样操作,这使得网络能够将下采样后的特征图进行还原,从而实现端到端的语义分割。U-Net标志着上采样技术在深度学习中的广泛应用开始兴起。
上采样(up-sampling)的逻辑思路是通过多种手段,增加图像尺寸或恢复图像分辨率,从而使模型的输出不是一个向量,而是一张标注的热力图(heatmap)。事实上,它可以看作是池化(又称为下采样down-sampling)的逆向操作。
U-Net语义分割实现效果:
总的来说,与传统神经网络相比,FCN和U-Net分别通过将全连接层替换为卷积层并进行反卷积操作 和 在图像压缩层后增加扩展层等手段实现上采样,还原了因特征采集而缩小的图像尺寸,实现了对图像分割精度的提高。
二、实现方法
我们知道下采样(池化)通过最大值池化、平均池化、概率池化等方式缩小图像尺寸实现特征提取,下面我们介绍上采样的三种实现方案:
1.转置卷积
转置卷积(transpose convolution),也称为反卷积(deconvolution),是一种常见的神经网络层,用于实现上采样操作,可以将一个单个值映射到一个较大的局部区域,用于输入特征图的尺寸扩大。
转置卷积的操作本质上是通过学习参数来实现的,通过学习卷积核来放大特征图。在转置卷积中,输入特征图中的每个像素值都会被扩展到一个更大的区域,通常使用插值或填充技术来实现。
转置卷积操作通常包括以下几个步骤:
-
零填充(Zero Padding):在输入特征图的周围添加零值,以增加输出特征图的大小。这样可以保持输出特征图的大小与输入特征图的大小相同。
-
扩展卷积核(Expanded Convolution Kernel):将卷积核进行扩展,通常通过在卷积核中插入零值来实现。扩展后的卷积核的大小通常大于原始卷积核的大小。
-
正常的卷积操作:将扩展后的卷积核应用于输入特征图,执行常规的卷积操作,生成输出特征图。
-
调整步长(Adjusting Stride):通过调整卷积操作的步长,可以控制输出特征图的尺寸,从而实现上采样的效果。
我们用最简单的手段,在结果卷积得到的特征图像素周围填充0,从而提高图像的分辨率
当然为了使图像的特征分布更合理,我们可以将填充方法修改为在每个像素点周围补0
2.反池化
卷积时特征图尺寸会缩小,我们采用了反卷积,而针对池化,我们也有类似的上采样手段。
其中最简单的如上图,保留池化的区域,在其他部分填充0。
3.双线性插值法
双线性插值法是一种常用的图像插值方法,用于在已知离散采样点的图像上估计任意位置的像素值。这种方法假设在每个像素之间存在线性关系,并且利用相邻四个像素的信息进行插值。
具体来说,双线性插值法通过以下步骤进行:
- 确定目标像素在原始图像中的位置,并计算其在水平和垂直方向上的相对位置(通常使用浮点数表示)。
- 找到目标像素周围的四个最近的像素点,通常是左上、右上、左下和右下四个点。
- 对这四个像素点的像素值进行加权平均,其中权重是根据目标像素在水平和垂直方向上的相对位置计算得到的。通常使用的权重是与目标像素与相邻像素之间的距离成反比的。
- 将加权平均值作为目标像素的插值结果。
简而言之,双线性插值首先在x方向进行线性插值,得到R1和R2,然后在y方向进行线性插值,得到P,这样就得到所要的结果f(x,y)。
三、在经典网络中的的应用
1.U-Net
它包括一条收缩路径(左侧)和一条扩张路径(右侧)。
收缩路径遵循卷积网络的典型架构。它由两个3x3卷积(未填充卷积)的重复应用组成,每个卷积后面都有一个整流线性单元(ReLU)和一个2x2 max池化操作,步幅为2,用于下采样,在每个降采样步骤中,我们将特征通道的数量加倍。扩展路径中的每一步都包括特征映射的上采样2x2卷积(“反卷积”),将特征通道的数量减半,与收缩路径中相应裁剪的特征映射进行连接,以及两个3x3卷积,每个卷积都有一个ReLU。由于在每次卷积中边界像素的损失,裁剪是必要的。在最后一层,使用1x1卷积将每个64个分量的特征向量映射到所需的类数,这个网络总共有23个卷积层。
右侧进行反卷积上采样,但因为卷积进行的下采样会导致部分边缘信息的丢失,失去的特征并不能从上采样中找回,因此作者采用了特征拼接操作来弥补,后续FPN貌似是延用了这一思想,通过横向连接将低分辨率语义强的特征和高分辨率语义弱的特征结合起来。
class deconv2d_bn(nn.Module):def __init__(self,in_channels,out_channels,kernel_size=2,strides=2):super(deconv2d_bn,self).__init__()self.conv1 = nn.ConvTranspose2d(in_channels,out_channels,kernel_size = kernel_size,stride = strides,bias=True)self.bn1 = nn.BatchNorm2d(out_channels)def forward(self,x):out = F.relu(self.bn1(self.conv1(x)))return out
上采样是通过 deconv2d_bn
类实现的。具体来说,deconv2d_bn
类使用了 nn.ConvTranspose2d
这个 PyTorch 中的函数来进行上采样操作。在 U-Net 中,上采样是通过反卷积(转置卷积)层实现的。
在 Unet
类的 forward
方法中,你可以看到这样的部分代码:
convt1 = self.deconv1(conv5)
convt2 = self.deconv2(conv6)
convt3 = self.deconv3(conv7)
convt4 = self.deconv4(conv8)
这些部分使用了 deconv2d_bn
类来进行上采样操作,将特征图的大小调整为原始输入图像的大小,以便进行后续的特征融合和预测。
2.FCN
在FCN中,典型的结构包括编码器(Encoder)和解码器(Decoder)部分。编码器部分通常由预训练的卷积神经网络(如VGG、ResNet等)组成,用于提取输入图像的特征。然后,解码器部分通过上采样操作将编码器部分得到的低分辨率特征图恢复到输入图像相同的分辨率,从而得到像素级别的语义分割结果。
FCN通过转置卷积、双线性插值达到了以下效果:
-
恢复空间信息:在卷积过程中,由于池化操作等因素,图像的空间信息被逐渐丢失。上采样能够将特征图的分辨率提高,从而恢复空间信息,使网络更好地理解图像中的细节和结构。
-
提高分割精度:在语义分割任务中,精确的像素级别的预测非常重要。通过上采样,可以获得更高分辨率的特征图,从而提高分割的精度和准确性。
-
增加感受野:通过上采样,可以扩大特征图的大小,使得每个像素点能够感知更广阔的上下文信息,从而提高网络对图像的理解能力。
另一种连接粗糙输出到dense像素的方法就是插值法。比如,简单的双线性插值计算每个输出y_ij来自只依赖输入和输出单元的相对位置的线性图最近的四个输入。
从某种意义上,伴随因子f的上采样是对步长为1/f的分数式输入的卷积操作。只要f是整数,一种自然的方法进行上采样就是向后卷积(有时称为去卷积)伴随输出步长为f。这样的操作实现是不重要的,因为它只是简单的调换了卷积的顺推法和逆推法。所以上采样在网内通过计算像素级别的损失的反向传播用于端到端的学习。
需要注意的是去卷积滤波在这种层面上不需要被固定不变(比如双线性上采样)但是可以被学习。一堆反褶积层和激励函数甚至能学习一种非线性上采样。在我们的实验中,我们发现在网内的上采样对于学习dense prediction是快速且有效的。我们最好的分割架构利用了这些层来学习上采样用以微调预测
class FCN(nn.Module):def __init__(self, out_channel=21):super(FCN, self).__init__()#self.backbone = models.resnet101(pretrained=True) #旧版本写法self.backbone = models.resnet101(weights = models.ResNet101_Weights.IMAGENET1K_V1)# 4倍下采样 256self.stage1 = nn.Sequential(*list(self.backbone.children())[:-5])# 8倍下采样 512self.stage2 = nn.Sequential(list(self.backbone.children())[-5])# 16倍下采样 1024self.stage3 = nn.Sequential(list(self.backbone.children())[-4])# 32倍下采样 2048self.stage4 = nn.Sequential(list(self.backbone.children())[-3])self.conv2048_256 = nn.Conv2d(2048, 256, 1)self.conv1024_256 = nn.Conv2d(1024, 256, 1)self.conv512_256 = nn.Conv2d(512, 256, 1)self.upsample2x = nn.Upsample(scale_factor=2)self.upsample8x = nn.Upsample(scale_factor=8)self.outconv = nn.Conv2d(256, out_channel, kernel_size=3, stride=1, padding=1)
总结
以语义分割任务为背景,通过分析U-net、FCN等经典网络结构,介绍上采样(up-sampling)技术在神经网络模型中的应用
相关文章:
上采样技术在语义分割中的应用
目录 概要 一、概述 二、实现方法 1.转置卷积 2.反池化 3.双线性插值法 三、在经典网络中的的应用 1.U-Net 2.FCN 总结 概要 上采样是用于深度学习中提高语义分割精度的技术,可以实现图像放大和像素级别标注 一、概述 神经网络的基本结构为:…...
linux 组建raid5详细操作
raid5最多运行损坏一个盘,最少3个盘,容量为少一块硬盘的容量之和。 如果硬盘数量较多,比如8块以上,建议用raid6,raid6最多允许两块硬盘损坏。 如果需要 一、安装raid软件 deb包 apt-get install mdadm或dnf包 dnf …...
机器学习概念、步骤、分类和实践
在当今数字化时代,机器学习已经渗透到我们生活的方方面面,从智能手机应用、搜索引擎优化,到自动驾驶汽车、医疗诊断等,其应用无处不在。本文将带您走进机器学习的世界,了解它的基本概念、步骤、分类以及实践应用。 一…...
钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确
problem 调用钉钉服务端API,机器人发送群聊消息,后台返回报错信息: 钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确; reason 定位: 登录后台,查看机器人是存在查看机器人调用权限接…...
Linux 开发环境以及编译链接
再谈编译链接 C函数重载与编译链接-CSDN博客 之前我已经写过文章简单介绍了编译链接要做的一些操作。现在为了能更好的理解我们平时的开发环境,我会在Linux系统上完整地走一遍流程。 环境描述 我们使用普通用户在Linux上进行操作,先写一段测试代码。 …...
SmartChart的部署以及可能遇见的报错解决方案
简介 数据可视化是一种将数据转化为图形的技术,可以帮助人们更好地理解和分析数据。但是,传统的数据可视化开发往往需要编写大量的代码,或者使用复杂的拖拽工具,不仅耗时耗力,而且难以实现个性化的需求。有没有一种更…...
【Node.js从基础到高级运用】十九、Node.js 捕获错误之“未捕获的异常”
引言 在 Node.js 应用程序中,错误处理是保证应用稳定性和可靠性的关键部分。特别是“未捕获的异常”(uncaught exceptions),如果不妥善处理,很可能会导致整个进程崩溃。在本文中,我们将探讨如何在 Node.js …...
vue 计算属性
基础示例 模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [V…...
RedissonLock-tryLock-续期
redisson版本3.16.6 1.什么是看门狗 Redisson提供的分布式锁是支持锁自动续期的,也就是说,如果线程仍旧没有执行完,那么redisson会自动给redis中的目标key延长超时时间,这在Redisson中称之为 Watch Dog 机制。默认情况下&#x…...
MSTP环路避免实验(华为)
思科设备参考:MSTP环路避免实验(思科) 一,技术简介 MSTP(多生成树协议),MSTP解决了STP和RSTP没有考虑vlan的问题,STP和RSTP将所有的vlan共享为一个生成树实例,无法实现…...
IoT网关在智能制造工厂生产线监控与管理中的应用-天拓四方
随着工业4.0时代的到来,智能制造已成为工业发展的重要方向。IoT网关在智能制造工厂中扮演着关键角色,它能够实现设备间的互联互通、数据的实时采集与处理,以及生产线的智能监控与管理。本案例将详细介绍IoT网关在智能制造工厂生产线监控与管理…...
niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端
目前多店版有四端uniapp,包括PC端uniapp,商家端uniapp,收银端uniapp,门店手机端uniapp,下面我总结下这些端的打包流程希望能帮助到大家,需要交流的可以看我昵称或者点我头像关注我分享代码和教程 一.niush…...
npm包发布
一、npm npm(Node Package Manager)是 Node.js 的包管理工具,用于安装、分享和管理 JavaScript 包和项目依赖。npm 是 Node.js 的默认包管理器,随同 Node.js 一起安装。 二、npm主要功能特点 包管理:npm 允许开发者…...
C#使用SQLite(含加密)保姆级教程
C#使用SQLite 文章目录 C#使用SQLite涉及框架及库复制runtimes创建加密SQLite文件生成连接字串执行SQL生成表SQLiteConnectionFactory.cs 代码结构最后 涉及框架及库 自己在NuGet管理器里面安装即可 Chloe.SQLite:ORM框架Microsoft.Data.Sqlite.Core:驱…...
C# 异步与 Unity 协程(实例讲解)
C#异步编程实例: 假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞 1using System.Net.Http; 2using System.Threading.Tasks; 3 4public class AsyncExample 5{ 6 public async Task<string> Fetch…...
iOS - Runloop介绍
文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…...
探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...
PCI总线管脚定义(引脚定义)
文章目录 1: 参考资料的链接2: 图片说明3:PCI文字说明每日好图 1: 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…...
万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
Sphinx查询性能非常厉害,亿级数据下输入关键字,大部分能在0.01~0.1秒,少部分再5秒之内查出数据。 Sphinx 官方文档:http://sphinxsearch.com/docs/sphinx3.html极简概括: 由C编写的高性能全文搜索引擎的开源组件&…...
数据库索引及优化
数据库索引及优化 什么是索引? MySQL官方对索引的定义为:索引(INDEX)是帮助MySQL高效获取数据的数据结构。 索引的本质: 数据结构 为什么要引入索引? 引入索引的目的在于提高查询效率,就好像是…...
flink: 将接收到的tcp文本流写入HBase
一、依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…...
SpringBoot集成knife4j
SpringBoot集成knife4j 1、什么是Knife4j2、SpringBoor整合Knife4j2.1、Knife4j配置方式12.2 配置方式二2.3、写注解2.4、效果 1、什么是Knife4j 在日常开发中,写接口文档是我们必不可少的,而Knife4j就是一个接口文档工具,可以看作是Swagger…...
Vue3之setup方法
Vue 3 的 setup 方法是 Vue Composition API 的一部分,用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码,特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…...
MySQL常见索引及其创建
MySQL索引 在 MySQL 数据库中,常见的索引类型包括以下几种: 普通索引(Normal Index):最基本的索引类型,没有任何限制。唯一索引(Unique Index):要求索引列的值是唯一的…...
高效测量“芯”搭档 | ACM32激光测距仪应用方案
激光测距仪概述 激光测距仪是利用激光对目标的距离进行准确测定的仪器。激光测距仪在工作时向目标射出一束很细的激光,由光电元件接收目标反射的激光束,计时器测定激光束从发射到接收的时间,计算出从观测者到目标的距离。激光测距仪分为手持激…...
基于Hive大数据分析springboot为后端以及vue为前端的的民宿系
标题基于Hive大数据分析springboot为后端以及vue为前端的的民宿系 本文介绍了如何利用Hive进行大数据分析,并结合Spring Boot和Vue构建了一个民宿管理系统。该民民宿管理系统包含用户和管理员登陆注册的功能,发布下架酒店信息,模糊搜索,酒店详情信息展示,收藏以及对收藏的…...
pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程
浅尝pnpm monorepo 多包管理方案 💡tips: 创建pnpm monorope多包管理框架流程 初始化 mkdir taurus & cd taurus pnpm init创建基础文件 创建文件pnpm-workspace.yaml packages:- packages/**创建文件夹packages/ -packages/ -package.json -pnpm-workspace…...
vue3封装Element分页
配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…...
真机 ARM64 架构转模拟器 ARM64 架构
本文字数:2051字 预计阅读时间:15分钟 01 需要转换架构的原因 老版 Mac 使用 Intel 芯片,是x86_64架构,相应地在老版 Mac 上运行的模拟器使用的也就是 x86_64架构。 由于模拟器的 x86_64 架构与真机的 arm64、armv7 等架构不冲突&…...
敏捷教练CSM认证考了有没有用,谁说了算?
敏捷教练CSM证书是近年来备受关注的一项证书,它被认为可以提升敏捷开发团队的管理能力和项目执行效率。然而,对于这个证书的价值和含金量,人们的观点却不尽相同。那么,CSM证书到底有没有用,谁来说了算呢? 首…...
织梦教育网站开发/推广计划方案模板
Servlet采用单实例多线程方式运行,因此是线程不安全的。默认情况下,非分布式系统,Servlet容器只会维护一个Servlet的实例,当多个请求到达同一个Servlet时,Servlet容器会启动多个线程分配给不同请求来执行同一个Servlet…...
wordpress兼容ie/合肥百度推广公司哪家好
文章目录一、线程 API 介绍1、创建线程2、恢复线程3、等待信号量4、线程状态判定5、销毁线程二、线程类的封装1、设计思路2、头文件设计3、接口实现4、接口分析三、线程类的使用1、线程类继承2、线程类调用一、线程 API 介绍 1、创建线程 _beginthreadex unsigned long _beg…...
洛阳网站建设哪家权威/sem培训班学费哪个好
javascript是一种基于对象的语言,但它没有类的概念,所以又和实际面向对象的语言有区别,面向对象是javascript中的难点之一。现在就我所理解的总结一下,便于以后复习: 一、创建对象 1、创建自定义对象最简单的方式就是创…...
廊坊网站建设精灵/外贸网站推广的方法
swal()方法是一个提示框;swal({title: "",text: "请扫描用户手机上的付款码",type: "input",showCancelButton: true,closeOnConfirm: false,cancelButtonText: "取消",confirmButtonText: "确认",imageUrl: &qu…...
flask做大型网站开发/自助建站的优势
1、多选题: 可以运行R语言的操作系统包括( ): 选项: A:Linux B:Windows C:Mac OS D:Android 答案: 【Linux;Windows;Mac OS 】 2、单选题: ( )可以命令将R语言升级到最新版本。…...
简网 互联 专业wordpress主机/媒体公关
C语言 _ 编辑、调试工具一、GCC编译器1、GNU工具2、GCC简介3、GCC编译器的版本4、gcc所支持后缀名解释5、编译器的主要组件6、GCC的基本用法和选项7、GCC的错误类型及对策8、**GCC编译过程**条件编译二、GDB调试工具1、Gdb调试流程:2、进入代码调试模式后一、GCC编译…...