标准卷积网络通常依赖池化层来逐渐降低空间分辨率,同时增大感受野。这在图像分类中效果良好,因为最终输出是整个图像的单个标签。然而,对于语义分割,我们需要密集、像素级的预测。激进的下采样后再进行上采样(例如在基本的全卷积网络或编解码器结构中)会导致细粒度空间信息的丢失,使得准确描绘物体边界变得困难。空洞卷积,也称为atrous卷积(源自法语“à trous”,意为“带孔的”),提供了一种不同的方法来增大卷积层的感受野,而无需降低空间分辨率或显著增加参数数量。核心思想是在应用卷积时,在卷积核权重之间引入空隙。一个标准的 $3 \times 3$ 卷积核对输入特征图的一个连续的 $3 \times 3$ 区域进行操作。空洞卷积引入了一个 dilation rate(膨胀率),记作 $r$。膨胀率 $r$ 表示卷积核权重之间间隔了 $r-1$ 个像素。标准卷积对应于膨胀率 $r=1$。一个膨胀率 $r=2$ 的 $3 \times 3$ 卷积核将拥有相同的参数数量(9个权重),但会覆盖输入特征图中更大的区域($5 \times 5$),它在考虑的输入块中实际跳过了每个隔一个像素。考虑一个1维例子。令 $x$ 为输入信号,$w$ 为大小为 $K$ 的滤波器。标准1维卷积的输出 $y[i]$ 是: $$y[i] = \sum_{k=1}^{K} x[i + k - 1] \cdot w[k]$$膨胀率为 $r$ 的1维空洞卷积的输出 $y[i]$ 是: $$y[i] = \sum_{k=1}^{K} x[i + r \cdot (k - 1)] \cdot w[k]$$注意输入索引是如何通过膨胀率 $r$ 进行间隔的。这有效地扩展了卷积核的视野,而无需增加参数或需要更大的卷积核尺寸。digraph G { rankdir=LR; node [shape=square, style=filled, width=0.4, height=0.4, label=""]; edge [arrowhead=none]; subgraph cluster_0 { label = "标准卷积 (r=1)"; bgcolor="#e9ecef"; node [fillcolor="#74c0fc"]; in_0_0; in_0_1; in_0_2; in_1_0; in_1_1; in_1_2; in_2_0; in_2_1; in_2_2; {rank=same; in_0_0; in_0_1; in_0_2;} {rank=same; in_1_0; in_1_1; in_1_2;} {rank=same; in_2_0; in_2_1; in_2_2;} in_0_0 -> in_0_1 -> in_0_2; in_1_0 -> in_1_1 -> in_1_2; in_2_0 -> in_2_1 -> in_2_2; in_0_0 -> in_1_0 -> in_2_0; in_0_1 -> in_1_1 -> in_2_1; in_0_2 -> in_1_2 -> in_2_2; node [fillcolor="#1c7ed6"]; out_std [label="输出", shape=circle, width=0.3, height=0.3, fillcolor="#f03e3e"]; in_0_0 -> out_std; in_0_1 -> out_std; in_0_2 -> out_std; in_1_0 -> out_std; in_1_1 -> out_std; in_1_2 -> out_std; in_2_0 -> out_std; in_2_1 -> out_std; in_2_2 -> out_std; } subgraph cluster_1 { label = "空洞卷积 (r=2)"; bgcolor="#e9ecef"; node [fillcolor="#adb5bd"]; d_in_0_0; d_in_0_1; d_in_0_2; d_in_0_3; d_in_0_4; d_in_1_0; d_in_1_1; d_in_1_2; d_in_1_3; d_in_1_4; d_in_2_0; d_in_2_1; d_in_2_2; d_in_2_3; d_in_2_4; d_in_3_0; d_in_3_1; d_in_3_2; d_in_3_3; d_in_3_4; d_in_4_0; d_in_4_1; d_in_4_2; d_in_4_3; d_in_4_4; {rank=same; d_in_0_0; d_in_0_1; d_in_0_2; d_in_0_3; d_in_0_4;} {rank=same; d_in_1_0; d_in_1_1; d_in_1_2; d_in_1_3; d_in_1_4;} {rank=same; d_in_2_0; d_in_2_1; d_in_2_2; d_in_2_3; d_in_2_4;} {rank=same; d_in_3_0; d_in_3_1; d_in_3_2; d_in_3_3; d_in_3_4;} {rank=same; d_in_4_0; d_in_4_1; d_in_4_2; d_in_4_3; d_in_4_4;} node [fillcolor="#63e6be"]; d_in_0_0; d_in_0_2; d_in_0_4; d_in_2_0; d_in_2_2; d_in_2_4; d_in_4_0; d_in_4_2; d_in_4_4; out_dil [label="输出", shape=circle, width=0.3, height=0.3, fillcolor="#f03e3e"]; d_in_0_0 -> out_dil; d_in_0_2 -> out_dil; d_in_0_4 -> out_dil; d_in_2_0 -> out_dil; d_in_2_2 -> out_dil; d_in_2_4 -> out_dil; d_in_4_0 -> out_dil; d_in_4_2 -> out_dil; d_in_4_4 -> out_dil; } }一个 $3 \times 3$ 卷积核的感受野比较。左图:标准卷积 ($r=1$) 覆盖了 $3 \times 3$ 的输入区域(蓝色)。右图:膨胀率为 $r=2$ 的空洞卷积使用相同的9个权重,但通过有间隔地采样输入像素(绿色)来覆盖 $5 \times 5$ 的区域(灰色代表空隙)。两者都计算一个单一的输出值(红色)。对分割任务的益处为什么这种改变对语义分割特别有用?感受野呈指数级增长: 通过堆叠空洞卷积层,有效感受野可以呈指数级增长,而不损失分辨率或需要池化。这使得网络能够捕获更广泛的上下文信息(例如,理解一个像素是道路或天空等大型物体的一部分),在对每个像素进行预测时。保持空间细节: 不同于池化,空洞卷积保持特征图的完整空间分辨率。这对分割任务非常有利,因为分割任务常需要精确地定位物体边界。边缘和精细结构的信息不会通过下采样而丢失。参数效率: 使用标准卷积实现大感受野需要非常深的网络以及许多池化层(损失分辨率),或者使用非常大的卷积核尺寸(计算成本高且参数多)。空洞卷积提供了一种更有效的方法来扩大感受野。潜在问题:网格效应尽管功能强大,天真地堆叠相同膨胀率的空洞卷积可能导致一个被称为“网格效应”的问题。因为卷积核总是以固定的稀疏模式采样输入位置,一些输入像素在更深层中可能永远不会参与到输出计算中。这可能在预测中产生棋盘状伪影。缓解此问题的一个常见策略是在连续层中使用不同的膨胀率。例如,在后续层中使用 [1, 2, 5] 等速率确保所有输入像素最终在一系列层中都对输出有所贡献。这种方法有时被称为混合空洞卷积(Hybrid Dilated Convolution, HDC)。在分割架构中的作用空洞卷积是几种先进语义分割模型中的一个基础组成部分,最著名的是DeepLab系列。DeepLab架构在其骨干网络中广泛应用空洞卷积,以获取密集特征图。它们通常在并行分支中结合使用不同速率的空洞卷积,使用一个名为Atrous空间金字塔池化(ASPP)的模块,我们将在下一节中进行讨论。ASPP明确地以多种膨胀率探测输入的特征图,以捕获不同尺度的物体上下文信息。总之,空洞卷积提供了一种有效的机制来控制CNN中的感受野大小,同时保持空间分辨率,解决了为语义分割等密集预测任务设计网络时的一个重要难题。它们使得模型能够高效地汇聚多尺度上下文信息,从而提高分割准确性,特别是对于较大的物体和复杂场景。