尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MMPose 手部关键点估计实战:HRNetv2-W18 在 COCO-WholeBody-Hand 上的 Topdown Heatmap 方案全解析

MMPose 手部关键点估计实战:HRNetv2-W18 在 COCO-WholeBody-Hand 上的 Topdown Heatmap 方案全解析 MMPose 手部关键点估计实战HRNetv2-W18 在 COCO-WholeBody-Hand 上的 Topdown Heatmap 方案全解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文聚焦 MMPose 仓库中configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/目录下的 HRNetv2 手部关键点模型配置完整解读td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py这一自顶向下Topdown热图回归方案的实现细节。读完本文你将掌握HRNetv2-W18 在该任务上的基准精度PCK0.2 0.813、AUC 0.840、EPE 4.39、21 点手部骨架的定义方式、MSRAHeatmap 编解码原理、完整训练与验证配置的每一处参数含义以及如何在本地复现训练、评测和可视化推理。模型与基准结果根据 hrnetv2_coco_wholebody_hand.md 与 hrnetv2_coco_wholebody_hand.yml 的记录MMPose 在 COCO-WholeBody-Hand 验证集上使用 HRNetv2-W18 作为主干网络Backbone配合 256×256 输入尺寸的热图回归方案取得了如下结果架构输入尺寸PCK0.2AUCEPE配置文件pose_hrnetv2_w18256×2560.8130.8404.39td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py其中三个指标的含义分别为PCK0.2Percentage of Correct Keypoints以关键点尺度归一化距离阈值 0.2 为判定标准预测正确的关键点比例数值越高越好AUCArea Under the Curve在不同 PCK 阈值下积分得到的面积反映整体定位精度数值越高越好EPEEnd Point Error预测关键点与真值之间的平均像素欧氏距离数值越低越好。该模型对应的预训练权重在模型索引中注册于Hand 2D Keypoint任务下训练数据为 COCO-WholeBody-Hand 数据集。论文出处为 HRNetv2Deep High-Resolution Representation Learning for Visual Recognition, TPAMI2019与 COCO-WholeBodyWhole-Body Human Pose Estimation in the Wild, ECCV2020仓库在文档中给出了对应的 BibTeX 引用条目引用时可直接使用。数据集与 21 点手部骨架定义COCO-WholeBody-Hand 数据集COCO-WholeBody 是 COCO 数据集的扩展在原始人体 17 点关键点之外额外标注了脸部、手部与脚部关键点。其中的手部子集COCO-WholeBody-Hand包含左右手各 21 个关键点。数据集元信息定义在 configs/base/datasets/coco_wholebody_hand.py 中而具体的数据读取逻辑位于 mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py 的CocoWholeBodyHandDataset类。从源码结构看该类继承自BaseCocoStyleDataset其METAINFO通过from_fileconfigs/_base_/datasets/coco_wholebody_hand.py直接引用上述元信息文件。在_load_annotations方法中它会针对每张图像的每个标注依次检查lefthand_valid和righthand_valid标志只有手部有效且存在可见关键点时才生成训练实例——这意味着同一张图中最多可能产生左右手两个实例这也是bbox_file参数支持在评测阶段加载检测框结果的原因。21 个关键点顺序COCO-WholeBody-Hand 的关键点编号顺序如下来自数据集类 docstring 与元信息文件0: wrist 1: thumb1 2: thumb2 3: thumb3 4: thumb4 5: forefinger1 6: forefinger2 7: forefinger3 8: forefinger4 9: middle_finger1 10: middle_finger2 11: middle_finger3 12: middle_finger4 13: ring_finger1 14: ring_finger2 15: ring_finger3 16: ring_finger4 17: pinky_finger1 18: pinky_finger2 19: pinky_finger3 20: pinky_finger4即第 0 点为腕部其余 20 点按大拇指、食指、中指、无名指、小指的顺序每根手指从指根到指尖排列 4 个点。骨架连接skeleton_info定义了从腕部到各指根、以及同一手指相邻关节之间的连线不同手指使用不同的可视化颜色如拇指为橙色、食指为粉色、中指为蓝色、无名指为红色、小指为绿色。元信息中还给出了joint_weights21 个点全部为 1.0和sigmas用于 OKS 计算的各关节标准差。配置文件逐段精读模型核心配置为 td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py文件名本身即概括了关键要素td-hmtop-down heatmap 方案、hrnetv2-w18主干网络、8xb328 卡 × 每卡 batch size 32、210e210 个 epoch、256x256输入分辨率。运行时与训练策略_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs210, val_interval10) # optimizer optim_wrapper dict(optimizerdict( typeAdam, lr5e-4, )) # learning policy 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_size256) # hooks default_hooks dict(checkpointdict(save_bestAUC, rulegreater))要点解读基础运行环境default_runtime.py见 configs/base/default_runtime.py提供了默认的日志、可视化、SyncBuffersHook每个 epoch 结束后同步 BN 的 running_mean / running_var 等缓冲区、多进程后端与PoseLocalVisualizer等通用配置优化器采用Adam初始学习率 5e-4学习率调度分两段前 500 次迭代使用LinearLR做 warm-up起始因子 0.001即从 5e-7 线性升至 5e-4by_epochFalse表示按迭代而非 epoch 计数之后按 epoch 使用MultiStepLR在第 170、200 epoch 处将学习率乘以 0.1auto_scale_lr dict(base_batch_size256)表示配置以总 batch size 256 为基准当实际 batch size 与基准不一致时MMPose 会自动线性缩放学习率覆盖了默认的 checkpoint 保存策略以AUC作为最佳模型筛选指标rulegreater表示 AUC 越大越好。CodecMSRAHeatmap 热图编解码codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2)Codec编解码器是 MMPose 1.x 中连接标签生成与模型输出解析的桥梁实现位于 mmpose/codecs/msra_heatmap.py 的MSRAHeatmap类其设计源自 Simple BaselinesXiao et al., 2018。三个参数的作用input_size(256, 256)模型输入图像的尺寸heatmap_size(64, 64)输出热图尺寸输入与热图尺寸之比scale_factor 4决定了坐标恢复时的缩放倍数sigma2生成高斯热图时的高斯标准差决定每个关键点峰值能量的扩散范围。编码阶段encode将真值关键点坐标除以 scale_factor 映射到热图坐标系再通过generate_gaussian_heatmaps生成 (21, 64, 64) 的 K 通道高斯热图并同步输出用于加权损失的keypoint_weights。解码阶段decode对预测热图执行get_heatmap_maximum取得峰值坐标再经过refine_keypoints基于相邻像素分布的泰勒展开式亚像素细化可缓解量化误差最后乘回 scale_factor 还原到原图坐标同时输出每个关键点的置信度分数。模型结构HRNetv2 FeatureMapProcessor HeatmapHeadmodel dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeHRNet, in_channels3, extradict( stage1dict(num_modules1, num_branches1, blockBOTTLENECK, num_blocks(4, ), num_channels(64, )), stage2dict(num_modules1, num_branches2, blockBASIC, num_blocks(4, 4), num_channels(18, 36)), stage3dict(num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(18, 36, 72)), stage4dict(num_modules3, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(18, 36, 72, 144), multiscale_outputTrue), upsampledict(modebilinear, align_cornersFalse)), init_cfgdict( typePretrained, checkpointopen-mmlab://msra/hrnetv2_w18)), neckdict( typeFeatureMapProcessor, concatTrue, ), headdict( typeHeatmapHead, in_channels270, out_channels21, deconv_out_channelsNone, lossdict(typeKeypointMSELoss, use_target_weightTrue), conv_out_channels(270, ), conv_kernel_sizes(1, ), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))结构拆解如下数据预处理器PoseDataPreprocessor使用 ImageNet 统计的 mean/std 对输入做归一化并设置bgr_to_rgbTrue处理 OpenCV 读取的 BGR 图像主干网络 HRNetHRNet即 HRNetv2的核心思想是全程保持高分辨率特征通过 4 个 stage 逐步引入更多分支stage1 单分支64 通道BOTTLENECK 模块、stage2 双分支18/36 通道、stage3 三分支18/36/72 通道、stage4 四分支18/36/72/144 通道各 stage 间通过并行的跨分辨率融合保持多尺度信息。multiscale_outputTrue表示 stage4 输出所有四个分辨率的特征。网络使用 ImageNet 预训练的hrnetv2_w18权重初始化颈部FeatureMapProcessor配置中concatTrue将 HRNet 输出的 4 个不同分辨率分支18、36、72、144 通道上采样到同一分辨率后拼接得到183672144 270通道的特征——这正是 head 中in_channels270的来源头部HeatmapHeadout_channels21对应 21 个手部关键点deconv_out_channelsNone表示不再使用反卷积上采样HRNet 本身已提供高分辨率特征而是直接用 1×1 卷积conv_kernel_sizes(1,)输出仍为 270 通道映射到热图空间损失函数采用KeypointMSELossuse_target_weightTrue表示按关键点可见性加权测试策略flip_testTrue启用水平翻转测试将原图与翻转图的热图平均后解码flip_modeheatmap指定在热图层面进行翻转融合shift_heatmapTrue对翻转产生的半像素偏移进行修正。数据加载与变换管线dataset_type CocoWholeBodyHandDataset data_mode topdown data_root data/coco/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomBBoxTransform, rotate_factor180, scale_factor(0.7, 1.3)), 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) ]数据加载器配置中训练集使用annotations/coco_wholebody_train_v1.0.jsontrain2017/图片验证集使用annotations/coco_wholebody_val_v1.0.jsonval2017/图片均以data/coco/为根目录需按仓库文档准备该数据集。每个 dataloader 的 batch size 为 32配合 2 个 worker 与persistent_workersTrue。Top-down 方案的训练管线要点GetBBoxCenterScale从 GT 人手检测框计算中心点与尺度数据增强组合水平随机翻转 RandomBBoxTransform旋转幅度 180°、尺度缩放 0.7~1.3对手部这种任意朝向的目标非常关键TopdownAffine仿射变换裁剪到 256×256GenerateTarget使用前面定义的MSRAHeatmapcodec 生成训练目标热图验证管线不包含增强与目标生成直接做仿射对齐后打包输入。评估指标val_evaluator [ dict(typePCKAccuracy, thr0.2), dict(typeAUC), dict(typeEPE) ] test_evaluator val_evaluator评测同时输出 PCK0.2、AUC 与 EPE 三项指标与文章开头的结果表一一对应。同目录变体与扩展DarkPose同一目录下还提供了使用 DarkPose 无偏编解码的变体配置 td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py它与主配置的差异仅在于 codeccodec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2, unbiasedTrue)unbiasedTrue会启用MSRAHeatmap中的 DarkPose 分支编码阶段使用generate_unbiased_gaussian_heatmaps生成无偏高斯热图避免量化误差解码阶段使用refine_keypoints_dark进行基于泰勒展开的高斯峰精修。从 mmpose/codecs/msra_heatmap.py 的源码注释可以得知blur_kernel_size与 sigma 遵循经验公式sigma 0.3*((ks-1)*0.5-1)0.8默认核大小 11 对应 sigma≈2。在精度敏感的场景中这一变体通常能带来额外的关键点定位提升且与主配置共享相同的模型结构与训练策略。训练、测试与可视化复现在完成数据集准备将 COCO-WholeBody 注释放置于data/coco/annotations/图片放置于data/coco/train2017/、data/coco/val2017/后可借助 tools/train.py 与 tools/test.py 复现训练与评测# 单卡训练 python tools/train.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py # 8 卡分布式训练与文件名 8xb32 对应总 batch size 为 256 bash tools/dist_train.sh configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py 8 # 评测使用训练日志中保存的最佳权重 python tools/test.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py checkpoint路径训练过程中由于配置了save_bestAUC, rulegreater系统会在每个验证间隔val_interval10评估一次并保留 AUC 最高的 checkpoint。推理与可视化方面MMPose 提供了统一的inferencer接口详见 demo/inferencer_demo.py与 docs/zh_cn/user_guides/inference.md 指南其中Pose2DInferencer支持传入检测模型后对整图做人体/手部关键点估计并绘制骨架结果。小结HRNetv2-W18 与 COCO-WholeBody-Hand 的组合是 MMPose 手部 2D 关键点任务的代表性 baseline全程高分辨率的 HRNet 主干天然适合手部这种对细粒度定位要求高的任务MSRAHeatmapcodec 提供了标准的 coordinate → heatmap → coordinate 闭环而 180° 旋转与 0.7~1.3 尺度缩放的数据增强则针对手部姿态的任意朝向做了专门设计。通过本文对配置文件、数据集元信息与编解码源码的逐层拆解你可以将这一方案直接迁移到自有手部数据集或在此基础上更换主干同目录下还有 resnet、litehrnet、hourglass、scnet 等配置以权衡精度与速度。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表