Pytorch常用的函数(七)空洞卷积详解

news2024/9/22 18:17:42

Pytorch常用的函数(七)空洞卷积详解

1 初识空洞卷积

1.1 空洞卷积与语义分割任务

语义分割面临的困境:

  • 与检测模型类似,语义分割模型也是建立是分类模型基础上的,即利用CNN网络来提取特征进行分类。在CNN分类模型中,一般情况下会通过stride>1的卷积层或者池化层进行降采样,此时特征图维度降低,但是特征更高级,语义更丰富。

    • 这对于简单的分类没有问题,因为最终只预测一个全局概率。
    • 对于图像分割模型就无法接受,因为我们需要给出图像不同位置的分类概率,特征图过小时会损失很多信息。对于前面的特征图,其保持了较多的空间位置信息,虽然语义会差一些,但是这些空间信息对于精确分割也是至关重要的。
    • 其实对于目标检测模型同样存在这个问题,但是由于检测比分割更粗糙,所以图像分割对于这个问题更严重。
  • 但是下采样层又是不可缺少的。

    • 首先stride>1的下采样层对于提升感受野非常重要,这样高层特征语义更丰富,而且对于分割来说较大的感受野也至关重要;
    • 另外的一个现实问题,没有下采样层,特征图一直保持原始大小,计算量是非常大的。
  • 总之,这是语义分割所面临的一个困境或者矛盾,也是大部分研究要一直解决的。

语义分割任务的两种解决方案:

语义分割任务主要存在两种不同的解决方案:

  • 一种是EncoderDecoder结构,其中Encoder就是下采样模块,负责特征提取,而Decoder是上采样模块(通过插值,转置卷积等方式),负责恢复特征图大小,经典的网络如U-Net(网络结构如下图)、U2-Net等。而要直接将高层特征图恢复到原始大小是相对困难的,所以Decoder是一个渐进的过程,而且要引入横向连接(lateral connection),即引入低级特征增加空间信息特征分割准确度。

在这里插入图片描述

  • 另外一种结构是DilatedFCN,主要是通过空洞卷积(Atrous Convolution)来减少下采样率,但是又可以保证感受野。例如利用空洞卷积,那么我们就可以让原图的下采样倍数仅为8,那么最终的特征图语义不仅语义丰富而且相对精细,可以直接通过插值恢复原始分辨率。DeepLab系列网络(如下图)就是属于典型的DilatedFCN。

在这里插入图片描述

1.2 空洞卷积的相关

1.2.1 空洞卷积的理解

  • 空洞卷积(Atrous Convolution),又称膨胀卷积扩张卷积
  • 空洞卷积可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样操作。
  • 与正常的卷积不同的是,空洞卷积引入了一个称为扩张率(dilation rate)的超参数,该参数定义了卷积核处理数据时各值的间距。扩张率,也称空洞数(Hole Size)。

下图是我们熟悉的标准卷积(k=3,p=1,s=2,r=1)

在这里插入图片描述

下图是扩张率为2空洞卷积(k=3,p=0,s=2,r=2)
在这里插入图片描述

1.2.2 空洞卷积感受野的计算

