news 2026/9/17 23:16:08

MMPose 推理实战指南:MMPoseInferencer 统一接口与底层 Python 推理 API 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MMPose 推理实战指南:MMPoseInferencer 统一接口与底层 Python 推理 API 详解

MMPose 推理实战指南:MMPoseInferencer 统一接口与底层 Python 推理 API 详解

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

本文基于 MMPose 官方用户指南《使用现有模型进行推理》,系统讲解 MMPose 执行姿态估计推理的两种接口——面向快速上手的统一推理器MMPoseInferencer(含 CLI 工具、结果转储、可视化与全部参数说明、模型别名体系)和面向深度定制的底层 Python 推理 API(init_model/inference_topdown/ 可视化器)。读完后,你可以用别名一行代码完成人体/手部/面部/动物/全身/3D 姿态推理,也可以在自己的管线中精细控制输入边界框、数据样本与可视化输出。

两种推理接口概览

MMPose 为姿态估计提供了大量预测训练好的模型(模型清单可参考仓库根目录的 model-index.yml)。针对“如何使用训练好的模型对图像或视频运行姿态估计”,MMPose 提供了两种推理接口:

接口特点适用人群
推理器(Inferencer)统一的推理接口,自动处理输入检测、结果转储与可视化所有用户,尤其是快速验证与部署场景
推理 API(Python API)更灵活的自定义推理,需自行处理输入和输出熟悉 MMPose 内部机制、需要深度定制的用户

两条路线的核心实现都位于 mmpose/apis 目录:推理器实现见 mmpose/apis/inferencers,底层 API 实现见 mmpose/apis/inference.py 与 mmpose/apis/visualization.py。

推理器:统一的推理接口

MMPose 提供了一个被称为MMPoseInferencer(mmpose/apis/inferencers/mmpose_inferencer.py)的、全面的推理 API。这个 API 使得用户得以使用所有 MMPose 支持的模型来对图像和视频进行模型推理。此外,该 API 可以完成推理结果自动化,并方便用户保存预测结果。

从源码结构看,MMPoseInferencer是一个“门面”类:它在构造函数中根据参数选择底层推理器——指定pose3d时构建Pose3DInferencer(含hand3d时构建Hand3DInferencer),指定pose2d时构建Pose2DInferencer(mmpose/apis/inferencers/mmpose_inferencer.py)。而preprocess(数据准备)、forward(模型前向)、visualize(可视化)、postprocess(结果打包与转储)四阶段的公共逻辑则集中在基类 BaseMMPoseInferencer 中实现。

基本用法

MMPoseInferencer可以在任何 Python 程序中被用来执行姿态估计任务。以下是在 Python Shell 中使用预训练的人体姿态模型对给定图像进行推理的示例:

from mmpose.apis import MMPoseInferencer img_path = 'tests/data/coco/000000000785.jpg' # 将img_path替换给你自己的路径 # 使用模型别名创建推理器 inferencer = MMPoseInferencer('human') # MMPoseInferencer采用了惰性推断方法,在给定输入时创建一个预测生成器 result_generator = inferencer(img_path, show=True) result = next(result_generator)

如果一切正常,你将在一个新窗口中看到输入图像上叠加估计姿态(关键点 + 骨架)的可视化窗口。

result变量是一个包含两个键'visualization''predictions'的字典:

  • 'visualization'键对应的值是一个列表:
    • 包含可视化结果,例如输入图像、估计姿态的标记,以及可选的预测热图。
    • 如果没有指定return_vis参数,该列表将保持为空。
  • 'predictions'键对应的值是一个包含每张图像、每个检测实例预估关键点的列表。

result字典的结构如下所示:

