语义分割入门 - 理解 U-Net 和 DeepLab 架构
什么是语义分割
语义分割为图像中的每个像素分配一个类别标签,实现像素级别的场景理解。与目标检测的边界框不同,语义分割提供精确的物体轮廓。
任务定义:输入 H×W×3 的 RGB 图像,输出 H×W 的标签图,每个像素值对应一个类别 ID。
与实例分割的区别:语义分割不区分同类别的不同个体。例如,图像中的 3 个行人都标记为"人"类,不区分是哪个人。实例分割则为每个行人分配不同的 ID。
典型数据集:
- PASCAL VOC: 20 类 + 背景,经典基准
- Cityscapes:城市驾驶场景,19 类,精细标注
- ADE20K: 150 类,场景多样性最高
- COCO-Stuff: 171 类,包含物体和材质
与目标检测的区别:目标检测 (Object Detection) 用矩形区域框住物体,而语义分割捕捉物体的准确轮廓。YOLO 和 SSD 以矩形做检测,分割模型则输出逐像素的分类图。
三种分割与评价指标:语义分割不区分同类的各个物体 (所有的车统一归为「车」类);实例分割即使同类也区分各个物体 (车 A 与车 B 分别识别);全景分割把语义与实例统合,实现包含背景的完整场景理解。评价指标标准使用 mIoU (mean Intersection over Union),用 0 到 1 的分数表示预测区域与正确区域的重合程度。PASCAL VOC 数据集上竞争的是 21 类的分类精度,Cityscapes 上则是 19 类。
FCN - 去除全连接层的开创性架构
FCN (Fully Convolutional Network, 2015) 是第一个端到端的语义分割深度学习方法,奠定了后续所有方法的基础。
核心思想:将 VGG-16 等分类网络的全连接层替换为 1×1 卷积层,使网络可以接受任意尺寸输入并输出对应尺寸的分割图。
上采样策略:
- FCN-32s:直接 32 倍上采样,结果粗糙
- FCN-16s:融合 pool4 特征后 16 倍上采样
- FCN-8s:融合 pool3 和 pool4 特征后 8 倍上采样,效果最好
贡献:证明了预训练分类网络可以迁移到分割任务;建立了编码器 (下采样) + 解码器 (上采样) 的基本范式;跳跃连接融合多尺度特征的思想影响了后续所有架构。
局限性:分割边界粗糙;缺乏全局上下文信息;上采样方式简单 (双线性插值)。
全卷积化的意义:FCN 是 2015 年 Long 等人提出的、成为语义分割基础的架构。传统 CNN 为了图像分类而使用全连接层,FCN 则把所有层都替换为卷积层,从而能对任意尺寸的输入图像做逐像素的预测。下采样中丢失的分辨率,通过转置卷积 (Transposed Convolution) 的上采样来复原。
实现与训练的要点:在 PyTorch 中可以使用 torchvision.models.segmentation.fcn_resnet50,把输入图像归一化后对输出取 argmax,即可得到类别图。PASCAL VOC 2012 上 FCN-8s 的 mIoU 约为 62.2%。训练基本是逐像素施加 cross-entropy loss,作为类别不均衡的对策,weighted cross-entropy 与 focal loss 也很有效。
U-Net - 编码器-解码器结构与医学图像应用
U-Net (2015) 为医学图像分割设计,其对称的编码器-解码器结构和跳跃连接成为分割网络的经典范式。
架构特点:
- 对称结构:编码器和解码器层数相同,形成 U 形
- 跳跃连接:编码器每层的特征图直接拼接到解码器对应层,保留空间细节
- 逐步上采样:解码器逐步恢复分辨率,每步 2 倍上采样
为什么适合医学图像:
- 医学数据集通常很小 (几十到几百张),U-Net 在小数据集上表现优异
- 数据增强 (弹性变形、旋转、翻转) 有效扩充训练数据
- 精确的边界分割对医学诊断至关重要
变体:
- 3D U-Net:处理 CT/MRI 体数据的 3D 版本
- Attention U-Net:注意力门控机制聚焦重要区域
- U-Net++:密集跳跃连接,多尺度特征融合
- nnU-Net:自配置框架,自动优化所有超参数
编码器 (收缩路径) 的构成:U-Net 是 2015 年 Ronneberger 等人面向医学图像分割提出的架构。编码器由 3x3 卷积 (2 次) + ReLU + 2x2 MaxPooling 的重复构成,各阶段把通道数按 64 → 128 → 256 → 512 → 1024 倍增,同时把空间分辨率缩小一半。
跳跃连接与医学图像上的成果:U-Net 最大的特征,是把编码器各阶段的特征图连接 (concatenation) 到解码器的对应阶段。它在 ISBI 2015 的细胞追踪挑战赛中获胜,仅用 30 张训练图像就实现了高精度的分割。
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%。
系列的定位与核心技术:DeepLab 是 Google Research 开发的分割模型系列,从 v1 (2015) 持续演进到 v3+ (2018)。其核心技术是 Atrous Convolution (Dilated Convolution),特点在于不降低分辨率也能确保较大的感受野。普通卷积的核元素彼此相邻,Atrous Convolution 则在核元素之间插入「孔 (trous)」。
ASPP 与编码器-解码器结构:DeepLab v2 引入的 ASPP 并行施加不同 rate (6, 12, 18, 24) 的 Atrous Convolution,提取多尺度的特征。DeepLab v3+ 在基于 ASPP 的编码器上追加了轻量的解码器,把编码器的低层特征 (stride 4) 在解码器中结合,使物体边界的精度大幅提升。骨干使用 Xception 或 ResNet-101,在 Cityscapes 上达到 mIoU 82.1%。
基于 CRF 的后处理:在 DeepLab v1/v2 中,会用 Conditional Random Field (CRF) 对 CNN 的输出做后处理,使物体边界更加清晰。
训练数据准备与标注方法
高质量的像素级标注是语义分割训练的基础,也是最耗时的环节。
标注工具:
- CVAT:开源,支持多边形、画笔、AI 辅助标注
- Label Studio:开源,支持多种标注类型和团队协作
- Labelme:轻量级 Python 工具,适合小规模标注
- SAM 辅助:使用 SAM 生成初始掩码,人工修正,大幅提高效率
标注格式:
- 掩码图像:与原图同尺寸的单通道图像,像素值为类别 ID
- COCO 格式: JSON 文件记录多边形轮廓坐标
- VOC 格式:彩色 PNG 掩码,每种颜色对应一个类别
数据增强:
- 几何变换:随机裁剪、翻转、旋转、缩放
- 颜色变换:亮度、对比度、饱和度随机调整
- 弹性变形:医学图像中特别有效
- Mixup/CutMix:混合不同图像增加多样性
标注成本:对 1 张图像的全部像素分配类别 ID、制作掩码图像的工作,与目标检测的边界框相比要花 10 倍以上的工时。
主要数据集:PASCAL VOC 2012 是 21 类约 10,000 张的分割研究标准基准;Cityscapes 以城市景观 19 类构成,包含 5,000 张精密标注与 20,000 张粗标注;ADE20K 是 150 类 25,000 张,覆盖室内外多样的场景;COCO-Stuff 是 171 类 164,000 张,对物体与背景都做了标注。
标注工具与省力化:Labelme、CVAT、Supervisely 等工具支持基于多边形的标注。每张的作业时间取决于图像的复杂度,Cityscapes 的精密标注平均每张需要 90 分钟。把 CAM (Class Activation Map) 用作伪标签的方法,可以达到完全监督约 80% 的精度。CutMix 与 MixUp 也有分割版本,能高效地增加训练数据的多样性。
实现与部署 - 从 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-3 倍;知识蒸馏将大模型知识迁移到小模型;输入分辨率降低 (如 512×512) 大幅提速。
PyTorch 的训练流程:torchvision.models.segmentation 中备有 DeepLab v3、FCN 的预训练模型。用自有数据集微调时,一般是改变最终层的类别数,以 1e-4 左右的学习率训练 50-100 个 epoch。损失函数使用 nn.CrossEntropyLoss,存在类别不均衡时按各类出现频率的倒数加权。
训练技巧:学习率调度广泛使用 Poly Learning Rate (初始学习率 × (1 - iter/max_iter)^0.9)。批大小取决于显存,但为了 Batch Normalization 的稳定性推荐 8 以上;使用 Synchronized Batch Normalization 可以在多 GPU 环境下共享批的统计量。
轻量化与实时模型:以 MobileNet v3 为骨干的 DeepLab v3,可以在不大幅牺牲精度的前提下把推理速度提升 5-10 倍,量化还能把模型尺寸削减 75%。BiSeNet、ICNet、ENet 等实时分割模型可以用 30fps 以上处理 720p 图像;在 NVIDIA Jetson Xavier NX 上,BiSeNet v2 在 1,024 × 512 分辨率下达到 45fps。