扩张率(dilation rate)定义了卷积核处理数据时各值的间距
设空洞卷积的卷积核大小为 k , 空洞数为 d ,等效卷积核大小为 k ′ k ′ = k + ( k − 1 ) × ( d − 1 ) 设当前层感受野为 R F i + 1 ,上一层感受野为 R F i R F i + 1 = R F i + ( k ′ − 1 ) × S i S i 表示之前所有层步长的乘积 ( 不包括当前层 ) ,因此当前层步长不影响当前层的感受野。另外,感受野和 p a d d i n g 无关。 设空洞卷积的卷积核大小为k,空洞数为d,等效卷积核大小为k' \\ k' = k + (k-1)×(d-1) \\ 设当前层感受野为RF_{i+1},上一层感受野为RF_{i} \\ RF_{i+1} = RF_{i} + (k'-1)× S_i \\ S_i表示之前所有层步长的乘积(不包括当前层),因此当前层步长不影响当前层的感受野。另外,感受野和padding无关。 设空洞卷积的卷积核大小为k,空洞数为d,等效卷积核大小为kk=k+(k1)×(d1)设当前层感受野为RFi+1,上一层感受野为RFiRFi+1=RFi+(k1)×SiSi表示之前所有层步长的乘积(不包括当前层),因此当前层步长不影响当前层的感受野。另外,感受野和padding无关。
例子1:从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的,大框表示输入图像(感受野默认为1),深绿色表示 3 × 3 3×3 3×3的卷积核,绿色区域表示卷积后的感受野。

  • a是普通的卷积过程(dilation rate = 1),卷积后的感受野为3;
  • b是dilation rate = 2的空洞卷积,卷积后的感受野为5;
  • c是dilation rate = 3的空洞卷积,卷积后的感受野为7;
  • 普通卷积是空洞卷积的一种特殊情况。
  • 我们可以明显的看到,在卷积核不变的情况下,增加扩张率可以增加感受野

在这里插入图片描述

例子2:请注意下图和上面的图有区别,上图的三幅图是独立的,而下图是从左到右连续进行卷积。

  • 第一层卷积,为普通卷积,经过第1层卷积,感受野为3;
  • 第二层卷积,先算等效卷积核为 k ′ = k + ( k − 1 ) × ( d − 1 ) = 3 + ( 3 − 1 ) × ( 2 − 1 ) = 5 k'=k + (k-1)×(d-1)=3+(3-1)×(2-1)=5 k=k+(k1)×(d1)=3+(31)×(21)=5,然后计算感受野 R F i + 1 = R F i + ( k ′ − 1 ) × S i = 3 + ( 5 − 1 ) × 1 = 7 RF_{i+1} = RF_{i} + (k'-1)× S_i=3+(5-1)×1=7 RFi+1=RFi+(k1)×Si=3+(51)×1=7,因此经过第3层卷积,感受野为7;
  • 第三层卷积,先算等效卷积核为 k ′ = k + ( k − 1 ) × ( d − 1 ) = 3 + ( 3 − 1 ) × ( 4 − 1 ) = 9 k'=k + (k-1)×(d-1)=3+(3-1)×(4-1)=9 k=k+(k1)×(d1)=3+(31)×(41)=9,然后计算感受野 R F i + 1 = R F i + ( k ′ − 1 ) × S i = 7 + ( 9 − 1 ) × 1 = 15 RF_{i+1} = RF_{i} + (k'-1)× S_i=7+(9-1)×1=15 RFi+1=RFi+(k1)×Si=7+(91)×1=15,经过第3层卷积,感受野为15。

在这里插入图片描述

经过上述例子,我们已经知道空洞卷积可以增大感受野,那么如何理解可以不改变图像输出特征图的尺寸呢

我们来看下标准卷积计算特征图尺寸的公式:
设输入特征图为 ( H , W ) , 卷积核大小为 ( K , K ) , 填充为 P ,步长为 S ,输出为 O H , O W O H = H + 2 P − K S + 1 O W = W + 2 P − K S + 1 设输入特征图为(H,W),卷积核大小为(K,K),填充为P,步长为S,输出为OH,OW \\ OH=\frac{H+2P-K}{S} + 1 \\ OW=\frac{W+2P-K}{S} + 1 \\ 设输入特征图为(H,W),卷积核大小为(KK),填充为P,步长为S,输出为OH,OWOH=SH+2PK+1OW=SW+2PK+1

  • 从上述影响特征图尺寸的参数中可以看到没有扩张率,而标准卷积和空洞卷积之间的区别就是扩张率不同,所以使用空洞卷积可以不改变图像输出特征图的尺寸。不过,天下没有免费的午餐,保持分辨率意味着较大的运算量。
  • 需要注意的是,在空洞卷积里面,上面式子中的K为等效的卷积核,想要输入和输出不变,需要填充。
  • 一般每一层的卷积核都是用3 x 3 大小的,而每一层只要设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。当然这样操作并不影响特征图的尺寸,这样一来,又避免下采样那样造成信息损失,同时也利用到多尺度信息。

1.2.3 pytorch中API

Dilation_conv2d = nn.Conv2d(
    in_channels = in_channels,
    out_channels = out_channels,
    kernel_size = kernel_size , 
    stride = stride,
    padding=padding,
    dilation=dilation  # 设置扩张率
)
  • 默认dilation=1,所以我们在使用二维卷积的时候,如果不去设置dilation,默认都是使用标准卷积。
