资讯动态

ViTPose 仓库 3D 手部姿态估计演示指南:interhand3d_img_demo.py 单图推理与可视化实战

发布时间:2026/10/15 16:24:20 来源:尧图企业网站定制
人工智能计算机视觉深度学习【免费下载链接】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 仓库中的 3D 手部演示文档 为主体围绕interhand3d_img_demo.py脚本系统讲解如何基于 InterHand2.6M 数据集完成单张 RGB 图像的 3D 交互手部姿态推理与可视化。读完本文你将掌握该演示脚本的全部命令行参数、两种典型运行模式带/不带 Ground Truth 与相机参数、底层推理调用链、相机空间坐标变换原理以及模型配置与测试验证方法可直接在本仓库环境中复现完整演示。一、3D 手部姿态估计与 InterHand2.6M 数据集背景3D 手部姿态估计3D Hand Pose Estimation的目标是从 RGB 图像中恢复手部关节的三维坐标是手势交互、AR/VR、人机接口等应用的关键技术。其中最具挑战性的场景是双手交互interacting hands双手互相遮挡、形状高度相似导致左右手区分与深度估计都更加困难。仓库中的 3D 手部模型基于InterNetECCV2020论文题为 InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image算法与InterHand2.6M数据集构建相关引用与算法说明可参见 模型页面 和 internet_interhand3d.md。数据集的完整定义位于 interhand3d.py其关键点体系为左右手各 21 个关节、共 42 个关键点每只手包含拇指、食指、中指、无名指、小指 5 根手指每根 4 个指节编号 1~4 从掌根到指尖外加 1 个手腕wrist索引 0~20 为右手21~41 为左手左右手对应关节互为 swap 关系如right_thumb4↔left_thumb4。二、演示脚本与输入数据准备2.1 脚本位置与作用演示脚本位于 demo/interhand3d_img_demo.py。它的输入不是任意一张图片而是给定的 COCO 格式 JSON 标注文件其中包含手部 GT 边界框逐帧读取图片、逐框调用模型进行 3D 关键点推理并输出可视化结果。因此文档中将其归类为 Using gt hand bounding boxes as input——即使用 GT 手部边界框作为检测输入适合在数据集上验证模型效果而非端到端的目标检测演示。2.2 测试数据文件仓库的 tests/data/interhand2.6m/ 目录下提供了 4 张测试图像和 3 个配套 JSON 文件开箱即可运行演示文件用途test_interhand2.6m_data.jsonCOCO 格式图像与标注文件记录每张图像的file_name、capture、camera、frame_idx以及手部bbox格式为xywhtest_interhand2.6m_camera.json相机参数文件按capture→camera两级索引组织包含campos相机在世界空间中的位置、camrot世界到相机的旋转矩阵、focal焦距、princpt主点test_interhand2.6m_joint_3d.jsonGT 3D 关节文件按capture→frame_idx索引包含world_coord世界坐标与joint_valid关节有效性标志image2017.jpg等 4 张图像RGB 输入图像2.3 完整数据集组织方式如需在完整数据集上运行可参考 docs/en/tasks/3d_hand_keypoint.md 的准备说明从 InterHand2.6M 官方渠道下载数据集与标注解压后组织为如下目录结构并软链接到仓库的data/目录下若目录结构不同需同步修改配置中的路径data └── interhand2.6m ├── annotations │ ├── all │ ├── human_annot │ ├── machine_annot │ ├── skeleton.txt │ └── subject.txt └── images ├── train ├── val └── test三、命令行参数全解interhand3d_img_demo.py的命令行参数在脚本的ArgumentParser中定义见 demo/interhand3d_img_demo.py完整说明如下参数类型默认值说明pose_configstr必填姿态网络配置文件路径pose_checkpointstr必填模型权重文件路径可为本地图或下载 URL--json-filestr包含图像信息与手部边界框的 COCO 格式 JSON 文件--img-rootstr图像根目录脚本内部通过osp.join(img_root, image[file_name])拼接出完整图像路径--camera-param-filestrNone相机参数文件提供时预测的 3D 关键点将从像素空间转换到相机空间进行可视化为None时在像素空间可视化--gt-joints-filestrNoneGT 3D 关键点参数文件提供后可与预测结果对照显示并用于将预测的相对深度恢复为绝对深度--rebase-keypoint-heightflagFalse将预测 3D 姿态的最低有效关键点高度归零即落地效果适用于模型不预测全局位置时的可视化--show-ground-truthflagFalse若 GT 可用同时显示 GT 关键点--showflagFalse是否弹出窗口实时显示结果--out-img-rootstrNone可视化图像输出目录None时不保存图像--devicestrcuda:0推理设备可指定 GPU ID 或cpu--kpt-thrfloat0.3关键点分数阈值低于该分数的关键点不绘制--radiusint4可视化关键点的圆点半径像素--thicknessint1可视化关键点连接线的粗细像素需要特别注意的是脚本开头有一条硬性校验第 103 行assert args.show or (args.out_img_root ! )——即--show与--out-img-root必须至少提供其一否则脚本直接报错退出。四、使用 GT 手部边界框进行单图推理4.1 完整命令模板原文档给出的命令模板如下其中方括号[...]内的参数为可选项python demo/interhand3d_img_demo.py \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --json-file ${JSON_FILE} \ --img-root ${IMG_ROOT} \ [--camera-param-file ${CAMERA_PARAM_FILE}] \ [--gt-joints-file ${GT_JOINTS_FILE}]\ [--show] \ [--device ${GPU_ID or CPU}] \ [--out-img-root ${OUTPUT_DIR}] \ [--rebase-keypoint-height] \ [--show-ground-truth]4.2 带 GT 关键点与相机参数的完整示例使用仓库自带的测试数据同时提供相机参数与 GT 3D 关键点可以输出预测 真值对照、且坐标已转换到相机空间的完整可视化python demo/interhand3d_img_demo.py \ configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py \ https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3d_all_256x256-b9c1cf4c_20210506.pth \ --json-file tests/data/interhand2.6m/test_interhand2.6m_data.json \ --img-root tests/data/interhand2.6m \ --camera-param-file tests/data/interhand2.6m/test_interhand2.6m_camera.json \ --gt-joints-file tests/data/interhand2.6m/test_interhand2.6m_joint_3d.json \ --out-img-root vis_results \ --rebase-keypoint-height \ --show-ground-truth命令含义拆解pose_config与pose_checkpoint指定了 res50_interhand3d_all_256x256.py 配置及其配套权重--camera-param-file提供相机参数后脚本会把 GT 关节从世界坐标变换到相机坐标并把模型预测的相对深度相对各自手腕的深度借助 GT 手腕深度恢复为绝对深度再转换到相机空间详见第六节--show-ground-truth会在可视化结果中同时绘制 GT 关键点--rebase-keypoint-height将最低有效关键点的高度归零使姿态落地在统一基准上便于比较左右手与帧间姿态。权重下载提示上述命令中的 checkpoint 为演示文档中附带的官方权重。若希望使用模型页面列出的更新版本v1.0256×256 输入含all训练集权重可将 checkpoint 参数替换为模型页面 internet_interhand3d.md 中提供的res50_intehand3dv1.0_all_256x256-42b7f2ac_20210702.pth下载地址。4.3 无 GT 与相机参数的最小示例若只想快速查看预测效果、不关心相机空间坐标可以省略--camera-param-file与--gt-joints-file。此时 GT 3D 关节不可用--show-ground-truth不会生效脚本会打印提示预测关键点直接在像素空间可视化python demo/interhand3d_img_demo.py \ configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py \ https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3d_all_256x256-b9c1cf4c_20210506.pth \ --json-file tests/data/interhand2.6m/test_interhand2.6m_data.json \ --img-root tests/data/interhand2.6m \ --out-img-root vis_results \ --rebase-keypoint-height五、推理与可视化调用链源码解析演示脚本的核心调用链为init_pose_model→ 解析 COCO 标注 →inference_interhand_3d_model→ 后处理 →vis_3d_pose_result。5.1 模型初始化init_pose_modelmmpose/apis/inference.py 中的init_pose_model(config, checkpoint, device)负责读取配置文件mmcv.Config.fromfile、通过build_posenet构建模型、加载 checkpoint并将配置保存在model.cfg中供推理阶段复用最后将模型置于指定设备并切换为eval()模式。5.2 标注解析与数据组装脚本使用xtcocotools.coco.COCO加载--json-file第 105 行遍历每张图像及其标注为每个手部实例组装det_result字典第 153-158 行包含image_name由--img-root与标注中的file_name拼接bbox标注中的手部边界框xywh格式camera_param按capture→camera两级索引从相机参数文件中取出并经_transform_interhand_camera_param转换格式见 5.4keypoints_3d_gt按capture→frame_idx索引取出 GT 关节将world_coord与joint_valid沿最后一维拼接成[42, 4]的数组。5.3 核心推理inference_interhand_3d_modelmmpose/apis/inference_3d.py 中的inference_interhand_3d_model(model, img_or_path, det_results, ...)完成单图多框推理流程如下从det_results中收集所有边界框支持xywh/xyxy两种格式默认xywh可选的bbox_thr按分数过滤从model.cfg读取test_pipeline并用Compose构建数据预处理管线为每个边界框调用_box2cs计算中心center与尺度scale组装包含joints_3d占位、ann_info图像尺寸、关节数、flip_pairs、深度边界等的data字典其中左右手flip_pairs定义为[[i, 21 i] for i in range(21)]数据经过 pipeline 后collate、scatter到推理设备在torch.no_grad()下前向得到preds3D 关键点、rel_root_depth相对根深度与hand_type左右手类型三部分输出后处理将rel_root_depth加到左手索引 21 及之后关节的深度通道上并按hand_type对左右手关键点的置信度加权第 603-608 行。5.4 相机参数格式转换InterHand2.6M 的原始相机参数格式camrot为世界到相机的旋转矩阵、campos为相机在世界空间的位置、focal、princpt与SimpleCamera期望的格式R为相机到世界的旋转、T为平移、f、c并不一致因此 demo/interhand3d_img_demo.py 中的_transform_interhand_camera_param做了如下转换camera_param[R] np.array(interhand_camera_param[camrot]).T camera_param[T] np.array(interhand_camera_param[campos])[:, None] camera_param[f] np.array(interhand_camera_param[focal])[:, None] camera_param[c] np.array(interhand_camera_param[princpt])[:, None]即对旋转矩阵转置、把 3×1 的位置向量重塑为列向量。转换后的参数交给 mmpose/core/camera/single_camera.py 中的SimpleCameraworld_to_camera第 85 行将世界坐标转到相机坐标pixel_to_camera第 117 行利用焦距f与主点c将像素空间坐标含深度反投影到相机空间。5.5 演示脚本的后处理与可视化推理结果返回后演示脚本在 第 170-235 行 做如下后处理分数归一化若关键点分数的最大值大于 1模型输出为 0~255 或 0~1 的差异统一除以 255提取 2D 关键点取 3D 关键点的前两维与分数维作为像素空间 2D 关键点坐标空间转换当同时提供相机参数与 GT 3D 关节时将 GT 从世界坐标转到相机坐标用 GT 手腕右手索引 20、左手索引 41的深度把模型预测的相对深度补齐为绝对深度keypoints_3d[:21, 2] keypoints_3d_gt[20, 2]左手同理用索引 41最后将像素空间关键点反投影到相机空间坐标轴旋转用旋转矩阵vis_R [[1, 0, 0], [0, 0, -1], [0, 1, 0]]将关键点坐标旋转使 z 轴对应高度方向以便直观比较姿态的高低高度归零若指定--rebase-keypoint-height将有效关键点分数大于 0的最小高度减到 0可视化调用 vis_3d_pose_result 绘制骨架结果经model.show_result输出若指定--out-img-root以vis_{i}.jpg命名保存到该目录第 238-242 行。vis_3d_pose_result内置了InterHand3DDataset的骨架连接关系第 408-447 行左右手各 20 条骨骼连线并配有区分手指的颜色。六、模型与配置深度解读6.1 配置结构演示所用的 res50_interhand3d_all_256x256.py 以default_runtime.py与 interhand3d.py 为基座核心设置如下配置项值说明输入尺寸256×256data_cfg.image_size3D 热图尺寸64×64×64data_cfg.heatmap_size深度边界heatmap3d_depth_bound400.0、root_depth_bound400.0关键点 3D 热图与根深度 1D 热图的深度量化边界单位 mm输出通道42左右手各 21 个关节骨干网络ResNetdepth50预训练权重torchvision://resnet50优化器Adamlr2e-4total_epochs20学习率在 epoch 15、17 阶梯下降评价指标MRRPE、MPJPE、Handedness_acc相对根深度误差、关节误差、左右手判别准确率save_bestMPJPE_all6.2 三分支头部Interhand3DHead模型头部 interhand_3d_head.py 的Interhand3DHead由三个子分支组成前向见 第 383-392 行关键点头keypoint_head_cfg输出21×64通道的 3D 热图depth_size64配合 3 层反卷积 256 通道对左右手各 21 个关节的深度维进行 64 层量化解码时将热图索引映射回毫米级深度见 decode 实现根深度头root_head_cfg输出 64 格的 1D 热图预测左右手腕的相对深度解码后得到rel_root_depth第 514-517 行手型分类头hand_type_head_cfg输出 2 分类左右手解码为hand_type第 519-520 行用于区分左右手并对置信度加权。三个分支的监督损失分别为JointsMSELoss3D 热图、L1Loss相对根深度、BCELoss手型分类与推理时preds / rel_root_depth / hand_type三路输出一一对应。数据侧训练与测试数据由 mmpose/datasets/datasets/hand/interhand3d_dataset.py 的InterHand3DDataset提供支持use_gt_root_depth使用 GT 手腕深度或来自rootnet_result_file的深度等选项。6.3 参考精度根据模型页面 internet_interhand3d.md 的记录InterNet_resnet_50256×256在 InterHand2.6M 上的官方结果为test(HM) 集 MPJPE-all 11.59mm、MRRPE 29.28mm、APh 0.99val(M) 集 MPJPE-all 13.16mm、MRRPE 31.73mm、APh 0.98。这些数字可作为运行演示后主观观察的量化参考。七、测试验证仓库在 tests/test_apis/test_inference_3d.py 中提供了test_interhand3d_demo测试用例完整覆盖了本演示的核心路径在 CPU 上构建 res50_interhand3d_all_256x256.py 模型不加载权重用tests/data/interhand2.6m/image2017.jpg与一个人为指定的bbox[50, 50, 50, 50]构造det_result调用inference_interhand_3d_model推理并调用vis_3d_pose_result可视化验证空det_results的边界情况返回空列表若 CUDA 可用额外验证 GPU 推理路径验证传入未知数据集名会抛出NotImplementedError。该测试证明即使不加载任何训练权重模型结构、数据管线与推理接口也能完整走通——因此演示脚本可以放心地在 CPU 上进行流程调试。八、常见问题与注意事项必须提供--show或--out-img-root之一否则脚本因assert直接退出--camera-param-file与--gt-joints-file需成对提供才有最佳效果只有两者同时给出预测才能转换到相机空间并叠加 GT 对照只给其一或都不给时关键点将在像素空间可视化--show-ground-truth会打印提示而不生效设备选择默认cuda:0无 GPU 时将--device指定为cpu测试用例证实该链路在 CPU 上可完整运行数据格式--json-file必须是 COCO 标注格式含images与annotations字段边界框为xywh相机与关节文件的索引层级capture/frame_idx必须与标注中的capture、frame_idx字段一致深度边界语义heatmap3d_depth_bound与root_depth_bound定义了 3D 热图的深度量化范围更换数据集或相机时需检查是否匹配完整数据集路径使用完整 InterHand2.6M 时按 docs/en/tasks/3d_hand_keypoint.md 组织data/interhand2.6m目录并保持配置中ann_file、camera_file、joint_file、img_prefix与之一致。通过本文你可以从一张带 GT 边界框标注的手部图像出发完整复现 3D 手部姿态的推理、坐标变换与可视化流程并理解从inference_interhand_3d_model到Interhand3DHead三分支解码、再到SimpleCamera相机投影的完整技术链路。赞分享人工智能计算机视觉深度学习【免费下载链接】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 仓库 3D 手部姿态估计3D Hand Pose Estimation实战指南InterNet 与 InterHand2.6M 数据集ViTPose 仓库 3D 手部姿态估计3D Hand Pose Estimation实战指南InterNet 与 InterHand2.6M 数据集 导人工智能计算机视觉深度学习ViTPose 仓库 2D 手部姿态估计Hand Keypoint完整指南任务定义、数据准备与推理演示ViTPose 仓库 2D 手部姿态估计Hand Keypoint完整指南任务定义、数据准备与推理演示 2D 手部姿态估计2D Hand Pose Es人工智能计算机视觉深度学习ViTPose 仓库单视图 3D 人体姿态估计实践2D-to-3D Pose Lifting 原理、配置与 Demo 全解析ViTPose 仓库单视图 3D 人体姿态估计实践2D to 3D Pose Lifting 原理、配置与 Demo 全解析 本篇技术指南以 configs/人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