OOTDiffusion 中的 DensePose 实战指南:基于 Detectron2 的稠密人体姿态估计推理、训练与可视化

发布时间:2026/9/17 2:14:46
OOTDiffusion 中的 DensePose 实战指南:基于 Detectron2 的稠密人体姿态估计推理、训练与可视化 OOTDiffusion 中的 DensePose 实战指南基于 Detectron2 的稠密人体姿态估计推理、训练与可视化【免费下载链接】OOTDiffusion[AAAI 2025] Official implementation of OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on项目地址: https://gitcode.com/GitHub_Trending/oo/OOTDiffusion导读本文以 OOTDiffusion 仓库内携带的 DensePose in Detectron2 文档为核心系统讲解 Dense Human Pose Estimation In The Wild稠密人体姿态估计的核心原理、仓库中的代码组织结构、预训练模型推理、模型训练与评估以及apply_net/query_db两大配套工具的使用方法。读者读完本文后将能够利用仓库中现成的 DensePose-RCNN 配置与权重完成从单张人体图像到 24 个表面块patchUV 坐标映射的完整推理管线并掌握结果可视化、数据集查询与自定义训练的全流程操作。DensePose 是什么从稀疏关键点到稠密 UV 对应按 DensePose README 的定义稠密人体姿态估计Dense Human Pose Estimation的目标是将一张 RGB 图像中的所有人体像素一一映射到人体三维表面3D surface of the human body上。与传统的稀疏人体姿态估计通常只输出十几个关键点坐标如 openpose 风格的关键点不同DensePose 为每个属于人体的像素都估计一个稠密对应关系具体表现为块索引patch index / I人体表面被划分为 24 个表面块由 config.py 中的NUM_PATCHES 24定义每个像素属于哪一个块UV 坐标U / V在该表面块的参数化坐标系中的连续坐标值。由此DensePose 建立起图像像素 ↔ 人体表面点的稠密映射这一能力可服务于服装贴合、人体纹理映射、虚拟试穿等下游任务。在 OOTDiffusion 的预处理模块中DensePose 实现以 detectron2 扩展项目的形式被携带于 projects/DensePose 目录下与人体解析humanparsing共用同一个 detectron2 框架详见 detectron2 README 中 Includes more features such as panoptic segmentation, densepose... 的说明为仓库的预处理链路提供了基于检测分割框架的稠密人体建模能力。仓库中的 DensePose 模块结构在深入使用之前先梳理本仓库中 DensePose 相关文件的布局根目录为preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/文件 / 目录作用README.md项目总览任务定义、快速开始、模型动物园、License 与引用doc/GETTING_STARTED.md推理、训练、评估的完整操作指南doc/MODEL_ZOO.md基线模型与指标汇总doc/TOOL_APPLY_NET.mdapply_net推理结果导出与可视化工具说明doc/TOOL_QUERY_DB.mdquery_db数据集条目打印与可视化工具说明apply_net.pyapply_net工具源码dump / show 两种模式query_db.pyquery_db工具源码print / show 两种模式train_net.pyDensePose 训练 / 评估入口脚本configs/全部基线模型对应的 YAML 配置文件densepose/DensePose 核心模块配置注入、数据、模型头、可视化等tests/模型端到端与数据结构测试快速上手用预训练模型进行推理根据 GETTING_STARTED.md使用预训练模型推理只需两步选定模型与配置文件从 Model Zoo 中挑选一个模型及其配置例如 densepose_rcnn_R_50_FPN_s1x.yaml运行 Apply Net 工具完成可视化或结果落盘。例如使用轮廓contour可视化python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml densepose_rcnn_R_50_FPN_s1x.pkl image.jpg dp_contour,bbox --output image_densepose_contour.png该命令的三个必选位置参数分别是配置文件、权重文件、输入图片dp_contour,bbox指定了要叠加的可视化类型。执行前需要把模型权重文件下载到本地下载入口见 MODEL_ZOO.md 中的模型下载链接。apply_net推理结果导出与可视化工具apply_net 是 DensePose 官方提供的推理结果工具拥有dump保存结果与show可视化两种模式。dump 模式把模型输出保存为 pickle 文件通用命令形式为python apply_net.py dump [-h] [-v] [--output dump_file] config model input三个必选参数含义config模型对应的配置文件model训练好的模型权重文件input输入图像的文件名、通配模式或文件夹。可选参数--output指定输出文件名默认results.pkl。官方示例# 1) 对 images 文件夹下所有图像执行推理并保存到 dump.pkl python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl images --output dump.pkl -v # 2) 对匹配 image*.jpg 的图像执行推理并保存到 results.pkl python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image*.jpg --output results.pkl -v从 apply_net.py 源码 可以看到input的处理逻辑是目录则枚举目录内全部文件单个文件则直接使用否则当作glob通配模式展开——这解释了上面三种输入的等价性。pickle 结果的结构每个图像对应一个字典保存了检测分数、边界框和稠密姿态结果例如data: [{file_name: /your_path/image1.jpg, scores: tensor([0.9884]), pred_boxes_XYXY: tensor([[ 69.6114, 0.0000, 706.9797, 706.0000]]), pred_densepose: densepose.structures.DensePoseResult object}, {file_name: /your_path/image2.jpg, scores: tensor([0.9999, 0.5373, 0.3991]), pred_boxes_XYXY: tensor([[ 59.5734, 7.7535, 579.9311, 932.3619], [612.9418, 686.1254, 612.9999, 704.6053], [164.5081, 407.4034, 598.3944, 920.4266]]), pred_densepose: densepose.structures.DensePoseResult object}]结果解析代码示例先保证 DensePose 在PYTHONPATH中或临时追加其路径import sys, pickle sys.path.append(/your_detectron2_path/detectron2_repo/projects/DensePose/) f open(/your_result_path/results.pkl, rb) data pickle.load(f) # 取出第一张图、第一个被检测实例的结果 img_id, instance_id 0, 0 bbox_xyxy data[img_id][pred_boxes_XYXY][instance_id] # (x0, y0, x1, y1) result_encoded data[img_id][pred_densepose].results[instance_id] iuv_arr DensePoseResult.decode_png_data(*result_encoded)iuv_arr的形状为[3, H, W]H、W 为边界框尺寸三个通道的含义是iuv_arr[0,:,:]图像点的块索引表示该点位于 24 个表面块中的哪一块iuv_arr[1,:,:]该点的U 坐标值iuv_arr[2,:,:]该点的V 坐标值。show 模式在图像上可视化检测结果通用命令形式为python apply_net.py show [-h] [-v] [--min_score score] [--nms_thresh threshold] [--output image_file] config model input visualizations四个必选参数中visualizations是可视化类型说明符支持以逗号组合多种类型bbox检测到的人体边界框dp_segm检测到的人体分割掩码dp_u各身体部位按估计的 U 坐标值着色dp_v各身体部位按估计的 V 坐标值着色dp_contour以颜色编码 U / V 坐标的轮廓图。可选参数--min_score只显示分数不低于该值的检测结果在源码ShowAction.add_arguments中默认值为0.8且会通过MODEL.ROI_HEADS.SCORE_THRESH_TEST注入配置--nms_thresh对检测结果额外执行非极大值抑制NMS阈值由该参数给定--output输出文件名模板默认outputres.png为区分多张图像的输出工具会追加从 1 开始的序号例如outputres.0001.png、outputres.0002.png该行为由源码中的_get_out_fname实现。官方示例# 边界框 分割 python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_segm -v # 边界框 U 坐标着色 python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_u -v # 边界框 V 坐标着色 python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_v -v # 边界框 U/V 轮廓图 python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg dp_contour,bbox -v从 apply_net.py 的ShowAction实现 可以看到可视化类型到可视化器的映射VISUALIZERS字典是dp_contour/dp_segm/dp_u/dp_v/bbox五种多个可视化器通过CompoundVisualizer组合渲染到同一张图上-v用于提升日志详细度。Model Zoo基线模型与配置MODEL_ZOO.md 汇总了所有官方基线。所有模型均使用 COCOtrain2014valminusminival2014训练并在 COCOminival2014上评估统一采用 s1x 学习率调度。指标列含义box AP人体框检测精度、dp. AP GPS与dp. AP GPSmDensePose 稠密姿态在 GPS 与 GPSm 两种阈值设定下的平均精度。传统基线Legacy Models沿用 Güler et al., 2018 训练调度的模型名称训练耗时 (s/iter)推理耗时 (s/im)训练显存 (GB)box APdp. AP GPSdp. AP GPSmR_50_FPN_s1x_legacy0.3070.0513.258.152.154.9R_101_FPN_s1x_legacy0.3900.0634.359.553.256.1改进基线原始全卷积 Head Panoptic FPN Head使用改进训练调度与 Kirillov et al., 2019 的 Panoptic FPN head名称训练耗时 (s/iter)推理耗时 (s/im)训练显存 (GB)box APdp. AP GPSdp. AP GPSmR_50_FPN_s1x0.3590.0664.561.263.765.3R_101_FPN_s1x0.4280.0795.862.364.566.4改进基线DeepLabV3 Head在上一组基础上将 DensePose 头替换为 Chen et al., 2017 的 DeepLabV3 head名称训练耗时 (s/iter)推理耗时 (s/im)训练显存 (GB)box APdp. AP GPSdp. AP GPSmR_50_FPN_DL_s1x0.3920.0706.761.165.666.8R_101_FPN_DL_s1x0.4780.0837.062.366.367.7带置信度估计的基线Confidence Estimation这些模型在回归 UV 坐标的同时额外估计坐标置信度思路见 Neverova et al., 2019命名中WC1/WC2对应两种协方差建模方式对应配置中的UV_CONFIDENCE.TYPE名称训练耗时 (s/iter)推理耗时 (s/im)训练显存 (GB)box APdp. AP GPSdp. AP GPSmR_50_FPN_WC1_s1x0.3530.0644.660.564.265.6R_50_FPN_WC2_s1x0.3640.0664.860.764.265.7R_50_FPN_DL_WC1_s1x0.3970.0686.761.165.867.1R_50_FPN_DL_WC2_s1x0.4100.0706.860.865.666.7R_101_FPN_WC1_s1x0.4350.0765.762.564.966.5R_101_FPN_WC2_s1x0.4500.0785.762.364.866.6R_101_FPN_DL_WC1_s1x0.4790.0817.962.066.267.4R_101_FPN_DL_WC2_s1x0.4910.0827.661.765.967.3以上模型与配置文件一一对应均可直接在 configs 目录中找到每个模型的权重与训练日志model、metrics通过 MODEL_ZOO 文档中的下载链接获取。MODEL_ZOO 还说明所有可下载模型均遵循 Creative Commons Attribution-ShareAlike 3.0 许可。文档同时指出DensePose 1旧版框架的ResNet50_FPN_s1x-e2ebbox AP 54.673与ResNet101_FPN_s1x-e2ebbox AP 56.032两个旧基线也可在当前框架中加载评估但分数与旧版报告值存在轻微差异源于框架间的小型不兼容。从配置文件看模型结构以 densepose_rcnn_R_50_FPN_s1x.yaml 为例_BASE_: Base-DensePose-RCNN-FPN.yaml MODEL: WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl # 骨干网络预训练权重 RESNETS: DEPTH: 50 SOLVER: MAX_ITER: 130000 STEPS: (100000, 120000)其基类 Base-DensePose-RCNN-FPN.yaml 定义了完整的网络骨架元架构GeneralizedRCNN骨干为build_resnet_fpn_backboneFPN 输入res2–res5RPN5 个特征层各有单尺度锚框32–512长宽比[0.5, 1.0, 2.0]训练 / 测试的PRE_NMS_TOPK分别为 2000 / 1000每 FPN 层POST_NMS_TOPK均为 1000ROI 头DensePoseROIHeadsNUM_CLASSES: 1只有 person 一类Box headFastRCNNConvFCHead2 个 FC 层ROIAlign 池化分辨率 7DensePose 头DensePoseV1ConvXHeadNUM_COARSE_SEGM_CHANNELS: 2数据与求解器训练集densepose_coco_2014_traindensepose_coco_2014_valminusminival测试集densepose_coco_2014_minivalIMS_PER_BATCH: 16、BASE_LR: 0.01、90k 迭代训练输入短边在 640–800 之间多尺度采样。置信度版本的配置如 densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml则在此基础上开启UV_CONFIDENCE.ENABLED: True并将TYPE设为indep_aniso同时将POINT_REGRESSION_WEIGHTS调低到0.0005、启用梯度裁剪。DensePose 头配置参数详解DensePose 的全部配置项在 densepose/config.py 的add_densepose_config中注册这里列出关键参数及其默认值配置项默认值含义MODEL.DENSEPOSE_ONTrue是否启用 DensePose 分支ROI_DENSEPOSE_HEAD.NAMEDensePose 头名称如DensePoseV1ConvXHead、DensePoseDeepLabHeadROI_DENSEPOSE_HEAD.NUM_STACKED_CONVS8堆叠卷积层数ROI_DENSEPOSE_HEAD.NUM_PATCHES24人体表面块数量点标签的部件数ROI_DENSEPOSE_HEAD.DECONV_KERNEL4反卷积核大小ROI_DENSEPOSE_HEAD.CONV_HEAD_DIM512卷积头通道数ROI_DENSEPOSE_HEAD.CONV_HEAD_KERNEL3卷积核大小ROI_DENSEPOSE_HEAD.UP_SCALE2上采样倍率ROI_DENSEPOSE_HEAD.HEATMAP_SIZE112输出热图尺寸ROI_DENSEPOSE_HEAD.POOLER_TYPEROIAlignV2RoI 池化类型ROI_DENSEPOSE_HEAD.POOLER_RESOLUTION28RoI 池化分辨率ROI_DENSEPOSE_HEAD.POOLER_SAMPLING_RATIO2池化采样率ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS2粗分割通道数注释说明可取值15或2ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD0.7RoI 被判为前景的 IOU 阈值ROI_DENSEPOSE_HEAD.INDEX_WEIGHTS5.0注释掩码14 部件的损失权重ROI_DENSEPOSE_HEAD.PART_WEIGHTS1.0表面部件24 部件的损失权重ROI_DENSEPOSE_HEAD.POINT_REGRESSION_WEIGHTS0.01UV 回归损失权重ROI_DENSEPOSE_HEAD.DECODER_ONTrue是否启用解码器ROI_DENSEPOSE_HEAD.DECODER_NUM_CLASSES256解码器类别数ROI_DENSEPOSE_HEAD.DECODER_CONV_DIMS256解码器卷积维度ROI_DENSEPOSE_HEAD.DECODER_NORM解码器归一化方式ROI_DENSEPOSE_HEAD.DECODER_COMMON_STRIDE4解码器公共步长ROI_DENSEPOSE_HEAD.DEEPLAB.NORMGNDeepLab 头的归一化方式GroupNormROI_DENSEPOSE_HEAD.DEEPLAB.NONLOCAL_ON0是否启用 non-local 模块ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.ENABLEDFalse是否在学习 UV 值的同时学习置信度方差ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.EPSILON0.01UV 置信度的下界ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.TYPEiid_iso置信度统计模型iid_iso独立同分布、各向同性协方差或indep_aniso独立但各向异性协方差理解这些默认值对调参很有帮助例如切换 DensePose 头时通过ROI_DENSEPOSE_HEAD.NAME指定DensePoseDeepLabHead开启置信度估计时则需要同时调整UV_CONFIDENCE与POINT_REGRESSION_WEIGHTS置信度基线中将其从默认的0.01降为0.0005。训练 DensePose-RCNN数据集准备按 GETTING_STARTED.md 的说明先将 DensePose 数据集组织为如下目录结构位于训练脚本运行目录下datasets/coco/ annotations/ densepose_{train,minival,valminusminival}2014.json densepose_minival2014_100.json # 可选仅用于测试 {train,val}2014/ # json 中引用到的图像文件其中densepose_minival2014_100.json是仅含 100 张图的轻量测试子集方便快速验证流程。训练命令训练统一使用 train_net.pyMODEL_ZOO 中的全部模型均由该脚本训练得到。8 卡端到端训练 ResNet-50 FPN 骨干的 DensePose-RCNNs1x 调度python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml --num-gpus 8注意配置默认面向 8 卡训练。若只有 1 张 GPU需按线性学习率缩放规则linear learning rate scaling rule见 arXiv:1706.02677同步下调批大小与学习率python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025从 train_net.py 源码 可以看到训练前的配置组装流程是get_cfg()获取基础配置 →add_dataset_category_config(cfg)注入类别白名单与映射 →add_densepose_config(cfg)注入 DensePose 头配置 → 合并 YAML 文件与命令行--opts→freeze()冻结。训练器Trainer还重载了评估器与数据加载器当cfg.MODEL.DENSEPOSE_ON为真时会在 COCO 评估之外叠加DensePoseCOCOEvaluator并支持通过test_with_TTA在训练结束时执行带测试时增强TTA的评估。评估模型评估与训练命令几乎相同只需额外添加--eval-only标志并通过MODEL.WEIGHTS指定模型路径python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ --eval-only MODEL.WEIGHTS model.pth评估时会同时产出目标检测COCOEvaluator与 DensePose 稠密姿态DensePoseCOCOEvaluator两类指标若配置中开启TEST.AUG.ENABLED还会额外运行 TTA 评估结果键带_TTA后缀。query_db数据集条目的打印与可视化query_db 是面向数据集而非模型推理结果的工具用于查看 DensePose 标注数据。print 模式python query_db.py print [-h] [-v] [--max-entries N] dataset selectordatasetDensePose 数据集说明符例如densepose_coco_2014_trainselector条目选择器可以是单个说明或逗号分隔的多个形式为field[:type]value精确匹配或field[:type]min-max范围匹配--max-entries限制输出条目的最大数量。官方示例# 输出 densepose_coco_2014_train 中前 10 条 python query_db.py print densepose_coco_2014_train \* --max-entries 10 -v # 按文件名精确匹配 python query_db.py print densepose_coco_2014_train file_nameCOCO_train2014_000000000036.jpg -v # 按 image_id 范围匹配注意 :int 类型标注 python query_db.py print densepose_coco_2014_train image_id:int36-156 -vshow 模式python query_db.py show [-h] [-v] [--max-entries N] [--output image_file] dataset selector visualizations可视化类型与 apply_net 不同针对的是标注数据bbox标注人体的边界框dp_i标注点按所属表面块着色dp_pts标注点以绿色显示dp_segm标注人体的分割掩码dp_u标注点按 U 坐标着色dp_v标注点按 V 坐标着色。官方示例查看densepose_coco_2014_train中image_id 322的样本python query_db.py show densepose_coco_2014_train image_id:int322 bbox,dp_segm -v python query_db.py show densepose_coco_2014_train image_id:int322 bbox,dp_i -v python query_db.py show densepose_coco_2014_train image_id:int322 bbox,dp_pts -v python query_db.py show densepose_coco_2014_train image_id:int322 bbox,dp_u -v python query_db.py show densepose_coco_2014_train image_id:int322 bbox,dp_v -v--output为输出文件名模板默认output.png多条目输出时会追加从 1 开始的序号如output.0001.png。从 query_db.py 源码 可以确认其执行流程先通过DatasetCatalog.get(dataset)加载数据集再用EntrySelector.from_string(args.selector)解析选择器逐条过滤后交给PrintActionpprint 输出或ShowAction可视化叠加。ShowAction在读取条目时会通过DensePoseDataRelative.validate_annotation校验标注有效性并将DensePoseDataRelative数据与边界框一并交给对应的可视化器。引用与许可若在研究中使用了 DensePoseREADME 提供了两份 BibTeX 引用使用带置信度估计的 DensePose 时InProceedings{Neverova2019DensePoseConfidences, title {Correlated Uncertainty for Learning Dense Correspondences from Noisy Labels}, author {Neverova, Natalia and Novotny, David and Vedaldi, Andrea}, journal {Advances in Neural Information Processing Systems}, year {2019}, }使用原始 DensePose时InProceedings{Guler2018DensePose, title{DensePose: Dense Human Pose Estimation In The Wild}, author{R{i}za Alp Guler, Natalia Neverova, Iasonas Kokkinos}, journal{The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, year{2018} }许可方面DensePose 随 detectron2 一起以 Apache 2.0 许可 发布而 Model Zoo 中可下载的模型权重遵循 Creative Commons Attribution-ShareAlike 3.0 许可使用时需注意区分。总结本文围绕 OOTDiffusion 仓库中携带的 DensePose README 及其配套文档完整覆盖了稠密人体姿态估计的任务定义24 表面块 UV 坐标、仓库文件结构、预训练模型的推理apply_net的 dump / show 两种模式、Model Zoo 全部四类基线legacy / 改进 FPN head / DeepLabV3 head / 置信度估计及其配置解析、DensePose 头的全部关键超参数、训练含单卡线性学习率缩放与评估--eval-only命令以及数据集查询工具query_db的使用。无论是想快速对单张人体图像做稠密姿态推理与可视化还是准备在自有数据上复现或微调 DensePose-RCNN上述命令与配置都具备直接可复制、可运行的实战价值。【免费下载链接】OOTDiffusion[AAAI 2025] Official implementation of OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on项目地址: https://gitcode.com/GitHub_Trending/oo/OOTDiffusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询