result = { 'visualization': [ # 元素数量:batch_size(默认为1) vis_image_1, ... ], 'predictions': [ # 每张图像的姿态估计结果 # 元素数量:batch_size(默认为1) [ # 每个检测到的实例的姿态信息 # 元素数量:检测到的实例数 {'keypoints': ..., # 实例 1 'keypoint_scores': ..., ... }, {'keypoints': ..., # 实例 2 'keypoint_scores': ..., ... }, ] ... ] }

这段结果打包逻辑可以在 BaseMMPoseInferencer.postprocess 中得到印证:默认情况下预测会被split_instances拆分为可 JSON 序列化的实例字典列表;如果传入return_datasamples=True,则会保留原始的PoseDataSample对象。单元测试 test_mmpose_inferencer.py 中同样断言了results1['predictions'][0][0]含有 17 个 COCO 关键点,以及return_datasamples=True时返回PoseDataSample类型。

命令行界面工具(CLI):inferencer_demo.py

除了 Python 接口,还可以使用命令行界面工具 demo/inferencer_demo.py。这个工具允许用户使用以下命令使用相同的模型和输入执行推理:

python demo/inferencer_demo.py 'tests/data/coco/000000000785.jpg' \ --pose2d 'human' --show --pred-out-dir 'predictions'

预测结果将被保存在路径predictions/000000000785.json。作为 API,inferencer_demo.py的输入参数与MMPoseInferencer相同:源码中parse_args()(demo/inferencer_demo.py)把参数划分为初始化参数(--pose2d--pose2d-weights--pose3d--pose3d-weights--det-model--det-weights--det-cat-ids--scope--device--show-progress)和调用参数(--show--bbox-thr--nms-thr--pose-based-nms--kpt-thr--radius--thickness--skeleton-style--vis-out-dir--pred-out-dir等),最终通过MMPoseInferencer(**init_args)inferencer(**call_args)完成推理,与 Python 接口完全一致。

该 CLI 能够处理一系列输入类型:

  • 图像路径
  • 视频路径
  • 文件夹路径(这会导致该文件夹中的所有图像都被推断出来)
  • 表示图像的 numpy array(在命令行界面工具中未支持)
  • 表示图像的 numpy array 列表(在命令行界面工具中未支持)
  • 摄像头(在这种情况下,输入参数应该设置为webcamwebcam:{CAMERA_ID}

源码中,输入归一化由 BaseMMPoseInferencer._inputs_to_list 完成:字符串路径会被识别为目录(仅收集其中的图像文件并排序)、视频(通过mmcv.VideoReader逐帧读取)或单张图像;numpy 数组则被包装为单元素列表。对于摄像头输入,_get_webcam_inputs 会解析webcam:id格式(省略 id 时默认为 0),并按帧产出 BGR 图像。

当输入对应于多个图像时,例如输入为视频文件夹路径时,推理生成器必须被遍历,以便推理器对视频/文件夹中的所有帧/图像进行推理。以下是一个示例:

folder_path = 'tests/data/coco' result_generator = inferencer(folder_path, show=True) results = [result for result in result_generator]

在这个示例中,inferencer接受folder_path作为输入,并返回一个生成器对象(result_generator),用于生成推理结果。通过遍历result_generator并将每个结果存储在results列表中,你可以获得视频/文件夹中所有帧/图像的推理结果。

对于视频输入还有一个源码级细节:所有帧的预测会先在内部缓冲(video_info['predictions']),推理结束后由 _finalize_video_processing 统一写出——可视化结果合成一个与输入同名的.mp4视频,预测结果则合并为单个 JSON 文件(每帧带frame_id字段),而不是逐帧一个文件(源码)。

自定义姿态估计模型

MMPoseInferencer提供了几种可用于自定义所使用的模型的方法:

# 使用模型别名构建推理器 inferencer = MMPoseInferencer('human') # 使用模型配置名构建推理器 inferencer = MMPoseInferencer('td-hm_hrnet-w32_8xb64-210e_coco-256x192') # 使用 3D 模型配置名构建推理器 inferencer = MMPoseInferencer(pose3d="motionbert_dstformer-ft-243frm_8xb32-120e_h36m") # 使用模型配置文件和权重文件的路径或 URL 构建推理器 inferencer = MMPoseInferencer( pose2d='configs/body_2d_keypoint/topdown_heatmap/coco/' \ 'td-hm_hrnet-w32_8xb64-210e_coco-256x192.py', pose2d_weights='https://download.openmmlab.com/mmpose/top_down/' \ 'hrnet/hrnet_w32_coco_256x192-c78dce93_20200708.pth' )

也就是说,pose2d参数可以接受三种形式:模型别名(如'human')、metafile 中定义的配置名(如'td-hm_hrnet-w32_8xb64-210e_coco-256x192')、或直接指向配置文件的相对/绝对路径;当使用配置名且未显式提供pose2d_weights时,权重将从 metafile 自动加载。

上述代码为 2D 模型推理器的构建例子。3D 模型的推理器可以用类似的方式通过pose3d参数构建:

# 使用 3D 模型别名构建推理器 inferencer = MMPoseInferencer(pose3d="human3d") # 使用 3D 模型配置名构建推理器 inferencer = MMPoseInferencer(pose3d="motionbert_dstformer-ft-243frm_8xb32-120e_h36m") # 使用 3D 模型配置文件和权重文件的路径或 URL 构建推理器 inferencer = MMPoseInferencer( pose3d='configs/body_3d_keypoint/motionbert/h36m/' \ 'motionbert_dstformer-ft-243frm_8xb32-120e_h36m.py', pose3d_weights='https://download.openmmlab.com/mmpose/v1/body_3d_keypoint/' \ 'pose_lift/h36m/motionbert_ft_h36m-d80af323_20230531.pth' )

此外,自顶向下的姿态估计器还需要一个对象检测模型。MMPoseInferencer能够推断用 MMPose 支持的数据集训练的模型的实例类型,然后构建必要的对象检测模型。这个“自动推断”机制的实现在 BaseMMPoseInferencer._init_detector 中:它会从姿态模型配置的数据集类型解析出目标类别(human / face / hand / animal 等),再从 default_det_models.py 的默认映射表取出对应的检测器配置、权重与类别 id;映射表覆盖human(RTMDet-m,person 类别)、face(YOLOX-s,face 类别)、handanimal(COCO 动物类别 15-23)等。用户也可以通过以下方式手动指定检测模型:

# 通过别名指定检测模型 # 可用的别名包括“human”、“hand”、“face”、“animal”、 # 以及mmdet中定义的任何其他别名 inferencer = MMPoseInferencer( # 假设姿态估计器是在自定义数据集上训练的 pose2d='custom_human_pose_estimator.py', pose2d_weights='custom_human_pose_estimator.pth', det_model='human' ) # 使用模型配置名称指定检测模型 inferencer = MMPoseInferencer( pose2d='human', det_model='yolox_l_8x8_300e_coco', det_cat_ids=[0], # 指定'human'类的类别id ) # 使用模型配置文件和权重文件的路径或URL构建推理器 inferencer = MMPoseInferencer( pose2d='human', det_model=f'{PATH_TO_MMDET}/configs/yolox/yolox_l_8x8_300e_coco.py', det_weights='https://download.openmmlab.com/mmdetection/v2.0/' \ 'yolox/yolox_l_8x8_300e_coco/' \ 'yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth', det_cat_ids=[0], # 指定'human'类的类别id )

需要注意:top-down 推理器依赖 MMDetection 提供的DetInferencer(需要 mmdet 3.0.0 及以上版本),这一点在 BaseMMPoseInferencer 的导入兼容处理中可见;若检测到数据集类型不在默认映射表内(例如全图类数据集),也可以通过det_model='whole_image'关闭检测器,直接以整图作为边界框。

转储结果

在执行姿态估计推理任务之后,你可能希望保存结果以供进一步分析或处理。本节将指导你将预测的关键点和可视化结果保存到本地。

要将预测保存在JSON 文件中,在运行MMPoseInferencer实例inferencer时使用pred_out_dir参数:

result_generator = inferencer(img_path, pred_out_dir='predictions') result = next(result_generator)

预测结果将以 JSON 格式保存在predictions/文件夹中,每个文件以相应的输入图像或视频的名称命名(源码中文件名为输入路径的 basename 加上.json,见 postprocess)。

对于更高级的场景,还可以直接从inferencer返回的result字典中访问预测结果。其中,predictions包含输入图像或视频中每个单独实例的预测关键点列表。然后,你可以使用你喜欢的方法操作或存储这些结果。

请记住,如果你想将可视化图像和预测文件保存在一个文件夹中,你可以使用out_dir参数:

result_generator = inferencer(img_path, out_dir='output') result = next(result_generator)

在这种情况下,依据 MMPoseInferencer.call的实现,可视化图像将保存在output/visualizations/文件夹中,而预测将存储在output/predictations/文件夹中(当未单独指定vis_out_dir/pred_out_dir时,二者会被自动设置为f'{out_dir}/visualizations'f'{out_dir}/predictions')。

可视化

推理器inferencer可以自动对输入的图像或视频进行预测。可视化结果可以显示在一个新的窗口中,并保存在本地。

要在新窗口中查看可视化结果,使用show=True。请注意:

  • 如果输入视频来自网络摄像头,默认情况下将在新窗口中显示可视化结果,以此让用户看到输入——源码中对webcam输入会强制打开显示模式,并给出相应警告(mmpose_inferencer.py)。
  • 如果平台上没有 GUI,这个步骤可能会卡住。

要将可视化结果保存在本地,可以像这样指定vis_out_dir参数:

result_generator = inferencer(img_path, vis_out_dir='vis_results') result = next(result_generator)

输入图片或视频的可视化预测结果将保存在vis_results/文件夹中。

在开头展示的滑雪图中,姿态的可视化估计结果由关键点(用实心圆描绘)和骨架(用线条表示)组成。这些视觉元素的默认大小可能不会产生令人满意的结果。用户可以使用radiusthickness参数来调整圆的大小和线的粗细,如下所示:

result_generator = inferencer(img_path, show=True, radius=4, thickness=2) result = next(result_generator)

从源码看,这些参数在 BaseMMPoseInferencer.visualize 中生效:radius会赋值给可视化器的visualizer.radiusthickness赋值给visualizer.line_width;默认值为radius=3thickness=1kpt_thr=0.3(关键点分数阈值,低于该值的关键点不绘制)。此外还有black_background=True可在纯黑背景上绘制姿态(img = img * 0),适合单独导出骨架动画。

推理器参数

MMPoseInferencer提供了各种自定义姿态估计、可视化和保存预测结果的参数。源码中,所有调用参数会按四个白名单集合被分发到对应阶段(preprocess_kwargsforward_kwargsvisualize_kwargspostprocess_kwargs,见 mmpose_inferencer.py),不属于任何集合的键会被直接过滤掉——这也是自定义参数时“不报错但不生效”的原因。

下面是初始化推理器时可用的参数列表及对这些参数的描述:

ArgumentDescription
pose2d指定 2D 姿态估计模型的模型别名、配置文件名称或配置文件路径。
pose2d_weights指定 2D 姿态估计模型权重文件的 URL 或本地路径。
pose3d指定 3D 姿态估计模型的模型别名、配置文件名称或配置文件路径。
pose3d_weights指定 3D 姿态估计模型权重文件的 URL 或本地路径。
det_model指定对象检测模型的模型别名、配置文件名或配置文件路径。
det_weights指定对象检测模型权重文件的 URL 或本地路径。
det_cat_ids指定与要检测的对象类对应的类别 id 列表。
device执行推理的设备。如果为None,推理器将选择最合适的一个。
scope定义模型模块的名称空间(默认为'mmpose')。
show_progress是否在推理循环中显示进度条(源码 构造函数 支持,CLI 对应--show-progress)。

推理器被设计用于可视化和保存预测。以下表格列出了在使用MMPoseInferencer进行推断时可用的参数列表,以及它们与 2D 和 3D 推理器的兼容性:

参数描述2D3D
show控制是否在弹出窗口中显示图像或视频。✔️✔️
radius设置可视化关键点的半径。✔️✔️
thickness确定可视化链接的厚度。✔️✔️
kpt_thr设置关键点分数阈值。分数超过此阈值的关键点将被显示。✔️✔️
draw_bbox决定是否显示实例的边界框。✔️✔️
draw_heatmap决定是否绘制预测的热图。✔️
black_background决定是否在黑色背景上显示预估的姿势。✔️
skeleton_style设置骨架样式。可选项包括'mmpose'(默认)和'openpose'✔️
use_oks_tracking决定是否在追踪中使用 OKS 作为相似度测量。✔️
tracking_thr设置追踪的相似度阈值。✔️
disable_norm_pose_2d决定是否将边界框缩放至数据集的平均边界框尺寸,并将边界框移至数据集的平均边界框中心。✔️
disable_rebase_keypoint决定是否将最低关键点的高度置为 0。✔️
num_instances设置可视化结果中显示的实例数量。如果设置为负数,则所有实例的结果都会可视化。✔️
return_vis决定是否在结果中包含可视化图像。✔️✔️
vis_out_dir定义保存可视化图像的文件夹路径。如果未设置,将不保存可视化图像。✔️✔️
return_datasamples决定是否以PoseDataSample格式返回预测。✔️✔️
pred_out_dir指定保存预测的文件夹路径。如果未设置,将不保存预测。✔️✔️
out_dir如果vis_out_dirpred_out_dir未设置,它们将分别设置为f'{out_dir}/visualizations'f'{out_dir}/predictions'✔️✔️

补充两个源码中可查证的预处理参数:bbox_thr(边界框分数阈值,默认 0.3)与nms_thr(边界框 IoU 阈值,默认 0.3)作用于 top-down 预处理阶段(Pose2DInferencer.preprocess_single);对 bottom-up 模型,这两个值会被直接写入模型 head 的test_cfgscore_thr/nms_thr,见 base_mmpose_inferencer.py),用于过滤预测。forward阶段还有merge_results(top-down 多边界框结果合并)与pose_based_nms(基于邻近关节数去重的 NMS,见 pose2d_inferencer.py),后者在 CLI 中默认对yoloxposertmo类 one-stage 模型启用(demo/inferencer_demo.py)。

skeleton_style的生效位置在 Pose2DInferencer.update_model_visualizer_settings:取值只能是'mmpose''openpose',否则抛出ValueErrordraw_heatmap则通过model.test_cfg['output_heatmaps']控制模型是否输出热图供可视化叠加。

模型别名

MMPose 为常用模型提供了一组预定义的别名。在初始化MMPoseInferencer时,这些别名可以用作简略的表达方式,而不是指定完整的模型配置名称。下面是可用的模型别名及其对应的配置名称的列表:

别名配置文件名称对应任务姿态估计模型检测模型
animalrtmpose-m_8xb64-210e_ap10k-256x256动物姿态估计RTMPose-mRTMDet-m
humanrtmpose-m_8xb256-420e_body8-256x192人体姿态估计RTMPose-mRTMDet-m
body26rtmpose-m_8xb512-700e_body8-halpe26-256x192人体姿态估计RTMPose-mRTMDet-m
facertmpose-m_8xb256-120e_face6-256x256人脸关键点检测RTMPose-myolox-s
handrtmpose-m_8xb256-210e_hand5-256x256手部关键点检测RTMPose-mssdlite_mobilenetv2
wholebodyrtmpose-m_8xb64-270e_coco-wholebody-256x192人体全身姿态估计RTMPose-mRTMDet-m
vitposetd-hm_ViTPose-base-simple_8xb64-210e_coco-256x192人体姿态估计ViTPose-baseRTMDet-m
vitpose-std-hm_ViTPose-small-simple_8xb64-210e_coco-256x192人体姿态估计ViTPose-smallRTMDet-m
vitpose-btd-hm_ViTPose-base-simple_8xb64-210e_coco-256x192人体姿态估计ViTPose-baseRTMDet-m
vitpose-ltd-hm_ViTPose-large-simple_8xb64-210e_coco-256x192人体姿态估计ViTPose-largeRTMDet-m
vitpose-htd-hm_ViTPose-huge-simple_8xb64-210e_coco-256x192人体姿态估计ViTPose-hugeRTMDet-m

下表列出了可用的 3D 姿态估计模型别名及其对应的配置文件:

别名配置文件名称对应任务3D 姿态估计模型2D 姿态估计模型检测模型
human3dvid_pl_motionbert_8xb32-120e_h36m3D 人体姿态估计MotionBertRTMPose-mRTMDet-m
hand3dinternet_res50_4xb16-20e_interhand3d-256x2563D 手部关键点检测InterNet-全图

从源码结构看,别名并非硬编码在推理器中:get_model_alias.py 的get_model_aliases()会从仓库/安装目录的 metafile(即 model-index.yml)中读取每个模型条目的Alias字段(支持字符串或字符串列表,因此一个模型可以有多个别名,如bodyhuman等价、wholebody复用human检测配置),生成“别名 -> 配置名”字典。

此外,用户可以使用命令行界面工具显示所有可用的别名,使用以下命令:

python demo/inferencer_demo.py --show-alias

推理 API:用于更加灵活的自定义推理

MMPose 还提供了单独的 Python API 用于不同模型的推理,这种推理方式更加灵活,但是需要用户自己处理输入和输出,因此适合于熟悉 MMPose的用户。

MMPose 提供的 Python 推理接口存放于 mmpose/apis 目录下,以下是一个构建 topdown 模型并进行推理的示例:

构建模型

from mmcv.image import imread from mmpose.apis import inference_topdown, init_model from mmpose.registry import VISUALIZERS from mmpose.structures import merge_data_samples model_cfg = 'configs/body_2d_keypoint/rtmpose/coco/rtmpose-m_8xb256-420e_coco-256x192.py' ckpt = 'https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-body7_pt-body7-halpe26_700e-256x192-4d3e73dd_20230605.pth' device = 'cuda' # 使用初始化接口构建模型 model = init_model(model_cfg, ckpt, device=device)

对应实现为 mmpose/apis/inference.py 中的init_model(config, checkpoint=None, device='cuda:0', cfg_options=None),其行为要点(均可在源码中确认):

  • 接受配置文件路径、PathConfig对象;cfg_options可用于覆盖配置项;
  • 通过build_pose_estimator构建模型,并用revert_sync_batchnorm还原 SyncBN,便于单机推理;
  • dataset_meta的加载优先级为checkpoint 中的 meta > 模型配置 > 默认 COCO meta(源码),如果三者都取不到会警告并回退到configs/_base_/datasets/coco.py的 metainfo;
  • 未提供 checkpoint 时模型以随机权重运行,仅用于打通管线;
  • 最终model.eval()并把完整配置挂在model.cfg上,供后续推理与可视化取用 pipeline / visualizer 配置。

推理

img_path = 'tests/data/coco/000000000785.jpg' # 单张图片推理 batch_results = inference_topdown(model, img_path)

inference_topdown(model, img, bboxes=None, bbox_format='xyxy')的完整签名(mmpose/apis/inference.py)中,bboxes支持传入 N×4 的边界框列表,bbox_format可选'xyxy''xywh'(后者会自动转换);不传bboxes时,会把整张图片当作单个边界框处理。每个边界框会走一遍配置中的test_dataloader.dataset.pipeline,经pseudo_collate打包后调用model.test_step,返回List[PoseDataSample]。对 bottom-up 模型,则使用同文件中的inference_bottomup(model, img)

推理接口返回的结果是一个PoseDataSample列表,每个PoseDataSample对应一张图片的推理结果。PoseDataSample的结构如下所示:

[ <PoseDataSample( ori_shape: (425, 640) img_path: 'tests/data/coco/000000000785.jpg' input_size: (192, 256) flip_indices: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15] img_shape: (425, 640) gt_instances: <InstanceData( bboxes: array([[ 0., 0., 640., 425.]], dtype=float32) bbox_centers: array([[320. , 212.5]], dtype=float32) bbox_scales: array([[ 800. , 1066.6666]], dtype=float32) bbox_scores: array([1.], dtype=float32) )> gt_instance_labels: <InstanceData()> pred_instances: <InstanceData( keypoints: array([[[365.83333333, 87.50000477], [372.08333333, 79.16667175], [361.66666667, 81.25000501], [384.58333333, 85.41667151], [357.5 , 85.41667151], [407.5 , 112.50000381], [363.75 , 125.00000334], [438.75 , 150.00000238], [347.08333333, 158.3333354 ], [451.25 , 170.83333492], [305.41666667, 177.08333468], [432.5 , 214.58333325], [401.25 , 218.74999976], [430.41666667, 285.41666389], [370. , 274.99999762], [470. , 356.24999452], [403.33333333, 343.74999499]]]) bbox_scores: array([1.], dtype=float32) bboxes: array([[ 0., 0., 640., 425.]], dtype=float32) keypoint_scores: array([[0.8720184 , 0.9068178 , 0.89255375, 0.94684595, 0.83111566, 0.9929208 , 1.0862956 , 0.9265839 , 0.9781244 , 0.9008082 , 0.9043166 , 1.0150217 , 1.1122335 , 1.0207931 , 1.0099326 , 1.0480015 , 1.0897669 ]], dtype=float32) keypoints_visible: array([[0.8720184 , 0.9068178 , 0.89255375, 0.94684595, 0.83111566, 0.9929208 , 1.0862956 , 0.9265839 , 0.9781244 , 0.9008082 , 0.9043166 , 1.0150217 , 1.1122335 , 1.0207931 , 1.0099326 , 1.0480015 , 1.0897669 ]], dtype=float32) )> )> ]

其中pred_instances.keypointspred_instances.keypoint_scores即最终预测(形状为 N×K×2 与 N×K,N 为实例数、K 为关键点数)。用户可以通过.来访问PoseDataSample中的数据,例如:

pred_instances = batch_results[0].pred_instances pred_instances.keypoints # array([[[365.83333333, 87.50000477], # [372.08333333, 79.16667175], # [361.66666667, 81.25000501], # [384.58333333, 85.41667151], # [357.5 , 85.41667151], # [407.5 , 112.50000381], # [363.75 , 125.00000334], # [438.75 , 150.00000238], # [347.08333333, 158.3333354 ], # [451.25 , 170.83333492], # [305.41666667, 177.08333468], # [432.5 , 214.58333325], # [401.25 , 218.74999976], # [430.41666667, 285.41666389], # [370. , 274.99999762], # [470. , 356.24999452], # [403.33333333, 343.74999499]]])

可视化

在 MMPose 中,大部分可视化基于可视化器实现。可视化器是一个类,它接受数据样本并将其可视化。MMPose 提供了一个可视化器注册表,用户可以使用VISUALIZERS来实例化它。以下是一个使用可视化器可视化推理结果的示例:

# 将推理结果打包 results = merge_data_samples(batch_results) # 初始化可视化器 visualizer = VISUALIZERS.build(model.cfg.visualizer) # 设置数据集元信息 visualizer.set_dataset_meta(model.dataset_meta) img = imread(img_path, channel_order='rgb') # 可视化 visualizer.add_datasample( 'result', img, data_sample=results, show=True)

set_dataset_meta传入的model.dataset_meta决定了关键点的颜色、名称与骨架连接关系(skeleton),它与训练配置中的数据 metainfo(如 configs/base/datasets/coco.py)保持一致;而可视化器配置model.cfg.visualizer决定了窗口尺寸、线宽等渲染细节。

MMPose 也提供了更简洁的可视化接口(实现在 mmpose/apis/visualization.py),它内部自动创建PoseLocalVisualizer、解析 metainfo、包装临时PoseDataSample并调用add_datasample

from mmpose.apis import visualize pred_instances = batch_results[0].pred_instances keypoints = pred_instances.keypoints keypoint_scores = pred_instances.keypoint_scores metainfo = 'configs/_base_/datasets/coco.py' visualize( img_path, keypoints, keypoint_scores, metainfo=metainfo, show=True)

visualize还支持visualizer(传入已有可视化器实例,会被 deepcopy 以避免状态污染)、show_kpt_idx(标注关键点序号)、skeleton_style'mmpose'/'openpose'两种骨架风格,非法取值会触发断言错误)、kpt_thr(关键点分数阈值,默认 0.3)等参数,适合在自有可视化流程中直接绘制任意关键点数据。

