MMSegmentation 中 DPT 密集预测视觉 Transformer 的完整实战指南:从权重转换到 ADE20K 语义分割
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),仅供参考

相关新闻

Faker::Sports::Mountaineering 使用与源码解析:用 Ruby 生成真实登山家姓名数据

Faker::Sports::Mountaineering 使用与源码解析:用 Ruby 生成真实登山家姓名数据

Faker::Sports::Mountaineering 使用与源码解析:用 Ruby 生成真实登山家姓名数据 【免费下载链接】faker A library for generating fake data such as names, addresses, and phone numbers. 项目地址: https://gitcode.com/GitHub_Trending/fake/faker Fak…

2026/11/1 18:39:20 阅读更多 →
Linux内存缓存解析:Page Cache、dentry/inode与yum/apt清理实践

Linux内存缓存解析:Page Cache、dentry/inode与yum/apt清理实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 7:27:13 阅读更多 →
FTP、FTPS、SFTP三兄弟详解:从协议原理到服务器搭建与排障

FTP、FTPS、SFTP三兄弟详解:从协议原理到服务器搭建与排障

很多人第一次接触这三个词的时候,都会下意识地认为:FTPS 是 FTP 的安全版,SFTP 是更安全一点的 FTP,反正都是"上传下载文件的协议"嘛,能有多大的区别?我以前也是这么想的,直到有一次帮…

2026/11/1 18:40:04 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/5 12:28:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/6 9:29:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/6 8:08:42 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/5 19:38:59 阅读更多 →

日新闻

周新闻

月新闻