资讯动态

Transformers DPT 模型完全指南:基于 Vision Transformer 的稠密预测(单目深度估计与语义分割)

发布时间:2026/9/8 21:15:06 来源:尧图企业网站定制
Transformers DPT 模型完全指南基于 Vision Transformer 的稠密预测单目深度估计与语义分割【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersDPTDense Prediction Transformer是 Transformers 仓库中用于稠密预测任务的经典架构它将 Vision Transformer 用作骨干网络而非卷积网络从而完成单目深度估计与语义分割。本文以 DPT 官方模型文档 为核心骨架结合 modeling_dpt.py 与 configuration_dpt.py 等源码完整梳理其架构脉络、配置项、图像预处理方式与三个模型类的实战用法。读完本文你将能够理解 DPT 的“多阶段特征重组 逐级融合上采样”解码机制掌握如何用任意 Transformer 骨干如 DINOv2搭建 DPT 框架以及如何直接跑通深度估计与语义分割的推理流程。概览什么是 DPTDPT 模型由 René Ranftl、Alexey Bochkovskiy 和 Vladlen Koltun 在论文Vision Transformers for Dense Prediction中提出。根据官方模型文档该模型论文于2021-03-24发表在 Hugging Face Papers并于2022-03-28由社区贡献者 nielsr 合入 Transformers 仓库。其核心思想非常简洁以 Vision TransformerViT 取代卷积网络作为稠密预测任务的骨干网络服务于语义分割与深度估计。论文摘要指出我们提出了 dense vision transformers——一种在稠密预测任务中以视觉 Transformer 取代卷积网络作为骨干的架构。我们收集 Transformer 不同 stage 输出的 token将它们重组成不同分辨率的类图像表示再用一个卷积解码器逐级融合最终产生全分辨率预测。Transformer 骨干在恒定且相对较高的分辨率下处理表示且每一 stage 都具有全局感受野。这些特性使 dense vision transformer 相比全卷积网络能给出更细粒度、更全局一致的预测。实验显示该架构在稠密预测任务上带来了显著提升——在单目深度估计上与 SOTA 全卷积网络相比相对性能最高提升 28%应用于语义分割时在 ADE20K 上以 49.02% mIoU 刷新 SOTA。我们进一步验证了该架构可微调到 NYUv2、KITTI、Pascal Context 等较小数据集上并同样取得新 SOTA。从实现层面看当前仓库中的 DPT 与 DPT-Hybrid 均由 Intel 实验室与 OpenMMLab 的 mmsegmentation 实现启发而来这一点在 modeling_dpt.py 的文件头注释中有明确说明。模型类同时声明了对 FlashAttention、SDPA、FlexAttention 与统一注意力后端的支持见DPTPreTrainedModel中_supports_sdpa True、_supports_flash_attn True、_supports_flex_attn True源码见 modeling_dpt.py。整体架构从特征序列到稠密预测的流水线DPT 的前向流程并不是简单地把 ViT 输出接一个上采样层。它的核心创新在于neck颈部模块该模块位于骨干与输出头之间由两段组成DPTReassembleStage特征重组DPTFeatureFusionStage多尺度特征融合。模型文档中对应的DPTModel、DPTForDepthEstimation、DPTForSemanticSegmentation三类模型在 modeling_dpt.py 中依次实现整体数据流为骨干编码将图片切分为 patch默认 16×16送入 ViT 或任意层次化骨干取第 2、5、8、11 层对应backbone_out_indices(2, 5, 8, 11)的中间隐状态作为多尺度特征特征重组Reassemble把每个中间层的(batch, seq_len, hidden)序列表示恢复成(batch, channels, height, width)的类图像特征图并利用 [CLS] readout token 补充全局信息再按不同 factor 做上/下采样到多分辨率源码见 DPTReassembleStage特征融合Fusion从最深、最粗的特征开始逐层加入更浅、更细的特征并双线性上采样 ×2最终得到融合的稠密特征源码见 DPTFeatureFusionLayer任务头将最后一级特征送入深度估计头或语义分割头产生逐像素输出。DPTNeck的完整接线可以在 modeling_dpt.py 中看到先对每个中间特征做一次 3×3 卷积把通道统一到fusion_hidden_size默认 256再交由DPTFeatureFusionStage融合。需要注意的是当骨干是 Swinv2 这种本身已是层次化 CNN 风格的骨干时backbone_config.model_type swinv2会跳过 reassemble 阶段因为其 feature map 已经是(batch, channels, height, width)形式。Reassemble 中的 readout 处理三种策略ViT 每个 stage 的输出都带一个 [CLS] token而语义分割/深度估计需要逐空间位置的信息。readout_type参数提供了三种把 [CLS] 信息注入其他 token 的策略配置校验见 configuration_dpt.py逻辑实现见 modeling_dpt.pyignore直接丢弃 [CLS] token仅用其余 patch tokenadd把 [CLS] 表示加到其余所有 token 上广播相加使每个位置都带上全局信息project默认先把 [CLS] token 沿空间维度拼接到每个 token 上维度翻倍为2 * hidden_size再用一个线性层投影回原维度hidden_size并施加hidden_act默认 GELU非线性。注意约束DPT-Hybrid模式强制要求readout_type project否则在配置初始化阶段直接抛ValueError见 configuration_dpt.py。输出头设计深度估计头DPTDepthEstimationHead由 3 个卷积层组成首层把fusion_hidden_size256减半后立即做 scale_factor2 的双线性上采样再经 32 通道卷积与 ReLU最后 1×1 卷积压缩到单通道输出并再次 ReLU最后squeeze掉通道维。若add_projectionTrue还会在头部前先加一层 3×3 的投影卷积。头部默认使用head_in_index-1指定的最后一级融合特征。语义分割头DPTSemanticSegmentationHead则是3×3 卷积 → BatchNorm → ReLU → Dropout比率由semantic_classifier_dropout控制默认 0.1→ 1×1 卷积映射到num_labels→ 双线性上采样 ×2。此外训练时可开启辅助头DPTAuxiliaryHead默认启用它只接收融合特征的最深一级hidden_states[-1]产生一个低分辨率的中间预测用于加深监督。DPTConfig 配置项详解DPTConfig继承自PreTrainedConfigmodel_type dpt并声明了子配置backbone_config见 configuration_dpt.py。其关键参数、默认值与含义如下表依据源码类字段与 docstring源码见 configuration_dpt.py参数默认值含义hidden_size768内置 ViT 骨干的隐层维度num_hidden_layers12内置 ViT 骨干层数num_attention_heads12注意力头数intermediate_size3072ViT MLP 中间维度hidden_actgeluMLP 激活函数hidden_dropout_prob/attention_probs_dropout_prob0.0隐层/注意力 dropoutimage_size384内置 ViT 期望输入尺寸DPT-large 风格patch_size16patch 尺寸num_channels3输入通道数is_hybridFalse是否使用 Hybrid 模式配合卷积式 BiT 骨干加载 DPT-Hybrid 权重qkv_biasTrue注意力 QKV 是否带偏置backbone_out_indices(2, 5, 8, 11)从骨干取哪些中间层特征使用AutoBackbone时会被置空并由骨干out_features决定见 configuration_dpt.pyreadout_typeproject[CLS]readout 注入策略枚举ignore/add/projectreassemble_factors(4, 2, 1, 0.5)四个重组层的上/下采样倍数neck_hidden_sizes(96, 192, 384, 768)各骨干特征图要投影到的通道数fusion_hidden_size256融合前统一缩放的通道数head_in_index-1输出头取哪一级融合特征-1 即最后一层use_batch_norm_in_fusion_residualFalse融合残差块是否使用 BatchNormuse_bias_in_fusion_residualNone语义上默认True融合残差块是否使用偏置add_projectionFalse深度估计头前是否加投影卷积层use_auxiliary_headTrue训练语义分割时是否启用辅助头auxiliary_loss_weight0.4辅助头交叉熵损失的权重系数semantic_loss_ignore_index255语义分割交叉熵损失忽略的标签值semantic_classifier_dropout0.1语义分类头 dropoutbackbone_featmap_shape(1, 1024, 24, 24)仅 Hybrid 模式使用描述 BiT 骨干特征图形状neck_ignore_stages(0, 1)仅 Hybrid 模式使用前两路 readout 特征会被 Identity 直接透传对应官方实现中前两层不重组的做法backbone_configNone外挂骨干的PreTrainedConfig或配置字典pooler_output_sizeNone自动取hidden_sizepooler 输出维度pooler_acttanhpooler 激活函数两个重要的自动行为在__post_init__中完成见 configuration_dpt.py当is_hybridTrue时若未提供backbone_config会自动按 BiT 骨干补全一组默认配置global_paddingsame、layer_typebottleneck、depths[3, 4, 9]、out_features[stage1,stage2,stage3]只有is_hybridTrue时backbone_featmap_shape与neck_ignore_stages才生效否则前者为None、后者为空列表readout_type若非法配置初始化即报错便于尽早暴露笔误。使用 AutoBackbone 自由搭配骨干以 DINOv2 为例模型文档重点强调DPT 框架兼容AutoBackbone机制因此可以复用库中大量现成视觉骨干如VitDetBackbone、Dinov2Backbone而不是被绑死在内置 ViT 上。官方示例给出了用 DINOv2 做骨干、随机初始化一个深度估计模型的完整写法from transformers import Dinov2Config, DPTConfig, DPTForDepthEstimation # 以 Transformer 骨干如 DINOv2初始化 # 此时需设置 reshape_hidden_statesFalse使骨干输出 # 形状为 (batch_size, num_channels, height, width) 的特征图 backbone_config Dinov2Config.from_pretrained( facebook/dinov2-base, out_features[stage1, stage2, stage3, stage4], reshape_hidden_statesFalse, ) config DPTConfig(backbone_configbackbone_config) model DPTForDepthEstimation(configconfig)这段代码背后依赖两个源码机制load_backbone当is_hybridFalse且提供了backbone_config时DPTForDepthEstimation会通过 backbone_utils.load_backbone 加载外部骨干而不是走内置DPTModel见 modeling_dpt.py动态 patch 尺寸推导由于 ViT 序列被 reshape 成方形特征图时要求边长可开方使用非方形输入时会依据pixel_values的实际高宽与backbone_config.patch_size计算出patch_height、patch_width再传给重组层做 reshape见 modeling_dpt.py。在仓库测试中test_modeling_dpt_auto_backbone.py 覆盖了这一组合路径而 DPT-HybridBiT 骨干与 Swinv2 骨干的接入逻辑分别由 convert_dpt_hybrid_to_pytorch.py、convert_dpt_swinv2_to_hf.py 等转换脚本佐证——DPT 已经从“特定 ViT 变体”演化为“可插拔骨干的稠密预测框架”。图像处理器DPTImageProcessor 与 PIL 后端DPT 的图像预处理有几个容易踩坑的细节官方通过自定义的 resize/pad 逻辑处理。仓库中同时存在两个实现文件image_processing_dpt.pyTorch 后端版本的DPTImageProcessorimage_processing_pil_dpt.pyPIL 后端版本的DPTImageProcessorPil两者的 preprocess 都支持images与segmentation_maps两个输入入口。预处理默认值与常规图像分类略有差异依据 PIL 后端类属性见 image_processing_pil_dpt.pysize {height: 384, width: 384}默认缩放到 384×384重采样方式为BICUBIC双三次像素值以1/255rescale并使用 ImageNet 标准均值/方差归一化新增两个 DPT 专有开关ensure_multiple_of默认 1保证缩放后尺寸是某数的整数倍与keep_aspect_ratio默认 False两者叠加时先等比缩放到尽量大、再把宽高约束为multiple的整数倍算法见 get_resize_output_image_sizedo_pad默认 False配合pad_image做居中 padding把图像补到size_divisor的整数倍如原版 DPT 处理宽高需被 14/32 整除的场景pad 逻辑见 image_processing_pil_dpt.py。后处理方法同样与模型输出配套post_process_depth_estimation(outputs, target_sizes)接收DepthEstimatorOutput把predicted_depth双线性插值回target_sizes原图高宽并返回字典列表post_process_semantic_segmentation(outputs, target_sizes)接收分割 logits插值回原图并返回SegmentationMask可选用return_segmentation_scoresTrue保留分数其与另一文件中的对应实现细节见 image_processing_pil_dpt.py 类定义部分。此外分割场景还支持do_reduce_labelsTrue把标签整体减 1、0 换为 255背景占位适配 ADE20k 这类“0 表示背景但背景不在类别表内”的数据集见 image_processing_pil_dpt.py。三个模型类与实战用法DPTModel仅骨干编码器DPTModelmodeling_dpt.py返回BaseModelOutputWithPoolingAndIntermediateActivations它会输出包含中间激活的特征供上层 DPT 解码流水线取用。它可选择是否附加DPTViTPooler取首 token 过线性层 pooler_act激活构造函数中通过add_pooling_layer控制深度估计/分割子类都会以add_pooling_layerFalse实例化它见 modeling_dpt.py 与 modeling_dpt.py。配置类的内置示例即展示了这一用法见 configuration_dpt.pyfrom transformers import DPTModel, DPTConfig # 初始化一个 dpt-large 风格配置 configuration DPTConfig() # 由配置初始化模型 model DPTModel(configuration)DPTForDepthEstimation单目深度估计该模型由一个骨干编码内置 ViT 或外挂骨干、DPTNeck与 3 层卷积深度头组成。官方 docstring 给出的端到端推理示例见 modeling_dpt.py如下from transformers import AutoImageProcessor, DPTForDepthEstimation from PIL import Image image Image.open(your_image.jpg) # 换成你自己的图片 image_processor AutoImageProcessor.from_pretrained(Intel/dpt-large) model DPTForDepthEstimation.from_pretrained(Intel/dpt-large) # 为模型准备输入 inputs image_processor(imagesimage, return_tensorspt) with torch.no_grad(): outputs model(**inputs) # 插值回原始分辨率 post_processed_output image_processor.post_process_depth_estimation( outputs, target_sizes[(image.height, image.width)], ) # 可视化预测结果 predicted_depth post_processed_output[0][predicted_depth] depth predicted_depth * 255 / predicted_depth.max() depth depth.detach().cpu().numpy() depth Image.fromarray(depth.astype(uint8))注意两点该模型的forward支持传入labels但官方当前尚未实现深度估计训练——一旦传labels会直接抛出NotImplementedError(Training is not implemented yet)见 modeling_dpt.py因此Intel/dpt-large这类预训练权重主要用于推理该模型返回DepthEstimatorOutput含predicted_depth、可选hidden_states与attentions默认内部会强制开启 hidden states 输出、按backbone_out_indices裁剪后喂给 neck见 modeling_dpt.py。若用户未主动要求最终输出不会携带完整 hidden states避免内存浪费。DPTForSemanticSegmentation语义分割模型结构为DPTModelDPTNeck 分割头 可选辅助头见 modeling_dpt.py。官方 docstring 示例modeling_dpt.pyfrom transformers import AutoImageProcessor, DPTForSemanticSegmentation from PIL import Image image Image.open(your_image.jpg) # 换成你自己的图片 image_processor AutoImageProcessor.from_pretrained(Intel/dpt-large-ade) model DPTForSemanticSegmentation.from_pretrained(Intel/dpt-large-ade) inputs image_processor(imagesimage, return_tensorspt) outputs model(**inputs) logits outputs.logits与前向流程相关的实现事实包括返回SemanticSegmenterOutput主输出为原始分辨率下的logits1/2 输入分辨率附近训练时传入labels会先把主头与辅助头的 logits 各自插值到labels的空间尺寸再用CrossEntropyLoss(ignore_indexsemantic_loss_ignore_index)分别计算损失最终loss 主损失 auxiliary_loss_weight × 辅助损失见 modeling_dpt.py若num_labels 1却传入 labels会抛出“标签数需大于 1”的ValueError见 modeling_dpt.py。任务指南与进一步探索模型文档将 DPT 定位为两个下游任务指南的核心模型实现对应任务文档位于仓库 语义分割任务指南 与 单目深度估计任务指南其中涵盖了完整的训练脚本、评估指标与更多调参建议建议在正式使用前通读。若想深入源码细节可以按下面的路径继续阅读当前仓库配置类与全部参数见 configuration_dpt.py完整前向实现embeddings → encoder → neck → head见 modeling_dpt.py其中 DPTFeatureFusionStage 负责从深到浅逐级把低分辨率特征图融合进来DPT 的“模块化建模”模板见 modular_dpt.py官方权重转换脚本仓库内置了从原始 DPT、DPT-Hybrid、DPT-BEiT、DPT-SwinV2、DPTDINOv2 权重转换到本库格式的脚本分别对应 convert_dpt_to_pytorch.py、convert_dpt_hybrid_to_pytorch.py、convert_dpt_beit_to_hf.py、convert_dpt_swinv2_to_hf.py、convert_dinov2_depth_to_hf.py可作为复现预训练权重的参考测试用例模型测试见 test_modeling_dpt.pyAutoBackbone 组合路径测试见 test_modeling_dpt_auto_backbone.py内部以Intel/dpt-large验证了预测张量形状与数值切片Hybrid 与 Swinv2 变体的测试分别见 test_modeling_dpt_hybrid.py 与 test_image_processing_dpt.py。总而言之DPT 给“Transformer 骨干 稠密预测”提供了清晰的模块化范式通用 ViT 编码多尺度特征 → reassemble 恢复空间结构并注入全局 readout → 卷积解码器逐级融合 → 轻量任务头出预测。在当前仓库中这一框架既可用于Intel/dpt-large等经典权重做零样本推理也能通过AutoBackbone无缝替换成 DINOv2、SwinV2、ViTDet 等新骨干进行定制训练是理解 Vision Transformer 落地稠密视觉任务的一条理想学习路径。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价