MHFormer & STCFormer 复现——从视频提取人体关节的2D/3D pose
使用MHFormer和STCFormer可以快速从视频提取出人体的17个关节2D与3D pose。
环境准备
测试环境:
MHFormer和STCFormer可使用同一个环境运行。
创建一个用于测试的conda环境请运行以下命令:
conda create -n former_test python=3.9
安装torch和torchvision请运行以下命令:
pip install torch==2.7.1 torchvision==0.22.1
MHFormer
MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation [CVPR 2022]
MHFormer github链接
论文作者在git中推荐使用PyTorch 1.7.1和Torchvision 0.8.2,但实测这两个老版本的torch包会导致运行出错,要求numpy必须是小于2.0版本,但切换numpy版本小于2.0后则会导致依赖环境出错。
1. 克隆代码
git clone https://github.com/Vegetebird/MHFormer.git
2. 下载MHFormer的预训练模型,下载完成后放到\'./checkpoint/pretrained\'目录下:
https://drive.google.com/drive/folders/1UWuaJ_nE19x2aM-Th221UpdhRPSCFwZaGoogle云盘:https://drive.google.com/drive/folders/1UWuaJ_nE19x2aM-Th221UpdhRPSCFwZa
下载任意一个文件夹,并将文件夹放入该目录下。例如实际目录长这样:
3. 下载YOLOv3和HRNet的预训练模型,下载完后放在\'./demo/video\'目录下:
https://drive.google.com/drive/folders/1_ENAMOsPM7FXmdYRbkwbFHgzQq_B_NQA
4. 克隆下来的git仓库中已提供了一个video用于demo测试,如需要测试自己的视频,将需要测试的wild video放在\'./demo/video\'目录下。
5. 运行代码,生成2D POSE、3D POSE、Demo video:
python demo/vis.py --video sample_video.mp4
6. 在\'./demo/output/sample_video\'目录下查看生成的2D POSE、3D POSE、Demo video。文末提供了读取npz文件的示例代码。
STCFormer
STCFormer: 3D Human Pose Estimation with Spatio-Temporal Criss-cross Attention [CVPR 2023]
STCFormer github链接
可以使用与MHFormer相同的环境运行。
1. 克隆代码
git clone https://github.com/zhenhuat/STCFormer.git
2. 下载STCFormer的预训练模型,下载完成后放到\'./checkpoint/pretrained\'目录下:
Google云盘:https://drive.google.com/drive/folders/1waaQ1Yj-HfbNahnCN8AWCjMCGzyhZJF7
下载任意一个目录下的任意一个预训练文件,并将文件放入该目录下。例如实际目录长这样:
3. 下载YOLOv3和HRNet的预训练模型,下载完后放在\'./demo/video\'目录下:
https://drive.google.com/drive/folders/1_ENAMOsPM7FXmdYRbkwbFHgzQq_B_NQA
此处下载的文件与MHFormer中的文件一致。
4. 克隆下来的git仓库中已提供了一个video用于demo测试,如需要测试自己的视频,将需要测试的wild video放在\'./demo/video\'目录下。
5. 运行代码,生成2D POSE、3D POSE、Demo video:
python demo/vis.py --video sample_video.mp4
6. 在\'./demo/output/sample_video\'目录下查看生成的2D POSE、3D POSE、Demo video。文末提供了读取npz文件的示例代码。
效果展示
读取npz文件
import numpy as npdef read_npz(file_path): \"\"\" 读取 .npz 文件并打印其中所有数组的名称和形状。 参数: file_path (str): .npz 文件的路径。 返回: dict: 包含所有数组的字典,key 为数组名,value 为对应的 numpy 数组。 \"\"\" try: data = np.load(file_path) print(f\"成功读取:{file_path}\") print(\"包含以下数组:\") for key in data.files: print(f\" - {key}: shape={data[key].shape}, dtype={data[key].dtype}\") return {key: data[key] for key in data.files} except Exception as e: print(f\"读取失败:{e}\") return None# 示例用法:if __name__ == \"__main__\": npz_path = \"/home/wzh-2004/3DPOSE_TEST/MHFormer/demo/output/sample_video/output_3D/output_keypoints_3d.npz\" # 替换为你自己的路径 arrays = read_npz(npz_path) print(arrays[\'reconstruction\'][0])