尧图精选

MM-Pose 全身关键点估计实战:基于 ResNet 的 Top-Down 热图方法在 COCO-WholeBody 上的配置与基准

🕒 发布时间:2026/9/17 21:34:42 📁 来源:尧图网络
MM-Pose 全身关键点估计实战基于 ResNet 的 Top-Down 热图方法在 COCO-WholeBody 上的配置与基准【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本指南聚焦 OpenMMLab 姿态估计工具库 MM-Pose 中configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/目录下的 ResNet 系列全身关键点估计模型从 Simple BaselineSimpleBaseline2DECCV 2018算法原理与 COCO-WholeBodyECCV 2020数据集出发逐项拆解 6 份完整配置文件结合源码解释 MSRA 热图编解码、133 关键点定义与评测指标并给出训练、测试与推理的完整命令。读完本文你将能够独立配置、训练、评估并部署基于 ResNet 的全身人体脚部面部双手2D 关键点估计模型。背景SimpleBaseline2D 算法与 COCO-WholeBody 数据集本文涉及的模型对应两条核心引用算法——SimpleBaseline2D出自论文Simple Baselines for Human Pose Estimation and TrackingXiao et al., ECCV 2018其核心思想是简单基线直接用 ResNet 提取特征再接少量反卷积层恢复分辨率并生成关键点热图即本文所说的 top-down 热图范式。数据集——COCO-WholeBody出自论文Whole-Body Human Pose Estimation in the WildJin et al., ECCV 2020在 COCO 人体关键点17 点基础上扩展出 133 个关键点的全身标注。在 resnet_coco-wholebody.md 中这两篇论文以 bibtex 形式记录便于复现引用inproceedings{xiao2018simple, title{Simple baselines for human pose estimation and tracking}, author{Xiao, Bin and Wu, Haiping and Wei, Yichen}, booktitle{Proceedings of the European conference on computer vision (ECCV)}, pages{466--481}, year{2018} }inproceedings{jin2020whole, title{Whole-Body Human Pose Estimation in the Wild}, author{Jin, Sheng and Xu, Lumin and Xu, Jin and Wang, Can and Liu, Wentao and Qian, Chen and Ouyang, Wanli and Luo, Ping}, booktitle{Proceedings of the European Conference on Computer Vision (ECCV)}, year{2020} }什么是全身Whole-Body关键点与仅含 17 个身体关键点的 COCO 人体数据集不同COCO-WholeBody 将标注扩展为133 个关键点按部位划分如下定义见 configs/base/datasets/coco_wholebody.py 中的dataset_info身体Body17 点id 0~16即 COCO 原始 17 个身体关键点nose、左右眼、左右耳、肩/肘/腕、髋/膝/踝等脚部Foot6 点id 17~22左右各 3 点大脚趾、小脚趾、脚跟用于支撑下肢动作分析面部Face68 点id 23~90以face-0至face-67命名轮廓、眉、眼、鼻、嘴等部位均有覆盖左手 21 点 右手 21 点id 91~132每只手 21 点从left_hand_root/right_hand_root起始各含拇指、食指、中指、无名指、小指每指 4 点。对应地dataset_info中为 133 个关键点配置了joint_weights[1.] * 133全 1 的权重向量以及 133 个用于 OKS 评估的sigmas值。同时skeleton_info定义了 65 条骨架连接骨骼连线覆盖身体躯干、面部轮廓与每根手指的关节点链用于可视化与结构化理解。正是这 133 点标注使得单个模型能够同时输出身体、脚、脸、手的 2D 位置这是全身姿态估计的核心价值所在。模型配置总览与基准结果resnet_coco-wholebody.md给出了 6 个 ResNet 系列模型的完整基准。评测设置说明如下Results on COCO-WholeBody v1.0 val with detector having human AP of 56.4 on COCO val2017 dataset即所有指标均基于同一个检测器人体 AP 为 56.4即配置文件中的COCO_val2017_detections_AP_H_56_person.json预测框文件在 COCO-WholeBody v1.0 验证集上的结果。指标按部位拆分统计Body、Foot、Face、Hand以及综合的 Whole AP/AR。下表完整继承自原文档ArchInput SizeBody APBody ARFoot APFoot ARFace APFace ARHand APHand ARWhole APWhole ARckptlogpose_resnet_50256x1920.6520.7380.6150.7490.6060.7150.4600.5840.5210.633ckptlogpose_resnet_50384x2880.6660.7470.6340.7630.7310.8110.5360.6460.5740.670ckptlogpose_resnet_101256x1920.6690.7530.6370.7660.6110.7220.4630.5890.5310.645ckptlogpose_resnet_101384x2880.6920.7700.6800.7990.7460.8200.5480.6570.5970.693ckptlogpose_resnet_152256x1920.6820.7640.6610.7870.6230.7280.4810.6070.5480.661ckptlogpose_resnet_152384x2880.7040.7800.6930.8130.7510.8240.5590.6660.6100.705ckptlog以上每个模型的权重ckpt与训练日志log的元数据同样记录在 resnet_coco-wholebody.yml 中该文件为模型索引格式Models:→Config/Weights/Results可直接被model-index.yml与文档工具链解析。基准结果解读要点从表中可以观察到几个与分辨率和模型容量直接相关的规律均为表格数据直接呈现的事实分辨率对小手/面部部位影响显著同一模型从 256x192 提升到 384x288 时Face AP 提升幅度明显大于 Body AP。例如 ResNet-50 的 Face AP 从 0.606 提升到 0.7310.125而 Body AP 仅从 0.652 到 0.6660.014。原因可从 MSRAHeatmap 编解码 理解——关键点以高斯热图表示面部与手部关键点尺寸小低分辨率下容易在热图中被淹没。Hand AP 始终是各部位中最难的指标即使 ResNet-152 384x288Hand AP 也只有 0.559。这与手部关键点密集、自遮挡严重相关是全身估计任务公认的难点。模型容量增益稳定在相同输入分辨率下从 ResNet-50 到 ResNet-152Whole AP 与 AR 单调提升256x192 下 Whole AP 0.521→0.548384x288 下 0.574→0.610。配置文件逐项拆解这 6 个配置文件结构高度一致仅在depth50/101/152、input_size/heatmap_size/sigma256x192 或 384x288与batch_size64 或 32上不同。下面以 td-hm_res50_8xb64-210e_coco-wholebody-256x192.py 为完整示例逐段解读。Runtime 与优化器配置_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs210, val_interval10) # optimizer optim_wrapper dict(optimizerdict( typeAdam, lr5e-4, ))_base_继承 configs/base/default_runtime.py后者提供日志、随机种子、环境等默认运行时设置max_epochs210训练 210 个 epochval_interval10每 10 个 epoch 在验证集上评估一次优化器使用Adam学习率 5e-4。所有 6 个配置共用这套优化器设置。学习率调度与自动缩放param_scheduler [ dict( typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict( typeMultiStepLR, begin0, end210, milestones[170, 200], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size512)Warm-up前 500 次迭代by_epochFalse表示按迭代步数计算用LinearLR从初始学习率的 0.001 倍线性预热到完整学习率帮助训练初期稳定阶梯式衰减在第 170、200 epoch 处将学习率乘以gamma0.1即 5e-4 → 5e-5 → 5e-6auto_scale_lr声明基准 batch size为 512。ResNet-50 的 batch_size64 × 8 卡 512正好等于基准而 ResNet-101/152 的 batch_size32 × 8 卡 256训练时 MM-Pose 会依据该基准自动按比例缩放学习率保证不同显存/卡数下的等效训练。CodecMSRA 热图编解码# codec settings codec dict( typeMSRAHeatmap, input_size(192, 256), heatmap_size(48, 64), sigma2)codec 是 MM-Pose 1.x 的核心抽象负责关键点坐标 ⇄ 热图标签的双向转换。MSRAHeatmap的实现位于 mmpose/codecs/msra_heatmap.py其设计思想直接来自 SimpleBaseline2D 论文。三个参数的含义input_size(192, 256)网络输入图像尺寸格式为 (w, h)即 192x256384x288 配置下为 288x384heatmap_size(48, 64)输出热图分辨率 (W, H)。256x192 输入对应 48x64 热图1/4 下采样384x288 输入对应 72x96 热图sigma2高斯热图的标准差像素。384x288 配置下sigma提升为 3因为更大的输入分辨率需要更大的高斯核来保持相对尺度一致。编码阶段生成形状为 (K, H, W) 的高斯热图K133与形状为 (N, K) 的keypoint_weights解码阶段则通过 post_processing 中的 get_heatmap_maximum 从热图取最大值位置得到关键点坐标。该 codec 还支持unbiasedDarkPose 无偏编码等扩展参数本组 ResNet 配置未启用。模型定义TopdownPoseEstimator ResNet HeatmapHeadmodel dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeResNet, depth50, init_cfgdict(typePretrained, checkpointtorchvision://resnet50), ), headdict( typeHeatmapHead, in_channels2048, out_channels133, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))TopdownPoseEstimatortop-down 范式的人体姿态估计器先在人体框内裁剪再单实例估计定义于 mmpose/models/pose_estimatorsPoseDataPreprocessor图像归一化预处理使用 ImageNet 统计的 mean/std并做bgr_to_rgb通道转换backboneResNetdepth分别取 50/101/152init_cfg使用 torchvision 预训练权重初始化torchvision://resnet50等headHeatmapHeadin_channels2048对应 ResNet 最后一个卷积块的输出通道数C4 阶段out_channels133与 COCO-WholeBody 的 133 个关键点一一对应损失为KeypointMSELoss关键点 MSE 损失use_target_weightTrue表示按目标权重加权弱标注/不可见关键点不参与惩罚decodercodec将 codec 挂载到 head推理时由 head 自动调用解码test_cfg开启翻转测试flip_testTrue将原图与水平翻转图各自输出的热图平均flip_modeheatmap并做shift_heatmapTrue的像素偏移修正这是 Simple Baseline 系列提升精度的标准技巧。数据管线Pipeline训练与验证的数据增强管线差异体现了 top-down 姿态估计的标准流程# pipelines train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomHalfBody), dict(typeRandomBBoxTransform), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ] val_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typePackPoseInputs) ]训练阶段的增强组合LoadImage加载图像GetBBoxCenterScale从人体框得到中心点与尺度RandomFlip水平翻转配合dataset_info中的swap字段自动交换左右对称关键点如left_eye⇄right_eye、left_hand_root⇄right_hand_rootRandomHalfBody随机取身体上半部/下半部进行裁剪训练强制模型学会部位间关联同时提升被裁剪区域的分辨率RandomBBoxTransform对检测框做随机平移/缩放扰动模拟检测器误差增强鲁棒性TopdownAffine将裁剪区域仿射变换到input_sizeGenerateTarget调用encodercodec生成高斯热图标签PackPoseInputs打包为模型输入格式。验证阶段只保留必要的仿射变换与打包不做数据增强。这些变换的具体实现在 mmpose/datasets/transforms/topdown_transforms.py 中。数据加载器与评测器dataset_type CocoWholeBodyDataset data_mode topdown data_root data/coco/训练数据加载器关键点ann_fileannotations/coco_wholebody_train_v1.0.jsondata_prefixdict(imgtrain2017/)——COCO-WholeBody 的训练标注直接建立在 COCO train2017 图像之上batch_size64ResNet-50/ 32ResNet-101/152num_workers2persistent_workersTrue验证/测试加载器使用ann_fileannotations/coco_wholebody_val_v1.0.json、data_prefixdict(imgval2017/)并以bbox_file指定预先检测好的人体框文件data/coco/person_detection_results/COCO_val2017_detections_AP_H_56_person.json——这正是文档开头 detector having human AP of 56.4 的出处保证所有模型的评估在完全一致的检测框上进行评测器val_evaluator使用CocoWholeBodyMetric实现在 mmpose/evaluation/metrics/coco_wholebody_metric.py并指定ann_file作为 GT 标注。CocoWholeBodyMetric继承自CocoMetric是全身任务的专用指标类。从源码可见其按部位拆分统计的实现结构body_num 17、foot_num 6、face_num 68、left_hand_num 21、right_hand_num 21共 176682121133 点据此分别计算 Body / Foot / Face / Hand / Whole 的 AP 与 AR输出前缀为coco-wholebody。这解释了基准表中按部位拆分指标的来源。此外该指标支持nms_mode默认oks_nmsOKS 阈值为 0.9、score_mode默认bbox_keypoint用关键点分数重排检测框等参数评估底层使用xtcocotools.cocoeval.COCOeval。模型保存策略由 hook 控制default_hooks dict( checkpointdict(save_bestcoco-wholebody/AP, rulegreater))即始终保存验证集上coco-wholebody/APWhole AP最高的 checkpoint。训练与测试数据准备COCO-WholeBody 的标注文件与 COCO 图像需要按如下目录结构组织data_rootdata/coco/data/coco/ ├── annotations/ │ ├── coco_wholebody_train_v1.0.json │ └── coco_wholebody_val_v1.0.json ├── train2017/ └── val2017/评测还需要预生成的人体检测框文件data/coco/person_detection_results/COCO_val2017_detections_AP_H_56_person.json。数据集整体准备流程可参考 docs/en/user_guides/prepare_datasets.md。单卡/多卡训练以 ResNet-50 256x192 配置为例启动训练python tools/train.py \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_res50_8xb64-210e_coco-wholebody-256x192.py多卡分布式训练使用仓库提供的脚本 tools/dist_train.shbash tools/dist_train.sh \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_res50_8xb64-210e_coco-wholebody-256x192.py \ 8训练 210 epoch验证间隔为 10 epoch并依据auto_scale_lr自动按实际 batch size 缩放学习率。测试与评估使用 tools/test.py 加载预训练权重在验证集上复现基准python tools/test.py \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_res50_8xb64-210e_coco-wholebody-256x192.py \ /path/to/res50_coco_wholebody_256x192-9e37ed88_20201004.pth输出会给出 Body / Foot / Face / Hand / Whole 各部位的 AP 与 AR。各模型权重的元数据含下载地址统一记录在 resnet_coco-wholebody.yml 中。推理演示单图整图推理使用 demo/image_demo.py将整图作为输入框直接推理以 ResNet-50 256x192 模型为例python demo/image_demo.py \ tests/data/coco/000000000785.jpg \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_res50_8xb64-210e_coco-wholebody-256x192.py \ /path/to/res50_coco_wholebody_256x192-9e37ed88_20201004.pth \ --out-file vis_results.jpg在 CPU 上运行只需追加--devicecpu需要可视化热图时追加--draw-heatmap。检测 姿态的级联推理实际场景中通常先用检测器框出人体再做姿态估计。仓库提供 demo/topdown_demo_with_mmdet.py 完成 mmdet mmpose 的级联python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py \ /path/to/person_detector.pth \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_res50_8xb64-210e_coco-wholebody-256x192.py \ /path/to/res50_coco_wholebody_256x192-9e37ed88_20201004.pth \ --input tests/data/coco/000000196141.jpg \ --output-root vis_results/ --show该脚本同样支持视频输入与--save-predictions保存预测结果 JSON。人体检测器配置可参考 demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py 等文件。更完整的全身姿态演示说明见 demo/docs/en/2d_wholebody_pose_demo.md。如何选择模型结合基准表数据与配置文件差异可给出如下选型思路均为表中数据的直接推论追求精度上限选择 ResNet-152 384x288Whole AP 0.610但需注意其训练 batch size 为 32显存占用高平衡精度与速度ResNet-50 256x192Whole AP 0.521是体积与精度最均衡的入门选择其 batch size 为 64吞吐更高对 Face/Hand 精度敏感的任务如表情分析、手语识别优先选择 384x288 分辨率因为高分辨率对 Face/Hand 指标的提升远大于 Body 指标。若对精度有更高要求同目录下还提供了 HRNethrnet_coco-wholebody.md、带 Dark 无偏编解码的变体hrnet_dark_coco-wholebody.md以及轻量级 ViPNAS 系列vipnas_coco-wholebody.md可据此横向比较。小结本文以 resnet_coco-wholebody.md 为骨架完整还原了 6 个 ResNet 系列全身关键点模型的基准数据并从配置源码层面逐项拆解了 runtime、学习率调度、MSRA 热图 codec、模型结构、数据管线与评测指标。这些配置configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/是 MM-Pose 中 top-down 热图方法在全身任务上的标准实现理解它们即可举一反三地掌握 MM-Pose 1.x 的配置体系为后续替换骨干网络、切换 codec 或扩展到 UBody 等更大规模全身数据集见 ubody2d打下基础。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →