DeepLab与空洞卷积——不降低分辨率也能扩大感受野,这招够聪明
聊完了FCN和U-Net今天聊聊分割领域另一个划时代的神器——空洞卷积Dilated Convolution以及基于它的DeepLab系列。我得说空洞卷积是我个人最喜欢的CV技巧之一。它简单到一句话就能说清楚——在卷积核的像素之间插空洞——但它的效果好到令人咋舌不增加参数量、不降低分辨率就能指数级扩大感受野。这种东西就是那种你一拍大腿说我怎么没想到的设计。普通卷积的死穴先回顾一下普通卷积的痛点。你要做一个分割模型希望能看到更大的范围——远处的上下文对判断当前像素的类别很重要。做法就是堆更多的卷积层或者用更大的卷积核。堆层的问题是每堆一层要么你保持分辨率不变计算量巨大要么你下采样分辨率降低、细节丢失。用大卷积核的问题是5x5的参数量是3x3的2.78倍7x7是3x3的5.4倍参数爆炸、过拟合风险飙升。所以在空洞卷积出现之前扩大感受野和保持高分辨率是矛盾的你只能二选一。空洞卷积的魔法空洞卷积的解决方案极其巧妙——你用一个3x3的卷积核但把9个像素点之间的间距拉开。dilation rate1就是普通3x3dilation rate2就是每隔一个像素取一个9个点覆盖了一个7x7的区域dilation rate3覆盖了13x13的区域。重点来了参数量没有任何增加——不管dilation rate是多少你用的都是9个权重但你覆盖的视野从3x3扩大到了7x7、13x13、甚至更大。这就像你用一副望远镜看东西望远镜本身没变重、没变大但能看到的范围远了十倍。这就是空洞卷积的精髓所在。在DeepLab系列里空洞卷积主要用在两个地方一是在backbone里。标准ResNet最后几层会做下采样把特征图缩小到1/32。DeepLab把最后几层替换成空洞卷积并且取消了部分下采样层这样特征图能保持在1/8甚至1/4的分辨率同时感受野却比原来的1/32还大。这就是所谓的Dilated ResNet——在ImageNet上预训练好的ResNet把最后几个block改成空洞版本直接拿来当分割的编码器。二是在ASPP模块里。这是DeepLabv3的王牌组件。在编码器的顶层特征图已经包含了高层语义并排放置不同dilation rate6、12、18、24的空洞卷积每个卷积各抓各的尺度的上下文信息然后把所有输出拼接起来。这个多尺度并行的设计让模型能同时看到很近的上下文dilation6和很远的上下文dilation24大大提升了分割的全局一致性。DeepLab系列的进化史DeepLab这系列从v1到v3一共发布了四个版本每个版本解决一个核心问题。DeepLabv12014首次把空洞卷积引入分割领域用空洞卷积替代下采样在不损失分辨率的前提下扩大感受野。但v1有两个明显缺陷一是上采样用的是双线性插值太粗糙二是缺乏多尺度信息。DeepLabv22016引入了ASPP模块用多尺度空洞卷积并行抓取不同范围的上下文。还在输出端用了一个全连接的条件随机场CRF来做后处理修整边界的毛刺。CRF这一步在v2里是标配到了v3里就被抛弃了——因为深度学习的边界预测已经足够好CRF那点提升划不来。DeepLabv32017取消了CRF后处理加强了ASPP——加了一个全局平均池化分支用来捕捉整个图像级别的上下文。去掉了v2里的CRF证明纯深度学习也能达到很好的边界效果。DeepLabv32018在v3的基础上加了解码器改成了编码器-解码器结构。v3的ASPP输出直接上采样16倍虽然精度的基线不低但边界还是不够锐利。v3加了一个轻量级的解码器融合了编码器中间层的高分辨率特征把边界精度提了一个档次。空洞卷积的一个隐患——网格效应空洞卷积也不是完美无缺的。它的一个著名问题叫网格效应Gridding Effect。当你在一个特征图上连续叠加多层空洞卷积而且dilation rate相同或者都是倍数关系的时候参与计算的有效像素点会集中在某个网格上很多像素点永远参与不到计算。这就导致信息利用不充分影响模型的上下文建模能力。解决方案也很直观在叠加空洞卷积的时候把dilation rate设成不同的、互质的数值。比如在DeepLab里ASPP的dilation rate是6、12、18——这三个数有公约数6但实际使用时因为每个分支的输出是独立拼接的并没有在单一分支上堆叠多个相同dilation率所以网格效应并不明显。但如果你要堆叠多层空洞卷积比如Dilated ResNet的后几层就要把dilation率设计成锯齿状——比如1、2、5、9这样逐步递增避免出现重复的采样模式。空洞卷积的工程陷阱——你用的框架可能不支持所有dilation率说个我自己踩过的坑。有些嵌入式推理框架比如某些国产NPU的SDK对空洞卷积的支持很有限——dilation率只能是1、2、4这些2的幂次不能是3、5、7。我有一回在DeepLabv3里把ASPP的dilation率设成了6、12、18模型在PC上训得好好的一导出到NPU上跑就报错unsupported dilation rate。后来只能改成4、8、16精度掉了一个点但好歹能跑了。所以做工业级项目的时候你在选模型结构之前最好先搞清楚目标推理平台支持哪些算子、哪些参数范围。别在服务器上训了个SOTA模型到了部署阶段发现根本跑不动那就欲哭无泪了。空洞卷积的性价比为什么这么高空洞卷积之所以能在分割领域统治这么久根本原因在于它的性价比极高。你加入一个空洞卷积层参数量跟普通卷积完全一样FLOPs也完全一样但感受野扩大了好几倍。这意味着你不需要增加模型大小、不需要降低推理速度就能获得显著的性能提升。这在资源受限的场景下是致命的优势。相比之下Transformer的自注意力虽然是全局感受野的终极形态但它的计算复杂度是O(n²)在图像尺度上大到没边。空洞卷积是在效率和全局感知之间找到了一个极佳的平衡点——它做不到100%的全局感知但它用极低的代价实现了80%的全局感知。在算力有限的现实世界里这种够用就好的设计往往比追求理论最优更务实。DeepLabv3为什么至今还是工业界的常青树2018年的DeepLabv3到今天快八年了你依然能看到它在各种工业项目里被使用。原因其实很简单结构清晰代码成熟开源资源丰富空洞卷积的效率极高推理速度尚可在Cityscapes等主流数据集上依然有竞争力的精度支持各种轻量化backbone替换MobileNet、EfficientNet-Lite部署工具链完善——TensorRT、ONNX、OpenVINO都能很好地支持DeepLab的算子在需要高精度、可部署、工程成熟的场景下DeepLabv3往往是最稳妥的选择。它可能不是最新、最花哨的但它一定是最不可能出幺蛾子的。