一、引言:为什么要学 U-net 系列?
在语义分割任务中(比如 "从 CT 图中分割出肺结节""从卫星图中识别道路"),U-net 系列是绕不开的经典:
- U-net:2015 年由德国学者提出,最初用于医学图像分割,凭借 "编码 - 解码 + 特征拼接" 的简单结构,实现了当时 SOTA(State of the Art)性能,至今仍是入门首选;
- U-net++:针对 U-net 的 "语义鸿沟" 问题,引入密集特征融合和深度监督,精度大幅提升,同时支持剪枝,兼顾速度与精度;
- U-net+++:进一步优化低阶与高阶特征的整合,适合对细节和全局一致性要求高的场景(相对小众,了解思路即可)。
如果你是语义分割新手,掌握 U-net 系列能帮你快速建立 "分割算法设计" 的核心认知;如果是做项目,U-net++ 的改进思路也能直接用到工程优化中。
二、U-net:经典分割的 "基石"
U-net 的名字来源于它的结构 ------ 形似字母 "U",核心是 "编码 - 解码 + 特征拼接",用最简单的设计解决了 "分割任务需要细节与语义结合" 的核心需求。
1. 整体结构:编码 - 解码双分支
U-net 的结构分为左右两部分,对应 "特征提取" 和 "分辨率恢复":
-
左侧(编码端 / 下采样) :负责提取图像的语义特征 (比如 "这是器官边界""这是病变区域")。流程:
卷积层(3×3 Conv)→ ReLU激活 → 卷积层 → ReLU激活 → 最大池化(2×2 MaxPool)。每经过一次池化,特征图分辨率减半(比如 572×572→284×284),通道数翻倍(比如 64→128),目的是增大感受野(让模型看到更大范围的图像,捕捉全局语义)。 -
右侧(解码端 / 上采样) :负责将编码端的语义特征 "映射回原图像分辨率",同时保留细节信息 (比如器官的边缘、病变的轮廓)。流程:
上采样(2×2 Upsample)→ 特征拼接 → 卷积层 → ReLU → 卷积层 → ReLU。上采样会将特征图分辨率翻倍(比如 28×28→56×56),通道数减半;关键是 "特征拼接"------ 将解码端的特征图与编码端同分辨率的特征图拼接(比如解码端 56×56 的特征图,拼接编码端 56×56 的特征图),补充低阶细节信息。 -
输出层:用 1×1 卷积将最终特征图映射到 "类别数"(比如二分类输出 1 通道,多器官分割输出 n 通道),再用 Sigmoid/Softmax 得到分割概率图。
2. 核心创新:特征拼接(不是加法!)
在 U-net 之前,很多算法用 "特征加法"(比如 ResNet 的残差连接)融合不同层级特征,但 U-net 选择 "特征拼接(Concatenation)":
- 加法:是 "元素级相加",要求两个特征图通道数相同,相当于 "加权融合";
- 拼接:是 "通道维度叠加",比如编码端 64 通道的特征图 + 解码端 64 通道的特征图,拼接后变成 128 通道,相当于 "把细节和语义'全保留'"。
PPT 里提到 "以前我们都是加法,现在全都要",正是 U-net 的核心思路 ------ 分割任务需要 "高阶语义(知道是什么)" 和 "低阶细节(知道在哪里)",拼接能最大限度保留两者,这也是 U-net 在医学分割中表现好的关键。
3. 优势与应用
- 优势:结构简单(没有复杂模块)、训练快(参数总量不大)、细节保留好(拼接补充低阶特征);
- 典型应用 :
- 医学图像分割(核心场景):CT/MRI 图像的器官分割(如肝脏、肾脏)、病变分割(如肺结节、肿瘤);
- 其他场景:卫星图像分割(道路、建筑)、工业检测(缺陷分割)、自动驾驶(车道线分割)。
三、U-net++:U-net 的 "升级版"
U-net 虽然经典,但存在一个问题 ------语义鸿沟:编码端和解码端的特征图 "语义层次差异大"(比如编码端浅层是 "边缘",深层是 "器官类别",直接拼接会导致融合不充分)。U-net++ 针对这个问题做了 3 个关键改进,同时增加了 "深度监督" 和 "可剪枝性"。
1. 核心改进 1:密集特征融合(Dense 连接)
U-net++ 借鉴了 DenseNet 的 "密集连接" 思想,把 U-net 的 "单一路径拼接" 改成 "多路径密集拼接":
- U-net 的拼接:仅解码端某一层与编码端 "同分辨率" 层拼接(比如解码端 L3 只接编码端 L3);
- U-net++ 的拼接:解码端某一层会与编码端 "所有低分辨率" 层的特征图拼接(比如解码端 L3 会接编码端 L3、L2、L1 的特征图,先通过 1×1 卷积统一通道数)。
这样做的好处是:更全面地融合不同层级的特征,彻底解决 U-net 的语义鸿沟问题,让分割结果既准又细(比如医学分割中能更精准区分 "病变边界" 和 "正常组织")。
2. 核心改进 2:深度监督(Deep Supervision)
U-net 只有 "最终输出层" 计算损失,而 U-net++ 在每个解码阶段都增加了输出分支(比如解码端 L1、L2、L3 都有独立的输出层),每个输出分支都会计算损失,最终总损失是所有分支损失的加权和。
深度监督的优势:
- 加速收敛:早期训练中,浅层输出分支(分辨率高)的损失能快速引导模型学习细节,避免 "只靠最终输出,训练后期才调整细节";
- 提升小目标分割精度:小目标(如微小病变)在浅层特征图中更明显,浅层输出分支能重点优化这类目标的分割效果。
3. 核心改进 3:可剪枝性(Prunability)
由于 U-net++ 的每个输出分支都经过独立的监督训练,训练完成后可以根据 "速度需求" 灵活剪枝:
- 追求速度:直接使用浅层输出分支(比如 L1 分支,分辨率高但计算量小);
- 追求精度:使用最深的输出分支(比如 L4 分支,融合了所有特征);
- 平衡速度与精度:选择中间分支(比如 L2、L3 分支)。
"训练的时候同样会用到 L4,效果还不错",就是说即使剪枝后,保留的分支也有很好的性能,非常适合工程场景(比如实时医学影像分析,需要在设备上快速运行)。
4. U-net vs U-net++:关键差异
| 对比维度 | U-net | U-net++ |
|---|---|---|
| 特征融合 | 单路径拼接(同分辨率) | 多路径密集拼接(全层级) |
| 损失计算 | 仅最终输出层 | 多输出分支(深度监督) |
| 精度 | 基础水平 | 显著提升(尤其小目标) |
| 计算量 | 小 | 略大(可通过剪枝优化) |
| 适用场景 | 入门学习、简单分割任务 | 高精度需求、工程项目 |
四、U-net+++:细节与全局的再平衡(了解即可)
U-net+++ 是 U-net++ 的进一步改进,核心思路是 "差异化整合低阶与高阶特征",但应用相对小众,重点理解设计逻辑即可:
- 低阶特征整合:用不同大小的 MaxPool(比如 2×2、4×4)处理输入图像,提取多尺度的低阶特征(如轮廓、纹理);
- 高阶特征整合:通过上采样将编码端的高阶语义特征(感受野大)与低阶特征融合;
- 特征统一:所有层级的特征图都通过 3×3 卷积统一为 64 通道,最终拼接得到 320 通道特征图(5×64),再做最终分割。
U-net+++ 的定位是 "极致细节 + 全局一致性",但计算量比 U-net++ 更大,目前在主流分割任务中应用不如前两者广泛,新手可以先聚焦 U-net 和 U-net++。