☰
ViTPose 入门指南:从数据准备、预训练模型推理到分布式训练与性能基准测试
2026/10/15 8:53:09 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ViTPose

The official repo for [NeurIPS'22] "ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation" and [TPAMI'23] "ViTPose++: Vision Transformer for Generic Body Pose Estimation"

项目地址:https://gitcode.com/gh_mirrors/vi/ViTPose
点击查看免费下载

本篇技术指南以 ViTPose 仓库(docs/en/getting_started.md)的入门文档为主线,系统讲解基于 MMPose 框架的 ViTPose 人体姿态估计工作流:如何准备数据集、用预训练模型完成整库评测与图像 Demo 推理、如何配置单卡/多卡/多机/集群训练,以及如何度量推理吞吐。读者学完后,可以独立完成从"下载配置与权重"到"跑通训练与评测"的完整闭环,并理解tools/下各脚本与底层源码的对应关系。

环境准备与安装

入门文档要求先完成环境安装(详见 docs/en/install.md):

  • 系统与依赖:Linux(Windows 非官方支持)、Python 3.6+、PyTorch 1.3+、CUDA 9.2+、GCC 5+,以及mmcv-full、Numpy、cv2、json_tricks、xtcocotools。
  • 可选依赖:mmdet(人体检测 Demo)、mmtrack(姿态跟踪 Demo)、pyrender与smplx(3D 网格 Demo)。

推荐流程:

conda create -n open-mmlab python=3.7 -y conda activate open-mmlab conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=10.2 -c pytorch pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.9.0/index.html git clone git@github.com:open-mmlab/mmpose.git && cd mmpose pip install -r requirements.txt pip install -v -e .

本仓库在 MMPose 基础上扩展了 ViT 系列主干(mmpose/models/backbones/vit.py)与混合专家模型(mmpose/models/backbones/vit_moe.py),并依赖mmcv_custom中的 layer_decay_optimizer_constructor.py 提供 ViT 预训练权重常用的分层学习率衰减策略。

准备数据集

MMPose 覆盖多种任务,不同任务对应不同的数据准备指南:

  • 2D 人体关键点检测
  • 3D 人体关键点检测
  • 3D 人体网格恢复
  • 2D 手部关键点检测
  • 3D 手部关键点检测
  • 2D 面部关键点检测
  • 2D 全身关键点检测
  • 2D 服装关键点检测
  • 2D 动物关键点检测

所有任务的数据集配置模板统一存放在 configs/base/datasets/,如 COCO 的 coco.py。以 COCO 为例,训练/验证/测试共用data_root = 'data/coco',并期望annotations/person_keypoints_train2017.json、train2017/等目录结构就绪。仓库的测试数据(如 tests/data/coco/test_coco.json)可用来快速验证流程,无需下载完整数据集。

用预训练模型进行推理

MMPose 提供两类推理入口:一是对整库(COCO、MPII 等)做指标评测的测试脚本;二是供集成到其他 OpenMMLab 项目使用的高层 API(init_pose_model、inference_top_down_pose_model等,见 mmpose/apis/init.py)。

评测一个数据集

单卡、CPU、单节点多卡、多节点均已支持:

# 单卡测试 python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--fuse-conv-bn] \ [--eval ${EVAL_METRICS}] [--gpu_collect] [--tmpdir ${TMPDIR}] [--cfg-options ${CFG_OPTIONS}] \ [--launcher ${JOB_LAUNCHER}] [--local_rank ${LOCAL_RANK}] # CPU 测试:禁用 GPU 后运行单卡脚本 export CUDA_VISIBLE_DEVICES=-1 python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] \ [--eval ${EVAL_METRICS}] # 多卡测试 ./tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--fuse-conv-bn] \ [--eval ${EVAL_METRIC}] [--gpu_collect] [--tmpdir ${TMPDIR}] [--cfg-options ${CFG_OPTIONS}] \ [--launcher ${JOB_LAUNCHER}] [--local_rank ${LOCAL_RANK}]

CHECKPOINT_FILE既可以是预先下载到本地的.pth权重路径,也可以是权重文件的 URL 链接。

