空洞卷积(膨胀卷积/扩张卷积)本质理解
传统增大感受野的方法有两种:
1.增大卷积核 (如 5×5、7×7)→ 参数增多,计算量变大
2.卷积核大小不变,池化后再卷积 (如 max pooling,stride=2)→ 尺寸减小,导致空间信息丢失
于是出现了需求:
有没有一种方法,能够扩大感受野,又不缩小特征图的空间尺寸?
答案就是:空洞卷积(Atrous Convolution / Dilated Convolution)
膨胀卷积:1.增大感受野2.保持原图尺寸大小不变
一、空洞卷积的工作机制
空洞卷积的核心思想是:在卷积核元素之间插入空洞(即“空”的位置),跳着采样输入特征图,而不是连续采样。
- 原始卷积:一个 3×33\times33×3 卷积核是连续滑动采样
- 空洞卷积(r=2):相邻的卷积核格点之间插入一个空格(跳一个像素)
空洞卷积=插空的卷积核(膨胀后的滤波器)
1.普通卷积(r=1):
卷积核是连续的,像素点之间不跳过:
输入特征图(7x7):o o o o o o oo o o o o o oo o o o o o oo o o o o o oo o o o o o oo o o o o o oo o o o o o o卷积核(3x3)扫过时,每次覆盖连续 3x3 的块:● ● ●● ● ●● ● ●
2.空洞卷积(r=2):
在卷积核每两个格子之间插入一个“空格”,也就是跳过输入特征图的像素进行采样:
空洞卷积核(3x3, dilation=2):● ● ●↓ ● ● ● ← 相当于采样的是一个 5x5 区域中跳着的像素↓ ● ● ●→ 有效感受野 = (kernel_size - 1) * dilation + 1 = (3 - 1) * 2 + 1 = 5
本质理解:
就像是你用筷子夹豆豆,普通卷积是“一粒一粒夹”,空洞卷积是“每隔一粒夹”
你手没变大(卷积核没变),但夹的范围(感受野)变大了!
二、空洞卷积的优点
特性 | 说明 |
感受野增大 | 不改变卷积核大小(参数量不变),却能覆盖更大区域 |
空间分辨率不变 | 不需要下采样,保留特征图的细节信息 |
适合语义分割 | 适用于像素级任务,尤其是 DeepLab 系列 |
三、空洞卷积与感受野关系(图解)
举例:连续 3 层空洞卷积,卷积核大小 3×33 \times 33×3,空洞率分别为 1、2、4
空洞率 r | 有效感受野 | 实际卷积核点分布 |
1(普通卷积) | 3×3 | 连续格点 |
2 | 5×5 | 每格中插1个空格 |
4 | 9×9 | 每格中插3个空格 |
你会发现:感受野变成了
(3−1)⋅r+1
四、Gridding Effect(网格效应)
“gridding effect” 是空洞卷积的一个副作用,原因是:
空洞率增大后,卷积核只在稀疏的像素上采样,像素之间没有重叠,导致输出图像出现栅格状(checkerboard-like)模式。
解决方案:
- 混合多个空洞率(如 ASPP 模块)
DeepLabv3 中引入了多尺度空洞卷积,让不同感受野的信息融合,缓解 gridding。 - 使用卷积核堆叠(多个不同 dilation rate 层)
- 适当插入普通卷积层 保证局部连续采样
方法 | 解释 |
ASPP 模块(DeepLabv3) | 使用多种空洞率(r=1, 6, 12, 18)并行卷积 → 多尺度融合 |
Dilated block 堆叠 | dilation=1,2,4 交替堆叠,避免单一间隔造成盲点 |
加普通卷积 | 中间插入 standard convolution 平衡信息 |
五、总结一句话:
空洞卷积=给卷积核“插空”,以扩大感受野但不增加计算和参数,在语义分割中大放异彩,但也容易引入栅格效应,需要多尺度融合等方式优化。