MMSegmentation 中 DPT 密集预测视觉 Transformer 的完整实战指南:从权重转换到 ADE20K 语义分割 📅 发布时间:2026/9/15 22:24:16 👁 浏览次数: MMSegmentation 中 DPT 密集预测视觉 Transformer 的完整实战指南从权重转换到 ADE20K 语义分割【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读DPTVision Transformer for Dense Prediction是首个将 Vision Transformer 直接用作密集预测任务语义分割、单目深度估计骨干网络的开创性架构通过在 ViT 各层提取不同分辨率的 token 并重组为图像特征再以卷积解码器渐进融合为全分辨率预测。本文以 configs/dpt/README.md 为核心结合 MMSegmentation 仓库中 DPTHead 的完整实现dpt_head.py、ViT 骨干实现vit.py以及官方训练配置系统讲解DPT 的架构原理与源码级实现、如何在 MMSegmentation 中使用 timm 预训练权重密钥转换脚本 vit2mmseg.py、完整训练配置的逐项解析以及如何复现 ADE20K 上 46.97% mIoU 的基准结果。读完本文你将能够在 MMSegmentation 中从零配置并训练、测试一个基于 DPT ViT-B/16 的语义分割模型。DPT 是什么用 Transformer 替换卷积骨干的密集预测架构DPTDense Prediction Transformer由 René Ranftl、Alexey Bochkovskiy 和 Vladlen Koltun 提出对应论文Vision Transformers for Dense PredictionarXiv:2103.13413。其核心思想是在密集预测任务中用 Vision Transformer 替代卷积网络作为骨干网络。论文的要点如下恒定高分辨率 全局感受野Transformer 骨干在所有 stage 都以恒定且相对较高的分辨率处理表示并且每个 stage 都具有全局感受野这使其输出的预测在细粒度细节与全局一致性上优于全卷积网络。多阶段 token 重组从 ViT 的多个 stage 收集 token重组为不同分辨率的类图像表示再通过卷积解码器渐进式融合成全分辨率预测。显著收益在单目深度估计上相对 SOTA 全卷积网络提升最高达 28%用于语义分割时DPT 在 ADE20K 上以 49.02% mIoU 刷新当时的 SOTA在 NYUv2、KITTI、Pascal Context 等较小数据集上微调同样刷新 SOTA。在 MMSegmentation 中DPT 以「ViT 骨干 DPTHead 解码头」的形式接入通用EncoderDecoder框架官方支持配置位于 configs/dpt/集合信息登记在 metafile.yamlApache License 2.0PyTorch 框架ADE20K 训练数据。架构解剖ViT 骨干 DPTHead 的源码级实现1. VisionTransformer 骨干输出多阶段特征与 class tokenDPT 使用的骨干是 mmseg/models/backbones/vit.py 中注册的VisionTransformer。其关键配置能力包括img_size/patch_size输入图像尺寸与 patch 大小DPT 默认 224 / 16与预训练权重匹配embed_dims/num_layers/num_heads嵌入维度、Transformer 层数与注意力头数ViT-B 为 768 / 12 / 12out_indices指定从哪些 Transformer 层输出特征DPT 使用(2, 5, 8, 11)即每 3 层取一次中间特征共 4 个 stagewith_cls_token/output_cls_token是否使用 class token以及是否将 class token 一并输出——DPT 需要 class token 参与后续的 readout 操作因此两者均设为Truefinal_normDPT 设为False避免在最终输出上追加归一化层。从forward实现可以看到vit.py当output_cls_tokenTrue时每个输出索引处返回的并不是单一特征图而是[特征图, cls_token]的二元组特征图已去除 class token 并按(B, C, H, W)重塑这与后续 DPTHead 的输入约定严格对应。2. DPTHead 解码头四条数据通路与渐进融合解码头实现在 mmseg/models/decode_heads/dpt_head.py核心类为DPTHead注册于第 215 行由三个子模块构成ReassembleBlocks特征重组将每个 stage 的 token 序列重排回特征图。源码中readout_type支持三种 class token 融合策略dpt_head.pyignore直接忽略 class token默认行为add将 class token 逐位置加到每个 patch token 上project将 class token 与 patch token 拼接后经过一层Linear GELU投影融合官方配置采用此方式。随后对 4 个 stage 分别做1×1卷积投影到不同通道数默认[96, 192, 384, 768]再用不同上/下采样算子统一分辨率前两个 stage 用ConvTranspose2dstride 4 / stride 2上采样第三个用nn.Identity第四个用 stride 2 的卷积下采样——最终得到分辨率一致的多尺度特征。PreActResidualConvUnit预激活残差卷积单元采用(act, conv, norm)顺序的预激活设计两个3×3卷积后与输入做残差相加dpt_head.py。FeatureFusionBlock特征融合从最高分辨率最后一个 stage开始自顶向下逐级将低层特征与高层融合结果相加每级经过两个残差卷积单元、2×双线性上采样和1×1投影dpt_head.py。DPTHead.forwarddpt_head.py的完整数据流为输入 4 个 stage 特征 → ReassembleBlocks 重组 → 4 个 3×3 卷积对齐通道 → FeatureFusionBlock 逐级融合最高分辨率起步逐级加入低层特征 → 3×3 投影 → cls_seg 分类层输出 logits此外DPTHead 对input_transform有强制要求。测试用例 tests/test_models/test_heads/test_dpt_head.py 明确验证不指定input_transformmultiple_select会直接触发AssertionError而readout_type取add/project时输出形状均保持(4, 19, 16, 16)与project配置的官方模型行为一致。官方配置逐项解析dpt_vit-b16_8xb2-160k_ade20k-512x512官方唯一的训练配置为 configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py它继承四个基础配置_base_ [ ../_base_/models/dpt_vit-b16.py, ../_base_/datasets/ade20k.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_160k.py ]模型定义base/models/dpt_vit-b16.py模型结构定义在 configs/base/models/dpt_vit-b16.py要点包括数据预处理器SegDataPreProcessorImageNet 均值和标准差mean[123.675, 116.28, 103.53]std[58.395, 57.12, 57.375]bgr_to_rgbTrue骨干VisionTransformerimg_size224, embed_dims768, num_layers12, num_heads12, out_indices(2, 5, 8, 11), final_normFalse, with_cls_tokenTrue, output_cls_tokenTrue解码头DPTHeadin_channels(768,768,768,768)channels256embed_dims768post_process_channels[96,192,384,768]num_classes150ADE20K 类别数readout_typeprojectinput_transformmultiple_selectin_index(0,1,2,3)归一化使用SyncBN损失函数CrossEntropyLossuse_sigmoidFalse, loss_weight1.0测试模式test_cfgdict(modewhole)即整图推理预训练权重pretrainedpretrain/vit-b16_p16_224-80ecf9dd.pth指向本地存放的由下文转换脚本生成的权重文件。优化器与调度器官方配置使用 AdamW 优化器并为 ViT 中的位置编码、class token 与归一化层关闭权重衰减optim_wrapper dict( _delete_True, typeOptimWrapper, optimizerdict( typeAdamW, lr0.00006, betas(0.9, 0.999), weight_decay0.01), paramwise_cfgdict( custom_keys{ pos_embed: dict(decay_mult0.), cls_token: dict(decay_mult0.), norm: dict(decay_mult0.) }))学习率调度采用两段式前 1500 iter 使用LinearLR线性预热start_factor1e-6随后切换为PolyLRpower1.0衰减至 160000 iter。数据加载crop_size (512, 512)数据预处理器统一缩放尺寸训练8 张 GPU × 每卡 2 张batch_size2num_workers2即 metafile 中登记的 Batch Size 16验证 / 测试batch_size1num_workers4。使用 timm 预训练权重vit2mmseg.py 密钥转换DPT 官方模型默认采用 timm 训练的 ViT 权重初始化骨干。由于 timm 与 MMSegmentation 的权重命名风格不同直接加载会因 key 不匹配而失败。仓库提供了转换脚本 tools/model_converters/vit2mmseg.pypython tools/model_converters/vit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH}例如python tools/model_converters/vit2mmseg.py \ https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_vit_base_p16_224-80ecf9dd.pth \ pretrain/jx_vit_base_p16_224-80ecf9dd.pth该脚本从PRETRAIN_PATH本地路径或 URL读取权重转换后保存到STORE_PATH。其底层转换逻辑vit2mmseg.py覆盖了以下命名映射timm 中的 keyMMSegmentation 中的 keynorm.ln1.patch_embed.projpatch_embed.projectionblocks.*.normlayers.*.lnblocks.*.mlp.fc1layers.*.ffn.layers.0.0blocks.*.mlp.fc2layers.*.ffn.layers.1blocks.*.attn.qkvlayers.*.attn.attn.in_proj_blocks.*.attn.projlayers.*.attn.attn.out_projblocks.layers.同时脚本会丢弃与分类无关的head分支权重并兼容 timmstate_dict字段、DeiTmodel字段两种检查点格式vit2mmseg.py。转换得到的权重即可按上述配置中pretrained指定的路径使用。说明若输入图像尺寸与预训练尺寸224×224不一致VisionTransformer的init_weights与_pos_embeding会利用interpolate_modebicubic对位置编码做双三次插值重采样vit.py无需人工干预。训练、测试与推理配置文件名dpt_vit-b16_8xb2-160k_ade20k-512x512的含义为DPT ViT-B/168 卡 × 每卡 2 样本160k 迭代ADE20K输入 512×512。可借助仓库标准工具进行训练与测试# 单卡训练 python tools/train.py configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py # 8 卡分布式训练 bash tools/dist_train.sh configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py 8 # 使用官方权重测试 python tools/test.py configs/dpt/dpt_vit-b16_8xb2-160k_ade20k-512x512.py \ ${CHECKPOINT_FILE} --eval mIoU此外仓库提供图像推理脚本 demo/image_demo.py 与基于 Inferencer 的 demo/image_demo_with_inferencer.py可将训练好的 DPT 模型直接用于单张图片的语义分割可视化。基准结果与模型仓库官方在 ADE20K 上提供了 DPT ViT-B 的基准结果详见 configs/dpt/README.md 与 metafile.yamlMethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)DPTViT-B512x5121600008.0910.41V10046.9748.34对应配置为 dpt_vit-b16_8xb2-160k_ade20k-512x512.py训练资源为 8× V100 GPU、Batch Size 16。该模型的预训练权重与训练日志的下载地址均登记在 metafile.yaml 的Weights与Training log字段中可通过模型库工具按集合名DPT、模型名dpt_vit-b16_8xb2-160k_ade20k-512x512检索下载。小结DPT 在 MMSegmentation 中的落地完整呈现了「Transformer 骨干 密集预测解码头」的标准范式VisionTransformer骨干通过out_indices输出多 stage 特征并保留 class tokenDPTHead则以ReassembleBlocksreadout 融合 多分辨率重组、PreActResidualConvUnit预激活残差和FeatureFusionBlock渐进式融合三件套将 ViT 特征重建为高分辨率分割结果。配合vit2mmseg.py权重转换脚本与官方训练配置你可以快速在 ADE20K 上复现 46.97% mIoU 的基准并在此基础上将 DPT 迁移到自己的语义分割任务中。引用若在学术工作中使用 DPT请引用article{dosoViTskiy2020, title{An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, author{DosoViTskiy, Alexey and Beyer, Lucas and Kolesnikov, Alexander and Weissenborn, Dirk and Zhai, Xiaohua and Unterthiner, Thomas and Dehghani, Mostafa and Minderer, Matthias and Heigold, Georg and Gelly, Sylvain and Uszkoreit, Jakob and Houlsby, Neil}, journal{arXiv preprint arXiv:2010.11929}, year{2020} } article{Ranftl2021, author {Ren\{e} Ranftl and Alexey Bochkovskiy and Vladlen Koltun}, title {Vision Transformers for Dense Prediction}, journal {ArXiv preprint}, year {2021}, }【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考