import torch
import torch.nn as nn


input_data = torch.randn(1, 3, 64, 64)
dilated_conv1 = nn.Conv2d(in_channels=3,
                          out_channels=64,
                          kernel_size=3,
                          dilation=2,
                          padding=2,  # 设置dilation=2后,等效卷积核kernel_size=5,因此设置padding=2
                          stride=1)

output = dilated_conv1(input_data)

print("Input  shape:", input_data.shape)
print("Output shape:", output.shape)
Input  shape: torch.Size([1, 3, 64, 64])
Output shape: torch.Size([1, 64, 64, 64])

2 空洞卷积的问题与优化

2.1 空洞卷积存在的问题

2.1.1 栅格效应 Gridding Effect

  • 假设我们仅仅多次叠加dilation rate为均为2的3 x 3 kernel 的话,则会出现这个问题。
    • 左侧从下往上看,相当于一个卷积网络,每次卷积采用膨胀率为 2的空洞卷积;
    • 右侧是卷积后的统计分析,整个图代表原始输入,每个格子代表一个像素,格子里的值代表3次卷积后,该像素被计算的次数;
    • 可以看到有些像素是没有参与计算的,造成了大量的信息丢失,影响最终效果。
  • 由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。这对 pixel-level dense prediction 的任务来说是致命的。

在这里插入图片描述

2.1.2 Long-ranged information might be not relevant

  • 我们从dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而,只采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。
  • 由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。

2.2 HDC方案解决空洞卷积存在的问题

论文地址:https://arxiv.org/abs/1702.08502

规则1 第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小, 即 M 2 < K 即M_2<K M2<K
M i = m a x [ M i + 1 − 2 r i , M i + 1 − 2 ( M i + 1 − r i ) , r i ] M i :第 i 层两个非零元素之间的最大距离 r i : 第 i 层的扩张率 最后一层 M n = r n M_i = max[M_{i+1}-2r_i, M_{i+1}-2(M_{i+1}-r_i),r_i ] \\ M_i:第i层两个非零元素之间的最大距离 \\ r_i:第i层的扩张率 \\ 最后一层M_n = r_n Mi=max[Mi+12ri,Mi+12(Mi+1ri),ri]Mi:第i层两个非零元素之间的最大距离ri:i层的扩张率最后一层Mn=rn
公式比较难理解,举例如下:
参数 K = 3 , r = [ 1 , 2 , 5 ] , 此时 M 3 = r 3 = 5 M 2 = m a x [ M 3 − 2 r 2 , M 3 − 2 ( M 3 − r 2 ) , r 2 ] = m a x [ 5 − 4 , 5 − 2 ( 5 − 2 ) , 2 ] = 2 此时 M 2 < 3 ,满足规则,因此这样设置扩张率不会出现栅格效应问题。 假如此时 r = [ 1 , 2 , 9 ] ,那么此时 M 3 = r 3 = 9 M 2 = m a x [ M 3 − 2 r 2 , M 3 − 2 ( M 3 − r 2 ) , r 2 ] = m a x [ 9 − 4 , 9 − 2 ( 9 − 2 ) , 2 ] = 5 此时 M 2 > 3 ,不满足规则,因此这样设置扩张率会出现栅格效应问题。 参数K=3,r=[1,2,5],此时M_3=r_3=5 \\ M_2 = max[M_{3}-2r_2, M_{3}-2(M_{3}-r_2),r_2 ] \\ =max[5-4,5-2(5-2),2]=2 \\ 此时M_2 < 3,满足规则,因此这样设置扩张率不会出现栅格效应问题。\\ 假如此时r=[1, 2, 9],那么此时M_3=r_3=9 \\ M_2 = max[M_{3}-2r_2, M_{3}-2(M_{3}-r_2),r_2 ] \\ =max[9-4,9-2(9-2),2]=5\\ 此时M_2 > 3,不满足规则,因此这样设置扩张率会出现栅格效应问题。\\ 参数K=3r=[1,2,5],此时M3=r3=5M2=max[M32r2,M32(M3r2),r2]=max[5452(52)2]=2此时M2<3,满足规则,因此这样设置扩张率不会出现栅格效应问题。假如此时r=[1,2,9],那么此时M3=r3=9M2=max[M32r2,M32(M3r2),r2]=max[9492(92)2]=5此时M2>3,不满足规则,因此这样设置扩张率会出现栅格效应问题。
规则2:扩张系数从1开始设置

