语义分割入门 - 理解 U-Net 和 DeepLab 架构

· 9 分钟阅读

什么是语义分割

语义分割为图像中的每个像素分配一个类别标签,实现像素级别的场景理解。与目标检测的边界框不同,语义分割提供精确的物体轮廓。

任务定义:输入 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。

相关文章

目标检测概述 - YOLO、SSD 和 Faster R-CNN 架构与性能对比

全面解析目标检测技术,从 Faster R-CNN 到 YOLO 系列和 SSD,比较各架构的精度、速度和适用场景。

图像分割基础 - 理解区域划分原理与应用

系统介绍图像分割技术,从经典阈值法到深度学习方法 (U-Net、DeepLab、SAM),涵盖评估指标和浏览器端实现。

图像标注工具对比 - CVAT、Label Studio 与 Roboflow 的选择

比较主流图像标注工具的功能、效率和成本,帮助选择最适合机器学习项目的标注方案。

背景去除技术详解 - 分割与抠图处理的工作原理

详解图像背景去除(背景透明化)所使用的技术。比较语义分割、基于三值图的 Alpha 抠图和边缘检测方法的原理与精度差异。

医学图像处理基础 - DICOM、CT 和 MRI 数据与技术

系统介绍医学图像处理,涵盖 DICOM 标准、CT/MRI 成像原理、窗宽窗位调节、分割技术以及临床 AI 应用。

图像自动标注技术 - 目标检测、场景识别与字幕生成

详解图像自动标注技术,包括目标检测、场景识别和图像字幕生成的原理与实现方法。

相关术语