ARTICLE DETAIL

资讯详情

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

MMPose 手部关键点检测实战:RTMPose-m 在 COCO-WholeBody-Hand 上的训练与推理解析

MMPose 手部关键点检测实战:RTMPose-m 在 COCO-WholeBody-Hand 上的训练与推理解析 MMPose 手部关键点检测实战RTMPose-m 在 COCO-WholeBody-Hand 上的训练与推理解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文围绕 MMPose 官方提供的 rtmpose_coco_wholebody_hand.md 这一模型卡片文档展开深入解析 RTMPose-m 在 COCO-WholeBody-Hand 手部关键点数据集上的完整实现从 SimCC 标签编码、RTMCC 检测头与 KL 散度损失等核心原理到配套训练配置的逐项参数解读再到数据准备、单卡/多卡训练、测试与推理的完整实战流程。读完本文你将能够独立复现该 21 点手部关键点模型的训练与评估并理解 RTMPose 在实时 2D 姿态估计场景中的设计精髓。一、模型总览一份模型卡片文档承载了什么该文档是 RTMPose 手部关键点模型的结果页官方统计如下ArchInput SizePCK0.2AUCEPE权重文件训练日志rtmpose_m256x2560.8150.8374.51ckptlog该表同时记录了算法与数据集的引用信息算法 RTMDetArXiv 2022RTMDet: An Empirical Study of Designing Real-Time Object DetectorsRTMPose 借鉴其 CSPNeXt 骨干与实时检测器设计经验数据集 COCO-WholeBody-HandECCV 2020源自论文 Whole-Body Human Pose Estimation in the Wild手部关键点标注包含 21 个点腕部 1 点 手指各 3 点 × 5 指。配套的模型索引文件 rtmpose_coco_wholebody_hand.yml 将该模型登记为rtmpose-m_8xb32-210e_coco-wholebody-hand-256x256任务类型为 Hand 2D Keypoint训练数据为 COCO-WholeBody-Hand。注AUC/PCK 指标数值以官方模型卡片为准训练日志 JSON 中记录了逐轮验证过程可用于复现核对。二、背后的算法原理RTMPose 与 SimCC2.1 RTMPose 框架设计RTMPose 是 MMPose 推出的高性能实时多人姿态估计框架。根据 RTMPose 综述页其核心是从范式topdown 检测加关键点、骨干网络、定位算法、训练策略与部署推理五个方面系统优化。RTMPose-m 在 COCO 上可达到 75.8% AP在 Intel i7-11700 CPU 上 90 FPS、GTX 1660 Ti 上 430 FPS。2.2 SimCC坐标分类视角的标签编码手部模型采用SimCCSimple Coordinate Classification方案将关键点坐标估计转化为一维坐标分类问题。核心 codec 实现在 simcc_label.py 的SimCCLabel类中对 x、y 轴分别生成一维标签keypoint_x_labels与keypoint_y_labels尺寸为Wx w * simcc_split_ratio、Wy h * simcc_split_ratiosmoothing_typegaussian默认时按高斯分布平滑生成标签sigma控制高斯核宽度本配置为(5.66, 5.66)simcc_split_ratio2.0表示标签长度为输入尺寸的 2 倍256×2512从而获得亚像素级定位精度normalizeFalse、use_darkFalse关闭了热图归一化与 DARK 后处理属于 RTMPose 官方训练设定坐标映射与越界保护逻辑见_map_coordinatessimcc_label.py越界点权重被置 0不参与损失计算。2.3 RTMCC 检测头大核卷积 门控注意力模型 head 采用RTMCCHead实现见 rtmcc_head.py。其结构为final_layer大核卷积final_layer_kernel_size7将特征图映射到 21 个通道mlpScaleNorm 线性层把展平特征压入hidden_dims256的隐空间gauGated Attention UnitRTMCCBlock基于门控注意力聚合全局上下文输出 x/y 两个方向的一维表示向量解码时通过simcc_split_ratio将一维向量还原为亚像素坐标。head 输出通道out_channels21与手部关键点数量一一对应in_featuremap_size input_size // 32 8×8由骨干下采样 32 倍得到。2.4 KLDiscretLossSimCC 的离散 KL 散度损失训练损失为KLDiscretLossclassification_loss.py。其核心计算逻辑是log_pt log_softmax(dec_outs * beta) # 预测分布beta 为温度系数 labels softmax(labels * label_beta) # 标签 softmaxlabel_softmaxTrue 时 loss mean(KLDiv(log_pt, labels))本配置参数beta10.0、label_softmaxTrue并开启use_target_weightTrue使遮挡关键点按权重参与损失。三、训练配置逐项拆解完整配置见 rtmpose-m_8xb32-210e_coco-wholebody-hand-256x256.py该文件继承 default_runtime.py。3.1 运行时与优化器max_epochs 210 stage2_num_epochs 30 base_lr 4e-3 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))训练 210 轮每 10 轮在验证集评估一次固定随机种子seed21保证可复现优化器为 AdamWweight_decay0.05BN 归一化层参数与偏置不参与权重衰减norm_decay_mult0、bias_decay_mult0。3.2 学习率调度与自动缩放param_scheduler [ dict(typeLinearLR, start_factor1.0e-5, by_epochFalse, begin0, end1000), # 前 1000 次迭代线性 warmup 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_size256)auto_scale_lr声明基准批大小 256当实际批大小与 256 不同时MMPose 会按比例自动缩放学习率。3.3 数据增强流水线训练阶段使用两阶段增强策略第一阶段增强强度较高最后一阶段stage230 轮降低强度微调增强项stage1stage2RandomBBoxTransform 缩放[0.5, 1.5][0.75, 1.25]rotate_factor180180RandomFliphorizontalhorizontalTopdownAffineinput_size(256,256)同左mmdet.YOLOXHSVRandomAugHSV 扰动同左AlbumentationBlur/MedianBlur/CoarseDropoutCoarseDropout p1.0p0.5数据流为LoadImage → GetBBoxCenterScale → RandomBBoxTransform → RandomFlip → TopdownAffine → YOLOXHSVRandomAug → Albumentation → GenerateTarget(encodercodec) → PackPoseInputs。测试/验证流水线仅含LoadImage → GetBBoxCenterScale → TopdownAffine → PackPoseInputs无任何随机增强。3.4 模型结构与预训练权重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/v1/projects/ rtmposev1/cspnext-m_udp-aic-coco_210e-256x192-...pth))骨干为 mmdet 作用域下的CSPNeXtRTMDet 骨干archP5widen_factor0.75对应 m 尺寸使用SyncBN与SiLU激活channel_attentionTrue开启通道注意力预训练权重为在 AIC COCO 上训练 210 轮的cspnext-mprefixbackbone.保证加载时只映射骨干部分。3.5 数据集与 DataLoaderdataset_type CocoWholeBodyHandDataset data_mode topdown data_root data/coco/训练标注annotations/coco_wholebody_train_v1.0.json图像前缀train2017/验证标注annotations/coco_wholebody_val_v1.0.json图像前缀val2017/test_modeTrue单卡 batch_size32、num_workers10、persistent_workersTrue训练采样器 shuffle验证采样器round_upFalse数据后端默认backendlocal文件头注释了可选的 Petrels3://openmmlab/datasets/...云端存储后端映射方式。3.6 评估指标与钩子val_evaluator [ dict(typePCKAccuracy, thr0.2), dict(typeAUC), dict(typeEPE) ] default_hooks dict(checkpointdict(save_bestAUC, rulegreater, max_keep_ckpts1)) custom_hooks [ dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0002, update_buffersTrue, priority49), dict(typemmdet.PipelineSwitchHook, switch_epoch210-30, switch_pipelinetrain_pipeline_stage2) ]三个指标与模型卡片一一对应PCK0.22D 关键点正确率、AUC曲线下面积、EPE平均像素误差越低越好检查点按验证 AUC 取最优保存只保留 1 份EMA指数滑动平均在训练中平滑模型参数以提升泛化momentum0.0002PipelineSwitchHook在第 180 轮max_epochs - stage2_num_epochs自动切换到降强度的 stage2 流水线。四、从零复现的完整流程4.1 准备环境与数据MMPose 1.x 的安装与数据准备分别见 安装指南 与 数据准备指南。手部关键点数据沿用 COCO 目录约定data/coco/ ├── annotations/ │ ├── coco_wholebody_train_v1.0.json │ └── coco_wholebody_val_v1.0.json ├── train2017/ └── val2017/4.2 单卡训练python tools/train.py configs/hand_2d_keypoint/rtmpose/coco_wholebody_hand/rtmpose-m_8xb32-210e_coco-wholebody-hand-256x256.py常用附加参数--work-dir指定输出目录--resume从已有 checkpoint 断点续训--amp开启混合精度训练。4.3 多卡分布式训练bash ./tools/dist_train.sh \ configs/hand_2d_keypoint/rtmpose/coco_wholebody_hand/rtmpose-m_8xb32-210e_coco-wholebody-hand-256x256.py \ 8多机多卡或指定端口请参考 训练与测试指南 中的PORT、NNODES、NODE_RANK、MASTER_ADDR环境变量用法。4.4 测试与评估python tools/test.py \ configs/hand_2d_keypoint/rtmpose/coco_wholebody_hand/rtmpose-m_8xb32-210e_coco-wholebody-hand-256x256.py \ /path/to/rtmpose-m_simcc-coco-wholebody-hand_pt-aic-coco_210e-256x256-99477206_20230228.pth测试默认优先使用 GPUCPU 推理可设置CUDA_VISIBLE_DEVICES-1。输出将包含 PCK0.2、AUC、EPE 三项指标可与官方数值 0.815 / 0.837 / 4.51 对照。4.5 用预训练模型推理方式一命令行推理推理文档python demo/inferencer_demo.py tests/data/coco/000000000785.jpg \ --pose2d hand --show --pred-out-dir predictions方式二Python APIfrom mmpose.apis import MMPoseInferencer inferencer MMPoseInferencer(hand) result_generator inferencer(your_hand_image.jpg, showTrue) results [r for r in result_generator]注MMPoseInferencer 的预置模型别名取决于当前安装的模型配置若需精确指定本文模型可传入完整配置文件与权重路径。五、源码佐证与测试验证SimCC 编码SimCCLabel类及高斯标签生成逻辑见 simcc_label.py对应单测 test_simcc_label.pyRTMCCHead结构定义见 rtmcc_head.py相关测试见 test_rtmcc_head.pyKLDiscretLoss见 classification_loss.py数据集类CocoWholeBodyHandDataset定义于 datasets/datasets/hand 目录评估指标PCKAccuracy、AUC、EPE定义于 evaluation/metrics 目录。通过阅读源码可以确认in_featuremap_size 256 // 32 8即输入图像经 CSPNeXt 下采样 32 倍得到 8×8 特征图SimCC 标签长度为256 × 2.0 512配合亚像素解码实现高精度定位——这正是手部小目标关键点任务需要高分辨率坐标分类的原因。六、小结RTMPose-m 手部模型以「CSPNeXt 骨干 SimCC 坐标分类 RTMCCHead 门控注意力 KL 散度损失」的组合在 COCO-WholeBody-Hand 上达到 PCK0.20.815、AUC0.837、EPE4.51 的精度。本文从模型卡片出发贯通了原理、配置与实战三条主线你可以基于 配置文件 直接开始训练也可以借鉴其 SimCC 参数与两阶段训练策略将 RTMPose 迁移到其他关键点数据集。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表