当前位置: 首页 > news >正文

上采样技术在语义分割中的应用

目录

概要

一、概述

二、实现方法

1.转置卷积

2.反池化 

3.双线性插值法

 三、在经典网络中的的应用

1.U-Net

2.FCN

总结


概要

上采样是用于深度学习中提高语义分割精度的技术,可以实现图像放大和像素级别标注


一、概述

神经网络的基本结构为:输入层->隐藏层->输出层。而在传统卷积神经网络中,隐藏层往往由多个卷积层和池化层、(激活函数层和批标准化层)全连接层组成。而为了提高模型的泛化性能,演变出了可以与卷积层或输出层结合使用的Dropout、softmax等技术。本文将以语义分割任务为背景,通过分析U-net、FCN等经典网络结构,介绍上采样(up-sampling)技术在神经网络模型中的应用。

传统卷积神经网络结构如图:

输入图像经过多次卷积、池化等操作,图像尺寸不算缩小,最后在全连接层转化为向量,经过处理(如softmax等)得到预测得分 W。这样的网络输出结果是一个数字或向量,在分类问题中可以起到很好的效果,但它存在以下问题:

  1. 固定输入尺寸: 传统CNN通常采用固定大小的输入图像,在实际应用中可能需要对图像进行裁剪或缩放,这会导致信息丢失或扭曲。

  2. 特征图分辨率损失: 在传统CNN中,随着网络层数的增加,特征图的尺寸会逐渐减小,导致分辨率损失。这会影响对图像中细节信息的捕获和重建。

  3. 语义信息丢失: 传统CNN在进行卷积和池化操作时会丢失部分像素级别的细节信息,导致对语义信息的表达不够准确。

  4. 上下文信息不足: 传统CNN通常只关注局部区域的特征提取,缺乏对整体上下文信息的充分利用,导致在处理全局语义信息时效果不佳。

  5. 缺乏跳跃连接: 传统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),是一种常见的神经网络层,用于实现上采样操作,可以将一个单个值映射到一个较大的局部区域,用于输入特征图的尺寸扩大。

转置卷积的操作本质上是通过学习参数来实现的,通过学习卷积核来放大特征图。在转置卷积中,输入特征图中的每个像素值都会被扩展到一个更大的区域,通常使用插值或填充技术来实现。

转置卷积操作通常包括以下几个步骤:

  1. 零填充(Zero Padding):在输入特征图的周围添加零值,以增加输出特征图的大小。这样可以保持输出特征图的大小与输入特征图的大小相同。

  2. 扩展卷积核(Expanded Convolution Kernel):将卷积核进行扩展,通常通过在卷积核中插入零值来实现。扩展后的卷积核的大小通常大于原始卷积核的大小。

  3. 正常的卷积操作:将扩展后的卷积核应用于输入特征图,执行常规的卷积操作,生成输出特征图。

  4. 调整步长(Adjusting Stride):通过调整卷积操作的步长,可以控制输出特征图的尺寸,从而实现上采样的效果。

 我们用最简单的手段,在结果卷积得到的特征图像素周围填充0,从而提高图像的分辨率

当然为了使图像的特征分布更合理,我们可以将填充方法修改为在每个像素点周围补0 

2.反池化 

卷积时特征图尺寸会缩小,我们采用了反卷积,而针对池化,我们也有类似的上采样手段。 

其中最简单的如上图,保留池化的区域,在其他部分填充0。 

3.双线性插值法

双线性插值法是一种常用的图像插值方法,用于在已知离散采样点的图像上估计任意位置的像素值。这种方法假设在每个像素之间存在线性关系,并且利用相邻四个像素的信息进行插值。

具体来说,双线性插值法通过以下步骤进行:

  1. 确定目标像素在原始图像中的位置,并计算其在水平和垂直方向上的相对位置(通常使用浮点数表示)。
  2. 找到目标像素周围的四个最近的像素点,通常是左上、右上、左下和右下四个点。
  3. 对这四个像素点的像素值进行加权平均,其中权重是根据目标像素在水平和垂直方向上的相对位置计算得到的。通常使用的权重是与目标像素与相邻像素之间的距离成反比的。
  4. 将加权平均值作为目标像素的插值结果。

简而言之,双线性插值首先在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通过转置卷积、双线性插值达到了以下效果:

  1. 恢复空间信息:在卷积过程中,由于池化操作等因素,图像的空间信息被逐渐丢失。上采样能够将特征图的分辨率提高,从而恢复空间信息,使网络更好地理解图像中的细节和结构。

  2. 提高分割精度:在语义分割任务中,精确的像素级别的预测非常重要。通过上采样,可以获得更高分辨率的特征图,从而提高分割的精度和准确性。

  3. 增加感受野:通过上采样,可以扩大特征图的大小,使得每个像素点能够感知更广阔的上下文信息,从而提高网络对图像的理解能力。

另一种连接粗糙输出到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#异步编程实例&#xff1a; 假设我们有一个需要从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特性在分布式系统中的挑战与解决方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…...

PCI总线管脚定义(引脚定义)

文章目录 1&#xff1a; 参考资料的链接2: 图片说明3&#xff1a;PCI文字说明每日好图 1&#xff1a; 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…...

万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

Sphinx查询性能非常厉害&#xff0c;亿级数据下输入关键字&#xff0c;大部分能在0.01~0.1秒&#xff0c;少部分再5秒之内查出数据。 Sphinx 官方文档&#xff1a;http://sphinxsearch.com/docs/sphinx3.html极简概括&#xff1a; 由C编写的高性能全文搜索引擎的开源组件&…...

数据库索引及优化

数据库索引及优化 什么是索引&#xff1f; MySQL官方对索引的定义为&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a; 数据结构 为什么要引入索引&#xff1f; 引入索引的目的在于提高查询效率&#xff0c;就好像是…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...