
PoolFormer 语义分割实战MetaFormer 骨干网络在 MMSegmentation 中的配置、训练与评测指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文以 MMSegmentation 仓库中 configs/poolformer 的官方配置与 README 为主体系统讲解如何将 PoolFormer 这一 MetaFormer 代表性骨干网络接入语义分割任务。文章覆盖 PoolFormer 的核心思想用简单池化替换注意力、mmpretrain 环境依赖、FPN 全金字塔解码结构、ADE20K 上的完整实验结果表以及从配置继承、模型变体替换到训练评测的全链路实操帮助读者直接复现 PoolFormer FPN 的分割方案并理解其底层实现原理。PoolFormer 与 MetaFormer为什么池化也能媲美注意力PoolFormer 出自论文MetaFormer is Actually What You Need for VisionCVPR 2022其核心观点是Transformer 真正起作用的是通用架构MetaFormer而不是其中的注意力 token mixer 模块。论文的验证思路非常直接既然已有工作证明注意力可以被空间 MLP 替换且效果仍然不错那么进一步把注意力模块替换为一个极其简单的空间池化算子仅做最基本的 token mixing得到的模型——即 PoolFormer——是否依然具备竞争力实验结果表明答案是肯定的在 ImageNet-1K 上PoolFormer 达到 82.1% top-1 精度超过调参充分的视觉 Transformer/MLP 类基线 DeiT-B 0.3%、ResMLP-B24 1.1%同时参数量分别减少 35% / 52%MACs 减少 48% / 60%。该结论推动提出了MetaFormer这一从 Transformer 中抽象出的通用架构概念——即不指定 token mixer 的通用框架。论文进一步论证近期在视觉任务上表现优异的 Transformer 与 MLP 类模型其关键贡献者正是 MetaFormer 通用架构本身因此未来研究应更多聚焦于改进 MetaFormer而非仅仅设计 token mixer 模块。PoolFormer 也因此可以充当未来 MetaFormer 架构设计的起点基线。在 MMSegmentation 中PoolFormer 以**骨干网络Backbone**身份出现配以 FPN 颈部与 FPN 解码头构成完整的分割模型官方配置与权重索引见 configs/poolformer 与 configs/poolformer/metafile.yaml。使用前提先安装 mmpretrain 获取 PoolFormer 骨干PoolFormer 骨干网络本身托管在 MMClassification现为 mmpretrain中MMSegmentation 通过注册机制直接复用。官方 README 明确指出PoolFormer backbone 需要先安装 MMClassification其中包含丰富的下游任务骨干网络预训练权重也可以从 MMClassification 的 PoolFormer 配置中获取。安装命令MMSegmentation v1.x 配套版本要求pip install mmpretrain1.0.0rc7安装完成后还需要在配置中显式导入 mmpretrain 的模型注册。以 configs/base/models/fpn_poolformer_s12.py 为例# TODO: delete custom_imports after mmpretrain supports auto import # please install mmpretrain 1.0.0rc7 # import mmpretrain.models to trigger register_module in mmpretrain custom_imports dict( imports[mmpretrain.models], allow_failed_importsFalse)这段custom_imports的作用是在加载配置时先导入mmpretrain.models从而触发 mmpretrain 内部模块的register_module注册使配置中的typemmpretrain.PoolFormer能够被正确解析。若 mmpretrain 已支持自动导入这一行可以删除源码注释中已注明该 TODO。配置文件全解析骨干、FPN 颈部与解码头PoolFormer 在 MMSegmentation 中的最小可运行配置为 configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py其通过_base_机制继承三份基础配置_base_ [ ../_base_/models/fpn_poolformer_s12.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_40k.py ]骨干网络Backbone骨干部分定义在 configs/base/models/fpn_poolformer_s12.pymodel dict( typeEncoderDecoder, data_preprocessordata_preprocessor, backbonedict( typemmpretrain.PoolFormer, archs12, init_cfgdict( typePretrained, checkpointcheckpoint_file, prefixbackbone.), in_patch_size7, in_stride4, in_pad2, down_patch_size3, down_stride2, down_pad1, drop_rate0., drop_path_rate0., out_indices(0, 2, 4, 6), frozen_stages0, ), ... )关键参数说明参数默认值作用typemmpretrain.PoolFormer直接复用 mmpretrain 注册的 PoolFormer 骨干archs12模型变体可选 s12 / s24 / s36 / m36 / m48init_cfgPretrained从 ImageNet-1K 预训练权重初始化prefixbackbone.对应权重字典前缀in_patch_size / in_stride / in_pad7 / 4 / 2输入 Patch Embedding 的卷积核尺寸、步长与 paddingdown_patch_size / down_stride / down_pad3 / 2 / 1各阶段间下采样卷积参数out_indices(0, 2, 4, 6)输出第 0/2/4/6 四个阶段的特征图供 FPN 使用frozen_stages0冻结前若干 stage 的骨干参数0 表示全部参与训练预训练权重 URL 直接写在基础配置中S12 为poolformer-s12_3rdparty_32xb128_in1km48 为poolformer-m48_3rdparty_32xb128_in1k各变体权重可在 mmpretrain 的 PoolFormer 配置页获取后通过checkpoint_file覆盖。数据预处理器data_preprocessor dict( typeSegDataPreProcessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue, pad_val0, seg_pad_val255)这是 MMSegmentation v1.x 引入的SegDataPreProcessor统一完成归一化、BGR→RGB 通道转换、padding 等操作其中seg_pad_val255表示标签 padding 值 255该值在计算损失时默认被忽略。特征金字塔颈部FPN NeckFPN 颈部定义如下neckdict( typeFPN, in_channels[256, 512, 1024, 2048], out_channels256, num_outs4),注意S12 骨干四个阶段的实际输出通道为[64, 128, 320, 512]因此 fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py 中会覆盖model dict( data_preprocessordata_preprocessor, neckdict(in_channels[64, 128, 320, 512]), decode_headdict(num_classes150))FPN 颈部的底层实现在 mmseg/models/necks/fpn.py对每个输入层级先做1x1lateral 卷积统一通道到out_channels再从最深层开始自顶向下逐级最近邻上采样相加top-down path最后对每个层级做3x3卷积输出得到 4 个尺度、每尺度 256 通道的特征金字塔。解码头FPNHead解码头采用 Semantic FPN 风格的FPNHead实现见 mmseg/models/decode_heads/fpn_head.pydecode_headdict( typeFPNHead, in_channels[256, 256, 256, 256], in_index[0, 1, 2, 3], feature_strides[4, 8, 16, 32], channels128, dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)),从源码看FPNHead为每个feature_strides构造一个scale_head各尺度先经 3x3 卷积必要时级联双线性上采样再逐级相加融合为单张高分辨率特征图最后经cls_seg卷积输出num_classes通道的分割 logits。ADE20K 配置将num_classes覆盖为 150。训练调度与优化器基础调度来自 configs/base/schedules/schedule_40k.py默认 SGD 40k 迭代。PoolFormer 配置将其整体替换为 AdamW AMP 混合精度optim_wrapper dict( _delete_True, typeAmpOptimWrapper, optimizerdict(typeAdamW, lr0.0002, weight_decay0.0001)) param_scheduler [ dict( typePolyLR, power0.9, begin0, end40000, eta_min0.0, by_epochFalse, ) ]_delete_True删除继承的 SGD 优化器配置防止与 AdamW 冲突AmpOptimWrapper启用自动混合精度对应显存占用较低可参考结果表中各变体 4.17–10.48 GB 的显存数据PolyLR多项式学习率衰减power0.9、eta_min0.0、按迭代by_epochFalse衰减40k 迭代到 0。数据流水线方面训练采用RandomResize RandomCrop(512×512) RandomFlip PhotoMetricDistortion其中cat_max_ratio0.75限制裁剪窗口内单类别占比过高测试采用Resize ResizeToMultiple(32)保证尺寸可被 32 整除见下文实现细节说明。模型变体与快速替换PoolFormer 提供 5 种规模变体全部在 configs/poolformer 目录下每个变体对应一份独立配置配置变体骨干通道fpn_poolformer_s12_8xb4-40k_ade20k-512x512.pyS12[64, 128, 320, 512]fpn_poolformer_s24_8xb4-40k_ade20k-512x512.pyS24同上仅 arch 与权重不同fpn_poolformer_s36_8x4_512x512_40k_ade20k.pyS36同上仅 arch 与权重不同fpn_poolformer_m36_8xb4-40k_ade20k-512x512.pyM36同上fpn_poolformer_m48_8xb4-40k_ade20k-512x512.pyM48[96, 192, 384, 768]小/中规模S/M变体以继承 S12 配置为基础仅需覆盖arch、预训练权重与 FPN 输入通道。以 M48 为例fpn_poolformer_m48_8xb4-40k_ade20k-512x512.py 完整内容为_base_ ./fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py checkpoint_file https://download.openmmlab.com/mmclassification/v0/poolformer/poolformer-m48_3rdparty_32xb128_in1k_20220414-9378f3eb.pth # noqa # model settings model dict( backbonedict( archm48, init_cfgdict( typePretrained, checkpointcheckpoint_file, prefixbackbone.)), neckdict(in_channels[96, 192, 384, 768]))这种继承 覆盖的写法使得新增变体成本极低换arch、换权重、改neck.in_channels三步即可。ADE20K 实验结果一览官方 README 提供了 5 个变体在 ADE20K512×512 裁剪ImageNet-1K 预训练上的完整评测结果。下表完整继承该结果mIoU*表示采用Resize ResizeToMultiple测试流水线时的指标msflip为多尺度 翻转测试增强MMSegmentation v1.x 中仍在完善中MethodBackboneCrop SizepretrainBatch SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU*FPNPoolFormer-S12512x512ImageNet-1K32400004.1723.48V10036.6837.07FPNPoolFormer-S24512x512ImageNet-1K32400005.4715.74V10040.1240.36FPNPoolFormer-S36512x512ImageNet-1K32400006.7711.34V10041.6141.81FPNPoolFormer-M36512x512ImageNet-1K32400008.598.97V10041.9542.35FPNPoolFormer-M48512x512ImageNet-1K324000010.486.69V10042.4342.76各模型的权重与训练日志索引统一记录在 configs/poolformer/metafile.yaml 中Weights与Training log字段训练资源为 8×V100 GPU、总 batch size 32单卡 4。从表中可以清晰看到一条规律骨干规模从 S12 增大到 M48mIoU 从 36.68 提升至 42.43代价是显存从 4.17 GB 增至 10.48 GB、推理速度从 23.48 fps 降至 6.69 fps——这为不同硬件条件下的骨干选型提供了直接参考。关键实现细节说明官方 README 在表格下方给出三条重要说明直接关系到评测口径的一致性AlignedResize被替换为Resize ResizeToMultiple原版 PoolFormer 实现使用AlignedResize保证 resize 后尺寸对齐MMSegmentation 中改用标准Resize后接ResizeToMultiple(size_divisor32)效果等价且与框架现有流水线兼容见 fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py 中test_pipeline的第 2、3 行。mIoU*的口径带*的 mIoU 是在test_pipeline采用Resize ResizeToMultiple时采集的日志log中的 mIoU 同样基于该口径因此上表中普通 mIoU 与mIoU*存在约 0.2–0.4 的差异属于预期现象对比结果时须注意口径一致。测试时增强TTA状态MMSegmentation v1.x 中msflip多尺度 翻转测试增强仍在开发完善中当前表格中该项为空读者使用时需留意版本更新。训练与测试命令在完成数据准备ADE20K 数据集按 MMSegmentation 约定放置于data/ade/ADEChallengeData2016配置中data_root指向该目录与 mmpretrain 安装后即可基于任意变体配置启动训练# 单卡训练 python tools/train.py configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py # 多卡分布式训练例如 8 卡 bash tools/dist_train.sh configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py 8训练完成后使用tools/test.py配合从 configs/poolformer/metafile.yaml 获取的官方权重进行评测# 单卡测试 python tools/test.py configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py ${CHECKPOINT_FILE} # 多卡测试 bash tools/dist_test.sh configs/poolformer/fpn_poolformer_s12_8xb4-40k_ade20k-512x512.py ${CHECKPOINT_FILE} 8评测默认使用配置中的test_evaluator dict(typeIoUMetric, iou_metrics[mIoU])输出 mIoU 等标准语义分割指标。引用与延伸阅读若在研究中使用了 PoolFormer 或 MetaFormer 思想请引用原论文inproceedings{yu2022metaformer, title{Metaformer is actually what you need for vision}, author{Yu, Weihao and Luo, Mi and Zhou, Pan and Si, Chenyang and Zhou, Yichen and Wang, Xinchao and Feng, Jiashi and Yan, Shuicheng}, booktitle{Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, pages{10819--10829}, year{2022} }进一步深入阅读时建议按以下路径在仓库内展开骨干定义与 mmpretrain 注册机制configs/base/models/fpn_poolformer_s12.pyFPN 颈部逐层实现mmseg/models/necks/fpn.pySemantic FPN 解码头实现mmseg/models/decode_heads/fpn_head.py全部 5 个变体的配置与权重索引configs/poolformer 与 configs/poolformer/metafile.yaml。PoolFormer 的价值在于用最简算子验证了通用架构优于特定模块这一命题——理解了它也就理解了 MetaFormer 系列后续骨干如 ConvNeXt 等的设计逻辑是学习现代视觉骨干演进脉络的理想起点。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考