UPerNet 语义分割详解:OpenMMLab MMSegmentation 中的 Unified Perceptual Parsing 实现与实战
【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation
UPerNet(Unified Perceptual Parsing Network)是一个面向统一场景理解的多任务分割框架,能够同时建模场景类别、物体、材质与部件等不同粒度的视觉概念。本文以 MMSegmentation 仓库中 configs/upernet/README.md 为骨架,结合 uper_head.py 源码与 configs/upernet 目录下全套训练配置,深入讲解 UPerNet 的算法原理、配置体系与训练使用方法,帮助你掌握在 Cityscapes、ADE20K、Pascal VOC 等数据集上复现与二次开发 UPerNet 的完整技能。
UPerNet 背景与核心思想
UPerNet 由论文Unified Perceptual Parsing for Scene Understanding(Xiao Tete、Liu Yingcheng、Zhou Bolei 等人,ECCV 2018)提出,论文地址为 arXiv:1807.10221。该论文观察到:人类理解视觉世界是多层次的——既能轻松地对场景进行分类、检测其中的物体,也能识别物体的纹理、表面以及它们的组成部件。为此,论文定义了一个新的任务Unified Perceptual Parsing(统一感知解析),要求机器视觉系统能够从一张图像中识别出尽可能多的视觉概念。
围绕这一任务,论文做出了两项核心贡献:
- 提出名为UPerNet的多任务框架,用一个统一的骨干网络同时支撑多个解析分支;
- 设计了一套训练策略,使模型能够从异构的图像标注数据(不同数据集标注不同粒度的概念)中联合学习。
在 MMSegmentation 中,UPerNet 被实现为EncoderDecoder体系下的一个解码头UPerHead,注册于 mmseg/models/decode_heads/uper_head.py,与仓库中的 PSPNet、DeepLabV3 等模型共用一套训练与评测管线。官方复现实验表明,该框架能够有效分割图像中广泛的概念类别,训练好的网络还可用于发现自然场景中的视觉知识(官方原始仓库为 CSAILVision/unifiedparsing)。
算法架构:PPM + FPN 的双重特征聚合
UPerHead 的架构精髓在于同时使用金字塔池化模块(PPM)和特征金字塔网络(FPN),分别解决"全局上下文"与"多尺度细节"两个问题。这一点可以直接从源码 uper_head.py 的__init__中读出:
@MODELS.register_module() class UPerHead(BaseDecodeHead): def __init__(self, pool_scales=(1, 2, 3, 6), **kwargs): super().__init__(input_transform='multiple_select', **kwargs) # PSP Module self.psp_modules = PPM( pool_scales, self.in_channels[-1], self.channels, conv_cfg=self.conv_cfg, norm_cfg=self.norm_cfg, act_cfg=self.act_cfg, align_corners=self.align_corners) self.bottleneck = ConvModule( self.in_channels[-1] + len(pool_scales) * self.channels, self.channels, 3, padding=1, conv_cfg=self.conv_cfg, norm_cfg=self.norm_cfg, act_cfg=self.act_cfg) # FPN Module self.lateral_convs = nn.ModuleList() self.fpn_convs = nn.ModuleList() for in_channels in self.in_channels[:-1]: # skip the top layer ... self.fpn_bottleneck = ConvModule( len(self.in_channels) * self.channels, self.channels, 3, padding=1, conv_cfg=self.conv_cfg, norm_cfg=self.norm_cfg, act_cfg=self.act_cfg)几个关键设计点:
input_transform='multiple_select':BaseDecodeHead默认只取单层特征,而 UPerHead 需要消费骨干网络全部四个阶段的输出(如 ResNet 的 C2、C3、C4、C5),因此必须开启多特征选择。- PPM 金字塔池化:作用于最深的最后一层特征,
pool_scales默认(1, 2, 3, 6)。PPM 的实现位于 psp_head.py,每个尺度对应AdaptiveAvgPool2d(pool_scale)加 1x1 卷积,输出再双线性上采样回原尺寸并拼接,用于捕捉全局上下文。 - FPN 侧向连接:对除最深层以外的每一层做 1x1 侧向卷积(
lateral_convs)压缩通道,再自顶向下逐层相加融合多尺度信息,最后接 3x3 卷积(fpn_convs)消除上采样伪影。
前向过程(_forward_feature)可以概括为三步:先对各级特征做侧向卷积并拼接 PPM 输出;再自顶向下做 top-down 路径融合;最后把所有层级上采样到最高分辨率后拼接,经fpn_bottleneck得到统一特征,交由cls_seg逐像素分类。从源码结构看,这种"PPM 拿全局、FPN 拿多尺度"的组合正是 UPerNet 能同时胜任场景级与物体/部件级解析的关键。
配置文件体系:从基础模型到数据集级联
MMSegmentation 采用_base_配置继承机制。以 Cityscapes 为例,upernet_r50_4xb2-40k_cityscapes-512x1024.py 全部内容如下:
_base_ = [ '../_base_/models/upernet_r50.py', '../_base_/datasets/cityscapes.py', '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' ] crop_size = (512, 1024) data_preprocessor = dict(size=crop_size) model = dict(data_preprocessor=data_preprocessor)可见一个 UPerNet 实验由四部分拼接而成:模型定义、数据集定义、运行时定义、训练调度。而模型本身定义在 configs/base/models/upernet_r50.py,其中关键参数包括:
- backbone:
ResNetV1c,depth=50,out_indices=(0, 1, 2, 3)输出四层特征,dilations=(1, 1, 1, 1)不使用空洞卷积(与 DeepLab 系列d8/d16不同),预训练权重为open-mmlab://resnet50_v1c; - decode_head:
type='UPerHead',in_channels=[256, 512, 1024, 2048]、in_index=[0, 1, 2, 3],pool_scales=(1, 2, 3, 6),channels=512,dropout_ratio=0.1,num_classes=19(Cityscapes 类别数),损失为CrossEntropyLoss(loss_weight=1.0); - auxiliary_head:辅助分支为
FCNHead,取in_index=2(C4 层,1024 通道),channels=256,loss_weight=0.4,用于训练期提供深监督; - test_cfg:
mode='whole',整图推理而非滑窗。
换数据集时只需覆盖与类别数、分辨率相关的字段。例如 ADE20K 的 upernet_r50_4xb4-160k_ade20k-512x512.py 将num_classes改为 150 并切换调度到schedule_160k;Pascal VOC 变体(如 upernet_r101_4xb4-20k_voc12aug-512x512.py)直接在 R50 配置上通过model = dict(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101))一键换骨干。R18 变体(如 upernet_r18_4xb4-160k_ade20k-512x512.py)则同时改写in_channels=[64, 128, 256, 512]与auxiliary_head.in_channels=256。
data_preprocessor统一使用SegDataPreProcessor,内置 ImageNet 均值/标准差归一化、bgr_to_rgb=True通道转换及 padding(pad_val=0、seg_pad_val=255),各数据集配置只需通过data_preprocessor = dict(size=crop_size)声明裁剪尺寸。
实验结果与预训练模型
configs/upernet/README.md中记录了三大数据集的复现成绩(评估设备为 NVIDIA V100,指标为 mIoU;mIoU(ms+flip)表示多尺度 + 水平翻转测试),对应模型权重与训练日志均可在 metafile.yaml 中找到,训练资源为 4×V100 GPU。
Cityscapes
| 骨干 | Crop Size | 迭代数 | Mem (GB) | 推理 (fps) | mIoU | mIoU(ms+flip) | 配置文件 |
|---|---|---|---|---|---|---|---|
| R-50 | 512x1024 | 40000 | 6.4 | 4.25 | 77.10 | 78.37 | upernet_r50_4xb2-40k_cityscapes-512x1024.py |
| R-101 | 512x1024 | 40000 | 7.4 | 3.79 | 78.69 | 80.11 | upernet_r101_4xb2-40k_cityscapes-512x1024.py |
| R-50 | 769x769 | 40000 | 7.2 | 1.76 | 77.98 | 79.70 | upernet_r50_4xb2-40k_cityscapes-769x769.py |
| R-101 | 769x769 | 40000 | 8.4 | 1.56 | 79.03 | 80.77 | upernet_r101_4xb2-40k_cityscapes-769x769.py |
| R-50 | 512x1024 | 80000 | - | - | 78.19 | 79.19 | upernet_r50_4xb2-80k_cityscapes-512x1024.py |
| R-101 | 512x1024 | 80000 | - | - | 79.40 | 80.46 | upernet_r101_4xb2-80k_cityscapes-512x1024.py |
| R-50 | 769x769 | 80000 | - | - | 79.39 | 80.92 | upernet_r50_4xb2-80k_cityscapes-769x769.py |
| R-101 | 769x769 | 80000 | - | - | 80.10 | 81.49 | upernet_r101_4xb2-80k_cityscapes-769x769.py |
ADE20K
| 骨干 | Crop Size | 迭代数 | Mem (GB) | 推理 (fps) | mIoU | mIoU(ms+flip) | 配置文件 |
|---|---|---|---|---|---|---|---|
| R-50 | 512x512 | 80000 | 8.1 | 23.40 | 40.70 | 41.81 | upernet_r50_4xb4-80k_ade20k-512x512.py |
| R-101 | 512x512 | 80000 | 9.1 | 20.34 | 42.91 | 43.96 | upernet_r101_4xb4-80k_ade20k-512x512.py |
| R-50 | 512x512 | 160000 | - | - | 42.05 | 42.78 | upernet_r50_4xb4-160k_ade20k-512x512.py |
| R-101 | 512x512 | 160000 | - | - | 43.82 | 44.85 | upernet_r101_4xb4-160k_ade20k-512x512.py |
Pascal VOC 2012 + Aug
| 骨干 | Crop Size | 迭代数 | Mem (GB) | 推理 (fps) | mIoU | mIoU(ms+flip) | 配置文件 |
|---|---|---|---|---|---|---|---|
| R-50 | 512x512 | 20000 | 6.4 | 23.17 | 74.82 | 76.35 | upernet_r50_4xb4-20k_voc12aug-512x512.py |
| R-101 | 512x512 | 20000 | 7.5 | 19.98 | 77.10 | 78.29 | upernet_r101_4xb4-20k_voc12aug-512x512.py |
| R-50 | 512x512 | 40000 | - | - | 75.92 | 77.44 | upernet_r50_4xb4-40k_voc12aug-512x512.py |
| R-101 | 512x512 | 40000 | - | - | 77.43 | 78.56 | upernet_r101_4xb4-40k_voc12aug-512x512.py |
从结果可以观察到一个典型规律:迭代数翻倍(40k→80k)带来的收益普遍大于骨干从 R-50 升级到 R-101;而在 Cityscapes 上 769x769 大裁剪尺寸通常比 512x1024 获得 0.7~1.1 个点的 mIoU 提升,代价是显存与推理耗时显著增加。这些模型的配置、权重与日志条目均收录在 configs/upernet/metafile.yaml 中,可通过 MMSegmentation 的模型索引机制直接引用。
训练、测试与单图推理
在准备好对应数据集(Cityscapes / ADE20K / Pascal VOC 2012 + Aug)并按 MMSegmentation 的数据目录规范组织后,即可使用仓库标准工具进行实验:
- 单卡训练:
python tools/train.py configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py - 多卡训练:使用 tools/dist_train.sh,例如
bash tools/dist_train.sh configs/upernet/upernet_r50_4xb2-40k_cityscapes-512x1024.py 8 - 测试/评测:
python tools/test.py <config> <checkpoint> --eval mIoU - 单图推理:
python demo/image_demo.py <img> <config> <checkpoint> --out-file result.png
推理时默认采用test_cfg=dict(mode='whole')整图前向;如需报告表中所列mIoU(ms+flip),可在测试命令中启用多尺度与翻转增强的评测配置。
引用方式
若在研究中使用了 UPerNet 或本文涉及的实现,建议按如下 BibTeX 引用原始论文(亦收录于 configs/upernet/README.md):
@inproceedings{xiao2018unified, title={Unified perceptual parsing for scene understanding}, author={Xiao, Tete and Liu, Yingcheng and Zhou, Bolei and Jiang, Yuning and Sun, Jian}, booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, pages={418--434}, year={2018} }小结
UPerNet 通过"PPM 全局上下文 + FPN 多尺度融合"的巧妙组合,用单一骨干支撑起多粒度统一场景理解。在 MMSegmentation 中,它被封装为UPerHead解码头(源码位置),配合 configs/base/models/upernet_r50.py 的模块化配置体系,可以轻松在 Cityscapes、ADE20K、Pascal VOC 等数据集上训练、复现与扩展。其辅助FCNHead深监督、pool_scales可调、骨干可一键替换(R-18/R-50/R-101)等特性,使其既适合作为语义分割的基线模型,也适合作为多任务场景理解框架的起点。
【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考