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

目录

概要

一、概述

二、实现方法

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倍下采样 256
        self.stage1 = nn.Sequential(*list(self.backbone.children())[:-5])
        # 8倍下采样 512
        self.stage2 = nn.Sequential(list(self.backbone.children())[-5])
        # 16倍下采样 1024
        self.stage3 = nn.Sequential(list(self.backbone.children())[-4])
        # 32倍下采样 2048
        self.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)技术在神经网络模型中的应用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【讲解下go和java的区别】

🔥博主:程序员不想YY啊🔥 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家💫 🤗点赞🎈收藏⭐再看💫养成习惯 🌈希望本文对您有所裨益,如有…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立,可以参考我的博客:【深耕 Python】Data Science with Python 数据科学(1)环境搭建 Jupyter代码片段1:简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

vue3-pinia使用(末尾有彩蛋)

什么是 pinia Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 之前用的是 vuex,后面 vue 官方团队不维护了,推荐使用 pinia 安装 yarn add pinia # 或者使用 npm npm install piniapnpm install piniaStore 是什么&#xf…

2024 ccfcsp认证打卡 2022 06 01 归一化处理

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 输入数字的个数int[] a new int[1010]; // 创建一个数组来存储输入的数字double sum 0; // 用于计算所有输入数字的总…

COLMAP(Windows)实现SFM三维重建位姿估计

问题产生: Guassian splatting第一步用colmap进行位姿估计,图片匹配失败,输出图片全靠运气,最少的时候甚至一张都没匹配上,所以想到用colmap软件先进行匹配,再放入高斯训练。 colmap使用步骤:…

小米汽车引入革命性卫星通信技术:专利揭示直连卫星能力

小米汽车在近期的SU7发布会上,虽已展示了其运动轿跑车型的各项卓越性能,售价起于21.59万元,但其技术创新的深度远不止于此。一项最新公布的专利显示,小米汽车科技有限公司正在积极探索和开发车载卫星通信技术,该技术的…

后端常问面经之操作系统

请简要描述线程与进程的关系,区别及优缺点? 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之…

NSGA算法

先给自己叠甲,记录自己的学习过程,如有内容错误欢迎指正!!!。 1. NSGA算法简介(Nondominated Sorting Genetic Algorithm) 根据标题,NSGA算法分为两个要点,Nondominated Sorting(非支配排序&a…

Golang实战:深入hash/crc64标准库的应用与技巧

Golang实战:深入hash/crc64标准库的应用与技巧 引言hash/crc64简介基本原理核心功能 环境准备安装Golang创建一个新的Golang项目引入hash/crc64包测试环境配置 hash/crc64的基本使用计算字符串的CRC64校验和计算文件的CRC64校验和 高级技巧与应用数据流和分块处理网…

springboot 使用@profiles.active@多配置文件切换

项目配置文件结构&#xff1a; 主配置文件内容&#xff1a; pom配置文件&#xff1a; <profiles><profile><id>dev</id><properties><profiles.active>dev</profiles.active></properties></profile><profile>…

鸿蒙OS开发实战:【Socket小试MQTT连接】

本篇分享一下 HarmonyOS 中的Socket使用方法 将从2个方面实践&#xff1a; HarmonyOS 手机应用连接PC端 SocketServerHarmonyOS 手机应用连接MQTT 服务端 通过循序渐进的方式&#xff0c;全面了解实践HarmonyOS中的Socket用法 学习本章前先熟悉文档开发知识更新库gitee.com…

C#预处理器指令(巨细版)

文章目录 一、预处理器指令的基本概念二、预处理器指令的基本规则三、C# 预处理器指令详解3.1 #define 和 #undef3.2 #if、#else、#elif 和 #endif3.3 #line3.4 #error 和 #warning3.5 #region 和 #endregion 四、高级应用&#xff1a;预处理器指令的最佳实践4.1 条件编译的最佳…

hololens 2 投屏 报错

使用Microsoft HoloLens投屏时&#xff0c;ip地址填对了&#xff0c;但是仍然报错&#xff0c;说hololens 2没有打开&#xff0c; 首先检查 开发人员选项 都打开&#xff0c;设备门户也打开 然后检查系统–体验共享&#xff0c;把共享都打开就可以了

【优选算法】双指针 -- 快乐数 和 盛最多水的容器

前言&#xff1a; &#x1f3af;个人博客&#xff1a;Dream_Chaser &#x1f388;刷题专栏&#xff1a;优选算法篇 &#x1f4da;本篇内容&#xff1a;03快乐数 和 04盛最多水的容器 目录 一、快乐数&#xff08;medium&#xff09; 1. 题⽬链接&#xff1a;202. 快乐数 2. …

详解TCP的三次握手和四次挥手

文章目录 1. TCP报文的头部结构2. 三次握手的原理与过程三次握手连接建立过程解析 3. 四次挥手的原理与过程四次挥手连接关闭过程的解析 4. 常见面试题 深入理解TCP连接&#xff1a;三次握手和四次挥手 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;扮演着…

在低成本loT mcu上实现深度神经网络端到端自动部署-深度神经网络、物联网、边缘计算、DNN加速——文末完整资料

目录 前言 DNN 量化神经网络 并行超低功耗计算范式 面向内存的部署 结果 原文与源码下载链接 REFERENCES 前言 在物联网极端边缘的终端节点上部署深度神经网络( Deep Neural Networks&#xff0c;DNNs )是支持普适深度学习增强应用的关键手段。基于低成本MCU的终端节点…

基于SpringBoot和Vue的房产销售系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的房产销售系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f…

Vitest 单元测试方案

简介 Vitest 是一个面向 Vite 的极快的单元测试框架。它利用了 Vite 的优势,提供了一种全新的测试体验。本文将介绍如何在项目中集成和使用 Vitest 进行单元测试。 安装 Vitest npm install -D vitest 配置 Vitest 在项目根目录下创建 vitest.config.js 文件,用于配置 Vitest。…

AcWing-毕业旅行问题

731. 毕业旅行问题 - AcWing题库 所需知识&#xff1a;二进制状态压缩&#xff0c;dp 思路&#xff1a;Hamilton最小路径的变种&#xff0c;如果Hamilton最小路径不懂可以看看我这篇文章AcWing—最短Hamilton路径-CSDN博客 搞懂了Hamilton之后这题就很简单了&#xff0c;遍历…

【51单片机入门记录】Onewire单总线协议 温度传感器DS18B20概述

一、温度传感器DS18B20概述 &#xff08;1&#xff09;数字化温度传感器 美国DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点&#xff0c;使用户可轻松地组建传感器网络&#xff0c;为测量系统的构建…