可选参数说明(与 tools/test.py 中parse_args逐项对应):

参数含义
RESULT_FILE输出结果文件名,不指定则不落盘
--fuse-conv-bn融合 conv 与 bn 层,略微提升推理速度
EVAL_METRICS评测指标,取值依赖数据集,如 COCO 用mAP
--gpu_collect通过 GPU 通信收集各卡结果;否则各卡结果先写入TMPDIR再由 rank 0 汇总
TMPDIR多卡结果收集用的临时目录(未指定--gpu_collect时生效)
CFG_OPTIONS以xxx=yyy键值对覆盖配置,如--cfg-options model.backbone.depth=18 model.backbone.with_cp=True
JOB_LAUNCHER分布式启动器:none/pytorch/slurm/mpi,none表示非分布式模式
LOCAL_RANK本地 rank 号,默认 0

从源码看,tools/test.py 的流程为:读取配置 → 合并--cfg-options→ 构建测试数据集与 dataloader →build_posenet构建模型 →load_checkpoint加载权重 → 可选fuse_conv_bn→ 非分布式用single_gpu_test、分布式用multi_gpu_test→ 在 rank 0 上调用dataset.evaluate输出指标。

示例 1:单卡测试 ResNet50-COCO 并评测 mAP(权重已下载到checkpoints/):

./tools/dist_test.sh configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/res50_coco_256x192.py \ checkpoints/SOME_CHECKPOINT.pth 1 \ --eval mAP

示例 2:8 卡测试,直接通过 URL 下载权重:

./tools/dist_test.sh configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/res50_coco_256x192.py \ https://download.openmmlab.com/mmpose/top_down/resnet/res50_coco_256x192-ec54d7f3_20200709.pth 8 \ --eval mAP

示例 3:Slurm 集群上评测:

./tools/slurm_test.sh slurm_partition test_job \ configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/res50_coco_256x192.py \ checkpoints/SOME_CHECKPOINT.pth \ --eval mAP

对应地,tools/dist_test.sh 会调用python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT,端口默认29500;tools/slurm_test.sh 则通过srun按GPUS_PER_NODE、CPUS_PER_TASK等环境变量申请资源后以--launcher="slurm"启动 tools/test.py。

运行 Demo

仓库提供多个 Demo 脚本(demo 目录),以"使用 GT 人体框的 top-down 图像 Demo"为例:

python demo/top_down_img_demo.py \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --img-root ${IMG_ROOT} --json-file ${JSON_FILE} \ --out-img-root ${OUTPUT_DIR} \ [--show --device ${GPU_ID}] \ [--kpt-thr ${KPT_SCORE_THR}]

实际示例(HRNet-w48 + 仓库自带 COCO 测试图):

python demo/top_down_img_demo.py \ configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/hrnet_w48_coco_256x192.py \ https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth \ --img-root tests/data/coco/ --json-file tests/data/coco/test_coco.json \ --out-img-root vis_results

从 demo/top_down_img_demo.py 源码可以看出其内部流程:用xtcocotools.coco.COCO读取 JSON 标注 → 从每张图的标注中提取xywh格式的人体框 → 调用inference_top_down_pose_model逐图推理 → 用vis_pose_result绘制关键点并保存到vis_results/vis_{i}.jpg。--kpt-thr默认 0.3,--radius(关键点半径)默认 4,--thickness(连线粗细)默认 1,也可指定--device=cpu在无 GPU 环境运行。

更多 Demo(含 mmdet 检测器联合、视频、跟踪、3D 等)见 demo 目录 及各自的文档,例如 2D 人体姿态 Demo 文档。

训练模型

MMPose 同时实现分布式训练(MMDistributedDataParallel)与非分布式训练(MMDataParallel),并统一采用分布式模式管理单机与多机场景:假设服务器有 8 张 GPU,则启动 8 个进程、每进程占一张卡。每个进程持有独立的模型、数据加载器与优化器;模型参数仅在开始时同步一次,前向/反向后各 GPU 间对梯度做 allreduce,再由优化器更新参数——因为梯度已 allreduce,所以每个迭代结束后所有进程的模型参数保持一致。

