UPerNet 语义分割详解:OpenMMLab MMSegmentation 中的 Unified Perceptual Parsing 实现与实战
2026/9/15 20:24:24 网站建设 项目流程

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)

几个关键设计点:

  1. input_transform='multiple_select'BaseDecodeHead默认只取单层特征,而 UPerHead 需要消费骨干网络全部四个阶段的输出(如 ResNet 的 C2、C3、C4、C5),因此必须开启多特征选择。
  2. PPM 金字塔池化:作用于最深的最后一层特征,pool_scales默认(1, 2, 3, 6)。PPM 的实现位于 psp_head.py,每个尺度对应AdaptiveAvgPool2d(pool_scale)加 1x1 卷积,输出再双线性上采样回原尺寸并拼接,用于捕捉全局上下文。
  3. 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,其中关键参数包括:

  • backboneResNetV1cdepth=50out_indices=(0, 1, 2, 3)输出四层特征,dilations=(1, 1, 1, 1)不使用空洞卷积(与 DeepLab 系列d8/d16不同),预训练权重为open-mmlab://resnet50_v1c
  • decode_headtype='UPerHead'in_channels=[256, 512, 1024, 2048]in_index=[0, 1, 2, 3]pool_scales=(1, 2, 3, 6)channels=512dropout_ratio=0.1num_classes=19(Cityscapes 类别数),损失为CrossEntropyLossloss_weight=1.0);
  • auxiliary_head:辅助分支为FCNHead,取in_index=2(C4 层,1024 通道),channels=256loss_weight=0.4,用于训练期提供深监督;
  • test_cfgmode='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=0seg_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)mIoUmIoU(ms+flip)配置文件
R-50512x1024400006.44.2577.1078.37upernet_r50_4xb2-40k_cityscapes-512x1024.py
R-101512x1024400007.43.7978.6980.11upernet_r101_4xb2-40k_cityscapes-512x1024.py
R-50769x769400007.21.7677.9879.70upernet_r50_4xb2-40k_cityscapes-769x769.py
R-101769x769400008.41.5679.0380.77upernet_r101_4xb2-40k_cityscapes-769x769.py
R-50512x102480000--78.1979.19upernet_r50_4xb2-80k_cityscapes-512x1024.py
R-101512x102480000--79.4080.46upernet_r101_4xb2-80k_cityscapes-512x1024.py
R-50769x76980000--79.3980.92upernet_r50_4xb2-80k_cityscapes-769x769.py
R-101769x76980000--80.1081.49upernet_r101_4xb2-80k_cityscapes-769x769.py

ADE20K

骨干Crop Size迭代数Mem (GB)推理 (fps)mIoUmIoU(ms+flip)配置文件
R-50512x512800008.123.4040.7041.81upernet_r50_4xb4-80k_ade20k-512x512.py
R-101512x512800009.120.3442.9143.96upernet_r101_4xb4-80k_ade20k-512x512.py
R-50512x512160000--42.0542.78upernet_r50_4xb4-160k_ade20k-512x512.py
R-101512x512160000--43.8244.85upernet_r101_4xb4-160k_ade20k-512x512.py

Pascal VOC 2012 + Aug

骨干Crop Size迭代数Mem (GB)推理 (fps)mIoUmIoU(ms+flip)配置文件
R-50512x512200006.423.1774.8276.35upernet_r50_4xb4-20k_voc12aug-512x512.py
R-101512x512200007.519.9877.1078.29upernet_r101_4xb4-20k_voc12aug-512x512.py
R-50512x51240000--75.9277.44upernet_r50_4xb4-40k_voc12aug-512x512.py
R-101512x51240000--77.4378.56upernet_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询