MMPose 实战问题排查指南:安装版本兼容、数据准备与训练/评估/推理排错详解
2026/9/17 3:51:13 网站建设 项目流程

MMPose 实战问题排查指南:安装版本兼容、数据准备与训练/评估/推理排错详解

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

本文基于 MMPose 官方 FAQ 文档(docs/en/faq.md)整理并深度扩充,覆盖用户在安装、数据、训练、评估、推理五个环节最常遇到的问题:MMCV/MMEngine 版本兼容矩阵、xtcocotools 安装失败、mmcv.ops缺失、自定义数据集缺少 bbox、MASTER_PORT冲突、预训练权重键不匹配、训练曲线实时可视化、日志不打印、预测关节点超出 bbox、CPU 推理与推理加速等。读完本篇后,你可以对照仓库源码定位每一类报错的根因,并直接复制可用的配置与命令完成修复。

安装阶段:版本兼容与依赖报错

MMCV/MMEngine 版本不兼容:AssertionError 提示

最典型的安装期报错是导入 mmpose 时的断言失败:

AssertionError: MMCV==xxx is used but incompatible. Please install mmcv>=xxx, <=xxx.

该断言并非凭空而来。在 mmpose/init.py 中,包在导入时即检查两个依赖:

mmcv_minimum_version = '2.0.0rc4' mmcv_maximum_version = '3.0.0' ... mmengine_minimum_version = '0.6.0' mmengine_maximum_version = '1.0.0' assert (mmcv_version >= digit_version(mmcv_minimum_version) and mmcv_version <= digit_version(mmcv_maximum_version)), \ f'MMCV=={mmcv.__version__} is used but incompatible. ' \ f'Please install mmcv>={mmcv_minimum_version}, <={mmcv_maximum_version}.'

也就是说,只要环境中的 mmcv 或 mmengine 版本落在断言区间之外,import mmpose就会立刻失败。报错信息本身已给出应安装的版本范围,按提示重装对应依赖即可。

官方文档给出了 mmdet、mmcv、mmpose 三条主线之间的对应关系:

  • mmdet 2.x <=> mmpose 0.x <=> mmcv 1.x
  • mmdet 3.x <=> mmpose 1.x <=> mmcv 2.x

MMPose 1.x 各版本对应的 MMCV/MMEngine 版本

MMPose 版本MMCV / MMEngine 版本
1.3.2mmcv>=2.0.1, mmengine>=0.9.0
1.3.1mmcv>=2.0.1, mmengine>=0.9.0
1.3.0mmcv>=2.0.1, mmengine>=0.9.0
1.2.0mmcv>=2.0.1, mmengine>=0.8.0
1.1.0mmcv>=2.0.1, mmengine>=0.8.0
1.0.0mmcv>=2.0.0, mmengine>=0.7.0
1.0.0rc1mmcv>=2.0.0rc4, mmengine>=0.6.0
1.0.0rc0mmcv>=2.0.0rc0, mmengine>=0.0.1
1.0.0b0mmcv>=2.0.0rc0, mmengine>=0.0.1

MMPose 0.x 各版本对应的 MMCV 版本

MMPose 版本MMCV 版本
0.x(通配)mmcv-full>=1.3.8, <1.8.0
0.29.0 / 0.28.1mmcv-full>=1.3.8, <1.7.0
0.28.0 / 0.27.0 / 0.26.0 / 0.25.1mmcv-full>=1.3.8, <1.6.0
0.25.0 / 0.24.0 / 0.23.0 / 0.22.0 / 0.21.0mmcv-full>=1.3.8, <1.5.0
0.20.0 / 0.19.0 / 0.18.0 / 0.17.0 / 0.16.0mmcv-full>=1.3.8, <1.4.0
0.14.0 / 0.13.0mmcv-full>=1.1.3, <1.4.0
0.12.0 / 0.11.0 / 0.10.0 / 0.9.0mmcv-full>=1.1.3, <1.3
0.8.0 / 0.7.0mmcv-full>=1.1.1, <1.2

排查顺序建议:先确认自己安装的 mmpose 版本落在上表哪一行,再核对环境中mmcv.__version__mmengine.__version__是否满足区间约束。

无法安装 xtcocotools

xtcocotools 是 COCO 评测(pck 等指标)的底层依赖。官方 FAQ 给出两条路径:

  1. 先用 PyPI 直接安装:

    pip install xtcocotools
  2. 若 PyPI 安装失败,则从 xtcocoapi 项目源码编译安装(克隆仓库后执行python setup.py install)。

这里还有一个仓库层面的细节:在 setup.py 中,解析依赖时若检测到当前运行于 Colab 环境(ON_COLAB),会自动把xtcocotools的依赖项替换为 git 源码地址,因为 Colab 平台与预编译的 PyPI 轮子存在兼容问题。可以推断,如果你在类似受限平台(无预编译轮子、需要本地编译 C++ 扩展)上安装 mmpose,遇到 xtcocotools 失败时采用"源码编译"方案是与官方打包逻辑一致的做法。

