语义分割入门 - 理解 U-Net 和 DeepLab 架构
什么是语义分割
语义分割为图像中的每个像素分配一个类别标签,实现像素级别的场景理解。与目标检测的边界框不同,语义分割提供精确的物体轮廓。
任务定义: 输入 H×W×3 的 RGB 图像,输出 H×W 的标签图,每个像素值对应一个类别 ID。
与实例分割的区别: 语义分割不区分同类别的不同个体。例如,图像中的 3 个行人都标记为"人"类,不区分是哪个人。实例分割则为每个行人分配不同的 ID。
典型数据集:
- PASCAL VOC: 20 类 + 背景,经典基准
- Cityscapes: 城市驾驶场景,19 类,精细标注
- ADE20K: 150 类,场景多样性最高
- COCO-Stuff: 171 类,包含物体和材质
FCN - 去除全连接层的开创性架构
FCN (Fully Convolutional Network, 2015) 是第一个端到端的语义分割深度学习方法,奠定了后续所有方法的基础。
核心思想: 将 VGG-16 等分类网络的全连接层替换为 1×1 卷积层,使网络可以接受任意尺寸输入并输出对应尺寸的分割图。
上采样策略:
- FCN-32s: 直接 32 倍上采样,结果粗糙
- FCN-16s: 融合 pool4 特征后 16 倍上采样
- FCN-8s: 融合 pool3 和 pool4 特征后 8 倍上采样,效果最好
贡献: 证明了预训练分类网络可以迁移到分割任务; 建立了编码器 (下采样) + 解码器 (上采样) 的基本范式; 跳跃连接融合多尺度特征的思想影响了后续所有架构。
局限性: 分割边界粗糙; 缺乏全局上下文信息; 上采样方式简单 (双线性插值)。
U-Net - 编码器-解码器结构与医学图像应用
U-Net (2015) 为医学图像分割设计,其对称的编码器-解码器结构和跳跃连接成为分割网络的经典范式。
架构特点:
- 对称结构: 编码器和解码器层数相同,形成 U 形
- 跳跃连接: 编码器每层的特征图直接拼接到解码器对应层,保留空间细节
- 逐步上采样: 解码器逐步恢复分辨率,每步 2 倍上采样
为什么适合医学图像:
- 医学数据集通常很小 (几十到几百张),U-Net 在小数据集上表现优异
- 数据增强 (弹性变形、旋转、翻转) 有效扩充训练数据
- 精确的边界分割对医学诊断至关重要
变体:
- 3D U-Net: 处理 CT/MRI 体数据的 3D 版本
- Attention U-Net: 注意力门控机制聚焦重要区域
- U-Net++: 密集跳跃连接,多尺度特征融合
- nnU-Net: 自配置框架,自动优化所有超参数
DeepLab 系列 - 空洞卷积与 CRF 实现高精度
DeepLab 系列通过空洞卷积 (Atrous/Dilated Convolution) 在不降低分辨率的情况下扩大感受野,是通用语义分割的标杆方法。
空洞卷积: 在标准卷积核的元素之间插入空洞 (零值),扩大感受野而不增加参数量。膨胀率 (dilation rate) r=2 时,3×3 核的有效感受野等同于 5×5。
ASPP (Atrous Spatial Pyramid Pooling): 并行使用多个不同膨胀率的空洞卷积,捕获多尺度上下文信息。典型配置: r=6, 12, 18 加上 1×1 卷积和全局平均池化。
DeepLab 版本演进:
- DeepLabV1: 空洞卷积 + CRF 后处理
- DeepLabV2: 引入 ASPP 多尺度特征
- DeepLabV3: 改进 ASPP,加入全局上下文
- DeepLabV3+: 加入解码器模块,改善边界精度。当前最常用版本
性能: DeepLabV3+ (ResNet-101 骨干) 在 Cityscapes 上 mIoU 约 82%,PASCAL VOC 上约 89%。
训练数据准备与标注方法
高质量的像素级标注是语义分割训练的基础,也是最耗时的环节。
标注工具:
- CVAT: 开源,支持多边形、画笔、AI 辅助标注
- Label Studio: 开源,支持多种标注类型和团队协作
- Labelme: 轻量级 Python 工具,适合小规模标注
- SAM 辅助: 使用 SAM 生成初始掩码,人工修正,大幅提高效率
标注格式:
- 掩码图像: 与原图同尺寸的单通道图像,像素值为类别 ID
- COCO 格式: JSON 文件记录多边形轮廓坐标
- VOC 格式: 彩色 PNG 掩码,每种颜色对应一个类别
数据增强:
- 几何变换: 随机裁剪、翻转、旋转、缩放
- 颜色变换: 亮度、对比度、饱和度随机调整
- 弹性变形: 医学图像中特别有效
- Mixup/CutMix: 混合不同图像增加多样性
实现与部署 - 从 PyTorch 训练到边缘推理
从模型训练到生产部署的完整流程。
PyTorch 训练:
- 使用 torchvision 或 segmentation_models_pytorch 库
- 损失函数: CrossEntropyLoss (标准) 或 Dice Loss (类别不平衡时)
- 优化器: AdamW, lr=1e-4, weight_decay=1e-4
- 学习率调度: CosineAnnealingLR 或 PolynomialLR
- 训练技巧: 混合精度 (AMP)、梯度累积、预训练骨干
模型导出:
- ONNX:
torch.onnx.export(model, dummy_input, 'model.onnx') - TorchScript:
torch.jit.trace(model, dummy_input) - TensorRT: ONNX → TensorRT 引擎,NVIDIA GPU 最优推理
边缘部署:
- 手机: MobileNetV3 骨干 + DeepLabV3 头,CoreML/TFLite 格式
- 嵌入式: Jetson 上使用 TensorRT,实时分割
- 浏览器: ONNX Runtime Web 或 TensorFlow.js
推理优化: 量化 (INT8) 可提速 2-4 倍; 知识蒸馏将大模型知识迁移到小模型; 输入分辨率降低 (如 512×512) 大幅提速。