源码印证:一条推理链的完整闭环

把两条接口对照源码,可以看到它们共享同一套底层组件:

  1. 数据准备:推理器在 Pose2DInferencer.preprocess_single 中完成“检测 -> 边界框过滤(bbox_thr/nms_thr)-> 逐框跑 pipeline”的流程;若检测器未检出任何实例,则回退为“整图一个边界框”(与底层 APIinference_topdown不传bboxes时的行为一致)。
  2. 模型前向model.test_step完成推理,top-down 多框结果由merge_data_samples合并(对应 mmpose/structures 中的merge_data_samples)。
  3. 可视化与转储visualizepostprocess分别处理vis_out_dir/return_vispred_out_dir
  4. 测试保障:test_mmpose_inferencer.py 系统性地验证了图像路径、numpy 数组、目录、视频四类输入下推理器输出的键结构与产物数量(visualizations/predictions/下的文件数),以及human3d别名在视频输入下的行为;底层 API 则有 test_inference.py 覆盖。

小结:如果你的目标是“拿到结果并保存”,优先使用MMPoseInferencer(别名一行构建,CLI 一条命令完成,参数覆盖可视化与转储);如果你的目标是“把姿态估计嵌入自有管线并完全掌控中间数据(自定义边界框、PoseDataSample级访问、自定义可视化器)”,则选择init_model+inference_topdown/inference_bottomup+VISUALIZERS的底层组合。两条路线的关键实现都集中在 mmpose/apis,可直接对照上文引用的文件路径逐行验证。

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 23:14:01

从Keil到VS Code:STM32嵌入式AI编程环境搭建指南

1. 从 Keil 换到 VS Code&#xff0c;这一步到底图什么做嵌入式这一行十年&#xff0c;前八年我的电脑上一直躺着 Keil。它没坏&#xff0c;编译也快&#xff0c;问题是这几年我的工作方式变了——代码里有一半是 AI 帮我写的&#xff0c;调试思路有一半是 AI 帮我理的&#xf…

作者头像 李华
网站建设 2026/9/17 23:09:16

FanControl 5分钟风扇调速完全指南:从安装到静音

FanControl 5分钟风扇调速完全指南&#xff1a;从安装到静音 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…

作者头像 李华
网站建设 2026/9/17 23:07:22

PyCharm+TeXiFy:Mac上可编程LaTeX工作流实战指南

1. 为什么Mac用户在PyCharm里写LaTeX不是“折腾”&#xff0c;而是效率跃迁的起点你是不是也经历过这样的场景&#xff1a;用Typora写技术文档&#xff0c;公式一多就卡顿&#xff1b;用Overleaf在线编辑&#xff0c;网络稍有波动就丢稿&#xff1b;用TeXShop排版论文&#xff…

作者头像 李华