ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

VPD 视觉感知框架实战:在 MMSegmentation 中用 Stable Diffusion 主干完成单目深度估计

VPD 视觉感知框架实战:在 MMSegmentation 中用 Stable Diffusion 主干完成单目深度估计 VPD 视觉感知框架实战在 MMSegmentation 中用 Stable Diffusion 主干完成单目深度估计【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读VPDVisual Perception with a pre-trained Diffusion model是一种将大规模图文预训练的文本到图像扩散模型Stable Diffusion直接用作视觉感知任务骨干网络的框架。本文以 configs/vpd/README.md 为骨架结合 MMSegmentation 仓库中 VPD 的完整配置与源码实现系统讲解该方法的原理、依赖安装、配置文件逐项解析、训练与推理流程以及 NYU 数据集上的官方结果与评估指标。读完本文你将掌握如何在 MMSegmentation 中复现、改造并部署基于 Stable Diffusion 主干的深度估计模型并理解其背后的跨注意力引导与文本适配机制。VPD 方法简介论文出处Unleashing Text-to-Image Diffusion Models for Visual PerceptionICCV 2023官方仓库为 wl-zhao/VPD扩散模型Diffusion Models已成为生成式模型的新趋势而基于大规模图文对预训练的文本到图像扩散模型可以通过提示词prompt进行高度可控的条件合成。与只关注底层属性和细节的无条件生成模型不同文本到图像扩散模型得益于视觉-语言联合预训练蕴含更丰富的高层语义知识。VPD 框架的核心思想是不把预训练去噪自编码器放在扩散采样流程中而是直接把它当作骨干网络backbone使用研究如何最大化利用其中学到的知识。具体做法有三点文本提示去噪解码器用合适的文本输入class embedding去“提示”扩散模型的 UNet 解码器文本适配器Text Adapter通过可学习的适配器精炼文本特征使其与预训练阶段对齐并让视觉内容与文本提示充分交互跨注意力图显式引导利用视觉特征与文本特征之间的跨注意力图cross-attention maps提供显式引导。相比其他预训练方法VPD 表明视觉-语言预训练的扩散模型可以借助该框架更快地适配下游视觉感知任务。论文在语义分割、指代图像分割referring image segmentation和深度估计三个任务上验证了有效性。当前 MMSegmentation 仓库中实现并开源的是其中的单目深度估计部分基于 NYU 数据集。MMSegmentation 中的 VPD 实现架构MMSegmentation 对 VPD 的实现分布在三个核心模块中均通过注册器MODELS.register_module()挂载模块文件作用VPD骨干网络mmseg/models/backbones/vpd.py加载 Stable Diffusion 预训练模型提取多尺度视觉特征VPDDepthHead解码头mmseg/models/decode_heads/vpd_depth_head.py将多尺度特征融合并回归出深度图DepthEstimator分割器mmseg/models/segmentors/depth_estimator.py组织训练 / 推理 / 后处理全流程VPD 骨干网络mmseg/models/backbones/vpd.pyVPD 骨干在 vpd.py 第 302 行 注册其__init__主要完成四件事实例化并加载 Stable Diffusion 预训练模型通过instantiate_from_config(diffusion_cfg)构建完整的 Latent Diffusion 模型再以非严格模式加载预训练权重见 vpd.py 第 344-347 行拆分出 VAE 编码器与 UNetself.encoder_vq sd_model.first_stage_model将 RGB 图像编码为 latentself.unet UNetWrapper(sd_model.model, **unet_cfg)去噪 UNet 包装器见 vpd.py 第 349-350 行加载类别嵌入与文本适配器从class_embed_path加载 class embeddings构建TextAdapter一个Linear → GELU → Linear的残差适配模块见 vpd.py 第 282-298 行并以可学习参数gamma控制适配强度默认1e-4可选类别选择当class_embed_selectTrue时会在 class embeddings 末尾拼接其均值向量对应“无类别”情况前向时根据每张图的category_id选择对应的嵌入见 vpd.py 第 357-362 行。forward流程见 vpd.py 第 365-395 行可概括为输入图像 x ├─ 选择 class embeddings → TextAdapter(gamma) → 文本条件 c_crossattn ├─ 按 pad_shape 对输入做 padding适配预训练扩散模型的输入尺寸 ├─ torch.no_grad() 下 encoder_vq.encode(x).mode() 得到 4 通道 latents ├─ unet(latents, t1, contextc_crossattn) # 固定时间步一次前向 └─ 返回多尺度特征列表含跨注意力图拼接经 UNetWrapper 逆序输出值得注意的是这里并不执行真正的扩散采样时间步固定为t1encoder_vq前向全程torch.no_grad()冻结 VAE只有 UNet 及文本适配器参与梯度更新。UNetWrappervpd.py 第 193 行在use_attnTrue时通过register_attention_controlvpd.py 第 27 行改写所有CrossAttention的前向逻辑将跨注意力图经AttentionStorevpd.py 第 107 行收集、平均后按分辨率size16 / size32 / size64拼接到 UNet 各层级输出上从而把“视觉特征与文本提示的交互”显式注入到特征图中。VPD 深度解码头mmseg/models/decode_heads/vpd_depth_head.pyVPDDepthHeadvpd_depth_head.py 第 100 行接收骨干输出的四个层级特征前向过程见 vpd_depth_head.py 第 201-216 行将x[3]上采样 2 倍后与x[2]拼接对x[0]、x[1]分别做 stride2 的卷积下采样conv1/conv2使三者空间分辨率对齐拼接后经conv_aggregation1x1 卷积 GroupNorm ReLU聚合为feature_dim默认 1536维特征按fmap_border裁剪边缘后送入VPDDepthDecoder3 层转置卷积 双线性上采样见 vpd_depth_head.py 第 17 行经depth_pred_layer输出单通道最后sigmoid * max_depth映射到实际深度范围默认max_depth10米。损失函数默认使用SiLogLoss尺度不变对数损失训练时会把预测深度 resize 回 GT 尺寸再计算损失见 vpd_depth_head.py 第 218-253 行。深度估计器mmseg/models/segmentors/depth_estimator.pyDepthEstimatordepth_estimator.py 第 21 行继承自EncoderDecoder负责组织完整的训练 / 推理生命周期loss()extract_feat → decode_head.losspredict()inference → postprocess_result结果写入SegDataSample.pred_depth_map见 depth_estimator.py 第 333-391 行支持whole/slide/slide_flip三种推理模式其中slide_flip会以滑窗方式推理并对原图与水平翻转结果取平均见 depth_estimator.py 第 241-298 行VPD 配置默认使用该模式以提升精度extract_feat在class_embed_selectTrue时会把batch_img_metas中的category_id组装成类别标签传给骨干见 depth_estimator.py 第 98-113 行。仓库对应单元测试位于 tests/test_models/test_backbones/test_vpd.py、tests/test_models/test_heads/test_vpd_depth_head.py 与 tests/test_models/test_segmentors/test_depth_estimator.py可用于验证各模块的输入输出尺寸与基本前向。环境依赖安装VPD 依赖ldmLatent Diffusion Models库与 albumentations 增强库运行前需要按 README 安装pip install -r requirements/albu.txt pip install -r requirements/optional.txt其中requirements/albu.txt 提供 Albumentations 数据增强相关依赖对应 NYU 训练管线中使用的Albu变换requirements/optional.txt 提供 LDM 依赖若未安装VPD骨干与UNetWrapper在初始化时会抛出断言错误提示先安装该依赖见 vpd.py 第 214-215 行 与 vpd.py 第 333-334 行。VPD 的完整模型、权重与日志元信息许可证、训练数据、指标、权重与日志下载地址等记录在 configs/vpd/metafile.yaml 中可配合tools/model_converters与mim工具链使用。配置文件逐项解析VPD 在 MMSegmentation 中共有两个训练配置均以“SD-v1.5 骨干 NYU 数据集 25k 迭代”为基线区别仅在于裁剪尺寸480×480 与 512×512configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.pyconfigs/vpd/vpd_sd_4xb8-25k_nyu-512x512.py配置继承关系两个配置都继承自四份基础配置_base_ [ ../_base_/models/vpd_sd.py, ../_base_/datasets/nyu.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_25k.py ]configs/base/models/vpd_sd.py模型结构 Stable Diffusion 完整结构描述configs/base/datasets/nyu.pyNYU 数据加载与增强管线configs/base/default_runtime.py运行时钩子、日志、环境等configs/base/schedules/schedule_25k.py优化器与学习率调度。模型主干配置configs/base/models/vpd_sd.py该文件定义了完整的 Stable Diffusion 结构适配自官方v1-inference.yaml关键参数包括参数值说明base_learning_rate0.0001预训练基础学习率本仓库训练时会被 schedule 覆盖timesteps1000扩散时间步总数linear_start/linear_end0.00085 / 0.012latent 扩散噪声调度区间scale_factor0.18215VAE latent 缩放系数image_size/channels64 / 4latent 空间尺寸与通道数cond_stage_trainableFalse文本编码器不参与训练conditioning_keycrossattn使用跨注意力条件注入UNetmodel_channels320UNet 基础通道数UNetchannel_mult[1, 2, 4, 4]四阶段通道倍增UNetcontext_dim768文本条件维度对应 CLIP 文本编码VAEembed_dim4自编码器 latent 维度模型部分组装为DepthEstimator并设置find_unused_parameters TrueStable Diffusion 中有部分参数不参与梯度更新需开启该标志避免 DDP 报错model dict( typeDepthEstimator, data_preprocessordata_preprocessor, backbonedict( typeVPD, diffusion_cfgstable_diffusion_cfg, ), )data_preprocessor使用SegDataPreProcessormean[127.5, 127.5, 127.5]、std[127.5, 127.5, 127.5]即把输入归一化到[-1, 1]与 Stable Diffusion 预训练时的数据分布保持一致。下游任务配置以 480×480 为例crop_size (480, 480) model dict( typeDepthEstimator, data_preprocessordict(sizecrop_size), backbonedict( class_embed_pathhttps://download.openmmlab.com/mmsegmentation/ v0.5/vpd/nyu_class_embeddings.pth, class_embed_selectTrue, pad_shape512, unet_cfgdict(use_attnFalse), ), decode_headdict( typeVPDDepthHead, in_channels[320, 640, 1280, 1280], max_depth10, fmap_border(1, 1), ), test_cfgdict(modeslide_flip, crop_sizecrop_size, stride(160, 160)))各关键项说明class_embed_pathNYU 数据集的类别嵌入权重下载地址运行时会自动下载用于把“类别”作为文本提示注入 UNet。class_embed_selectTrue表示启用类别选择机制配合数据集 meta 中的category_id使用pad_shape512输入图像先 pad 到 512以满足预训练扩散模型对输入尺寸的要求实现见 vpd.py 第 384-387 行unet_cfgdict(use_attnFalse)深度估计任务关闭跨注意力图收集与拼接该机制主要服务于分割类任务减少显存与计算开销decode_headVPDDepthHead四层级输入通道[320, 640, 1280, 1280]max_depth10预测深度上限 10 米480 分辨率下设置fmap_border(1, 1)裁剪 1 像素边缘以对齐尺寸test_cfg推理采用slide_flip滑窗 翻转平均480 配置 stride 为(160, 160)512 配置 stride 为(128, 128)。检查点与优化器定制两个配置都通过default_hooks按 RMSE 保存最优权重default_hooks dict( checkpointdict(save_bestrmse, ruleless, max_keep_ckpts1))优化器部分使用自定义构造器ForceDefaultOptimWrapperConstructor对不同子网络设置差异化学习率optim_wrapper dict( constructorForceDefaultOptimWrapperConstructor, paramwise_cfgdict( bias_decay_mult0, force_default_settingsTrue, custom_keys{ backbone.encoder_vq: dict(lr_mult0), backbone.unet: dict(lr_mult0.01), }))backbone.encoder_vqVAE 编码器lr_mult0完全冻结只做前向编码对应源码中torch.no_grad()的实现backbone.unetlr_mult0.01UNet 使用主学习率的 1%微调bias_decay_mult0偏置项不做权重衰减。基础优化器与调度定义在 configs/base/schedules/schedule_25k.pyoptimizer dict(typeAdamW, lr0.001, weight_decay0.1) param_scheduler [ dict(typeLinearLR, start_factor3e-2, begin0, end12000, by_epochFalse), dict(typePolyLRRatio, eta_min_ratio3e-2, power0.9, begin12000, end24000, by_epochFalse), dict(typeConstantLR, by_epochFalse, factor1, begin24000, end25000) ] train_cfg dict(typeIterBasedTrainLoop, max_iters25000, val_interval1000)即前 12k 迭代线性热身起始为 3e-2随后多项式衰减至 24000 步最后 1k 步保持恒定共训练 25000 迭代每 1000 迭代验证一次。NYU 数据管线configs/base/datasets/nyu.pyNYU 数据集默认根目录为data/nyu训练图像位于images/train深度标注位于annotations/train。训练管线要点LoadDepthAnnotation加载深度图并乘以depth_rescale_factor1e-3把毫米量级的原始深度换算为米RandomDepthMixprob0.25VPD 配套的深度随机混合增强RandomFlipprob0.5RandomCropcrop_size(480, 480)Albu增强RandomBrightnessContrast、RandomGamma、HueSaturationValue对应requirements/albu.txtPackSegInputs的meta_keys中包含category_id供class_embed_select使用。验证/测试管线会将图像按scale(2000, 480)等比缩放评估器为DepthMetricval_evaluator dict( typeDepthMetric, min_depth_eval0.001, max_depth_eval10.0, crop_typenyu_crop)即只在 0.001~10 米有效深度范围内、按 NYU 标准裁剪区域评估。训练与推理训练准备好 NYU 数据集放置于data/nyu结构符合 configs/base/datasets/nyu.py 中的data_prefix后使用仓库统一的训练入口 tools/train.py 启动# 单卡训练 480x480 配置 python tools/train.py configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py # 多卡分布式训练8 卡 bash tools/dist_train.sh configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py 8训练过程中UNet 以 1% 学习率微调、VAE 完全冻结、文本适配器与解码头正常更新训练前会自动下载 Stable Diffusion 预训练权重与nyu_class_embeddings.pth。训练迭代数较大且显存占用较高建议参考 metafile 中“8× A100、batch size 32”的资源前提按需调整。推理 / 测试使用 tools/test.py 配合权重文件进行测试结果会按slide_flip模式输出深度图并计算 RMSE 等指标python tools/test.py configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py ${CHECKPOINT_FILE}模型权重与训练日志的下载地址均记录在 configs/vpd/metafile.yaml 中Weights与Training log字段可参照其中文件名组织本地权重路径。官方结果与评估指标NYU 深度估计结果以下是 README 与 metafile 中记录的两个 VPD 模型在 NYU 数据集上的官方指标训练资源8× A100batch size 32方法骨干网络Crop SizeLr schd设备RMSEd1d2d3RELlog_10配置VPDStable-Diffusion-v1-5480x48025000A1000.2530.9640.9950.9990.0690.030configVPDStable-Diffusion-v1-5512x51225000A1000.2580.9630.9950.9990.0720.031config指标含义数值越小越好的为 RMSE、REL、log_10越接近 1 越好的是 d1/d2/d3RMSE深度预测的均方根误差REL平均相对误差|pred - gt| / gt的均值log_10以 10 为底的对数空间误差d1 / d2 / d3阈值准确率即预测与真值比值落在[1/1.25, 1.25]、[1/1.25², 1.25²]、[1/1.25³, 1.25³]内的像素比例。论文指出VPD 在 NYUv2 深度估计上达到 0.254 RMSE并在 RefCOCO-val 指代分割上达到 73.3% oIoU均刷新了当时的榜单纪录。MMSegmentation 中的 480×480 配置复现结果 RMSE 为 0.253与论文结论一致。引用若在研究中使用了 VPD 方法请按 README 给出的文献引用article{zhao2023unleashing, title{Unleashing Text-to-Image Diffusion Models for Visual Perception}, author{Zhao, Wenliang and Rao, Yongming and Liu, Zuyan and Liu, Benlin and Zhou, Jie and Lu, Jiwen}, journal{ICCV}, year{2023} }小结VPD 为“如何复用扩散模型的语义知识”提供了一个简洁而有效的范式冻结 VAE、微调 UNet、以类别嵌入作为文本提示、用可学习适配器对齐图文特征。在 MMSegmentation 中它被完整落地为VPD骨干 VPDDepthHead解码头 DepthEstimator分割器的标准三段式结构开箱即用地支持训练、测试与指标评估。读者可以从 configs/vpd/vpd_sd_4xb8-25k_nyu-480x480.py 出发复现官方结果也可参考 mmseg/models/backbones/vpd.py 与 mmseg/models/decode_heads/vpd_depth_head.py 的源码将该范式迁移到语义分割、指代分割等更多视觉感知任务上。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表