标准卷积可以看做空洞卷积rate=1(Note:rate=2表示中间空洞间隙为1)的特殊形式 中间的空洞间隙,计算感受野的时候,也属于感受野的有效范围。 (单个卷积的感受野计算公式:[(rate-1)(k-1) + k] ** 2 ,其中(rate-1)(k-1) 是因为空洞而新增加的边长增量) 作用: 扩大感受野: 原本为了增加感受野同时不增加计算量 空洞卷积可以在不需要引入额外参数的前提下,任意扩大感受野。 一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。因此空洞卷积主要应用于检测、分割。 如deeplab使用rate=2,而HDC采用r=1,r=2,r=3三个空洞率组合,这两种方案感受野都是13。 但HDC方案可以从更广阔的像素范围获取信息,避免了grid问题。 deeplabv3在v2基础上进一步探索空洞卷积,分别研究了级联ASPP与并联ASPP两种结构。 总结-空洞卷积(Dilated/Atrous Convolution)
我们知道正常的卷积已经能够提取特征了,那么空洞卷积又是做什么的呢? 下图是正常卷积核空洞卷积的动态图对比: 下图为卷积核为3x3,步长为1的普通卷积: ? 下图为卷积核为3x3,步长为1,扩张率为1的空洞卷积: ? 对比上两动图,先感受下区别。 空洞卷积有什么用呢? 2,3,4,5,6五颗像素(想象二维情况下应该是5x5)。 ,如右侧蓝色的那个特征覆盖2,3,4,5,6五颗像素(想象二维情况下应该是5x5)。 而左侧为为3x3空洞卷积,padding为same,stride=1, dilated rate=2的情况下,我们可以看到卷积后的特征的感受野为7x7,如红色特征的感受野为1,2,3,4,5,6,7。
在此以 卷积为例,展示普通卷积和空洞卷积之间的区别,如图2所示 图2 普通卷积和空洞卷积的对比(来自[4]) 图2中从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的(区别于下面图4),大框表示输入图像 3 b是dilation rate = 2的空洞卷积,卷积后的感受野为5 c是dilation rate = 3的空洞卷积,卷积后的感受野为8 可以这么说,普通卷积是空洞卷积的一种特殊情况 另外,空洞卷积可以增大感受野 图2 普通卷积和空洞卷积的对比(来自[4]) image.png 下面举个例子练练手,此图4和上面的图2有区别,图2的三幅图是独立的,而图4是从左到右连续进行卷积,它们属于top-bottom关系 图4 三个不同的空洞卷积,卷积核的kernel size=3, stride=1, 但是空洞卷积的dilation rate分别是1,2,4。 假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话,则会出现这个问题: 由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖
因此Atrous conv.也被称为“空洞卷积”。一些论文也称之为"dilated convolution"。它通常用于小波变换,现在它被应用于卷积中以进行深度学习。 当r > 1时,它是一个带孔的卷积,r是在卷积过程中对输入样本进行采样的步幅。 下图说明这一点 ? 标准卷积(顶部)空洞卷积(底部) atrous卷积的想法很简单。在上图的顶部是标准卷积。 在图的底部,它是一个空洞卷积。我们可以看到,当rate = 2时,输入信号被交替采样。首先,pad = 2 意味着我们在左侧和右侧填充2个零。 在DeepLab中,使用VGG-16或ResNet-101,最后一个池化(pool5)或卷积conv5_1的步幅分别设置为1,以避免信号被过度抽取。并且使用rate=2的空洞卷积替换所有后续卷积层。 DeepLab模型 ASPP: 使用并行的空洞卷积的DeepLab模型 CRF: 全连接的条件随机场做最后处理 4.2 与最先进的方法对比 ?
扩张率中文也叫空洞数(Hole Size)。 在此以 ? 卷积为例,展示普通卷积和空洞卷积之间的区别,如图2所示 ? 图2 普通卷积和空洞卷积的对比(来自[4]) 图2中从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的(区别于下面图4),大框表示输入图像(感受野默认为1),黑色的圆点表示 ? = 2的空洞卷积,卷积后的感受野为5 c是dilation rate = 3的空洞卷积,卷积后的感受野为8 可以这么说,普通卷积是空洞卷积的一种特殊情况 另外,空洞卷积可以增大感受野,但是可以不改变图像输出特征图的尺寸 图2 普通卷积和空洞卷积的对比(来自[4]) 从图2可以看出,同样一个 ? 的卷积,却可以起到 ? 、 ? 图4 三个不同的空洞卷积,卷积核的kernel size=3, stride=1, 但是空洞卷积的dilation rate分别是1,2,4。默认初始化感受野是1。
ESPNet系列的核心在于空洞卷积金字塔,每层具有不同的dilation rate,在参数量不增加的情况下,能够融合多尺度特征,相对于深度可分离卷积,深度可分离空洞卷积金字塔性价比更高。 卷积将输入映射到低维特征空间,空洞卷积金字塔使用$K$组$n\times n$空洞卷积同时重采样低维特征,每个空洞卷积的dilation rate为$2^{k-1}$,$k={1, \cdots, K} ,深度分离卷积以及深度可分离空洞卷积的参数量和有效感受域如表1所示。 原始的ESP模块结构如图1a所示,论文首先将point-wise卷积替换为分组point-wise卷积,然后将计算量较大的空洞卷积替换为深度可分离空洞卷积,最后依然使用HFF来消除网格纹路,结构如图1b 所示,能够降低$\frac{Md+n^2d^2K}{\frac{Md}{g}+(n^2+d)dK}$倍计算复杂度,$K$为空洞卷积金字塔层数。
空洞卷积的计算过程 该文章只单纯的讲解计算的细节,关于对应的原理和证明可以戳尾部的参考文献。 当填充方式为 SAME 时,步长 s 为 1 时,输出的 o == i,我们则可以计算出相应的 P 值为 p = (f-1) / 2 转置卷积(反卷积,逆卷积)的计算过程 在理解转置卷积(Transposed 假设一个卷积操作,它的输入是 4x4,卷积核大小是 3x3,步长为 1x1,填充方式为 Valid 的情况下,输出则为 2x2,如下图所示: 我们将其从左往右,从上往下以的方式展开, 输入矩阵可以展开成维数为 空洞卷积的计算过程 空洞卷积(Dilated convolutions)在卷积的时候,会在卷积核元素之间塞入空格,如下图所示: 空洞卷积过程,蓝色表示输入,绿色表示输出 这里引入了一个新的超参数 d,( 进而,假定输入空洞卷积的大小为 i,步长 为 s ,空洞卷积后特征图大小 o 的计算公式为: ?
本篇博客只对空洞卷积进行多尺度背景聚合(Multi-Scale Context Aggregation by Dilated Convolutions)和DeepLab2(DeepLab + ResNet 毕竟在介绍DeepLab2的时候需要用到空洞卷积。 (1)空洞卷积 空洞卷积的原理如图所示,仔细看了下原理,才知道在传统的CNN中,正常都会采用pooling池化来达到降维的目的,这种在图像语义分割中会产生一定的副作用,如经典的FCN在第3-5的featuremap 因此空洞卷积的目的是:不要池化层,毕竟池化之后正常会减少像素的信息而导致信息损失。 可以看出,DeepLab2使用了带孔/空洞卷积,金字塔型的空洞池化(ASPP)和全连接 CRF等多项技术的结合。
一、空洞卷积的基础原理空洞卷积(Dilated Convolution) 是一种改进的卷积操作,通过在卷积核中引入“空洞”来扩大感受野。 2. 空洞卷积模块空洞卷积模块是网络的主体,每个模块包括空洞卷积层、批归一化(BatchNorm)和激活函数(ReLU)。我们拆开来看看它是怎么干活的。 比如空洞率是1,就是传统卷积;空洞率是2,核就跳着走,覆盖范围变大了。 以下是每个部分的细节: 卷积块 (self.layer)卷积块由四个子块组成,每个子块包含:nn.Conv2d:二维卷积层,可能包含空洞卷积。nn.BatchNorm2d:批归一化层,稳定训练过程。 四、PAMAP2数据集实战结果相比其他模型,例如可变形卷积网络,空洞卷积(Dilated Convolution)更注重通过较少的参数扩展感受野,通过引入空洞率(dilation rate)设计稀疏的滤波器
目录 一、从普通卷积到空洞卷积的直观理解 二、关于卷积的重新思考——普通卷积的缺陷 三、空洞卷积的拯救之路:Dilated Convolution to the Rescue 3.1 潜在问题 :Hybrid Dilated Convolution (HDC) 3.4 多尺度分割的另类解:Atrous Spatial Pyramid Pooling (ASPP) 四、总结 一、从普通卷积到空洞卷积的直观理解 总结:多次叠加多个具有相同空洞率的卷积核会造成格网中有一些像素自始至终都没有参与运算,不起任何作用,这对于像素级别的预测是不友好的。 3.3 通向标准化设计:Hybrid Dilated Convolution (HDC) 说得更简单明白一点其实就是使用多个不同空洞率的空洞卷积核混合,当然至于没一个卷积核的空洞率rate怎么选择,是有一些技巧和原则的 第一个特性是,叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积,依然会出现 gridding effect。
DeepLabv3在ImageNet预训练的Backbone中使用空洞卷积,将输出stride减少到16或8,而不是通常的32,并通过提出Atrous空间金字塔池模块(ASPP)来增加感受野,该模块并行地应用了不同扩张率的卷积层分支 图2是一个空洞卷积的例子。 PSPNet提出了金字塔池化模块(Pyramid Pooling Module, PPM),它通过首先应用平均池化来应用不同输入分辨率的卷积层的并行分支。 一种是在早期用stride为2或平均池化进行采样。另一种方法是使用空洞卷积,扩张率为r的卷积在感受野上等于kernel大小为2r+1的卷积。 图4为步幅为2时的D Block。与ResNet D-variant类似,当Block的stride=2时,在shortcut分支上应用2×2平均池化。BatchNorm紧跟每个卷积之后。 Backbone以一个32的通道3×3卷积为起点,stride为2。
一、空洞卷积的提出 空洞卷积(atrous convolutions)又名扩张卷积(dilated convolutions),向卷积层引入了一个称为 “扩张率(dilation rate) 假设原始特征为feat0,首先使用扩张率为1的空洞卷积生成feat1,feat1上一点相对feat0感受野为3*3(如图a); 然后使用扩张率为2的空洞卷积处理feat1生成feat2(如图b),使第一次空洞卷积的卷积核大小等于第二次空洞卷积的一个像素点的感受野 ,图b即feat1上一个点综合了图a即feat0上3*3区域的信息,则生成的feat2感受野为7*7,即整个图b深色区域; 第三次处理同上,第二次空洞卷积的整个卷积核大小等于第三次空洞卷积的一个像素点的感受野 ,图c即feat2上每个点综合了feat0上7*7的信息(感受野),则采用扩张率为3的空洞卷积,生成的feat3每一个点感受野为15*15。 三、空洞卷积问题 感受野跳跃 我们对同一张图连续三次使用扩张率为1的空洞卷积,观察整张图的中心点的感受野(如下图) ?
在空洞卷积提出以前,大部分的空间尺寸恢复工作都是由上采样或反卷积实现的。 2 空洞卷积 一句话概括空洞卷积:调整感受野(多尺度信息)的同时控制分辨率的神器。 (2) 控制分辨率 除了维持空间分辨率,空洞卷积也可以像标准卷积一样通过设置输出步长(output_stride)实现输出特征图分辨率的控制。 (2) 空洞卷积结构1 下图(b)是基于上面第三种结构的空洞卷积分割网络结构图,(a)是对应的第三种结构的网络结构图。 ? (3) 空洞卷积结构2 下图是基于最后一种结构的空洞卷积网络结构,也称为ASPP(Atrous Spatial Pyramid Pooling),也是前两个DeepLab版本中所使用的网络结构。
深度学习基础入门篇9.3:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析 1.空洞卷积(Dilated Convolution) 1.1 空洞卷积提出背景 在像素级预测问题中 空洞卷积在某些特定的领域有着非常广泛的应用,比如: 语义分割领域:DeepLab系列2,3,4,5与DUC6。 尺寸为 $3\times{3}$ ,扩张率分别为 $1,2,4$ 时的空洞卷积分别如 图1,图2,图3所示。 图片 图1 扩张率为1时的3*3空洞卷积 扩张率为1时,空洞卷积与标准卷积计算方式一样。 图片 图2 扩张率为2时的3*3空洞卷积 图片 图3 扩张率为4时的3*3空洞卷积 扩张率大于1时,在标准卷积的基础上,会注入空洞,空洞中的数值全部填0。 图片 图5 空洞卷积的感受野示例 其中,通过一层空洞卷积后,感受野大小为$5\times5$,而通过两层空洞卷积后,感受野的大小将会增加到$9\times9$。
微观层面:提出了可切换的空洞卷积(SAC),用不同的空洞率来对相同的输入特征做卷积,使用switch函数来结合结果。上图(b) 展示了 SAC 的概念。 而且SAC中使用了一个新的权重闭锁机制,除了一个可训练的差异之外,不同空洞卷积的权重是一样的。 2.新框架 ? ? 将RFP和SAC的结合起来,就有了DetectoRS。 Switchable Atrous Convolution 空洞卷积是增大卷积层滤波器感受野的有效方式。 特别地,空洞率r的空洞卷积在两个连续的滤波器值之间引入r−1个0,相当于将卷积核大小由k×k增大到ke=k+(k−1)(r−1),而不会增加参数的个数或计算量。 下图b为3×3卷积层和空洞率为1(红色)与2(绿色)的一个例子:不同尺度的同类物体可以通过相同的卷积权重和不同的空洞率来检测。 ?
带有空洞的文件复制后还有空洞吗? 的文件,如果害怕因下载时间太长导致后面磁盘空间不足而失败的情况,可以预先将文件扩展到 2GB,再分别填充其中的数据。 不过这个更像是 windows 上的 SetEndOfFile 的应用场景,因为需要事先分配这么多存储空间,而不是像文件空洞那样只给一个标称的 2GB 文件而实际不分配存储空间。 从这个角度看,windows 确实有一定的优势,因为在 linux 上占用 2GB 空间还真不是几个调用就可以搞定的。 还能想到的一个场景就是分块下载,这个和文件空洞确实可以产生一些化学反应。 最终结论就是,文件空洞并没有内存空洞那么有用,如果你遇到过它的应用场景,欢迎在评论区拍砖斧正~~ 参考 [1]. lseek函数与文件空洞 [2]. windows稀疏文件
学习torch框架中的卷积神经网络,对此进行记录 一、nn.Conv1d 一维的卷积能处理多维数据 nn.Conv2d(self, in_channels, out_channels, kernel_size ,可以是int,或tuple;kennel_size=2,意味着卷积大小2, kennel_size=(2,3),意味着卷积在第一维度大小为2,在第二维度大小为3; stride:步长,默认为1, 2), stride=(2, 2, 1), padding=[2, 2, 2]) (1): ReLU() ) ) torch.Size([10, 16, 16, 18, 37]) 卷积计算 :34,对于卷积核长分别是;对于步长分别是第一维度:2,第二维度:,2,第三维度:1;对于padding分别是:第一维度:2,第二维度:,2,第三维度:2; d1 = (30 – 3 + 22)/ 2 ,可以是int,或tuple;kennel_size=2,意味着卷积大小(2,2), kennel_size=(2,3),意味着卷积大小(2,3)即非正方形卷积 stride:步长,默认为1,与kennel_size
[SAConv可切换空洞卷积介绍] SAConv(可切换空洞卷积)原理与优点详解 一、SAConv的核心原理 SAConv(Switchable Atrous Convolution)是一种创新的卷积模块 ,旨在解决传统空洞卷积(Dilated Convolution)在多尺度目标检测中的局限性。 其核心设计思想如下: 动态空洞率切换机制 SAConv通过可学习的开关函数(Switch Functions)动态调整卷积核的空洞率(Dilation Rate),而非固定使用单一空洞率。 具体实现中,输入特征图会经过多个并行分支,每个分支使用不同的空洞率(如1, 2, 3等),然后通过开关函数加权融合结果。 开关函数的权重由网络自动学习,能够根据输入特征自适应地选择最优的空洞率组合。 四、总结 SAConv通过动态空洞率切换和全局上下文感知,解决了传统空洞卷积的固定感受野问题,显著提升了模型的多尺度特征提取能力和鲁棒性。
空洞文件(hole file) 我们知道 lseek()系统调用,使用 lseek 可以修改文件的当前读写位置偏移量,此函数不但可以改变位置偏移量,并且还允许文件偏移量超出文件长度,这是什么意思呢? ,所以形成了空洞,这部分区域就被称为文件空洞,那么相应的该文件也被称为空洞文件。 文件空洞部分实际上并不会占用任何物理空间,直到在某个时刻对空洞部分进行写入数据时才会为它分配对应的空间,但是空洞文件形成时,逻辑上该文件的大小是包含了空洞部分的大小的,这点需要注意。 空洞文件有什么用呢? 来看一下实际中空洞文件的两个应用场景: ⚫ 在使用迅雷下载文件时,还未下载完成,就发现该文件已经占据了全部文件大小的空间,这也是空洞文件;下载时如果没有空洞文件,多线程下载时文件就只能从一个地方写入,这就不能发挥多线程的作用了
空洞文件(Sparse File)是一种在磁盘上并非完全分配存储空间的文件。它包含了一些逻辑上存在但物理上并未存储的数据。 空洞文件在多线程共同操作文件时具有极大的优势。 空洞文件在实际应用中有两个典型场景: 1、在使用迅雷下载文件时,尚未完全下载时文件已经占据整个文件大小的空间,这就是空洞文件的应用。 如果没有空洞文件,多线程下载时只能从一个位置写入,无法充分发挥多线程的优势。有了空洞文件,不同地址可以同时写入,发挥了多线程的优势。 2、在创建虚拟机时,如果一开始就分配了100GB的磁盘空间,而实际上系统安装完成后可能只使用了3、4GB的空间,这就是空洞文件的应用。 在文件系统中,读取空洞文件时,操作系统会将空洞部分的数据补充为0,使得读取的文件内容包含完整的文件大小。