"No matching distribution found for xtcocotools>=1.6"

该错误通常意味着当前 Python 环境找不到可用的预编译轮子。官方给出的解法:

  1. 先安装 Cython:pip install cython
  2. 再从源码安装 xtcocotools(即 xtcocoapi 仓库,python setup.py install)。

"No module named 'mmcv.ops'" / "No module named 'mmcv._ext'"

这两个报错说明环境里存在一个"残缺"的 mmcv:只安装了纯 Python 部分(或旧版 mmcv-full),缺少编译后的 C++/CUDA 扩展。修复步骤:

  1. pip uninstall mmcv彻底卸载现有 mmcv;
  2. 按照 mmcv 官方安装文档重新安装完整版 mmcv(包含编译后的mmcv/opsmmcv/_ext模块)。

数据阶段:bbox 缺失与检测框文件

自定义数据集没有 bounding box 标注怎么办

MMPose 的 Top-down 模型需要人体 bbox 来裁剪输入。若你的自定义数据集没有 bbox 标注,官方 FAQ 给出的方案是:以"能紧贴包围全部关键点的最小矩形框"作为该人的 bbox。这是从关键点几何直接推导的降级方案,不需要额外训练检测器,适合先跑通流程。

COCO_val2017_detections_AP_H_56_person.json 是什么?没有它能否训练

该文件包含 COCO 验证集上"检测得到"的人体 bbox,由 FasterRCNN 生成。它的作用是让评估模拟真实部署场景(真实推理时输入是检测框而非真值框)。在配置文件的val_dataloader.dataset中有两种选择:

  • 真值框评估:设置bbox_file=None
  • 检测框评估模型的泛化能力:设置bbox_file='COCO_val2017_detections_AP_H_56_person.json'

因此训练与评测并不强制依赖该文件,但两种设置对应的指标含义不同(检测框模式下指标会偏低,因为它额外包含了检测误差)。

训练阶段:端口冲突、权重加载与日志问题

RuntimeError: Address already in use

分布式训练默认占用固定端口,同一机器上并发跑多个任务时容易冲突。解法是显式指定MASTER_PORT环境变量。官方 FAQ 给出的 Slurm 场景完整示例:

MASTER_PORT=29517 GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh train res50 configs/body_2d_keypoint/topdown_regression/coco/td-reg_res50_8xb64-210e_coco-256x192.py work_dirs/res50_coco_256x192

对照 tools/slurm_train.sh,可以看到该脚本默认GPUS为 8、GPUS_PER_NODE为 8、CPUS_PER_TASK为 5,并通过srun将任务分发到多节点后调用python -u tools/train.py。因此只需在命令行前附加MASTER_PORT=XXXXX即可避免端口抢占。

加载预训练权重时出现 "Unexpected keys in source state dict"

这是正常现象,官方 FAQ 明确说明:预训练分类网络与姿态估计网络结构不同(例如分类头在姿态模型中并不存在),因此源权重中有一部分键在当前模型里找不到对应层,属于预期行为。官方 FAQ 同时指出,在训练加载时这些意外键会被忽略,不影响训练。

如果你想把"用已有姿态模型权重做 backbone 预训练"做规范,可参考 docs/en/migration.md 中 "Migration - Step3: Model - Backbone" 的说明。

如何实时可视化训练精度/损失曲线

修改配置文件中的vis_backends,同时启用本地与 TensorBoard 后端:

