OOTDiffusion 中的 DensePose 上手指南:预训练模型推理、训练与评估全流程解析
2026/9/17 19:47:09 网站建设 项目流程

OOTDiffusion 中的 DensePose 上手指南:预训练模型推理、训练与评估全流程解析

【免费下载链接】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 仓库内嵌的 Detectron2 DensePose 项目文档 GETTING_STARTED.md 为核心骨架,系统讲解 DensePose-RCNN 的完整使用流程:如何用预训练模型做推理与可视化、如何准备 DensePose 数据集并训练端到端模型、如何评估模型精度,以及apply_net/query_db两个配套工具的实战用法。读者读完可掌握在 OOTDiffusion 的人体解析预处理管线中独立复现 DensePose 全流程的能力。

背景说明:OOTDiffusion 是一套可控虚拟试穿方案,其preprocess/humanparsing模块借助人体解析与 DensePose 等预处理能力完成人物区域的精细化定位。DensePose 的"稠密人体姿态估计"(将 RGB 图像中的所有人像像素映射到三维人体表面)恰好为试穿场景提供了可靠的人体表面先验。本指南所讲解的 DensePose 项目位于 detectron2/projects/DensePose,仓库内包含训练、评估与可视化所需的全部代码。

一、快速理解:DensePose 在本项目中的角色

DensePose 的目标是把一张 RGB 图像中所有属于人体的像素,映射到三维人体表面的稠密对应关系上。在 Detectron2 框架中,这一任务以DensePose-RCNN的形式实现——它是在 Faster R-CNN 的检测与分割头部基础上,额外增加一个ROI_DENSEPOSE_HEAD头部,用来对每个人体候选框内的像素回归出 UV 坐标(即三维人体表面参数化坐标)。

从项目源码看,DensePose 被实现为一个独立的 Detectron2 子项目,入口在 densepose/init.py,核心配置通过 densepose/config.py 中的add_densepose_config注入 Detectron2 的CfgNode。该函数定义了MODEL.DENSEPOSE_ONMODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES = 24(24 个身体表面块)、HEATMAP_SIZE = 112NUM_COARSE_SEGM_CHANNELS = 2等关键默认参数,这些参数会在后续训练与推理配置中反复出现。

整个 DensePose 子项目的顶层结构如下:

projects/DensePose/ ├── apply_net.py # 推理 + 结果可视化 / 结果 dump ├── train_net.py # 训练与评估入口 ├── query_db.py # 数据集条目查看 / 可视化 ├── configs/ # 各类模型的 YAML 配置 ├── densepose/ # 模型、数据、可视化等核心实现 ├── doc/ # 文档(GETTING_STARTED / MODEL_ZOO / TOOL_*) └── tests/ # 测试用例

二、用预训练模型做推理与可视化

2.1 选择模型与配置文件

推理的第一步是从 Model Zoo 中挑选一个模型及其配套配置文件。Model Zoo 中记录了模型家族、学习率调度(s1x)、训练/推理耗时、显存占用以及 box AP 与 DensePose AP 等基线指标,例如:

  • Legacy 基线(沿用 Güler et al., 2018 的训练调度),如R_50_FPN_s1x_legacy
  • 改进基线,原始全卷积 Head(采用改进调度与 Panoptic FPN Head),如 densepose_rcnn_R_50_FPN_s1x.yaml;
  • 改进基线,DeepLabV3 Head(额外引入 DeepLabV3 头),如R_50_FPN_DL_s1x
  • 带置信度估计的基线(WC1 / WC2 变体),如R_50_FPN_WC1_s1x

其中,densepose_rcnn_R_50_FPN_s1x.yaml 是一个很好的起点:它继承自 Base-DensePose-RCNN-FPN.yaml,采用 ResNet-50 FPN 骨干,MAX_ITER为 130000,学习率在 100000 / 120000 迭代处衰减(STEPS: (100000, 120000)),并指定了 ImageNet 预训练权重作为初始化。

2.2 运行 Apply Net 进行可视化