训练设置

所有输出(日志与权重)默认保存到配置文件指定的work_dir;也可以命令行覆盖:--work-dir ${YOUR_WORK_DIR}。从 tools/train.py 可见work_dir的优先级为:命令行 > 配置中的work_dir> 配置文件名推导出的./work_dirs/<config_name>。

默认每个 epoch 结束后在验证集上评测一次,可通过修改配置中的evaluation调整间隔:

evaluation = dict(interval=5) # 每 5 个 epoch 评测一次

以 configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/ViTPose_base_coco_256x192.py 为例,COCO 上训练 210 个 epoch,每 10 个 epoch 评测一次并保存最优 AP:

evaluation = dict(interval=10, metric='mAP', save_best='AP') optimizer = dict(type='AdamW', lr=5e-4, betas=(0.9, 0.999), weight_decay=0.1, constructor='LayerDecayOptimizerConstructor', paramwise_cfg=dict(num_layers=12, layer_decay_rate=0.75, ...)) lr_config = dict(policy='step', warmup='linear', warmup_iters=500, warmup_ratio=0.001, step=[170, 200]) total_epochs = 210

其中LayerDecayOptimizerConstructor(实现在 mmcv_custom/layer_decay_optimizer_constructor.py)按 0.75 的层间衰减率对 ViT 各层设置不同学习率,并对bias、pos_embed、norm等参数关闭权重衰减——这是 ViT 主干训练的关键配置,ResNet 类配置(如 res50_coco_256x192.py)则使用普通Adam优化器。

线性缩放规则(Linear Scaling Rule):根据该规则,若改变 GPU 数或每卡样本数,学习率应与 batch size 成正比调整。例如 4 卡 × 2 视频/卡时lr=0.01,16 卡 × 4 视频/卡时lr=0.08。也可以直接加--autoscale-lr让脚本自动缩放——tools/train.py 中实现为lr = lr * len(gpu_ids) / 8。

单 GPU 训练

python tools/train.py ${CONFIG_FILE} [optional arguments]

需要指定工作目录时追加--work-dir ${YOUR_WORK_DIR}。

CPU 训练

流程与单卡训练一致,只需先禁用 GPU:

export CUDA_VISIBLE_DEVICES=-1

然后运行上面的单卡脚本。注意:官方不建议用 CPU 训练(速度过慢),此功能仅为方便在无 GPU 机器上调试。

多 GPU 训练

./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]

可选参数(对应 tools/train.py 的参数解析):

参数含义
--work-dir ${WORK_DIR}覆盖配置中的工作目录
--resume-from ${CHECKPOINT_FILE}从断点继续训练
--no-validate训练期间不做验证评测
--gpus ${GPU_NUM}使用的 GPU 数(仅非分布式训练;源码中已标记 deprecated,建议用--gpu-id)
--gpu-ids ${GPU_IDS}使用的 GPU ID 列表(仅非分布式训练,同样标记 deprecated)
--seed ${SEED}设置 python/numpy/pytorch 随机种子
--deterministic为 CUDNN 后端设置确定性选项
--cfg-options CFG_OPTIONS以xxx=yyy覆盖配置
--launcher ${JOB_LAUNCHER}none/pytorch/slurm/mpi
--autoscale-lr按线性缩放规则自动调整学习率
LOCAL_RANK本地 rank,默认 0

resume-from与load-from的区别:

  • resume-from:同时加载模型权重与优化器状态,并继承 checkpoint 中的 epoch,用于中断后恢复训练;
  • load-from:只加载模型权重,训练从 epoch 0 开始,用于微调(finetune)。

示例:8 卡训练 ResNet50 并从断点恢复:

./tools/dist_train.sh configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/res50_coco_256x192.py 8 --resume_from work_dirs/res50_coco_256x192/latest.pth

dist_train.sh 的实现与dist_test.sh相同:python -m torch.distributed.launch --nproc_per_node=$GPUS --master_port=$PORT tools/train.py $CONFIG --launcher pytorch,端口默认29500。

多机(集群)训练

