3步上手MHFormer:CVPR 2022多假设Transformer 3D人体姿态估计,MPJPE 43.0mm快速复现指南
【免费下载链接】MHFormer[CVPR 2022] MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation项目地址: https://gitcode.com/gh_mirrors/mh/MHFormer
MHFormer(Multi-Hypothesis Transformer for 3D Human Pose Estimation)是发表于CVPR 2022的 3D 人体姿态估计方法,在 Human3.6M 基准上以MPJPE 43.0mm刷新了当时纪录,超越 VideoPose3D(46.8)与 PoseFormer(44.3)。它用三条并行 Transformer 路径同时输出多组"假设"表示,再融合出最终 3D 骨架。本文将带你 3 步跑通官方351 帧预训练模型的测试流程,并拆解这个 43.0mm 是怎么来的。
第 1 步:环境搭建与数据集准备
1.1 创建环境
MHFormer 依赖较老的 PyTorch 版本,请按官方要求配置(参考 requirements.txt):
conda create -n mhformer python=3.9 # 安装 PyTorch 1.7.1 + Torchvision 0.8.2(参考官网说明) pip3 install -r requirements.txt1.2 准备 Human3.6M 数据
从 Human3.6M 官网下载原始数据并处理(可参考 VideoPose3D 的流程),或使用官方提供的已处理数据,放入dataset/目录,最终目录结构见 dataset/README.md:
${POSE_ROOT}/ |-- dataset | |-- data_3d_h36m.npz # 3D 真值 | |-- data_2d_h36m_gt.npz # 2D 真值关键点 | |-- data_2d_h36m_cpn_ft_h36m_dbb.npz # CPN 预测的 2D 关键点(模型实际输入)💡 模型推理时用的是CPN 预测的 2D 关键点(
cpn_ft_h36m_dbb),而非真值,这是标准评测协议,保证横向可比。
第 2 步:下载预训练权重并加载
将官方 351 帧预训练模型(.pth 文件)下载后放入checkpoint/pretrained/351目录,说明见 checkpoint/pretrained/README.md。
权重加载逻辑在 main.py 的previous_dir分支中:程序会自动扫描目录下的*.pth,挑选文件名以model开头的最佳权重并载入,无需手动指定文件名。
第 3 步:一键测试,复现 MPJPE 43.0mm
只需一条命令(351 帧窗口的预训练模型):
python main.py --test --previous_dir 'checkpoint/pretrained/351' --frames 351测试会在 S9、S11 两个未见过的测试人物上逐动作计算误差,最终打印p1 / p2两项协议下的 MPJPE(单位 mm):
| 模型 | MPJPE (mm) |
|---|---|
| VideoPose3D | 46.8 |
| PoseFormer | 44.3 |
| MHFormer | 43.0 |
如果显卡显存有限,也可以训练/测试 81 帧模型:python main.py --frames 81 --batch_size 256,相关超参数(帧数、batch size、学习率等)都定义在 common/opt.py。
43.0mm 是怎么来的?多假设思想拆解
核心思想:一次输出 3 条假设
2D 关键点本身有噪声,单条 Transformer 路径容易被噪声"带偏"。MHFormer 的解法是同时生成 3 条假设表示(hypothesis),再让它们互相借鉴、取平均,相当于用"集成"的思想换取精度。
主网络在 model/mhformer.py 中分为四段:
| 模块 | 作用 | 源码位置 |
|---|---|---|
| MHG(多假设生成) | 3 个堆叠 Transformer 编码器逐级精化,产生 3 条假设 | model/module/trans.py |
| Embedding | 1D 卷积把每条假设映射到 512 维通道空间 | model/mhformer.py |
| SHR + CHI(融合) | 假设间共享信息 + 交叉注意力互查,输出增强后的 3 条假设 | model/module/trans_hypothesis.py |
| Regression | BatchNorm + 1D 卷积回归出 17 个关节的 3D 坐标 | model/mhformer.py |
其中 SHR(Shared Hypothesis Representation)在 trans_hypothesis.py 中让 3 条假设各自自注意力后再拼接共享 MLP;CHI(Cross-Hypothesis Interaction)则用交叉注意力——假设 A 的 Query 去查询 B 的 Key 和 C 的 Value——让每条假设"吸收"另外两条的长处。
测试时增强:左右翻转再平均
除了网络结构,43.0mm 还有一个"免费午餐":测试时数据增强。main.py 中的input_augmentation会把输入水平翻转,让模型前向两次,再把翻转输出的 x 坐标取反、左右关节对调后与原始输出取平均。左右对称的噪声被抵消,误差进一步降低。
351 帧窗口:用更多上下文补精度
351 帧(约 15 帧 × 3 倍下采样)的长窗口让注意力能"看到"更完整的动作上下文,这也是该模型默认配置(--frames 351,对应pad=175,即取窗口中心帧作为输出,见 common/opt.py)。
进阶:对真实视频做 3D 姿态 Demo 🎬
想在自己的视频上体验?项目内置了完整流水线:YOLOv3 人体检测 → HRNet 2D 关键点 → MHFormer 3D 估计:
python demo/vis.py --video sample_video.mp4使用前需把 YOLOv3 与 HRNet 预训练模型放入demo/lib/checkpoint,待处理视频放入demo/video目录(仓库自带 sample_video.mp4 可直接体验)。可视化逻辑(2D/3D 骨架绘制)在 demo/vis.py。
常见问题速查(FAQ)
| 问题 | 解决 |
|---|---|
| 权重加载报错 / 找不到 pth | 确认文件在checkpoint/pretrained/351下且文件名以model开头 |
| 显存不足 | 换 81 帧模型或调小--batch_size |
| 输出 p1/p2 与 43.0 有差异 | 检查输入是否为 CPN 关键点(--keypoints cpn_ft_h36m_dbb)及--frames是否与权重匹配 |
小提示:作者后续将效率优化版本发表于HoT(CVPR 2024),追求推理速度时可关注。本文方法基于 MIT 协议开源,可自由使用。
小结:3 步(环境 → 数据与权重 → 一条命令测试)即可复现 Human3.6M 上的 MPJPE 43.0mm;而成绩的来源正是"多假设生成 + 假设间交叉融合 + 翻转测试时增强 + 351 帧长上下文"的组合拳。
【免费下载链接】MHFormer[CVPR 2022] MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation项目地址: https://gitcode.com/gh_mirrors/mh/MHFormer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考