vis_backends = [ dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend') ]

作为对照,仓库默认配置 configs/base/default_runtime.py 中只启用了LocalVisBackendTensorboardVisBackendWandbVisBackend处于注释状态,visualizer则统一绑定这些后端:

vis_backends = [ dict(type='LocalVisBackend'), # dict(type='TensorboardVisBackend'), # dict(type='WandbVisBackend'), ] visualizer = dict( type='PoseLocalVisualizer', vis_backends=vis_backends, name='visualizer')

更多可视化细节可参阅 docs/en/user_guides/visualization.md。

日志信息不打印(Log info is NOT printed)

默认日志间隔为 50 个迭代,短训练或调试时看起来像"没有日志"。官方 FAQ 的解法是把default_hooks中 logger 的interval调小,例如从 50 改为 1:

# hooks default_hooks = dict(logger=dict(interval=1))

这与 configs/base/default_runtime.py 中default_hooks = dict(..., logger=dict(type='LoggerHook', interval=50), ...)的默认值一一对应,改小 interval 即可让每个迭代都打印日志。

评估阶段:MPII 测试集与关节点越界

如何评估 MPII 测试集

由于 MPII 测试集不提供 ground-truth 标注,无法在本地计算指标。若想在测试集上得到官方分数,需要将测试过程中生成的pred.mat通过邮件上传至 MPII 官方评测服务器,流程遵循 MPII 官方评测指南。

为什么 Top-down 2D 预测的关节点会落在 bbox 之外

这是设计使然而非 bug。官方 FAQ 解释:模型并不直接用 bbox 裁剪图像,而是先把 bbox 转换为"中心 + 尺度"表示,且尺度会乘以一个 1.25 的系数以纳入更多上下文;当 bbox 的宽高比与模型输入比例(例如 256x192)不一致时,还会进一步调整 bbox。

这一机制在源码中可以直接印证。mmpose/datasets/transforms/common_transforms.py 中的GetBBoxCenterScale变换负责把[x, y, w, h]形式的 bbox 转为中心与尺度,其 padding 系数默认正是 1.25:

class GetBBoxCenterScale(BaseTransform): """... Args: padding (float): The bbox padding scale that will be multilied to `bbox_scale`. Defaults to 1.25 """ def __init__(self, padding: float = 1.25) -> None: super().__init__() self.padding = padding

因此预测关节点出现在原始 bbox 外,是"裁剪区域本来就比 bbox 大"的必然结果;在做可视化对齐或结果后处理时,应以放大后的中心尺度框(而非原始 bbox)作为坐标系参考。

推理阶段:CPU 运行、加速与关键点索引

如何在 CPU 上运行 MMPose

官方 FAQ 的答复很直接:演示脚本加上--device=cpu参数即可。以 demo/image_demo.py 为例,其参数解析默认使用--device cuda:0(demo/image_demo.py),传入cpu即完成设备切换:

python demo/image_demo.py --config <config> --checkpoint <ckpt> --input <image> --device=cpu

如何加速推理

官方 FAQ 给出两条主要手段:

  1. 关闭翻转测试:在配置中把flip_test设为False。翻转测试会对左右翻转图像再做一次前向并融合结果,代价约翻倍。从源码结构看,flip_test是从各 pose estimator 的test_cfg读取的,例如 mmpose/models/heads/coord_cls_heads/rtmcc_head.py、mmpose/models/heads/coord_cls_heads/rtmw_head.py 中均有test_cfg.get('flip_test', False)的分支;而仓库的模型配置中普遍以test_cfg=dict(flip_test=True, ...)的形式开启它(如 configs/animal_2d_keypoint/topdown_heatmap/ak/td-hm_hrnet-w32_8xb32-300e_animalkingdom_P1-256x256.py)。将该项改为False即可省去一次前向。
  2. 更换更轻量的人体检测器:对 Top-down 模型,整条流水线的耗时往往被人体检测器主导,选型时应参照 MMDetection 模型库中更轻量的检测器(例如 RTMDet 系列),以检测速度换取整体吞吐。

每个关键点索引的定义在哪里查

官方 FAQ 指引:查看你所用模型训练数据对应的数据集元信息文件(meta information file),其中的keypoint_info键定义了每个关键点的名称、颜色、类型与左右配对关系。这些文件位于 configs/base/datasets/ 目录下。例如 configs/base/datasets/coco.py 中,索引 0 为nose、5 为left_shoulder、16 为right_ankle,每个关键点还带有swap字段描述水平翻转时的左右映射,这正是翻转增强与翻转测试结果融合所依赖的元数据;同文件中的skeleton_infojoint_weightssigmas则分别服务于骨架绘制、PCK 评估权重与 AP 的 σ 计算。

小结:一份按环节索引的排错速查表

环节症状处置依据
安装MMCV==xxx is used but incompatible按上表重装 mmcv/mmengine 到对应区间mmpose/init.py
安装xtcocotools 安装失败 / 无匹配轮子pip install cython,再源码编译安装setup.py
安装No module named 'mmcv.ops'/'mmcv._ext'卸载后重装完整版 mmcv官方 FAQ
数据自定义数据集无 bbox用包围全部关键点的最小框替代官方 FAQ
数据缺少 COCO 检测框文件bbox_file=None用真值框评估官方 FAQ
训练Address already in use设置MASTER_PORT=XXXtools/slurm_train.sh
训练Unexpected keys in source state dict预期行为,训练时忽略官方 FAQ
训练想实时看曲线/日志启用TensorboardVisBackend;调小 loggerintervalconfigs/base/default_runtime.py
评估关节点超出 bbox裁剪框 = 中心尺度框 x 1.25 padding,属正常common_transforms.py
推理CPU 推理 / 提速--device=cpuflip_test=False;换更快检测器demo/image_demo.py
推理关键点索引含义查对应数据集 meta 文件中的keypoint_infoconfigs/base/datasets/coco.py

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

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询