如果集群由 Slurm 管理,可直接使用 slurm_train.sh(同样支持单机):

./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR}

示例:在Test分区用 16 卡训练 ResNet50(GPUS_PER_NODE=8指定单节点 8 卡,CPUS_PER_TASK=2指定每任务 2 个 CPU):

GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh Test res50 configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/res50_coco_256x192.py work_dirs/res50_coco_256x192

slurm_train.sh支持的环境变量与完整参数可查看 tools/slurm_train.sh:它通过srun -p ${PARTITION} --gres=gpu:${GPUS_PER_NODE} --ntasks=${GPUS} --ntasks-per-node=${GPUS_PER_NODE} --cpus-per-task=${CPUS_PER_TASK} --kill-on-bad-exit=1申请资源,再以--launcher="slurm"启动 tools/train.py。

若只有多台以太网互联的机器(无 InfiniBand 等高带宽网络),可参考 PyTorch 的torch.distributed.launch工具手动启动,但通常速度较慢。

单机启动多个训练任务

在单机上同时启动多个任务(如 8 卡机器上跑 2 个 4 卡任务)时,需要为每个任务指定不同的通信端口(默认 29500)以避免冲突。

使用dist_train.sh时,在命令中通过环境变量设置端口:

CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4

使用 Slurm 启动时,则需修改配置文件(通常是第 4 行左右)中的dist_params指定不同端口:

# config1.py dist_params = dict(backend='nccl', port=29500)
# config2.py dist_params = dict(backend='nccl', port=29501)

然后分别启动:

CUDA_VISIBLE_DEVICES=0,1,2,3 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} 4 CUDA_VISIBLE_DEVICES=4,5,6,7 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} 4

dist_params的默认值(backend='nccl')在 configs/base/default_runtime.py 中定义;该基类配置还包含checkpoint_config = dict(interval=10)(每 10 个 epoch 存一次权重)、log_config(日志钩子)、workflow = [('train', 1)]等运行时设置。

基准测试(Benchmark)

可用以下脚本获得平均推理速度(注意:不包含IO 时间与预处理时间):

python tools/analysis/benchmark_inference.py ${MMPOSE_CONFIG_FILE}

参考 tools/analysis/benchmark_inference.py 的实现:脚本构建验证集 dataloader(samples_per_gpu=1)与模型后,先跳过前 5 个迭代(num_warmup = 5)做预热,再对后续迭代用torch.cuda.synchronize()+time.perf_counter()精确计时纯前向耗时,最终输出Overall average: {its:.2f} items / s与总耗时。该脚本还支持--fuse-conv-bn与--log-interval参数。

进阶教程

入门文档进一步指向仓库中的系列教程,覆盖从配置到定制的完整进阶路径:

  • 学习配置文件
  • 微调模型
  • 添加新数据集
  • 自定义数据流水线
  • 添加新模块
  • 导出模型为 ONNX
  • 自定义运行时设置

例如,若要为 ViTPose 训练自定义数据集,可参照 2_new_dataset.md 组织 COCO 格式标注,并在配置中替换data.train/val/test的ann_file与img_prefix;若需调整训练超参,0_config.md 详细解释了optimizer、lr_config、total_epochs等字段与_base_继承机制。结合本仓库中 ViTPose 系列配置(如 ViTPose_small_coco_256x192.py、ViTPose_large_coco_256x192.py 以及多数据集联合训练的 ViTPose++ 配置 vitPose+_base_coco+aic+mpii+ap10k+apt36k+wholebody_256x192_udp.py),即可把通用工作流落到 ViT/ViTMoE 主干的实战训练上。

  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ViTPose

The official repo for [NeurIPS'22] "ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation" and [TPAMI'23] "ViTPose++: Vision Transformer for Generic Body Pose Estimation"

项目地址:https://gitcode.com/gh_mirrors/vi/ViTPose
点击查看免费下载

相关推荐

上一篇:Minimal Mistakes 主题 Portfolio 归档页实战:从 `layout: collection` 到作品集页面的完整搭建指南
下一篇:IDEA Claude Code GUI 自定义模型被强制改写为 claude-opus-5 的根因与修复实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询