ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MMPose 实战:基于 RTMPose 的 CrowdPose 密集人群姿态估计训练与推理指南

MMPose 实战:基于 RTMPose 的 CrowdPose 密集人群姿态估计训练与推理指南 MMPose 实战基于 RTMPose 的 CrowdPose 密集人群姿态估计训练与推理指南【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmposeCrowdPose 是面向密集人群场景的二维人体姿态估计基准其难点在于目标彼此遮挡、尺度跨度大对模型的定位精度与拥挤鲁棒性提出了更高要求。本文以 MMPose 仓库中 CrowdPose 配置目录 下的 RTMPose-m 模型为核心完整讲解其官方结果、配置文件每一项参数的含义、SimCC 坐标分类编解码原理、两阶段训练策略以及从数据集准备到单卡/多卡训练、测试与评估的完整实操流程。读完本文你将能够复现 256x192 输入下 AP 70.6% 的官方指标并具备将该配置迁移到自定义密集人群数据集的改造能力。一、背景RTMPose 与 CrowdPose1.1 RTMPose面向实时多人的姿态估计框架RTMPose 是 OpenMMLab 团队提出的实时多人姿态估计框架论文收录于 arXiv 2023即RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose。它的设计动机非常明确传统 top-down 姿态估计算法虽然在公开基准上精度优秀但在工业落地中普遍存在模型参数大、延迟高的问题。RTMPose 从**范式paradigm、骨干网络backbone、定位算法localization algorithm、训练策略training strategy和部署推理deployment inference**五个方面系统性研究了影响多人姿态估计性能的因素最终形成了高精度、高帧率的实时方案。在 MMPose 的 RTMPose 总览文档 中可以看到RTMPose 系列覆盖了 COCO、MPII、CrowdPose、Human-Art 等多个数据集并提供了 t/s/m/l 多个规格的模型。其中 CrowdPose 章节正是本文要展开讲解的内容官方记录为RTMPose-m 在 256x192 输入下取得 AP 0.706、AR 0.788。1.2 CrowdPose专为拥挤场景设计的姿态基准CrowdPose 数据集CVPR 2019CrowdPose: Efficient Crowded Scenes Pose Estimation and A New Benchmark由上海交通大学团队发布其核心价值在于关注**拥挤场景crowded scenes**下的姿态估计。与 COCO 中大多数图像只含 1~2 人不同CrowdPose 的图像包含大量相互拥挤、遮挡的人体并按场景拥挤程度将测试样本划分为 Easy / Medium / Hard 三档对应下文指标中的 AP (E) / AP (M) / AP (H)。CrowdPose 采用14 个关键点定义无左右眼/耳/鼻在 数据集基础配置 中有完整定义左右肩、左右肘、左右腕、左右髋、左右膝、左右踝共 12 个四肢点外加top_head头顶与neck颈部。该配置还给出了每个关键点的swap左右对称映射关系用于水平翻转增强时的标签交换、joint_weights关节权重肘腕等末端点权重更高、sigmas高斯标签标准差用于标注关键点真实范围这些元数据会在 SimCC 标签生成与 loss 计算中被消费。二、官方模型与指标解读原文档的核心成果表如下评测配置为 CrowdPose test 集检测器为 YOLOv3 human detectorArchInput SizeAPAP^50AP^75AP (E)AP (M)AP (H)rtmpose-m256x1920.7060.8410.7650.7990.7190.582对该表需要补充三点说明Top-down 评测流程结果是在检测器给出人体框 → 姿态模型对每个框做单人关键点估计的级联流程下获得的。检测器使用 YOLOv3因此该 AP 是包含检测误差的端到端指标。按难度分档AP (E/M/H) 分别对应 Easy / Medium / Hard 场景。RTMPose-m 在 Easy 上达到 79.9%而在 Hard 场景高度拥挤遮挡仍有 58.2%体现了模型在拥挤条件下的定位能力。CrowdPose 专属 IoU评测时使用的不是标准 COCO 关键点相似度OKS而是 CrowdPose 提出的keypoints_crowd匹配机制它会避免与标注为 crowd群体遮挡的真实关键点进行匹配惩罚。这一设定在配置文件的iou_typekeypoints_crowd中显式体现。该模型的权重与训练日志已登记在模型库元数据文件 rtmpose_crowdpose.yml 中其中记录了相同的 5 项指标与权重引用方便训练完成后核对复现结果。三、配置文件逐段深度解析本模型对应的完整训练配置为 rtmpose-m_8xb64-210e_crowdpose-256x192.py。文件名本身即浓缩了关键超参数模型规格 m、8 卡 × batch 64、训练 210 个 epoch、输入 256x192。下面按配置顺序逐段拆解。3.1 运行时与优化器_base_ [../../../_base_/default_runtime.py] max_epochs 210 stage2_num_epochs 30 base_lr 5e-4 train_cfg dict(max_epochsmax_epochs, val_interval10) randomness dict(seed21) optim_wrapper dict( typeOptimWrapper, optimizerdict(typeAdamW, lrbase_lr, weight_decay0.05), paramwise_cfgdict( norm_decay_mult0, bias_decay_mult0, bypass_duplicateTrue))配置继承自 default_runtime.py后者统一提供日志、权重保存、环境变量等基础运行时。AdamW 优化器学习率5e-4权重衰减0.05。norm_decay_mult0表示归一化层参数不参与权重衰减bias_decay_mult0表示偏置不衰减这是对 Transformer 类结构常用的参数化技巧可显著提升训练稳定性。val_interval10表示每 10 个 epoch 验证一次seed21固定随机种子以保证可复现。3.2 学习率调度线性预热 余弦退火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_size512)阶段一前 1000 个 iter线性预热从1e-5的极小学习率逐步上升到base_lr避免训练初期权重剧烈震荡。阶段二epoch 105 → 210余弦退火eta_min衰减到base_lr * 0.05。auto_scale_lr dict(base_batch_size512)启用学习率自动缩放。由于配置按 8 卡 × 64 的 batch即 512调参若你改用不同 batch size 训练MMEngine 会依据该基准 batch 自动按比例调整实际学习率。3.3 SimCC 编解码器codec从热图回归到坐标分类codec dict( typeSimCCLabel, input_size(192, 256), sigma(4.9, 5.66), simcc_split_ratio2.0, normalizeFalse, use_darkFalse)这是 RTMPose 区别于传统 heatmap 方法的关键所在。SimCCSimple Coordinate Classification论文见SimCC: a Simple Coordinate Classification Perspective for Human Pose Estimation将关键点定位从二维热图回归改写为x、y 两个一维向量的坐标分类问题。其实现位于 SimCCLabel 编码器源码input_size(192, 256)注意这里顺序是[w, h]即宽 192、高 256。simcc_split_ratio2.0标签分辨率 输入尺寸 × 该比例。因此 x 方向标签长度Wx 192 * 2 384y 方向Wy 256 * 2 512。编码器源码中的keypoint_x_labels形状即为(N, K, Wx)。sigma(4.9, 5.66)x/y 两个方向各自的高斯核标准差用于生成高斯平滑的 one-hot 标签smoothing_typegaussian为默认值。相比单一 sigma双轴独立标准差能更好匹配 192 与 256 两个方向上的分布差异。normalizeFalse不对标签做归一化use_darkFalse关闭 DARK 亚像素精化后处理。在源码的decode()中若开启use_dark会调用refine_simcc_dark对峰值做泰勒展开精化RTMPose 通过更精细的训练已不再需要这一步。3.4 骨干网络CSPNeXtRTMDet 同源backbonedict( _scope_mmdet, typeCSPNeXt, archP5, expand_ratio0.5, deepen_factor0.67, widen_factor0.75, out_indices(4, ), channel_attentionTrue, norm_cfgdict(typeSyncBN), act_cfgdict(typeSiLU), init_cfgdict( typePretrained, prefixbackbone., checkpointhttps://download.openmmlab.com/mmpose/.../cspnext-m_udp-aic-coco_210e-256x192-....pth))骨干采用CSPNeXtRTMDet 论文《RTMDet: An Empirical Study of Designing Real-Time Object Detectors》提出通过_scope_mmdet从 MMDetection 注册表中加载体现 MMPose 与 MMDet 的无缝复用。archP5deepen_factor0.67widen_factor0.75共同决定了 m 规格的网络深度与通道宽度expand_ratio0.5控制 CSP 结构的扩张比例channel_attentionTrue引入通道注意力模块。out_indices(4, )只输出第 4 层1/32 分辨率特征图配合后续 head。激活函数使用SiLU归一化使用SyncBN。预训练迁移init_cfg指定加载在 AIC COCO 上预训练的 cspnext-m 权重prefixbackbone.保证只取骨干部分的参数。这是 RTMPose 在 CrowdPose 上取得高 AP 的重要先验来源——从大规模通用人体数据迁移到拥挤场景。3.5 检测头RTMCCHeadheaddict( typeRTMCCHead, in_channels768, out_channels14, 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, )RTMCCHeadRTMPose Coordinate Classification Head的实现位于 rtmcc_head.py其结构由三部分组成大卷积核卷积层final_layer使用kernel_size7的卷积将 768 通道特征压缩到out_channels14对应 14 个关键点MLP ScaleNorm将in_featuremap_size(192//32, 256//32)(6, 8)的特征图展平后线性投影到hidden_dims256门控注意力单元GAU, Gated Attention Units128、expansion_factor2这是 RTMPose 的核心创新模块用轻量化的门控自注意力建模关键点间的空间依赖cls_x/cls_y两个线性层分别输出W384、H512的一维分类 logits。值得注意的细节decodercodec将 SimCC 编解码器注入 head使训练时标签编码、推理时坐标解码与 head 共享同一配置对象从源头保证训练-推理一致性。3.6 损失函数离散 KL 散度lossdict( typeKLDiscretLoss, use_target_weightTrue, beta10., label_softmaxTrue)损失使用KLDiscretLoss离散 KL 散度损失源自 SimCC 官方实现源码见 classification_loss.py对预测 logits 做温度缩放log_pt log_softmax(dec_outs * beta)label_softmaxTrue时对高斯标签也做一次softmax(labels * label_beta)默认label_beta10.0使标签分布更平滑use_target_weightTrue表示使用每个关键点的权重加权即 CrowdPose 数据集配置中的joint_weights让肘、腕等对精度更敏感的关节点贡献更大梯度。3.7 数据管线两阶段训练与数据增强训练阶段分为两套 pipeline通过mmdet.PipelineSwitchHook在 epoch 180 处自动切换阶段一epoch 0~179train_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[...Blur/MedianBlur/CoarseDropout...]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs)]阶段二epoch 180~209train_pipeline_stage2 [ ... dict(typeRandomBBoxTransform, shift_factor0., scale_factor[0.75, 1.25], rotate_factor60), ... dict(typeAlbumentation, transforms[...CoarseDropout p0.5...]), ...]两阶段策略fine-tuning 后期收紧增强强度要点RandomHalfBody随机只保留上半身/下半身关键点迫使模型学会利用局部线索推断整体姿态对遮挡严重的拥挤场景尤其有效阶段一增强幅度更大scale 0.6~1.4、旋转 ±80°帮助模型在前期快速探索阶段二收窄到 scale 0.75~1.25、旋转 ±60°且CoarseDropout概率从 1.0 降至 0.5模拟真实遮挡的同时稳定收敛mmdet.YOLOXHSVRandomAug复用 YOLOX 的 HSV 色彩抖动增强光照鲁棒性Albumentation 的 Blur / MedianBlur 提供模糊增强CoarseDropout 随机挖掉大块矩形区域模拟密集人群中的互相遮挡。3.8 数据加载与评测train_dataloader dict( batch_size64, num_workers10, persistent_workersTrue, ...) val_dataloader dict( batch_size32, ..., bbox_filedata/crowdpose/annotations/det_for_crowd_test_0.1_0.5.json, ...) val_evaluator dict( typeCocoMetric, ann_filedata_root crowdpose/annotations/mmpose_crowdpose_test.json, use_areaFalse, iou_typekeypoints_crowd, prefixcrowdpose)训练/验证/测试均使用CrowdPoseDataset标注文件分别为mmpose_crowdpose_trainval.json训练与mmpose_crowdpose_test.json测试图片前缀为pose/CrowdPose/images/验证时必须提供检测框文件det_for_crowd_test_0.1_0.5.json——这是官方发布的 YOLOv3 检测结果用于公平对齐指标评测器为CocoMetric但iou_typekeypoints_crowd、use_areaFalse即使用 CrowdPose 专属的关键点 IoU 匹配规则验证 pipeline 仅包含LoadImage → GetBBoxCenterScale → TopdownAffine → PackPoseInputs不做任何随机增强权重保存钩子save_bestcrowdpose/AP会始终保留验证 AP 最高的 checkpoint。3.9 关键训练钩子custom_hooks [ dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0002, update_buffersTrue, priority49), dict(typemmdet.PipelineSwitchHook, switch_epochmax_epochs - stage2_num_epochs, switch_pipelinetrain_pipeline_stage2)]EMAHook指数移动平均momentum 0.0002维护模型权重的滑动平均推理时使用 EMA 权重通常能稳定提升精度update_buffersTrue同步更新 BN 统计量PipelineSwitchHook在210 - 30 180epoch 时把训练管线切换为阶段二。四、实战从数据集准备到训练评估4.1 数据集准备CrowdPose 官方数据需下载后按如下目录布局组织与配置中的路径一致data/ ├── crowdpose/ │ ├── annotations/ │ │ ├── mmpose_crowdpose_trainval.json │ │ ├── mmpose_crowdpose_test.json │ │ └── det_for_crowd_test_0.1_0.5.json │ └── images/ # 或由 data_prefix 指向 pose/CrowdPose/images/ └── pose/CrowdPose/images/详细的数据准备步骤可参考 数据集准备指南。若使用非本机存储如 petrel S3配置中已预留backend_args dict(backendpetrel, path_mapping...)的注释模板按需启用即可。4.2 训练单卡训练先确保已按 安装指南 完成环境配置python tools/train.py configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py单卡但想模拟原配置 512 batch 时学习率自动缩放机制会自动按base_batch_size512换算无需手工调整。多卡分布式训练bash ./tools/dist_train.sh \ configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py \ 8指定端口与 GPUPORT29666 bash ./tools/dist_train.sh \ configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py \ 8从断点恢复训练python tools/train.py \ configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py \ --resume以上命令均来自 训练与测试官方指南更多参数如--amp混合精度训练、--cfg-options覆盖配置可查阅该文档。4.3 测试与评估使用训练得到的 checkpoint 在 CrowdPose test 集上评测python tools/test.py \ configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py \ ${CHECKPOINT_FILE} [ARGS]其中${CHECKPOINT_FILE}替换为本地权重路径。多卡测试可改用bash ./tools/dist_test.sh \ configs/body_2d_keypoint/rtmpose/crowdpose/rtmpose-m_8xb64-210e_crowdpose-256x192.py \ ${CHECKPOINT_FILE} ${GPU_NUM}由于 test 与 val 共用同一 dataloader 与 evaluator测试过程会自动输出 AP、AP^50、AP^75 以及分档 AP (E/M/H) 全套指标可直接与官方数值0.706 / 0.841 / 0.765 / 0.799 / 0.719 / 0.582对照验证复现效果。4.4 直接推理如需用训练好的模型对单张图片做完整的人体姿态估计可使用仓库提供的 inferencer_demo.py结合人体检测模型实现 top-down 端到端推理检测 姿态估计参考 2D 人体姿态 Demo 文档 获取完整用法。五、要点总结与扩展建议核心要点回顾范式RTMPose 采用 top-down 流程 SimCC 坐标分类将姿态估计转化为一维分类问题配合 RTMCCHead 的 GAU 模块兼顾精度与速度配置精髓210 epoch 两阶段增强切换、AdamWwd0.05 线性预热 余弦退火、EMA 平滑、AICCOCO 预训练迁移这些共同构成了在 CrowdPose 上 70.6% AP 的复现配方评测口径CrowdPose 指标依赖官方检测框文件与keypoints_crowdIoU复现指标时务必使用相同评测管线。扩展到自定义场景若要在自己的密集人群数据上使用该配置只需调整out_channels关键点数量、codec.input_size、dataset_type与ann_file并将init_cfg.checkpoint替换为你自己的预训练权重。配置中所有模块CSPNeXt、RTMCCHead、SimCCLabel、KLDiscretLoss均在 mmpose/models 与 mmpose/codecs 中以可注册模块形式提供MMEngine 的配置驱动机制允许在不改代码的前提下完成全部替换。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表