其实这也不算做一个规则,但原论文中都是从1开始的。

规则3:扩张系数的公约数不能大于1

如果设置扩张系数为[2,4,8],他们之间的公约数为2,大于1了,仍然会出现gridding effect的问题。

另外还有一个建议:将扩张系数设置为锯齿形状[1,2,3,1,2,3]

参考链接如下:

关于HDC可以参考B站up主[霹雳吧啦Wz]视频:https://www.bilibili.com/video/BV1Bf4y1g7j8

膨胀卷积-空洞卷积-Dilated Convolution

深入理解空洞卷积

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

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

相关文章

鸿蒙开发 一 (一)、框架了解

一、UI框架 开发范式名称 语言生态 UI更新方式 适用场景 适用人群 声明式开发范式 ArkTS语言 数据驱动更新 复杂度较大、团队合作度较高的程序 移动系统应用开发人员、系统应用开发人员 类Web开发范式 JS语言 数据驱动更新 界面较为简单的程序应用和卡片 Web前端…

2025张宇考研数学基础36讲,视频百度网盘+PDF

一、张宇老师全年高数体系&#xff08;听课用书指南&#xff09; 25张宇全程&#xff1a; docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴在浏览器上打开&#xff0c;就可以看到2025张宇的全部的啦&#xff01; 一般来说我们把考研数学划分为3-4个阶段&#xff0c;分别是基础阶…

详解基于快速排序算法的qsort的模拟实现

目录 1. 快速排序 1.1 快速排序理论分析 1.2 快速排序的模拟实现 2. qsort的模拟实现 2.1 qsort的理论分析 2.2 qsort的模拟实现 qsort函数是基于快速排序思想设计的可以针对任意数据类型的c语言函数。要对qsort进行模拟实现&#xff0c;首先就要理解快速排序。 1. 快…

【物联网应用】基于云计算的智能化温室种植一体化平台

目录 第一章 作品概述 1.1. 作品名称 1.2. 应用领域 1.3.主要功能 1.4.创新性说明 第二章 需求分析 2.1 现实背景 2.2 用户群体及系统功能 2.3 竞品分析 第三章 技术方案 3.1. 硬件组成与来源 3.2. 硬件设计合理性 3.3. 硬件系统设计图 3.4. 接口的通用性与可扩展性 3.5. 代码规…

【已解决】在pycharm终端无法激活conda环境,但在cmd命令行中可以

一、问题描述 在windows下winr启动cmd命令行&#xff0c;可以成功运行conda命令并且激活环境在pycharm中打开Terminal终端&#xff0c;发现无法运行conda和pip命令&#xff0c;报错环境无法激活 无法在管道中间运行文档: D:\software\Anaconda3\condabin\conda.bat。 所在位置…

uniapp+vue3+setup语法糖开发微信小程序时不能定义globalData的解决方法

在使用 uniapp 开发小程序的时候&#xff0c; 发现使用了setup 语法糖 &#xff0c;定义 globalData 时&#xff0c;要不是定义不了&#xff0c; 要不就是使用 getApp()取不到&#xff0c;后来想到一个不伦不类的方法解决了&#xff0c; 这个方法有点难看&#xff0c; 但是解决…

云手机的数据安全有保障吗?

随着移动互联网的迅速发展&#xff0c;云手机作为一种新兴的移动终端技术&#xff0c;正在逐渐受到人们的关注和应用。然而&#xff0c;对于云手机而言&#xff0c;数据安全问题一直是人们关注的焦点之一。本文将探讨云手机的数据安全性&#xff0c;并分析其是否具备足够的保障…

每周编辑精选|微软开源 Orca-Math 高质量数学数据集、清华大学研究团队发布条件去噪扩散模型 SPDiff...

Orca-Math 是微软研究院发布的数学推理模型&#xff0c;该模型展示了较小的专业模型在特定领域的价值&#xff0c;它们可以匹配甚至超越更大模型的性能。微软近期开源了用于训练 Orca-Math 的 Orca-Math-200K 数学单词问题数据集&#xff0c;现已在 hyper.ai 官网提供下载&…

记录对NSIS的一些微调 实现Electron安装包美化

