RTMPose 实时多人姿态估计模型库:COCO 数据集配置与源码深度解析(MMPose) RTMPose 实时多人姿态估计模型库COCO 数据集配置与源码深度解析MMPose【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmposeRTMPose 是 OpenMMLab 基于 MMPose 构建的实时多人姿态估计框架在 COCO 数据集上以 256×192 的输入即可达到 70% 的 AP。本文以模型库文档 configs/body_2d_keypoint/rtmpose/coco/rtmpose_coco.md 为核心完整呈现 COCO val2017 上全部 10 个 RTMPose 模型的评测结果并结合仓库中的真实配置文件与源码逐项解析 SimCC 标签编解码、RTMCCHead 关键点头部、两阶段训练策略、AICCOCO 联合训练等核心细节。读完本文你将能理解 RTMPose 各规格模型的选型依据并能独立复现、训练与评估这些模型。一、RTMPose 与 COCO 模型库概览RTMPoseReal-Time Multi-Person Pose Estimation based on MMPose从范式、骨干网络、定位算法、训练策略与部署推理五个方面对多人姿态估计算法进行系统优化核心目标是弥合公开基准上的高性能与工业应用中模型大、延迟高之间的鸿沟。根据仓库 configs/body_2d_keypoint/rtmpose/README.md 的说明RTMPose-m 在 COCO 上取得 75.8% AP同时可在 Intel i7-11700 CPU 上达到 90 FPS、在 NVIDIA GTX 1660 Ti GPU 上达到 430 FPS。模型的骨干网络采用与检测模型 RTMDet 同源的 CSPNeXt 结构标签侧采用 SimCC 坐标分类方案数据集为 COCOECCV2014。以下评测结果均在COCO val2017上取得前提是使用在 COCO val2017 上人体 AP 为 56.4的检测器提供人体框属于标准的 Top-Down 评测设定。ArchInput SizeAPAP50AP75ARAR50配置文件rtmpose-t256x1920.6820.8830.7590.7360.920训练日志rtmpose-s256x1920.7160.8920.7890.7680.929训练日志rtmpose-m256x1920.7460.8990.8170.7950.935训练日志rtmpose-l256x1920.7580.9060.8260.8060.942训练日志rtmpose-t-aic-coco256x1920.6850.8800.7610.7380.918训练日志rtmpose-s-aic-coco256x1920.7220.8920.7940.7720.929训练日志rtmpose-m-aic-coco256x1920.7580.9030.8260.8060.940训练日志rtmpose-l-aic-coco256x1920.7650.9060.8350.8130.942训练日志rtmpose-m-aic-coco384x2880.7700.9080.8330.8160.943训练日志rtmpose-l-aic-coco384x2880.7730.9070.8350.8190.942训练日志说明上表 ckpt / log 为官方提供的预训练权重与训练日志下载链接完整链接请参见 rtmpose_coco.md 与 rtmpose_coco.yml 元数据。从表中可以读出三条规律一是输入尺寸从 256×192 提升到 384×288 后m/l 规格的 AP 可再提升约 1 个点如 rtmpose-l 从 0.765 升至 0.773二是加入 AIC 数据联合预训练后同规格模型 AP 普遍提升 0.3~1.2 个点三是从 t 到 lAP 呈单调上升趋势而 t/s 与 m/l 之间在训练细节上也有差异详见下文。二、模型架构CSPNeXt RTMCCHead SimCC 解码RTMPose 的模型定义统一为TopdownPoseEstimatortop-down 姿态估计器由数据预处理器、骨干网络与关键点头部三部分组成。以 rtmpose-s_8xb256-420e_coco-256x192.py 为例核心结构如下已省略细节model 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.33, widen_factor0.5, out_indices(4, ), channel_attentionTrue, norm_cfgdict(typeSyncBN), act_cfgdict(typeSiLU), init_cfgdict( typePretrained, prefixbackbone., checkpoint.../cspnext-s_udp-aic-coco_210e-256x192-92f5a029_20230130.pth)), headdict( typeRTMCCHead, in_channels512, out_channels17, input_sizecodec[input_size], in_featuremap_sizetuple([s // 32 for s in codec[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))2.1 CSPNeXt 骨干网络来自 mmdet 作用域骨干网络直接复用 RTMDet 的 CSPNeXt并通过_scope_mmdet声明其注册表作用域。四个规格只改变深度与宽度因子其余结构完全一致规格deepen_factorwiden_factorhead in_channels预训练权重t0.1670.375384cspnext-tiny_udp-aic-cocos0.330.5512cspnext-s_udp-aic-cocom0.670.75768cspnext-m_udp-aic-cocol1.01.01024cspnext-l_udp-aic-cocoarchP5表示使用 P5 层的输出out_indices(4, )仅取第 5 层特征图in_featuremap_sizetuple([s // 32 for s in codec[input_size]])说明骨干网络的下采样倍率为 32——对 256×192 输入特征图尺寸为 8×6。预训练权重均为在 AICCOCO 上以 UDP 方案训练 210 epoch 的 CSPNeXt 权重通过init_cfg中prefixbackbone.完成前缀对齐。2.2 RTMCCHead面向 SimCC 的关键点头部RTMCCHead的完整实现在 mmpose/models/heads/coord_cls_heads/rtmcc_head.py其 docstring 明确指出该头部由大卷积核卷积层 全连接层 Gated Attention UnitGAU组成用于从低分辨率特征图生成一维坐标分类表示final_layer一个 kernel size 为 7 的nn.Conv2d将特征图通道从in_channels映射到out_channels17COCO 人体 17 个关键点采用 padding 保持尺寸不变mlpScaleNorm Linear将展平后的特征向量映射到 GAU 的隐层维度gauGAU 模块实现见 mmpose/models/utils/rtmcc_block.py配置hidden_dims256、s128、expansion_factor2、激活函数SiLU、关闭相对位置偏置与位置编码以W input_size[0] * simcc_split_ratio、H input_size[1] * simcc_split_ratio确定 x/y 两个一维输出的长度即 SimCC 标签长度损失函数为KLDiscretLossKL 散度离散损失beta10.0、label_softmaxTruetest_cfgdict(flip_testTrue)开启水平翻转测试flip test推理时将原图与翻转图的 SimCC 向量融合可进一步提升精度。2.3 SimCCLabel 编解码器坐标分类视角SimCC 将关键点定位转化为一维坐标分类问题其编码器SimCCLabel实现在 mmpose/codecs/simcc_label.py对应的训练配置为codec dict( typeSimCCLabel, input_size(192, 256), sigma(4.9, 5.66), simcc_split_ratio2.0, normalizeFalse, use_darkFalse)关键参数含义与源码一一对应input_size(192, 256)输入图像尺寸宽、高。384×288 的模型配置为(288, 384)此时sigma也相应放大为(6., 6.93)sigma高斯标签的标准差。源码中将其转为数组后按radius sigma * 33σ 原则确定标签生成半径x/y 轴可分别设置以适配 256×192 这类非正方形输入simcc_split_ratio2.0标签长度与输入尺寸的比值。x 方向标签长度Wx w * 2 384y 方向Wy h * 2 512。坐标编码时先keypoints * simcc_split_ratio再取整_map_coordinatessmoothing_typegaussian默认对每个关键点沿 x/y 轴各生成一个高斯分布的一维标签exp(-(x - mu_x)^2 / (2*sigma^2))未标注点keypoints_visible 0.5权重置 0越界的点高斯核完全出界也会把权重置 0normalizeFalse关闭标签归一化_generate_gaussian中的norm_value sigma * sqrt(2*pi)归一化这是 RTMPose 相对原始 SimCC 的取舍use_darkFalse解码时不启用 DARK 亚像素细化。若开启decode方法会调用 mmpose/codecs/utils/refinement.py 的refine_simcc_dark进行亚像素精修解码方向decode()通过get_simcc_maximum从 x/y 一维分布中取最大值位置作为关键点坐标再除以simcc_split_ratio还原到输入图像坐标系。三、训练配置逐项解析420 epoch 的两阶段训练所有 COCO 配置文件都继承 configs/base/default_runtime.py并共享以下训练超参数骨架以 s 为例# runtime max_epochs 420 stage2_num_epochs 30 base_lr 4e-3 train_cfg dict(max_epochsmax_epochs, val_interval10) randomness dict(seed21) # optimizer optim_wrapper dict( typeOptimWrapper, optimizerdict(typeAdamW, lrbase_lr, weight_decay0.), paramwise_cfgdict(norm_decay_mult0, bias_decay_mult0, bypass_duplicateTrue)) # learning rate 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), ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size1024)3.1 优化器与学习率优化器AdamW基础学习率base_lr 4e-3。注意 t/s 规格的weight_decay0.而 m/l 规格为0.05——这是不同规格间少见的超参差异norm_decay_mult0, bias_decay_mult0表示对 BN 层参数与偏置不做权重衰减学习率调度两段式。前 1000 次迭代用LinearLR做热身起始因子 1e-5从第 210 epochmax_epochs // 2开始用CosineAnnealingLR余弦退火至eta_min base_lr * 0.05convert_to_iter_basedTrue表示按迭代为单位换算auto_scale_lr以base_batch_size1024为基准训练时会根据实际 batch size 自动线性缩放学习率。配置文件里 8×256 的 batch 合计 2048意味着实际有效学习率会按 2048/1024 2 倍放大因此更换 batch size 后无需手动调 lr。3.2 数据流水线两阶段增强策略训练流水线train_pipeline与第二阶段流水线train_pipeline_stage2共用同一套 Transform 骨架仅在数据增强的强度上有所区别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(typemmdet.YOLOXHSVRandomAug), 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.), ]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ]GetBBoxCenterScale/TopdownAffine由检测框计算中心与尺度再仿射变换到codec[input_size]是 top-down 方案的标准流程实现见 mmpose/datasets/transforms/topdown_transforms.pyRandomBBoxTransform第一阶段 scale 随机范围[0.6, 1.4]、旋转 ±80°第二阶段收紧为[0.75, 1.25]、旋转 ±60°且shift_factor0RandomHalfBody随机只用半身关键点训练增强遮挡鲁棒性mmdet.YOLOXHSVRandomAug复用 mmdet 的 HSV 颜色增强Albumentation组合 Blur、MedianBlur 与 CoarseDropout随机矩形遮挡。第一阶段 CoarseDropout 概率为 1.0第二阶段降为 0.5——整体上第二阶段采用更温和的增强用于精修阶段。两阶段策略通过custom_hooks中的mmdet.PipelineSwitchHook实现custom_hooks [ dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0002, update_buffersTrue, priority49), dict(typemmdet.PipelineSwitchHook, switch_epochmax_epochs - stage2_num_epochs, # 390 switch_pipelinetrain_pipeline_stage2), ]即在第 390 epoch420 - 30切换为第二阶段弱增强流水线前 390 epoch 使用强增强充分探索最后 30 epoch 弱化增强以便收敛到高精度。此外EMA指数滑动平均s/m/l 模型启用EMAHookExpMomentumEMA动量 0.0002update_buffersTrue优先级 49tiny 模型的配置中该 Hook 被注释掉注释明确说明训练 tiny 模型时关闭 EMAcheckpointsave_bestcoco/AP, rulegreater, max_keep_ckpts1按 COCO AP 保留最优权重且最多保留 1 份。3.3 数据加载与评测train_dataloader dict( batch_size256, num_workers10, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict(typeCocoDataset, data_rootdata/coco/, data_modetopdown, ann_fileannotations/person_keypoints_train2017.json, data_prefixdict(imgtrain2017/), pipelinetrain_pipeline)) val_dataloader dict( batch_size64, num_workers10, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse, round_upFalse), datasetdict(typeCocoDataset, data_rootdata/coco/, data_modetopdown, ann_fileannotations/person_keypoints_val2017.json, data_prefixdict(imgval2017/), test_modeTrue, pipelineval_pipeline)) val_evaluator dict(typeCocoMetric, ann_filedata/coco/annotations/person_keypoints_val2017.json) test_dataloader val_dataloader test_evaluator val_evaluatorbackend_args dict(backendlocal)表示从本地读取数据配置文件中也预留了 Petrel 对象存储的后端示例注释状态。评测用CocoMetric实现见 mmpose/evaluation/metrics/coco_metric.py验证集注释文件为person_keypoints_val2017.json被注释的bbox_file字段表明模型库文档中的评测结果使用了人体 AP 56.4 的检测器预检测结果若要用自有检测框评测可将该字段指向对应的COCO_val2017_detections_AP_H_56_person.json。四、AICCOCO 联合训练变体*-aic-coco系列配置如 rtmpose-s_8xb256-420e_aic-coco-256x192.py在纯 COCO 配置基础上将训练数据替换为COCO 重复 3 次 AIC的联合数据集这正是预训练权重中aic-coco后缀的来源。其数据组织方式值得借鉴dataset_coco dict( typeRepeatDataset, datasetdict(typeCocoDataset, data_rootdata/, data_modetopdown, ann_filecoco/annotations/person_keypoints_train2017.json, data_prefixdict(imgdetection/coco/train2017/), pipeline[]), times3) dataset_aic dict( typeAicDataset, data_rootdata/, data_modetopdown, ann_fileaic/annotations/aic_train.json, data_prefixdict(imgpose/ai_challenge/ai_challenger_keypoint_ train_20170902/keypoint_train_images_20170902/), pipeline[dict(typeKeypointConverter, num_keypoints17, mapping[ (0, 6), (1, 8), (2, 10), (3, 5), (4, 7), (5, 9), (6, 12), (7, 14), (8, 16), (9, 11), (10, 13), (11, 15)])]) train_dataloader dict( batch_size128 * 2, num_workers10, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict(typeCombinedDataset, metainfodict(from_fileconfigs/_base_/datasets/coco.py), datasets[dataset_coco, dataset_aic], pipelinetrain_pipeline, test_modeFalse))要点解析RepeatDataset由于 AIC 样本数远少于 COCO将 COCO 重复 3 次以平衡两数据集的比例KeypointConverterAIC 的关键点定义与 COCO 不同14 点 vs 17 点通过mapping把 AIC 关键点映射到 COCO 索引。从映射关系看(0, 6)表示 AIC 的第 0 个关键点对应 COCO 的第 6 个关键点右肩映射覆盖了肩、肘、腕、髋、膝、踝共 12 对点CombinedDataset将两个数据集统一到 COCO 的metainfo来自 configs/base/datasets/coco.py下混合采样该系列配置的data_rootdata/其目录布局为data/detection/coco/与data/pose/ai_challenge/...384×288 变体的唯一区别是codec改为input_size(288, 384), sigma(6., 6.93)同时batch_size256s 的 256×192 变体为128*2。从评测结果看AICCOCO 联合训练对 t/s 规格提升明显rtmpose-s 从 0.716 升至 0.722rtmpose-l 从 0.758 升至 0.765是官方推荐的训练配方。五、训练、测试与推理实践5.1 训练使用 tools/train.py 训练详见 docs/en/user_guides/train_and_test.md# 单机多卡训练以 8 卡为例 bash tools/dist_train.sh configs/body_2d_keypoint/rtmpose/coco/rtmpose-s_8xb256-420e_coco-256x192.py 8 # 单卡训练 python tools/train.py configs/body_2d_keypoint/rtmpose/coco/rtmpose-s_8xb256-420e_coco-256x192.py # 断点续训 python tools/train.py configs/body_2d_keypoint/rtmpose/coco/rtmpose-s_8xb256-420e_coco-256x192.py --resume # 混合精度训练--amp python tools/train.py configs/body_2d_keypoint/rtmpose/coco/rtmpose-s_8xb256-420e_coco-256x192.py --amp由于配置中声明了auto_scale_lr当实际卡数与 batch 改变时工具会自动换算学习率无需手工调整。5.2 测试使用 tools/test.py 评估python tools/test.py configs/body_2d_keypoint/rtmpose/coco/rtmpose-s_8xb256-420e_coco-256x192.py \ ${CHECKPOINT_FILE} [--out ${RESULT_FILE}]测试输出CocoMetric计算的 AP / AP50 / AP75 / AR 等指标与模型库表格口径一致。5.3 推理与部署快速推理可使用 demo/inferencer_demo.py 对图片、视频做端到端姿态估计底层 API 为 mmpose/apis/inferencers/pose2d_inferencer.py与检测器串联参考 demo/topdown_demo_with_mmdet.py 将 mmdet 人体检测器与 RTMPose 串联检测器配置位于 demo/mmdetection_cfg如rtmdet_m_640-8xb32_coco-person.py跨平台部署RTMPose 提供了 ONNXRuntime、TensorRT、OpenVINO 等部署样例位于 projects/rtmpose/examples含 C 与 Python 示例ncnn 端侧部署脚本可参考 projects/mmpose4aigc 中的安装脚本。六、源码参考与进一步阅读本文涉及的关键实现与配套文档均可直接在仓库中查阅模型库与配置configs/body_2d_keypoint/rtmpose/coco/rtmpose_coco.md、configs/body_2d_keypoint/rtmpose/README.md、configs/body_2d_keypoint/rtmpose/coco/rtmpose_coco.yml头部实现mmpose/models/heads/coord_cls_heads/rtmcc_head.py、mmpose/models/utils/rtmcc_block.py编解码器mmpose/codecs/simcc_label.py、mmpose/codecs/utils/refinement.py损失函数mmpose/models/losses/regression_loss.py含 KLDiscretLoss训练/测试工具tools/train.py、tools/test.py、docs/en/user_guides/train_and_test.md数据与评测mmpose/datasets/transforms/topdown_transforms.py、mmpose/evaluation/metrics/coco_metric.py、configs/base/datasets/coco.py参考文献RTMPosearXiv2023、RTMDetarXiv2022、Microsoft COCOECCV2014的 BibTeX 引用均收录于 rtmpose_coco.md 文首需要引用时可直接取用。若要在自己的项目中复现上述指标请确保 COCO 数据布局与配置文件中的data_root、data_prefix一致并选用人体 AP 为 56.4 的检测器作为评测前提。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考