[卷积]空洞卷积的改进

本文介绍了空洞卷积的作用,如扩大感受野和捕获多尺度信息,以及其在语义分割和目标检测中的应用。讨论了空洞卷积的gridding问题及其解决方案,包括HDC、ASPP等方法,同时提到了训练技巧和空洞卷积的优化策略。
摘要由CSDN通过智能技术生成

[卷积]空洞卷积的改进

文章来源: https://zhuanlan.zhihu.com/p/50369448

从这几年的分割结果来看,基于空洞卷积的分割方法效果要好一些,为此,拿出两天时间来重新思考下空洞卷积问题。

- . -语义分割创新该怎么做呢。

引言

空洞卷积(Dilated/Atrous Convolution),广泛应用于语义分割与目标检测等任务中,语义分割中经典的deeplab系列与DUC对空洞卷积进行了深入的思考。目标检测中SSD与RFBNet,同样使用了空洞卷积。

  • 标准卷积:以3*3为例,以下分辨率不变与分辨率降低的两个实例;
v2-67486c18a5cd95e03dba3bd188f2b76d_hd.jpg
v2-f505060cb5d84e1a18e8be54eda77999_hd.jpg
  • 空洞卷积:在3*3卷积核中间填充0,有两种实现方式,第一,卷积核填充0,第二,输入等间隔采样。
v2-3b7e3ff7c10d01b661752a9b68be7469_hd.jpg

标准卷积与空洞卷积在实现上基本相同,标准卷积可以看做空洞卷积的特殊形式。看到这,空洞卷积应该不那么陌生了。。

空洞卷积的作用

空洞卷积有什么作用呢?

  • 扩大感受野:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
  • 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要啊。

从这里可以看出,空洞卷积可以任意扩大感受野,且不需要引入额外参数,但如果把分辨率增加了,算法整体计算量肯定会增加。

空洞卷积感受野如何计算

说了这么多有关感受野的话,感受野究竟怎么计算呢?其实和标准卷积是一致的。

空洞卷积实际卷积核大小:

K=k+(k-1)(r-1),k为原始卷积核大小,r为空洞卷积参数空洞率;

### UNet 架构中的空洞卷积实现与应用 UNet 是一种广泛应用于图像分割任务的神经网络架构,其核心思想在于通过编码器-解码器结构捕获高分辨率的空间细节和低分辨率的语义特征。尽管原始 UNet 并未显式引入空洞卷积(Atrous Convolution),但在后续改进版本中,空洞卷积被用于增强模型对多尺度目标的理解能力。 #### 空洞卷积的作用 空洞卷积是一种扩展感受野的技术,在不增加参数量的情况下能够捕捉更大范围内的上下文信息[^2]。它通过对标准卷积核插入零值来扩大感知区域,从而有效解决传统卷积因降采样而导致的感受野缩小问题。这种特性使其非常适合于需要处理不同尺寸对象的任务,比如医学影像分析或多尺度物体检测。 #### 在 UNet 中的应用场景 1. **增大感受野而不损失空间分辨率** 当前许多基于 UNet 的变体采用空洞卷积替代部分常规卷积层,特别是在瓶颈阶段或者跳跃连接处。这样做的目的是保持输入图像较高的空间精度的同时获得更大的视觉覆盖面积[^4]。 2. **多尺度特征提取** 使用具有不同扩张率(dilation rate)的一组并行空洞卷积可以分别聚焦于局部细粒度模式以及全局背景关系。这种方法有助于构建更丰富的层次化表示形式,进而提高最终预测质量[^3]。 #### 示例代码展示如何在 PyTorch 下实现带空洞卷积的 UNet 层次之一: ```python import torch.nn as nn class AtrousConvBlock(nn.Module): def __init__(self, in_channels, out_channels, dilation=2): super(AtrousConvBlock, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=dilation, dilation=dilation) self.bn = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = self.conv(x) x = self.bn(x) # Batch Normalization after convolution. x = self.relu(x) # ReLU activation follows BN. return x # Example usage within a U-Net architecture component: def unet_with_atrous_block(): atrous_layer = AtrousConvBlock(in_channels=64, out_channels=128, dilation=4) ... ``` 上述代码片段定义了一个简单的带有指定膨胀因子 `dilation` 参数的标准二维空洞卷积模块,并展示了将其嵌入到典型 UNet 组件里的可能性。 #### 总结 综上所述,虽然经典版 UNet 不涉及空洞卷积技术,但现代衍生版本已成功融入该机制以应对复杂现实世界挑战。借助合理配置后的空洞卷积单元,不仅可维持原有紧凑高效优势,还能显著提升跨多种比例级别数据的表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值