ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MMPose RTMPose Body8-Halpe26 人体姿态估计:26 点全身姿态模型系列解析与训练指南

MMPose RTMPose Body8-Halpe26 人体姿态估计:26 点全身姿态模型系列解析与训练指南 MMPose RTMPose Body8-Halpe26 人体姿态估计26 点全身姿态模型系列解析与训练指南【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文围绕 MMPose 仓库中 RTMPose Body8-Halpe26 模型文档 展开系统介绍 RTMPose 系列在 Halpe2626 关键点人体姿态任务上的完整模型族谱从 RTMPose-t/s/m/l/x 五档规格、256x192 与 384x288 两种输入尺寸到基于 7 大数据集联合训练、OCHuman 附加评估的 Body8 评测体系。读完本文你将掌握如何阅读这些配置、理解 SimCC 编解码与 RTMCCHead 的底层实现并能在本地复现训练、验证与推理流程。一、算法与数据依据RTMPose × RTMDet × HalpeBody8-Halpe26 模型系列并非单一论文产物而是 RTMPose实时多人姿态估计框架、RTMDet实时目标检测骨干与 Halpe 数据集AlphaPose 全身姿态标注三者的有机结合RTMPose论文RTMPose: Real-Time Multi-Person Pose Estimation based on MMPosearXiv 2303.07399基于 MMPose 提出的高性能实时多人姿态估计框架从范式、骨干网络、定位算法、训练策略与部署推理五个方面对多人姿态估计算法进行实证研究重点解决工业场景中模型参数量大、延迟高的问题。RTMDet论文RTMDet: An Empirical Study of Designing Real-Time Object DetectorsarXiv 2212.07784用于构建 CSPNeXt 骨干网络在保持实时推理速度的同时提供高容量特征提取能力。Halpe / AlphaPose论文AlphaPose: Whole-Body Regional Multi-Person Pose Estimation and Tracking in Real-TimeTPAMI 2022Halpe 数据集提供 26 点人体标注17 个 COCO 人体点 头、颈、髋 6 个足部点是本文模型输出关键点定义的数据来源。三者的论文引用信息完整记录在 rtmpose_body8-halpe26.md 头部可据此追溯每一处设计的学术出处。二、Body8 与 Halpe26数据集体系与关键点定义1. 七个训练数据集*标注文档中以*标注的模型表示其训练数据来自以下 7 个公开数据集混合使用训练数据说明以 rtmpose_body8-halpe26.yml 为准数据集说明AI Challenger (AIC)大规模人体关键点挑战赛数据集MS COCO通用目标与人体姿态基准CrowdPose面向拥挤场景的姿态数据集MPII经典人体姿态数据集sub-JHMDBJHMDB 子集含 13 个关键点Halpe26 点全身姿态数据集PoseTrack18视频姿态跟踪数据集2. Body8加入 OCHuman 的评估体系Body8表示在以上 7 个数据集之外额外加入OCHuman遮挡人体姿态数据集用于评估。也就是说模型在 7 个数据集的联合数据上训练在 7 数据集 OCHuman 构成的 Body8 全集上进行验证——这正是文档表格中指标列标注(Body8)的原因。3. Halpe26 关键点定义模型的 26 个输出关键点定义在 configs/base/datasets/halpe26.py 中可归纳为三组17 个 COCO 人体点nose、左右 eye/ear/shoulder/elbow/wrist/hip/knee/ankleid 0-163 个补充身体点head17、neck18、hip196 个足部点左右 big_toe / small_toe / heelid 20-25。该文件同时定义了骨架连接skeleton_info、各关键点的joint_weights如肘/膝为 1.2、腕/踝/足部点为 1.5体现足部点更高权重以及用于 OKS 计算的sigmas列表。左右对称关键点通过swap字段配对供训练时的水平翻转RandomFlip和测试时的 flip test 使用。三、模型系列总览规格、精度与算力下表完整列出 Body8-Halpe26 系列全部 7 个配置数据来自 rtmpose_body8-halpe26.md 与 rtmpose_body8-halpe26.yml配置输入尺寸PCK0.1 (Body8)AUC (Body8)Params(M)FLOPS(G)RTMPose-t256x19291.8966.353.510.37RTMPose-s256x19293.0168.625.700.70RTMPose-m256x19294.7571.9113.931.95RTMPose-l256x19295.3773.1928.114.19RTMPose-m384x28895.1573.5614.064.37RTMPose-l384x28895.5674.3828.249.40RTMPose-x384x28895.7474.8250.0017.29各配置对应的预训练权重下载链接均列于 rtmpose_body8-halpe26.md 表格的 Download 列文件位于 OpenMMLab 官方模型库文件名形如rtmpose-m_simcc-body7_pt-body7-halpe26_700e-256x192-*.pth其中pt-body7表示在 body77 数据集上预训练700e表示 700 epoch 训练。选型建议基于上表数据追求实时性选 256x192 的 t/s 档FLOPS 仅 0.37/0.70G在精度与算力之间平衡选 m/l追求极致精度且硬件充裕选 384x288 的 l/x 档x 档 AUC 达 74.82但 FLOPS 达 17.29G。四、配置深度解析以 RTMPose-t 256x192 为例以 rtmpose-t_8xb1024-700e_body8-halpe26-256x192.py 为例逐块拆解训练配置。1. 基础运行时与优化器_base_ [../../../_base_/default_runtime.py] num_keypoints 26 input_size (192, 256) max_epochs 700 stage2_num_epochs 30 base_lr 4e-3 train_batch_size 1024 val_batch_size 64 train_cfg dict(max_epochsmax_epochs, val_interval10) randomness dict(seed21) optim_wrapper dict( typeOptimWrapper, optimizerdict(typeAdamW, lrbase_lr, weight_decay0.), clip_graddict(max_norm35, norm_type2), paramwise_cfgdict( norm_decay_mult0, bias_decay_mult0, bypass_duplicateTrue))关键点input_size(192, 256)是 (w, h) 顺序优化器使用AdamWt 档 weight_decay0m 档为 0.05并开启梯度裁剪max_norm35bypass_duplicate用于处理联合训练时共享模块的重复参数。学习率采用 线性预热 余弦退火 两段调度param_scheduler [ dict(typeLinearLR, start_factor1.0e-5, by_epochFalse, begin0, end1000), dict(typeCosineAnnealingLR, eta_minbase_lr * 0.05, beginmax_epochs // 2, endmax_epochs, T_maxmax_epochs // 2, by_epochTrue, convert_to_iter_basedTrue), ] auto_scale_lr dict(base_batch_size1024)即前 1000 iter 线性预热之后从第 350 epoch 开始余弦退火至base_lr * 0.05auto_scale_lr会在训练时依据实际 batch size 自动等比缩放学习率基准 batch size 为 1024。2. SimCC 编解码器Codeccodec dict( typeSimCCLabel, input_sizeinput_size, sigma(4.9, 5.66), # 256x192 档384x288 档为 (6., 6.93) simcc_split_ratio2.0, normalizeFalse, use_darkFalse)SimCCSimple Coordinate Classification将关键点定位转化为坐标分类问题把关键点在 x/y 轴上分别编码为一维高斯分布标签而非二维热图。其底层实现在 mmpose/codecs/simcc_label.pysimcc_split_ratio2.0标签长度为输入尺寸 × 2即 256x192 输入对应 x 轴 384、y 轴 512 个分类位sigma(4.9, 5.66)高斯标签的尺度x/y 分离_generate_gaussian中按 3-sigma 规则截断生成标签use_darkFalse解码时不启用 DARK 亚像素精化直接由get_simcc_maximum取分布最大值再除以simcc_split_ratio还原坐标normalizeFalse不对一维标签做归一化。3. 模型结构TopdownPoseEstimator CSPNeXt RTMCCHeadmodel dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( _scope_mmdet, typeCSPNeXt, archP5, expand_ratio0.5, deepen_factor0.167, # t 档缩放系数 widen_factor0.375, out_indices(4, ), channel_attentionTrue, norm_cfgdict(typeSyncBN), act_cfgdict(typeSiLU), init_cfgdict( typePretrained, prefixbackbone., checkpoint.../cspnext-tiny_udp-body7_210e-256x192-*.pth)), headdict( typeRTMCCHead, in_channels384, out_channelsnum_keypoints, input_sizeinput_size, in_featuremap_sizetuple([s // 32 for s in input_size]), simcc_split_ratiocodec[simcc_split_ratio], final_layer_kernel_size7, gau_cfgdict(hidden_dims256, s128, expansion_factor2, dropout_rate0., drop_path0., act_fnSiLU, use_rel_biasFalse, pos_encFalse), lossdict(typeKLDiscretLoss, use_target_weightTrue, beta10., label_softmaxTrue), decodercodec), test_cfgdict(flip_testTrue))骨干网络复用 mmdet 的CSPNeXtRTMDet 骨干通过deepen_factor/widen_factor缩放得到 t/s/m/l/x 五档规格各档均加载在 body77 数据集上预训练的权重作为初始化init_cfg.typePretrained。头部RTMCCHead实现在 mmpose/models/heads/coord_cls_heads/rtmcc_head.py由大卷积核 Conv2dkernel7 MLP 门控注意力单元GAURTMCCBlock 两个线性分类头组成。其forward将 backbone 特征经 final_layer 与 flatten 后送入 GAU再由cls_x/cls_y分别输出 x/y 轴一维分布pred_x、pred_y。损失KLDiscretLossmmpose/models/losses/classification_loss.py带beta10.的温度因子label_softmaxTrue对标签做 softmax 平滑use_target_weightTrue结合关键点权重加权。flip testtest_cfgdict(flip_testTrue)开启水平翻转 TTA——将原图与翻转图的两个预测分布按flip_indices对齐后取平均见 RTMCCHead.predict 中的实现可稳定提升精度。4. 数据增强管线训练与验证管线均基于 Topdown自上而下范式先用检测器裁剪出人体框再在框内估计关键点。训练管线topdown_transforms.py 中的变换包含train_pipeline [ dict(typeLoadImage, backend_argsbackend_args), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomHalfBody), dict(typeRandomBBoxTransform, scale_factor[0.6, 1.4], rotate_factor80), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typePhotometricDistortion), dict(typeAlbumentation, transforms[ dict(typeBlur, p0.1), dict(typeMedianBlur, p0.1), dict(typeCoarseDropout, max_holes1, max_height0.4, max_width0.4, min_holes1, min_height0.2, min_width0.2, p1.0), ]), dict(typeGenerateTarget, encodercodec, use_dataset_keypoint_weightsTrue), dict(typePackPoseInputs) ]涵盖随机翻转、半身增强、框尺度/旋转扰动、仿射变换、光度扰动与 Albumentation 的模糊/随机擦除GenerateTarget使用 SimCC codec 编码目标标签。验证管线仅保留 Load → GetBBoxCenterScale → TopdownAffine → Pack 四步。值得注意的是两阶段训练策略前max_epochs - stage2_num_epochs即 670个 epoch 使用上述含PhotometricDistortion与p1.0擦除的强增强管线最后 30 个 epoch 通过自定义钩子切换到train_pipeline_stage2移除光度扰动、擦除概率降为 0.5使模型在接近真实数据分布的轻微扰动下微调custom_hooks [ dict(typemmdet.PipelineSwitchHook, switch_epochmax_epochs - stage2_num_epochs, switch_pipelinetrain_pipeline_stage2) ]5. 多数据集联合训练与关键点映射这是 Body8 系列配置最精妙的部分。训练数据由 7 个数据集经CombinedDataset合并每个子数据集都带有各自的KeypointConverter映射把来源数据集的标注转换到统一的 26 点体系例如coco_halpe26 [(i, i) for i in range(17)] [(17, 20), (18, 22), (19, 24), (20, 21), (21, 23), (22, 25)]含义COCO 的 0-16 号点直接对应 Halpe26 的 0-16 号点COCO 的 17/18/19左右大脚趾映射到 Halpe26 的 20/22/2420/21/22左右小脚趾映射到 21/23/25。KeypointConverter实现在 mmpose/datasets/transforms/converting.py支持 1-1 直连映射也支持((src1, src2), target)形式的 2-1 插值映射如 MPII 的 hip 点可由两个源点求均值并在映射时同步处理可见性与 flip_indices。联合训练数据装载器与验证装载器如下训练 7 集、验证 8 集train_dataloader dict( batch_sizetrain_batch_size, num_workers10, pin_memoryTrue, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typeCombinedDataset, metainfodict(from_fileconfigs/_base_/datasets/halpe26.py), datasets[dataset_coco, dataset_aic, dataset_crowdpose, dataset_mpii, dataset_jhmdb, dataset_halpe, dataset_posetrack], pipelinetrain_pipeline, test_modeFalse)) val_dataloader dict( batch_sizeval_batch_size, num_workers10, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse, round_upFalse), datasetdict( typeCombinedDataset, metainfodict(from_fileconfigs/_base_/datasets/halpe26.py), datasets[val_coco, val_aic, val_crowdpose, val_mpii, val_jhmdb, val_halpe, val_ochuman, val_posetrack], pipelineval_pipeline, test_modeTrue))验证/测试评估器为 PCK0.1 与 AUC 的组合并依据 AUC 保存最优权重default_hooks dict( checkpointdict(save_bestAUC, rulegreater, max_keep_ckpts1)) test_evaluator [dict(typePCKAccuracy, thr0.1), dict(typeAUC)] val_evaluator test_evaluator6. 各规格档位的差异对比 m 档 384x288 配置 rtmpose-m_8xb512-700e_body8-halpe26-384x288.py可归纳档位间主要差异输入尺寸与 sigma256x192 档 sigma(4.9, 5.66)384x288 档 sigma(6., 6.93)随分辨率等比放大骨干缩放t/s/m/l/x 的deepen_factor/widen_factor依次为 (0.167, 0.375) / (0.33, 0.5) / (0.67, 0.75) / (1.0, 1.0) / (1.33, 1.25)in_channels从 384 递增到 1024批大小与优化器t/s 档 batch 1024、weight_decay0m/l 档 batch 512、weight_decay0.05x 档 batch 256增强强度m 档以上scale_factor[0.5, 1.5]、rotate_factor90比 t 档[0.6,1.4]、80更强EMAm 档以上启用EMAHookExpMomentumEMAmomentum0.0002做指数滑动平均t 档默认注释关闭。五、训练、验证与推理实战1. 环境与数据准备按 docs/zh_cn/installation.md 安装 MMPose 及其依赖mmengine、mmcv、mmdet 等参照 docs/zh_cn/user_guides/prepare_datasets.md 将 COCO、AIC、CrowdPose、MPII、JHMDB、Halpe、PoseTrack18、OCHuman 数据集按配置中data_root data/与各data_prefix指定的目录结构放置。2. 单卡 / 多卡训练# 单卡 python tools/train.py configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb512-700e_body8-halpe26-256x192.py # 多卡8 卡 bash tools/dist_train.sh \ configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb512-700e_body8-halpe26-256x192.py 8也可使用tools/slurm_train.shSlurm 集群提交训练或通过--cfg-options覆盖配置例如调整批大小后依赖auto_scale_lr自动缩放学习率。3. 测试与评估# 单卡 python tools/test.py \ configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb512-700e_body8-halpe26-256x192.py \ /path/to/checkpoint.pth # 多卡 bash tools/dist_test.sh \ configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb512-700e_body8-halpe26-256x192.py \ /path/to/checkpoint.pth 8tools/test.py 支持--out保存评估结果、--dump导出预测、--show/--show-dir可视化、--cfg-options覆盖配置等参数评估将输出 Body8 全部 8 个子集上的 PCK0.1 与 AUC 指标。4. 端到端推理检测 姿态Body8-Halpe26 属于 Topdown 范式需要先用人体检测器裁剪人体框。可使用 demo/topdown_demo_with_mmdet.py 串联 RTMDet 人体检测器与 RTMPose 姿态模型完成端到端推理检测器配置见 demo/mmdetection_cfg/或使用 demo/inferencer_demo.py 基于MMPoseInferencer一行式推理python demo/inferencer_demo.py \ tests/data/coco/000000000785.jpg \ --pose2d configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb512-700e_body8-halpe26-256x192.py \ --pose2d-weights /path/to/checkpoint.pth \ --vis-out-dir vis_results更多部署与边缘设备推理方案TensorRT、ONNX、C 部署可参考 projects/rtmpose/README.md。六、系列延伸阅读RTMPose 系列总览COCO / MPII / CrowdPose / Human-Art 等数据集上的结果对比Halpe26 数据集定义26 点坐标、骨架、权重与 sigma 的完整定义SimCC 编解码实现一维坐标分类标签的生成与解码细节RTMCCHead 实现大卷积核 GAU 双线性分类头的网络结构KeypointConverter 实现多数据集关键点映射与插值机制KLDiscretLoss 实现SimCC 离散 KL 散度损失工具脚本 与 tools/test.py训练与评估入口。结语RTMPose Body8-Halpe26 模型系列是多数据集联合训练 统一关键点体系 实时框架的典型工程范例通过KeypointConverter将 7 个标注体系不同的数据集对齐到 Halpe26 的 26 点体系借助 SimCC 坐标分类范式与 RTMCCHead 门控注意力头部实现高效定位再以两阶段训练、EMA 与 flip test 等策略打磨精度最终在 Body8 评测上取得从 t 档PCK0.1 91.89到 x 档PCK0.1 95.74的完整覆盖。理解这份配置与源码即可将这套方法论迁移到自定义关键点体系或新数据集上快速构建属于你自己的实时姿态估计方案。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表