资讯详情

ViTPose 项目实战:MobileNetV2 骨干在 RHD 手部 2D 关键点检测中的 Top-Down 热图方案与配置解析

📅 2026/10/15 16:32:28 | 华诺云谱 👁 阅读
ViTPose 项目实战:MobileNetV2 骨干在 RHD 手部 2D 关键点检测中的 Top-Down 热图方案与配置解析
人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载本文基于 ViTPose 仓库基于 OpenMMLab MMPose 框架中的模型性能卡片 mobilenetv2_rhd2d.md系统讲解如何用 MobileNetV2 作为骨干网络在 Rendered Handpose DatasetRHD上进行 top-down 手部 2D 关键点21 个手部关节点检测从性能指标解读、完整配置逐项剖析、数据准备到训练、测试与单图推理的端到端实操。读完本文你将掌握该模型卡片的全部技术信息并能直接在 ViTPose 仓库中复现其结果PCK0.20.985、AUC0.883、EPE2.80。一、方案概览轻量骨干 × 渲染手部数据集本文档对应的完整配置为 mobilenetv2_rhd2d_256x256.py其技术栈由三部分组成骨干网络 MobileNetV2Sandler 等人于 CVPR2018 提出的轻量级网络以倒残差Inverted Residual与线性瓶颈Linear Bottleneck为核心结构在保持精度的同时大幅降低计算量非常适合实时手部姿态估计等移动端场景。数据集 RHDRendered Handpose DatasetChristian Zimmermann 与 Thomas Brox 于 ICCV2017 提出基于单目 RGB 图像的渲染手部姿态数据集每张图像标注 21 个手部关键点并提供了 2D/3D 双模态标注。任务范式 Top-Down 热图回归先由目标检测器给出手部包围框再在裁剪框内回归每个关节的高斯热图最后解码为 2D 坐标。原文档中给出的两项论文引用如下BibTeX 摘录inproceedings{sandler2018mobilenetv2, title{Mobilenetv2: Inverted residuals and linear bottlenecks}, author{Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh}, booktitle{Proceedings of the IEEE conference on computer vision and pattern recognition}, pages{4510--4520}, year{2018} }TechReport{zb2017hand, author{Christian Zimmermann and Thomas Brox}, title{Learning to Estimate 3D Hand Pose from Single RGB Images}, institution{arXiv:1705.01389}, year{2017}, notehttps://arxiv.org/abs/1705.01389, }二、RHD 测试集性能结果原文档在 RHD 测试集上报告的指标如下表所示Arch一栏链接到对应配置文件ArchInput SizePCK0.2AUCEPEckptlogpose_mobilenet_v2256x2560.9850.8832.80ckptlog对应模型的注册信息也可以在模型索引文件 mobilenetv2_rhd2d.yml 中查到配置为configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py训练数据为 RHD模型名为topdown_heatmap_mobilenetv2_rhd2d_256x256权重文件为mobilenetv2_rhd2d_256x256-85fa02db_20210330.pth。三项指标的含义PCK0.2Percentage of Correct Keypoints阈值 0.2预测关键点与真值之间的归一化距离小于阈值的比例。这里的归一化因子是手部包围框的尺寸阈值 0.2 即要求归一化误差小于 0.2 个包围框尺度其源码实现在 top_down_eval.py 的keypoint_pck_accuracy中。AUCArea Under Curve将 PCK 的阈值从 0 到 1 均匀取 20 个步长num_step20见 top_down_eval.py 的keypoint_auc对每个阈值计算平均 PCK 并积分求和衡量模型在多个严格程度下的综合定位精度。EPEEnd-Point Error所有可见关键点预测坐标与真值坐标之间的平均欧氏距离像素实现见 top_down_eval.py 的keypoint_epe。上述三种指标正是配置文件evaluation字段中指定的评估集合见下文。三、配置文件逐项深度解析配置文件 mobilenetv2_rhd2d_256x256.py 继承了两份基础配置运行时默认配置 default_runtime.py 与数据集信息配置 rhd2d.py。3.1 评估与优化策略_base_ [ ../../../../_base_/default_runtime.py, ../../../../_base_/datasets/rhd2d.py ] evaluation dict(interval10, metric[PCK, AUC, EPE], save_bestAUC) optimizer dict( typeAdam, lr5e-4, ) optimizer_config dict(grad_clipNone) # learning policy lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[170, 200]) total_epochs 210 log_config dict( interval10, hooks[ dict(typeTextLoggerHook), # dict(typeTensorboardLoggerHook) ])要点解读评估每 10 个 epoch 评估一次同时计算 PCK、AUC、EPE 三个指标并以 AUC 作为选优保存模型save_bestAUC的依据。优化器Adam初始学习率5e-4不做梯度裁剪。学习率调度采用分段step衰减策略线性 warmup 500 个 iterationwarmup 初始比例为 0.001在第 170 和第 200 个 epoch 处各衰减一次总训练 210 个 epoch。日志每 10 个 iteration 输出一次文本日志TextLoggerHook如需 TensorBoard 可视化可取消注释TensorboardLoggerHook。3.2 通道配置与模型结构channel_cfg dict( num_output_channels21, dataset_joints21, dataset_channel[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]], inference_channel[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) model dict( typeTopDown, pretrainedmmcls://mobilenet_v2, backbonedict(typeMobileNetV2, widen_factor1., out_indices(7, )), keypoint_headdict( typeTopdownHeatmapSimpleHead, in_channels1280, out_channelschannel_cfg[num_output_channels], loss_keypointdict(typeJointsMSELoss, use_target_weightTrue)), train_cfgdict(), test_cfgdict( flip_testTrue, post_processdefault, shift_heatmapTrue, modulate_kernel11))21 个手部关键点定义dataset_channel与inference_channel均为 020 的完整映射对应 RHD 的 21 个关节点。其具体名称、颜色与骨骼连接关系定义在数据集信息文件 rhd2d.py 中0wrist腕部14thumb1thumb4拇指58forefinger1forefinger4食指912middle_finger1middle_finger4中指1316ring_finger1ring_finger4无名指1720pinky_finger1pinky_finger4小指数据集源码 rhd2d_dataset.py 中的Rhd2DDataset也以文档字符串形式完整列出了这一索引顺序。检测器与骨干TopDown MobileNetV2typeTopDown对应 top_down.py 中的TopDown检测器由backbone提取特征、keypoint_head回归热图训练与测试时分别调用forward_train/forward_test。pretrainedmmcls://mobilenet_v2从 mmclassification 模型库加载 ImageNet 预训练权重进行骨干初始化。backbonedict(typeMobileNetV2, widen_factor1., out_indices(7, ))MobileNetV2 实现位于 mobilenet_v2.py。widen_factor1.0表示使用标准宽度out_indices(7,)表示只输出第 7 个 stage 的特征。从源码arch_settings可见MobileNetV2 由 7 组倒残差层layer1layer7结构参数依次为[1,16,1,1]、[6,24,2,2]、[6,32,3,2]、[6,64,4,2]、[6,96,3,1]、[6,160,3,2]、[6,320,1,1]加最终 1x1 卷积conv2输出 1280 通道组成make_layer会按num_blocks堆叠InvertedResidual模块其中第一个模块使用给定 stride后续模块 stride 均为 1。keypoint_headdict(typeTopdownHeatmapSimpleHead, in_channels1280, ...)输入为骨干输出的 1280 通道特征。该 Head 实现在 topdown_heatmap_simple_head.py由 3 层反卷积每层 256 个滤波器、核大小 4、stride 2将特征图上采样 8 倍加 1x1 卷积组成输入 256x256 图像 → 骨干下采样至 32 倍 → 反卷积恢复至 8 倍最终输出 64x64 的 21 通道热图与heatmap_size[64, 64]一致。损失函数JointsMSELossuse_target_weightTrue实现位于 mse_loss.py对每个关节分别计算 MSE并用target_weight加权可见关节参与损失计算、不可见关节被置零。该配置中的目标热图由TopDownGenerateTarget以高斯 sigma2 生成见下文数据管线。测试策略flip_testTrue启用水平翻转测试增强预测时对原图与翻转图分别推理翻转热图后再取平均配合shift_heatmapTrue对翻转热图做 1 像素偏移校正以对齐特征这一逻辑体现在TopdownHeatmapSimpleHead.inference_model与flip_back中post_processdefault使用默认坐标解码_get_max_preds取最大响应位置并结合泰勒展开进行亚像素精化modulate_kernel11指定在解码时用 11x11 的核调制热图。3.3 数据配置与图像尺寸data_cfg dict( image_size[256, 256], heatmap_size[64, 64], num_output_channelschannel_cfg[num_output_channels], num_jointschannel_cfg[dataset_joints], dataset_channelchannel_cfg[dataset_channel], inference_channelchannel_cfg[inference_channel])image_size[256, 256]输入图像统一缩放到 256x256这也是性能表中 Input Size 一列的来源。heatmap_size[64, 64]监督热图分辨率为 64x64即输入图像 1/4 尺度由 8 倍反卷积从 8x8 特征图恢复而来。21 个关键点、输入输出通道映射均复用channel_cfg。3.4 数据增强管线训练 / 验证 / 测试训练管线train_pipelinetrain_pipeline [ dict(typeLoadImageFromFile), dict(typeTopDownRandomFlip, flip_prob0.5), dict(typeTopDownGetRandomScaleRotation, rot_factor90, scale_factor0.3), dict(typeTopDownAffine), dict(typeToTensor), dict(typeNormalizeTensor, mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), dict(typeTopDownGenerateTarget, sigma2), dict(typeCollect, keys[img, target, target_weight], meta_keys[image_file, joints_3d, joints_3d_visible, center, scale, rotation, flip_pairs]), ]TopDownRandomFlip以 0.5 概率水平翻转翻转的同时会交换左右对称关节由flip_pairs元信息携带。TopDownGetRandomScaleRotation随机旋转 ±90°、缩放 ±30%大幅扩充姿态多样性。TopDownAffine根据center/scale/rotation做仿射变换裁剪到手部区域。NormalizeTensor使用 ImageNet 统计的均值/标准差归一化。TopDownGenerateTarget以高斯 sigma2 生成 64x64 的热图目标target与target_weight。Collect收集送入网络的张量与训练所需的元信息。验证与测试管线只做加载、仿射、张量化与归一化不进行随机增强与目标生成val_pipeline [ dict(typeLoadImageFromFile), dict(typeTopDownAffine), dict(typeToTensor), dict(typeNormalizeTensor, mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), dict(typeCollect, keys[img], meta_keys[image_file, center, scale, rotation, flip_pairs]), ] test_pipeline val_pipeline3.5 数据加载配置data_root data/rhd data dict( samples_per_gpu64, workers_per_gpu2, val_dataloaderdict(samples_per_gpu32), test_dataloaderdict(samples_per_gpu32), traindict( typeRhd2DDataset, ann_filef{data_root}/annotations/rhd_train.json, img_prefixf{data_root}/, data_cfgdata_cfg, pipelinetrain_pipeline, dataset_info{{_base_.dataset_info}}), valdict( typeRhd2DDataset, ann_filef{data_root}/annotations/rhd_test.json, img_prefixf{data_root}/, data_cfgdata_cfg, pipelineval_pipeline, dataset_info{{_base_.dataset_info}}), testdict( typeRhd2DDataset, ann_filef{data_root}/annotations/rhd_test.json, img_prefixf{data_root}/, data_cfgdata_cfg, pipelinetest_pipeline, dataset_info{{_base_.dataset_info}}), )训练 batch size 为 64每 GPU验证/测试 batch size 为 32dataset_info从_base_继承。Rhd2DDataset继承自Kpt2dSviewRgbImgTopDownDataset。在其_get_db实现中rhd2d_dataset.pyRHD 原始图像为 224x224包围框通过_xywh2cs以 1.25 的 padding 扩展得到center与scale坐标与可见性从 COCO 格式的关键点标注解析而来。四、RHD 数据集准备根据任务文档 2d_hand_keypoint.md 的说明RHD 数据集需要从官方渠道下载图像并从官方注释包获取rhd_train.json/rhd_test.json标注。解压到仓库根目录的data目录下后目录结构应为ViTPose ├── configs ├── docs ├── mmpose ├── tools └── data └── rhd ├── annotations │ ├── rhd_train.json │ └── rhd_test.json ├── training │ ├── color │ │ ├── 00000.jpg │ │ ├── 00001.jpg │ │ └── ... │ ├── depth │ │ └── ... │ └── mask │ └── ... └── evaluation ├── color │ └── ... ├── depth │ └── ... └── mask └── ...配置中的ann_filef{data_root}/annotations/rhd_train.json与img_prefixf{data_root}/正是依赖这一目录约定。五、训练、测试与单图推理5.1 训练使用训练入口 tools/train.py指定配置文件即可开始训练210 个 epoch评估时按 AUC 保存最优模型python tools/train.py configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py如需指定 GPU可参考 tools/dist_train.sh 与 tools/slurm_train.sh 进行分布式训练。5.2 测试与复现指标使用测试入口 tools/test.py 加载官方权重即可在 RHD 测试集上复现表中指标python tools/test.py \ configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py \ checkpoint文件路径 \ --out result.pkl \ --eval PCK AUC EPE评估逻辑由 rhd2d_dataset.py 中的evaluate方法实现它将预测关键点结果写入result_keypoints.json再调用_report_metric基于底层keypoint_pck_accuracy、keypoint_auc、keypoint_epetop_down_eval.py计算三项目标指标。5.3 单图推理 Demo推理脚本 demo/top_down_img_demo.py 接受姿态配置、权重、图像目录与包含手部包围框的 JSON 文件COCO 格式其main函数通过init_pose_modelmmpose/apis/inference.py构建模型再逐图调用inference_top_down_pose_modelmmpose/apis/inference.py完成检测。仓库自带的测试数据 tests/data/rhd/test_rhd.json 及其对应图片即可用于快速验证流程python demo/top_down_img_demo.py \ configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py \ checkpoint文件路径 \ --img-root tests/data/rhd/ \ --json-file tests/data/rhd/test_rhd.json \ --out-img-root 输出目录 \ --kpt-thr 0.3六、同类配置横向参考在 rhd2d 配置目录 中除本文的 MobileNetV2 方案外仓库还提供了同一数据集上的其他骨干变体便于对比不同网络在 RHD 上的表现ResNet 系列res50_rhd2d_224x224.py与res50_rhd2d_256x256.py对应卡片 resnet_rhd2d.mdHRNet 系列hrnetv2_w18_rhd2d_256x256.py以及加入 DARK_dark与 UDP_udp坐标解码改进的变体对应卡片 hrnetv2_rhd2d.md、hrnetv2_dark_rhd2d.md、hrnetv2_udp_rhd2d.md。这些配置共享同一份_base_数据集定义与 RHD 目录结构仅替换骨干/解码策略是研究手部关键点检测中骨干网络与解码方法对精度影响的理想实验起点。七、小结通过本文我们完整解读了 ViTPose 仓库中 MobileNetV2 在 RHD 手部 2D 关键点检测上的方案其核心是一条MobileNetV2 骨干 TopdownHeatmapSimpleHead 热图回归头 JointsMSELoss 翻转测试增强的标准 top-down 流水线。结合配置文件、骨干实现 mobilenet_v2.py、检测器 top_down.py 与评估实现 top_down_eval.py可以清晰地看到从数据增强、热图监督到指标计算的每一环是如何衔接的。对于需要在移动端/边缘设备上部署手部姿态估计的场景该配置提供了一个轻量且经过验证的基线仅以 256x256 输入即取得 PCK0.20.985 的成绩同时 AUC 与 EPE 指标同样出色。赞分享人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载相关推荐ViTPose 仓库中基于 MobileNetV2 的 COCO-WholeBody 人脸关键点检测68 点 top-down 热图方案实战指南ViTPose 仓库中基于 MobileNetV2 的 COCO WholeBody 人脸关键点检测68 点 top down 热图方案实战指南 导读 本文人工智能计算机视觉深度学习ViTPose 手部关键点检测实战基于 ResNet-50 的 CMU Panoptic 2D Top-Down Heatmap 配置与实现解析ViTPose 手部关键点检测实战基于 ResNet 50 的 CMU Panoptic 2D Top Down Heatmap 配置与实现解析 本文围绕 V人工智能计算机视觉深度学习ViTPose 仓库实战MobileNetV2 轻量级 2D 手部关键点检测OneHand10K 配置全解析ViTPose 仓库实战MobileNetV2 轻量级 2D 手部关键点检测OneHand10K 配置全解析 导读 本文以 mobilenetv2_one人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