查看全课大纲(第 73 / 93 节)
- 1.计算机视觉概述
- 2.计算机视觉应用场景
- 3.困难与挑战
- 4.开源库介绍
- 5.图像显示与存储
- 6.CLAHE
- 7.腐蚀膨胀与开闭运算
- 8.滤波与边缘填充
- 9.各种滤波
- 10.图像金字塔
- 11.傅里叶变换
- 12.短时傅里叶变换与小波变换
- 13.颜色特征与颜色直方图
- 14.几何特征_边缘
- 15.几何特征-角点与斑点
- 16.局部特征-SIFT特征描述子
- 17.局部特征-SURF特征描述子
- 18.局部特征-ORB特征描述子
- 19.其他特征描述子
- 20.传统图像分割技术
- 21.GraphCut
- 22.GrabCut
- 23.人脸检测的传统方法
- 24.行人检测的传统方法HOG+SVM
- 25.行人检测DPM
- 26.人工神经网络的架构
- 27.目标函数与梯度下降
- 28.误差反向传播
- 29.可手算的神经网络
- 30.改进目标函数与克服梯度消散
- 31.神经网络之传统神经网络与深度网络的差异
- 32.各种梯度下降算法
- 33.如何选择合适的梯度下降算法
- 34.避免过适应
- 35.CNN的架构
- 36.CNN的误差反向传播_卷积层
- 37.CNN的误差反向传播_池化层
- 38.分类所用的数据集
- 39.Alexnet详解
- 40.VGG详解
- 41.GoogLeNet_v1
- 42.BatchNormalization
- 43.GoogLeNet_v3v4
- 44.ResNet
- 45.ResNeXt
- 46.CNN设计准则
- 47.图像检索与推土机距离
- 48.基于颜色相似性
- 49.基于形状相似性
- 50.基于纹理相似性
- 51.基于局部特征相似性
- 52.DL的二值哈希编码
- 53.高维空间中检索KDTree
- 54.高维空间中检索LSH
- 55.目标识别任务综述
- 56.RCNN
- 57.SPP-Net
- 58.Fast R-CNN
- 59.Faster R-CNN
- 60.R-CNN系列模型回顾
- 61.R-FCN的设计思路
- 62.R-FCN的实现
- 63.YOLOv1
- 64.YOLOv2_9000
- 65.YOLOv3
- 66.图像分割应用场景与数据集
- 67.上采样的实现方式
- 68.FCN网络架构的由来
- 69.FCN构建细节
- 70.DeepLabv1
- 71.CRF
- 72.DeepLabv2
- 73.DeepLabv3
- 74.特定的医学影像分割任务
- 75.U-Net
- 76.3D U-Net
- 77.V-Net
- 78.DenseNet
- 79.病理切片分析任务及数据集
- 80.病理切片分析
- 81.图说任务及其传统处理方法
- 82.深度语言模型与RNN
- 83.LSTM及其变种
- 84.NIC模型
- 85.SAT模型
- 86.图说的性能指标
- 87.判别模型与生成模型
- 88.KL散度与JS散度
- 89.VAE
- 90.GAN的基本原理
- 91.DCGAN与CGAN
- 92.Wasserstein GAN
- 93.SRGAN
DeepLabv3
DeepLab v3 与 v3+
小象实战讲义 · 基于深度学习的计算机视觉
在掌握了DeepLab v1和v2的核心思想——空洞卷积(Atrous Convolution)与空间金字塔池化(ASPP)——之后,我们继续深入DeepLab系列。本节将聚焦于该系列的后续演进:DeepLab v3和DeepLab v3+。这两个版本在架构设计上进行了关键性的探索,旨在不依赖条件随机场(CRF)等非深度学习组件的前提下,进一步提升语义分割的精度,尤其是物体边界的精细程度。学完本节,你将理解如何通过级联与并联空洞卷积模块、引入编解码器结构来构建更强大、更纯粹的深度学习分割模型。
💡 核心导读
- DeepLab v3的架构探索:通过级联(Cascaded)和并联(Parallel)两种方式组合多尺度空洞卷积,并摒弃CRF,追求端到端的深度学习解决方案。
- 改进的ASPP模块:新的并联式ASPP集成了1×1卷积、多种采样率的3×3空洞卷积以及图像级(全局平均池化)特征,并使用批量归一化(BN)进行稳定化。
- DeepLab v3+的核心创新:在v3的编码器基础上,引入了一个轻量级的解码器模块,通过融合浅层特征来精细化分割结果,显著改善了物体边缘的细节。
- “炼丹”般的模型设计哲学:体会研究者如何通过系统性地尝试不同的模块排列组合(如级联 vs. 并联,是否使用CRF)来推动模型性能的边界。
DeepLab v3:走向更通用的框架
DeepLab v3旨在构建一个更通用、更强大的分割框架,其核心改进可以概括为以下几点:
- 通用性:框架设计使其能够方便地适配各种骨干网络(如ResNet, Xception等)。
- 多尺度信息提取的两种策略:
- 级联(Cascaded)方式:复制ResNet最后的残差块(例如block4),并将它们级联起来(形成block5, block6, block7)。每个块内部包含多个卷积层,并逐步增大空洞卷积的采样率(rate)。这种方式让网络在深层次上拥有逐渐扩大的感受野,从而捕获更丰富的语义上下文。
- 并联(Parallel)方式:对改进的空洞空间金字塔池化(ASPP)模块进行增强。
- 摒弃条件随机场(CRF):v3的一个显著变化是移除了v1/v2中用于后处理精化的CRF。研究者的目标是探索能否纯粹通过深度学习网络达到甚至超越结合CRF的效果,实现真正的端到端训练。
改进的并联式ASPP模块
DeepLab v3的并联策略主要体现在其重新设计的ASPP模块上。新的ASPP模块并行地包含了多个分支:
- 一个标准的 1×1卷积。
- 三个 3×3的空洞卷积,其采样率(
rate)分别设置为6、12和18。 - 一个 图像级特征(Image-level Feature) 分支,通过全局平均池化(Global Average Pooling)获得整个特征图的全局上下文信息。
每个卷积分支后都接有批量归一化(Batch Normalization, BN) 层,以稳定训练过程。所有分支的输出(特征图)会通过拼接(Concatenation) 的方式融合在一起,然后利用一个 1×1的卷积进行跨通道融合,最终输出融合后的多尺度特征。
import numpy as np
# 模拟ASPP模块中不同分支的特征提取(概念性维度演示)
# 假设输入到ASPP的特征图 feat 形状为 (H, W, C)
H, W, C = 8, 8, 256
# 使用确定性的简单数据代替随机数,便于理解
base_feat = np.arange(H * W * C, dtype=np.float32).reshape(H, W, C) / 1000.0
# 模拟各分支输出(此处简化,实际为卷积操作)
# 分支1: 1x1卷积 -> 输出256通道
branch_1x1 = base_feat * 0.1 + 0.5
# 分支2: 3x3空洞卷积 rate=6 -> 输出256通道
branch_rate6 = base_feat * 0.15 + 0.4
# 分支3: 3x3空洞卷积 rate=12 -> 输出256通道
branch_rate12 = base_feat * 0.12 + 0.45
# 分支4: 3x3空洞卷积 rate=18 -> 输出256通道
branch_rate18 = base_feat * 0.18 + 0.35
# 分支5: 图像级特征 (全局平均池化)
# 1. 全局平均池化得到 (1,1,C) 的特征
global_feat = np.mean(base_feat, axis=(0, 1), keepdims=True) # 形状 (1,1,256)
# 2. 将其上采样(复制)回原始空间尺寸 (H, W, C)
branch_global = np.tile(global_feat, (H, W, 1))
# 沿通道维度拼接所有分支特征 (H, W, 256*5)
aspp_concat = np.concatenate([branch_1x1, branch_rate6, branch_rate12, branch_rate18, branch_global], axis=2)
# 模拟1x1卷积进行跨通道融合,将通道数从1280降回256
# 简化:使用一个小的随机权重矩阵进行点乘(模拟卷积效果)
np.random.seed(42) # 固定随机种子保证可复现
fusion_weight = np.random.randn(aspp_concat.shape[2], 256) * 0.01
# 注意:这里为了演示简化了计算,实际卷积是滑动窗口操作。
# 我们简化为对每个空间位置进行矩阵乘法。
aspp_output = np.zeros((H, W, 256))
for i in range(H):
for j in range(W):
aspp_output[i, j, :] = np.dot(aspp_concat[i, j, :], fusion_weight)
print("输入特征图形状:", base_feat.shape)
print("ASPP拼接后特征图形状:", aspp_concat.shape)
print("ASPP融合后输出特征图形状:", aspp_output.shape)
print("全局平均池化得到的特征向量(前5个值):", global_feat[0,0, :5])输入特征图形状: (8, 8, 256)
ASPP拼接后特征图形状: (8, 8, 1280)
ASPP融合后输出特征图形状: (8, 8, 256)
全局平均池化得到的特征向量(前5个值): [8.064 8.065 8.066 8.067 8.068]这种并联结构使得网络能够在同一层级上捕获不同尺度的上下文信息,与级联方式形成互补。研究者通过实验对比了级联、并联以及不同组合方式的效果,这种系统性的尝试被形象地称为“炼丹”,是模型结构演进中常见且有效的方法。
DeepLab v3+:引入编解码器细化边缘
尽管DeepLab v3去掉了CRF并取得了不错的效果,但研究者发现,直接上采样ASPP模块输出的低分辨率特征图,有时在物体边界轮廓的精细度上仍有提升空间。DeepLab v3+ 应运而生,其核心思想是在v3强大的编码器(Encoder)基础上,增加一个轻量级的解码器(Decoder) 模块。
编码器-解码器结构
DeepLab v3+ 将整个网络视为一个编码器-解码器结构:
- 编码器:沿用DeepLab v3的结构(包含改进的ASPP模块),负责提取丰富的高层语义特征。这部分输出一个低分辨率、强语义的特征图(记为
feat_high)。 - 解码器:新增部分。其目的是融合编码器中较浅层的特征。具体来说,会从骨干网络(如ResNet)的某个中间层(例如
block2之后,对应H/4分辨率)提取特征图(记为feat_low)。feat_low具有更高的空间分辨率,包含更多细节和边缘信息,但语义性较弱。
解码器的工作流程
- 编码器输出处理:编码器输出的
feat_high(256 通道)不做 1×1 卷积,直接进行双线性上采样 4 倍,空间尺寸放大到 ,通道数仍为 256。 - 浅层特征处理:将提取的浅层特征
feat_low( 分辨率,通道数通常较多,如 256 或 512)通过一个 1×1 卷积,把通道数降到 48。 - 特征融合:将上采样后的
feat_high(256 通道)与处理后的feat_low(48 通道)沿通道维度进行拼接,得到 通道的特征图。 - 进一步融合与上采样:对拼接后的特征进行两次 3×3 卷积(每次输出 256 通道),进一步融合高低层信息,最后再次上采样(通常为4倍)至输入图像尺寸,得到最终的分割预测图。
# DeepLab v3+ 结构示意图 (伪代码描述)
输入图像 (H, W, 3)
│
▼
骨干网络 (如ResNet)
│
├───► 浅层特征 feat_low (H/4, W/4, Clow) # 例如来自block2
│
▼
DeepLab v3 编码器 (包含ASPP)
│
▼
高层特征 feat_high (H/16, W/16, 256)
│
├─── 双线性上采样4倍 ───► (H/4, W/4, 256)
│
▼
拼接( Concat ) ◄─── 1x1卷积降维至 48 ◄─── feat_low (H/4, W/4, Clow)
│
▼
拼接结果 (H/4, W/4, 256+48=304)
│
▼
3x3卷积融合 ───► (H/4, W/4, 256)
│
▼
3x3卷积融合 ───► (H/4, W/4, 256)
│
▼
上采样4倍 ───► 最终分割图 (H, W, num_classes)通过这种设计,解码器巧妙地将高语义信息(来自深层,知道“是什么”)和高分辨率细节信息(来自浅层,知道“边界在哪”)结合起来,从而在不依赖CRF的情况下,显著提升了分割结果,特别是物体边界的清晰度和准确性。
📝 动手练一练
- 概念辨析:DeepLab v3 中“级联”和“并联”多尺度空洞卷积的主要区别是什么?各自的设计初衷是什么?
- 结构思考:在DeepLab v3+的解码器中,为什么要对浅层特征
feat_low先用1×1卷积处理后再与深层特征融合?如果直接拼接会有什么潜在问题?
👉 点击查看参考答案
级联 vs. 并联:
- 级联:将多个空洞卷积块按顺序连接,每个块的采样率可能逐步增大。这种方式让感受野随着网络深度逐层扩大,能够捕获从局部到全局的渐进式上下文信息,侧重于在深度方向上扩展感受野。
- 并联:在网络的同一层(如ASPP模块)并行部署多个不同采样率的空洞卷积分支。这种方式让网络在同一层级上同时捕获不同尺度的上下文信息,侧重于在广度(尺度)方向上获取多尺度特征。
- 设计初衷:级联更符合传统网络加深的思路;并联则更高效地集成多尺度信息。v3对两者都进行了实验,最终改进的并联式ASPP成为其标志性设计。
1×1卷积的作用:
- 原论文中,深层特征
feat_high(ASPP 输出)保持256通道,直接双线性上采样4倍参与拼接;而feat_low位于骨干网络较前的位置,通道数较多(例如256或512),且包含大量低级的细节信息。 - 对
feat_low施加1×1卷积,主要目的有两个:一是把通道数降到48,避免通道数庞大的低层特征在拼接后(256+48=304)盖过高层的编码器特征、削弱高层语义的作用,同时控制后续卷积的计算量;二是可以对浅层特征进行一次变换和压缩,提炼出对分割任务更有用的边缘和细节信息,过滤掉一些噪声。 - 如果直接拼接(如 256+512=768 通道),低层特征会在通道维度上占主导,使训练变得更困难,后续卷积的参数与计算量也会显著增加。
- 原论文中,深层特征
本章小结
本节我们完成了对DeepLab系列最终两个重要版本——v3和v3+的探讨。DeepLab v3通过系统性地设计级联与并联的空洞卷积模块,并大胆摒弃非深度学习的CRF后处理,推动了纯深度学习分割模型的发展。而DeepLab v3+则通过引入经典的编码器-解码器结构,巧妙地融合深浅层特征,在保持强大语义理解能力的同时,显著提升了分割边界的精细化程度,代表了该系列一个非常成熟的形态。
今天,DeepLab v3+ 仍是语义分割的强基线,并有 MobileNet/Xception 轻量主干等工程变体;后续研究已转向 Mask2Former、SegFormer 等 Transformer 分割模型。但“ASPP 多尺度上下文 + 编解码器融合浅层细节”的设计,仍是分割网络的核心范式之一。
📋 行动清单
- 理解DeepLab v3中改进的ASPP模块包含哪几个核心分支,以及全局平均池化分支的意义。
- 厘清DeepLab v3+中编码器与解码器的分工,以及特征融合的具体步骤。
- 思考:如果让你设计一个更轻量化的分割模型,可以从DeepLab v3+的哪些部分进行简化或改进?
—— 小象教研组