拿到配置与权重后,使用 apply_net.py 即可对图片执行推理并输出可视化结果。例如使用轮廓(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

注意:以上命令中的configs/...densepose_rcnn_R_50_FPN_s1x.pkl等路径均相对于 DensePose 项目目录(preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/)而言,实际执行时需先进入该目录,并确保detectron2densepose已装入 Python 路径。

从源码看,apply_net.py 的ShowAction内部维护了一张可视化器注册表VISUALIZERS,支持的可视化类型与含义如下:

可视化标识含义对应实现类
bbox检测到的人体边界框ScoredBoundingBoxVisualizer
dp_segm检测到的人体分割掩码DensePoseResultsFineSegmentationVisualizer
dp_u按 U 坐标着色的身体部位DensePoseResultsUVisualizer
dp_v按 V 坐标着色的身体部位DensePoseResultsVVisualizer
dp_contour以 U/V 坐标着色绘制的轮廓图DensePoseResultsContourVisualizer

show模式的可选参数包括:

  • --min_score <score>:仅显示得分不低于该值的检测结果(源码默认0.8);
  • --nms_thresh <threshold>:按给定阈值对检测框追加非极大值抑制;
  • --output <image_file>:输出文件名模板(默认outputres.png),多张图时工具会自动追加 1 起始的序号,例如outputres.0001.png

在 apply_net.py 的ShowAction.setup_config中可以看到,--min_score--nms_thresh会被翻译为MODEL.ROI_HEADS.SCORE_THRESH_TESTMODEL.ROI_HEADS.NMS_THRESH_TEST两个配置键写入推理配置,从而实现检测后处理控制。

2.3 从源码看推理调用链

apply_net.py 的基类InferenceAction清晰呈现了推理管线:

  1. get_cfg()创建空配置,调用add_densepose_config(cfg)注入 DensePose 专属配置键;
  2. cfg.merge_from_file(config_fpath)合并模型 YAML,cfg.MODEL.WEIGHTS = model_fpath指定权重;
  3. 通过DefaultPredictor(cfg)构建预测器;
  4. _get_input_file_list(input_spec)自动识别输入是目录、单文件还是 glob 通配符模式;
  5. 逐张图片执行predictor(img)["instances"]得到检测实例(scorespred_boxespred_densepose)。

输入既可以是单张图片,也可以是文件夹,还可以是通配符模式(如"image*.jpg"),由_get_input_file_list内部实现(apply_net.py)。

三、训练:数据准备与端到端训练

3.1 数据集目录结构

训练前需要先准备 DensePose 标注数据集,并在运行训练脚本的目录下整理为如下结构:

datasets/coco/ annotations/ densepose_{train,minival,valminusminival}2014.json densepose_minival2014_100.json # (可选,仅用于测试,包含 100 张快速验证样本) {train,val}2014/ # 与对应 json 中提及的图片文件

需要说明的是:这里展示的是 DensePose 项目文档所要求的原始 COCO 数据布局。在 OOTDiffusion 仓库的实际上下文中,该目录是作为preprocess/humanparsing的第三方依赖(detectron2 全家桶)随源码一起分发的,训练数据需用户自行按上述结构放置。

3.2 用 train_net.py 启动训练

训练统一使用 train_net.py,Model Zoo 中的全部 DensePose 模型均由此脚本产出。以 8 卡 GPU、ResNet-50 FPN 骨干、s1x 调度启动端到端 DensePose-RCNN 训练:

python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml --num-gpus 8

配置文件默认按 8 卡训练设计(SOLVER.IMS_PER_BATCH: 16,即每卡 2 张图)。若只有 1 张 GPU,可按照线性学习率缩放规则(Linear Scaling Rule)调整批大小与学习率:

python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025

即把IMS_PER_BATCH从 16 降到 2(对应单卡),BASE_LR从 0.01 按比例缩放到 0.0025。这是避免单卡训练发散的关键操作。

3.3 训练配置的关键键位

结合 Base-DensePose-RCNN-FPN.yaml 与 densepose/config.py,几个核心配置项的作用如下:

配置键默认/示例值含义
MODEL.DENSEPOSE_ONTrue是否启用 DensePose 任务头
MODEL.ROI_HEADS.NAMEDensePoseROIHeads使用 DensePose 专属 ROI Heads
MODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES24人体表面划分为 24 个补丁
MODEL.ROI_DENSEPOSE_HEAD.HEATMAP_SIZE112UV 坐标回归热图分辨率
MODEL.ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS2粗分割输出通道数(15 或 2)
MODEL.ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD0.7正样本 IoU 阈值
DATASETS.TRAIN("densepose_coco_2014_train", "densepose_coco_2014_valminusminival")训练数据集
DATASETS.TEST("densepose_coco_2014_minival",)测试数据集
SOLVER.IMS_PER_BATCH/SOLVER.BASE_LR16/0.01总批大小与基础学习率(8 卡设定)

训练脚本本身是一个标准 Detectron2DefaultTrainer子类:Trainer.build_train_loader使用 DensePose 专用的DatasetMapper(cfg, True)构造训练数据;Trainer.build_evaluator会同时挂载COCOEvaluatorDensePoseCOCOEvaluator(当MODEL.DENSEPOSE_ON为真时),因此训练过程中即可输出 box 与 DensePose 双份指标(train_net.py)。

四、评估:单卡权重评测与指标输出

模型测试与训练共用同一个train_net.py,只需追加--eval-only标志,并通过命令行MODEL.WEIGHTS model.pth指定待评测权重:

python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ --eval-only MODEL.WEIGHTS model.pth

从 train_net.py 的实现可以看出,--eval-only分支会先构建模型,再通过DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load(cfg.MODEL.WEIGHTS, ...)加载权重,随后执行Trainer.test(cfg, model);若配置中启用了TEST.AUG.ENABLED,还会自动追加一次带测试时增强(TTA)的评估,并输出_TTA后缀的指标。

评估输出位于OUTPUT_DIR/inference目录下,包含 COCO 风格指标(box AP)与 DensePose 专属指标(dp. AP GPS / GPSm)。对照 Model Zoo 中的基线数字,即可快速判断复现质量。

五、配套工具:query_db 与 apply_net 的完整用法

5.1 apply_net:推理结果的 dump 与 show

除了前面用到的show可视化模式,apply_net.py 还提供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

dump 结果的结构:pickle 文件内是一个按图片排列的列表,每张图片对应一个字典,包含file_namescores(检测得分)、pred_boxes_XYXY(XYXY 格式的边界框)与pred_densepose(DensePose 编码结果对象)。典型结构如下:

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', ...}]

解析 dump 结果:加载 pickle 时需保证densepose包在 Python 路径中(可sys.path.append到 DensePose 目录)。以第一张图第一个实例为例:

img_id, instance_id = 0, 0 # 查看第一张图、第一个检测实例 bbox_xyxy = data[img_id]['pred_boxes_XYXY'][instance_id] result_encoded = data[img_id]['pred_densepose'].results[instance_id] iuv_arr = DensePoseResult.decode_png_data(*result_encoded)
  • bbox_xyxy是边界框的(x0, y0, x1, y1)
  • iuv_arr的形状为[3, H, W](H、W 为边界框尺寸),三个通道含义为:
    • iuv_arr[0,:,:]:像素所属的表面补丁索引,指示该点位于 24 个身体表面补丁中的哪一个;
    • iuv_arr[1,:,:]:像素的 U 坐标值;
    • iuv_arr[2,:,:]:像素的 V 坐标值。

该解码逻辑由 densepose/data/structures.py 中的DensePoseResult.decode_png_data实现,负责将编码后的 PNG 数据还原为 IUV 三通道数组,是打通"模型输出 → UV 先验"链路的关键 API。

show 模式的完整命令形式:

python apply_net.py show [-h] [-v] [--min_score <score>] [--nms_thresh <threshold>] [--output <image_file>] <config> <model> <input> <visualizations>

四个必填参数为<config><model><input><visualizations>(逗号分隔的可视化类型列表)。常用组合示例:

# 边界框 + 分割 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

5.2 query_db:数据集条目的查看与可视化

query_db.py 用于从数据集中挑选并打印或可视化 DensePose 标注数据,是核查数据标注质量的实用工具,同样支持printshow两种模式。

print 模式通用形式:

python query_db.py print [-h] [-v] [--max-entries N] <dataset> <selector>
  • <dataset>:数据集规格说明,如densepose_coco_2014_train
  • <selector>:条目选择器,可以是单个规格,也可以是逗号分隔的多个规格,形如field[:type]=value(精确匹配)或field[:type]=min-max(范围匹配);
  • --max-entries N:限制最多输出条数。

print 模式示例:

# 输出前 10 条 python query_db.py print densepose_coco_2014_train \* --max-entries 10 -v # 按 file_name 精确匹配 python query_db.py print densepose_coco_2014_train file_name=COCO_train2014_000000000036.jpg -v # 按 image_id 范围匹配(显式声明 int 类型) python query_db.py print densepose_coco_2014_train image_id:int=36-156 -v

show 模式通用形式:

python query_db.py show [-h] [-v] [--max-entries N] [--output <image_file>] <dataset> <selector> <visualizations>

与 print 相比多一个<visualizations>必填参数。由 query_db.py 中ShowAction.VISUALIZERS注册表可知,数据集侧支持的可视化类型为:

可视化标识含义
bbox标注人体的边界框
dp_i按所属身体部位着色的标注点
dp_pts绿色标注点
dp_segm标注人体的分割掩码
dp_u按 U 坐标着色的标注点
dp_v按 V 坐标着色的标注点

show 模式示例(以densepose_coco_2014_trainimage_id = 322的图片为例):

# 边界框 + 分割 python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_segm -v # 边界框 + 按部位着色的标注点 python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_i -v # 边界框 + 绿色标注点 python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_pts -v # 边界框 + U 坐标着色 python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_u -v # 边界框 + V 坐标着色 python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_v -v

apply_net show类似,query_db show--output默认值为output.png,多条目输出时同样自动追加序号(output.0001.pngoutput.0002.png…)。从实现上看,query_db.py 会逐条解析数据集的annotations,通过DensePoseDataRelative.validate_annotation校验标注合法性,再用DensePoseDataRelative构造可视化所需数据,底层依赖 Detectron2 的DatasetCatalog加载数据集(setup_dataset)。

六、与 OOTDiffusion 预处理管线的衔接

在 OOTDiffusion 中,preprocess/humanparsing承担着对人体进行精细解析的职责,而 DensePose 提供的稠密 UV 先验与人体表面补丁划分(24 patches)可以为试穿任务中的人物区域建模、衣物贴合与遮挡处理提供几何依据。DensePose 子项目随 detectron2 依赖一并内嵌于 mhp_extension,属于第三方视觉基础能力组件:

  • 若仅需"推理 + 可视化",直接使用 apply_net.py 的show/dump模式即可,无需触碰训练代码;
  • 若需在自有数据上微调或复现基线,则按第三节准备datasets/coco目录并运行 train_net.py;
  • 若需核查标注质量,使用 query_db.py 的print/show模式。

建议将所有命令的执行目录切换到preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/,并保证环境满足 detectron2 的安装要求;同时注意配置文件中数据集的注册名称(如densepose_coco_2014_train)必须与DatasetCatalog中注册的数据集一一对应,否则query_db与训练都会因找不到数据集而报错。

七、常见问题与排查要点

  1. 找不到densepose模块apply_net.py/query_db.py/train_net.py均以from densepose import ...导入,运行前需将projects/DensePose/目录加入PYTHONPATH(或从其所在目录直接执行脚本)。
  2. 单卡训练发散:务必按线性缩放规则同步降低IMS_PER_BATCHBASE_LR,例如 1 卡对应IMS_PER_BATCH 2BASE_LR 0.0025
  3. dump 文件无法解析:加载 pickle 时同样需要 DensePose 包在 Python 路径中,否则DensePoseResult类无法反序列化。
  4. 可视化输出为空:检查--min_score阈值(默认 0.8)是否过高导致检测结果被过滤,可通过MODEL.ROI_HEADS.SCORE_THRESH_TEST相关参数调低阈值。

八、延伸阅读

  • Model Zoo 与基线指标:全部预训练模型、配置与评估指标的完整清单;
  • Apply Net 工具文档:dump/show两种模式的细节与示例;
  • Query DB 工具文档:数据集查看与可视化的细节与示例;
  • DensePose 项目 README:DensePose 背景、快速入口与引用信息;
  • Base-DensePose-RCNN-FPN.yaml: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询