EasyMocap视频动捕部署测试
# EasyMocap视频动捕部署测试
EasyMocap 是浙江大学一团队在 2021 发布的多目和单目视频画面动捕项目,现以无人维护更新。
浙大三维视觉团队提出Neural Body,单目RGB视频重建人体三维模型,无需预训练网络 (CVPR'21 Best Paper Candidate) (opens new window)
# 结论
- 单从摄像机空间来看,效果非常不错,但是从2D 人体姿态推导出 3D人体姿态效果较差。
- 该项目无配套的动画数据导出工具,使用的二次开发成本较高。
- 无导出相机运动数据,意味着只有固定相机拍摄的视频生成的动作数据才可用。
- 有更多更好类似的项目供选择,如**Pose2Sim (opens new window)** ** , **FreeMocap (opens new window)
本次测试只涉及该项目中的单目视频动捕流程,多目视频流程并未测试。
测试体验主机
美术中心研发部 192.168.251.94
D:\Anaconda\envs\easymocap\EasyMocap
2
3
# 创建虚拟环境
下载软件包
单独下载 如上图 3 个软包
下载cuda116 CUDA Toolkit 11.6 Downloads | NVIDIA Developer (opens new window)
下载 torch-1.12+cu116 download.pytorch.org/whl/cu116/torch/ (opens new window)
下载 torchvision-0.13.0+cu116 download.pytorch.org/whl/cu116/torchvision/ (opens new window)
使用 git 下载 EasyMocap 项目到本地,本次测试在研发部公共主机 192.168.251.94
conda create -n easymocap python=3.9 -y
conda activate easymocap
pip install D:\wwwNDTools\easymocap_whl\torch-1.12.0+cu116-cp39-cp39-win_amd64.whl
pip install D:\wwwNDTools\easymocap_whl\torchvision-0.13.0+cu116-cp39-cp39-win_amd64.whl
python -m pip install -r D:\Anaconda\envs\easymocap\EasyMocap\requirements.txt
pip install spconv-cu116
# install pyrender if you have a screen
python -m pip install pyrender
2
3
4
5
6
7
8
9
10
11
12
13
14
git clone https://github.com/zju3dv/EasyMocap.git
路径:D:\Anaconda\envs\easymocap\EasyMocap
创建好虚拟环境之后,最好是 在 Anconda Prompt 中 Cd 到EasyMocap 项目文件中来执行 其他命令,如下,是安装 EasyMocap 项目
python setup.py develop
使用过程 中,建议是给系统设置 全局代理,项目启动过程中自动下载各种 模型,如果网络正常,更省事。
# 安装 ffmpeg
因为有涉及到 视频 处理,那肯定是少不了ffmpeg ,下载好 ffmpeg 放在任意文件夹,然后将 ffmpeg 的bin 文件夹路径添加导出 系统变量 中,如下图。
打开命令行 cmd , 直接 输入 ffmpeg ,如果有下图 这样的显示,说明安装成功。
# 生成模型和视频合成
Quick Start | easymocap-public-doc (chingswy.github.io) (opens new window)
如上图,直接输入视频,自动合成带 SMPL模型的新视频。
# 测试1
如下图,在任意路径下,创建 videos 文件夹,然后将 mp4 视频放入,如下图。
然后执行 以下 命令
emc --data D:\Anaconda\envs\easymocap\EasyMocap\config\datasets\svimage.yml --exp D:\Anaconda\envs\easymocap\EasyMocap\config\1v1p\hrnet_pare_finetune.yml --root D:\Anaconda\envs\easymocap\EasyMocap\data\\youtebe --ranges 0 59 1 --subs v01
emc | 该项目的 集成运行工具 |
data | 处理流程配置 |
exp | 导出流程配置 |
root | 视频文件夹路径 |
ranges | 视频帧数, 开始帧,结束帧,间隔 |
subs | 视频文件名 |
实现类似效果的其他项目
# 输出数据
emc 命令输出,项目路径下的 output 文件夹,每次都会覆盖上一次的输出结果,注意改名文件夹。
Keypoints2d | pkl 单帧后缀文件,是什么数据不清楚 |
Keypoints3d | json 单帧文件, yolov 人体姿态识别的 骨点数据 3D坐标 |
pare | pkl 单帧文件, |
person | npy 单帧数据 |
smpl | json 单帧,应该是 SMLP 模型的 pose 数据,但是项目提供的 convert2bvh.py (opens new window) 无法正常读取。 |
cfg_data.yml | 处里的视频信息配置 |
cfg_exp.yml | 输出处理流程配置 |
render.mp4 | 3D姿态的 SMPL 模型的视频合成 |
vis_keypoints2d | 2D姿态识别的 视频合成 |
此流程使用 yolov5 进行人体姿态识别,可能是因为其引用的 yolov5 更新问题其提供的 convert2bvh.py (opens new window) 已无法正常使用,所以没法导出动画进入 3dsMax 中测试效果。
# Keypoints3d 导入 Max
因为项目并没有提供可用的将最终数据转换为骨骼动画的工具,为了验证数据的质量,只能将 Keypoints3d 的骨点位置数据导入 3dsMax 中查看。
注意,该Keypoints3d数据是相机空间运作数据,如果视频是非固定相机拍摄,那直接导入 3dsMax 之后会比奇怪,角色会有与动作无关的整体飘动,也没找到如何输出相机运动的数据用以处理。
Keypoints3d_To_3dsMax2022.py
from glob import glob
from os.path import join
import json
from pymxs import runtime as mxs
#https://chingswy.github.io/easymocap-public-doc/database/2_keypoints.html
def read_json(path):
with open(path) as f:
data = json.load(f)
return data
def get_json_frame(path):
filenames = sorted(glob(join(path, '*.json')))
frame_data = []
for ifile in filenames :
json_data = read_json(ifile)
json_data_pose = json_data[0]['keypoints3d']
frame_data.append(json_data_pose)
return frame_data
def create_body():
body_root = mxs.point(name="Root")
pt_body_25 = []
for i in range(25):
if i >= 15 and i < 19 :
pass
else:
pt = mxs.Sphere(name=f"pt_{i}",radius=5)
pt.parent = body_root
pt_body_25.append(pt)
return body_root,pt_body_25
#body_root,pt_body_25 = create_body()
path = r'\\TQ0301025011\Anaconda\envs\easymocap\EasyMocap\output\sv1p_internet-rotate\keypoints3d'
#根节点
body_root = mxs.getNodeByName(f"Root")
body_root.transform = mxs.execute("(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])")
json_frame = get_json_frame(path)
mxs.animationRange = mxs.interval(0,len(json_frame))
with pymxs.animate(True):
for i in range(len(json_frame)):
frame = json_frame[i]
with pymxs.attime(i):
for p in range(25):
if i >= 15 and i < 19 :
pass
else:
pt = mxs.getNodeByName(f"pt_{p}")
if pt :
x = frame[p][0] * 100.0
y = frame[p][1] * 100.0
z = frame[p][2] * 100.0
pt.pos = mxs.point3(x,y,z)
body_root.transform = mxs.execute("matrix3 [1,0,0] [0,0,-1] [0,1,0] [0,0,0]")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 报错解决
# yolov5
在执行 合成视频任务时,自动下载 https://github.com/ultralytics/yolov5 (opens new window) , 如果自动下载失败,可手动下载
# 缺少 yolov4.weights
https://github.com/AlexeyAB/darknet?tab=readme-ov-file (opens new window)
# 缺少 pare_w_3dpw_config.yaml
如下图,提示 缺少 pare_w_3dpw_config.yaml
是因为缺少 pare-github-data.zip 这个包里的文件,可以手动下载 之后解压。
def try_to_download():
model_dir = os.path.join(os.path.dirname(__file__), '..', '..', 'models', 'pare')
cmd = 'wget https://www.dropbox.com/s/aeulffqzb3zmh8x/pare-github-data.zip'
os.system(cmd)
os.makedirs(model_dir, exist_ok=True)
cmd = 'unzip pare-github-data.zip -d {}'.format(model_dir)
os.system(cmd)
CFG = 'models/pare/data/pare/checkpoints/pare_w_3dpw_config.yaml'
CKPT = 'models/pare/data/pare/checkpoints/pare_w_3dpw_checkpoint.ckpt'
2
3
4
5
6
7
8
9
10
11
12
Missing pare_w_3dpw_config.yaml · Issue #406 · zju3dv/EasyMocap (github.com) (opens new window)
也可以使用 gdown 这个谷歌网盘分享下载 工具 ,下载 pare-github-data.zip
gdown 1qIq0CBBj-O6wVc9nJXG-JDEtWPzRQ4KC
# 缺少 J_regressor_body25.npy
如下图,同样工具的自动下载失效。
https://github.com/zju3dv/EasyMocap/raw/master/data/smplx/J_regressor_body25.npy (opens new window)
https://github.com/zju3dv/EasyMocap/raw/master/data/smplx/J_regressor_body25.npy
手动下载 过来即可。
# 其他操作流程 (跑不通)
因为项目较老又无人维护,而且配套开发的文档也差,很多项目给的测试案例都无法跑通。
# 直接输出 数据
EasyMocap/doc/quickstart.md at master · zju3dv/EasyMocap (github.com) (opens new window)
# 数据格式
EasyMocap/doc/02_output.md at master · zju3dv/EasyMocap (github.com) (opens new window)
输出的 smpl json 帧文件导入 blender
1/3 Easymocap Install Raw Recording - 2021 04 29 04 21 43 (youtube.com) (opens new window)
MOCAP Import (gumroad.com) (opens new window)
# 单独的视频导出动作
convert2bvh.py reshape 错误 ·问题 #380 ·zju3dv/EasyMocap (github.com) (opens new window)
Hand/finger pose estimation · Issue #25 · zju3dv/EasyMocap (github.com) (opens new window)