利洽科技-nsNiuniuSkinUI - NSIS 实现了electron 的安装包美化&#xff0c;免费&#xff0c;便捷。 下面我整理了一些关于它的微调&#xff0c;使其安装卸载更加简单快捷。 1. 默认展示安装路径部分 &#xff08;1&#xff09;将moreconfiginfo标签visible 设置为 true&#…

const,static深度总结——c++穿透式分析

前言&#xff1b;c类和对象的知识点中除了几种默认函数&#xff0c; 比较重要的还有使用const和static修饰成员相关知识点。const在c中特性很简单。 但是在使用中&#xff0c; 比较容易疏忽大意出现问题。 static特性也很简单&#xff0c; 但是比起const来要直接的多。 在使用中…

PHP-小皮创建php网站中遇到的问题及解决方案—我耀学IT

一、安装 1.1 在学习php时我们需要用到的软件有两个&#xff0c;一个时vscode&#xff0c;一个就是小皮面板&#xff08;phpstudy&#xff09; 1.2 vscode安装直接从官网下载&#xff0c;根据系统下载对应的版本&#xff0c;例如&#xff1a;windows64、linux等&#xff1b;同…

智慧城市中的智慧生活:便捷、舒适与高效

目录 一、智慧城市中的智慧生活概述 二、智慧生活带来的便捷性 1、智慧交通的便捷出行 2、智慧购物的轻松体验 3、智慧政务的一站式服务 三、智慧生活带来的舒适性 1、智慧环境的绿色宜居 2、智慧医疗的健康保障 3、智慧教育的均衡发展 四、智慧生活带来的高效性 1、…

力扣每日一题 区域和检索 - 数组不可变 前缀和

Problem: 303. 区域和检索 - 数组不可变 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class NumArray {int[] s;public NumArray(int[] nums) {int n nums.length;s new int[n 1];for(int i 1; i < n; i)s[i] s[i-1] nums[i-1];}public …

蓝桥杯练习01卡片化标签

卡片化标签页 介绍 选项卡功能在前端开发中特别常见&#xff0c;作为设置选项的模块&#xff0c;每个选项卡代表一个活动的区域&#xff0c;点击不同的区域&#xff0c;即可展现不同的内容&#xff0c;这样既能节约页面的空间又能提升页面性能。 本题需要在已提供的基础项目中…

Vue/Uni-app/微信小程序 v-if 设置出场/退出动画(页面交互不死板,看起来更流畅)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 在Vue.js中&#xff0c;使用v-if进行条件渲染时设置动画可以通过<transition>组件来实现。 具体操作步骤如下&#xff1a; 包裹条件渲染的元素&#xff1a;您需要将要通过v-if控制显示隐藏的元素包裹在<transition…

华为配置终端定位基本实验配置

配置终端定位基本示例 组网图形 图1 配置终端定位基本服务示例 组网需求数据准备配置思路配置注意事项操作步骤配置文件 组网需求 如图1所示&#xff0c;某公司网络中&#xff0c;中心AP直接与RU连接。 管理员希望通过RU收集Wi-Fi终端信息&#xff0c;并提供给定位服务器进行定…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果 一、简单介绍 二、素描画风格效果实现原理 三、案例简单实现步骤 一、简单介绍 Python是一种跨…

机器人可反向驱动能力与力控架构

反向驱动性是电机传动系统的机械特性&#xff0c;它描述了运动是否可以轻松反转 。特别是&#xff0c;反向驱动能力取决于两个因素&#xff1a;传动运动效率和整体执行器机械阻抗。反向运动中传动装置的低运动效率意味着所施加的外力的大部分被运动反作用力抵消。然而&#xff…

T100中常用的SQL语句

汇总总结一下在T100中常用的SQL语句。 一、基础资料的查询 这里把aimm200中的所有的需要的数据全部串查到一个结果集中&#xff0c;然后直接Excel汇出即可。 select imafsite 据点,imaf001 料件编号,imaal003 品名,imaal004 规格,--imaf172 交货前置时间,imaf013 补给策略imaa…

windows查看局域网内所有已使用的IP IP扫描工具 扫描网段下所有的IP Windows环境下

推荐使用&#xff1a; Advanced IP Scanner 官网下载&#xff1a; https://www.advanced-ip-scanner.com/