把普通人物视频交给 GVHMR 做单人三维动作恢复,再将结果直接转换成 MikuMikuDance 可读取的 VMD 身体动作。也可以只转换已有的 hmr4d_results.pt。不需要 Blender。
本项目提供 Windows + WSL2 的一键入口、30 fps 视频规范化、断点续跑、镜像还原、根运动控制、动作平滑、MMD 骨骼映射和 VMD 写出后回读验证。
重要:GVHMR、模型权重、SMPL/SMPL-X 人体模型和输入视频不包含在本仓库中。请分别遵守它们的许可证和使用条款。本仓库的 MIT 许可证只覆盖 GVHMR-Transfer 自身代码。
- 从视频自动完成:环境预检 → FFmpeg 规范化 → GVHMR 推理 → VMD 导出 → 质量检查
- 读取 GVHMR 的
smpl_params_global或smpl_params_incam - 将 21 个 SMPL 身体关节转换为 19 条标准 MMD FK 骼轨道
- 内置
standard_mmd与legacy_mmd两套模型配置 - 支持保留或还原镜中动作的左右方向
- 支持
global、inplace、xz、none四种根运动 - 四档旋转平滑、30 fps 时间轴重采样和四元数连续性处理
- 默认关闭左右足与脚尖 IK,避免与 FK 腿骨冲突
- 基于输入指纹缓存耗时的推理阶段;转换参数改变时只重做 VMD
- 为长视频提供流式 GVHMR 预处理补丁,减少一次性占用的内存
经过验证的组合:
- Windows 10/11
- WSL2,默认发行版名为
Ubuntu-22.04 - NVIDIA GPU,以及可被 WSL 中 PyTorch 识别的 CUDA 驱动
- Python 3.10
- FFmpeg / ffprobe(安装在 WSL 内)
- PowerShell 5.1 或更高版本
- GVHMR 固定版本
6ec3ca39336c50492c0fae65fba2fb831fc7d866
推荐目录布局:
D:\Projects\
├─ GVHMR\
└─ GVHMR-Transfer\
按此布局放置时,一键脚本会自动找到同级的 GVHMR。其他位置也可以通过 -GVHMRRoot 指定。
在管理员 PowerShell 中执行:
wsl --install -d Ubuntu-22.04
wsl --update重启 Windows,并完成 Ubuntu 的首次启动。如果已经安装 WSL,可用下列命令确认发行版名称:
wsl -l -v如果名称不是 Ubuntu-22.04,运行插件时传入 -WslDistro "实际名称"。
在 WSL 终端中执行:
cd /mnt/d/Projects
git clone https://github.com/zju3dv/GVHMR.git
git clone https://github.com/LeslieH666/GVHMR-Transfer.git
cd GVHMR
git checkout 6ec3ca39336c50492c0fae65fba2fb831fc7d866锁定版本很重要:随本项目发布的补丁以该提交为基线制作。以后若要升级 GVHMR,请先确认补丁仍可干净应用并重新运行测试。
一键脚本默认使用 <GVHMR>/.venv/bin/python:
cd /mnt/d/Projects/GVHMR
sudo apt update
sudo apt install -y ffmpeg python3-venv
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install -e .GVHMR 的依赖安装以其官方 INSTALL.md 为准。如果使用 Conda,不必再建 .venv;先执行 which python,然后把返回的 WSL 路径通过 -WslPythonPath 传给本项目。
确认 PyTorch 能看到 GPU:
cd /mnt/d/Projects/GVHMR
.venv/bin/python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name() if torch.cuda.is_available() else 'CUDA unavailable')"
ffmpeg -version
ffprobe -versiontorch.cuda.is_available() 必须为 True。
按照 GVHMR 官方安装说明下载权重。SMPL 和 SMPL-X 需要在各自官网注册并接受许可条款;请勿把这些文件提交到本仓库。
运行一键流程前,以下文件必须存在:
GVHMR/
├─ inputs/checkpoints/
│ ├─ gvhmr/gvhmr_siga24_release.ckpt
│ ├─ yolo/yolov8x.pt
│ ├─ vitpose/vitpose-h-multi-coco.pth
│ ├─ hmr2/epoch=10-step=25000.ckpt
│ └─ body_models/
│ ├─ smpl/SMPL_NEUTRAL.pkl
│ └─ smplx/SMPLX_NEUTRAL.npz
└─ hmr4d/utils/body_model/
├─ smplx2smpl_sparse.pt
└─ smpl_neutral_J_regressor.pt
插件会在推理前逐项检查,缺少任何文件时会直接列出完整路径。
本项目调用了 --no_render,并依赖分批读取视频的长视频兼容改动,所以不能直接搭配未打补丁的 GVHMR。补丁还包含 PyTorch 2.6+ 的可信 ViTPose 检查点加载兼容处理。
在 WSL 中执行:
cd /mnt/d/Projects/GVHMR
git apply --check ../GVHMR-Transfer/patches/gvhmr-integration.patch
git apply ../GVHMR-Transfer/patches/gvhmr-integration.patch检查补丁状态:
git status --short
.venv/bin/python tools/demo/demo.py --help | grep no_render如果第一条 git apply --check 失败,先确认 GVHMR 的 HEAD 正是上面锁定的提交,并确认工作区没有与补丁重叠的改动。不要在检查失败后强制应用。
补丁具体做了四件事:
- 增加
--no_render,VMD 流程无需渲染网格预览。 - ViTPose 与 HMR2 按批读取视频,不把整段视频一次性装入内存。
- 每个预处理模型完成后主动释放 CPU/CUDA 内存。
- 兼容 PyTorch 2.6+ 对官方 ViTPose 完整检查点的加载方式。
流水线默认设置 GVHMR_PREPROCESS_BATCH_SIZE=4。
仓库中的 wslconfig-gvhmr.ini 是一个参考配置:
[wsl2]
memory=16GB
swap=8GB
[experimental]
autoMemoryReclaim=gradual把这些设置合并到 Windows 的 %UserProfile%\.wslconfig 后执行:
wsl --shutdown这会暂时停止所有 WSL 发行版和 Docker Desktop 容器。请根据自己的物理内存调整,不要盲目覆盖已有的 .wslconfig。
双击 start_video_to_vmd.cmd,启动器会先要求选择相机模式:固定机位选 static,手持、跟拍或明显转动的相机选 moving。随后选择视频即可开始。也可以把视频拖到 start_video_to_vmd.cmd 或 mirror_video_to_vmd.cmd 上,相机模式仍会询问。
通用双击入口使用:
用户选择的相机模式 + 还原镜像 + 全局根运动 + legacy_mmd
因此 VMD 默认保留 GVHMR 识别出的 X/Y/Z 中心位移。确实需要原地动作时,改用 start_video_to_vmd_inplace.cmd;该入口同样会询问 static/moving,但会明确删除 X/Z 地面移动。
这些入口适合镜子前拍摄的舞蹈视频,以及没有“上半身2”骨骼的老 PMD 模型。
在 PowerShell 中执行:
cd D:\Projects\GVHMR-Transfer
.\video_to_vmd.ps1 `
-Video "D:\Videos\dance.mp4" `
-Camera static `
-Mirror keep `
-Profile standard_mmd `
-RootMotion global如果两个项目不在同一父目录:
.\video_to_vmd.ps1 `
-Video "E:\Videos\dance.mp4" `
-GVHMRRoot "E:\AI\GVHMR" `
-WslDistro "Ubuntu-22.04" `
-WslPythonPath "/mnt/e/AI/GVHMR/.venv/bin/python"-GVHMRRoot 使用 Windows 路径;-WslPythonPath 使用 WSL/Linux 路径。默认使用该发行版的默认用户;仅在环境确实安装在其他用户下时传入 -WslUser。
| 参数 | 说明 |
|---|---|
-Camera static |
固定机位、三脚架或镜子视频;PowerShell 默认,一键入口会询问 |
-Camera moving |
手持、跟拍或明显移动的相机 |
-Mirror keep |
保留画面中看到的左右方向 |
-Mirror undo |
交换左右关节,并镜像根位置和旋转 |
-RootMotion global |
保留 X/Y/Z 位移 |
-RootMotion inplace |
去掉地面移动,保留跳跃与蹲起高度 |
-RootMotion xz |
只保留地面平移 |
-RootMotion none |
不写中心位移 |
-Profile standard_mmd |
现代 PMX / 标准骨骼模型 |
-Profile legacy_mmd |
没有“上半身2”的老 PMD 模型 |
-Smooth off/light/medium/strong |
关闭或选择 3/5/9 帧平滑窗口 |
-Scale 10 |
根位移比例;不改变肢体骨骼长度 |
-Crop "x,y,w,h" |
裁剪画面,隔离主要人物 |
-StartSeconds 10 -DurationSeconds 20 |
只处理指定片段 |
-FocalLengthMm 24 |
全画幅等效焦距 |
-Output "D:\Motions\dance.vmd" |
指定最终文件 |
-NoRecenter |
不把第一帧中心归零 |
-KeepFootIK |
不自动关闭足/脚尖 IK |
-Fresh |
新建任务,不复用同设置缓存 |
-GVHMRRoot |
GVHMR 的 Windows 路径 |
-WslDistro |
WSL 发行版名 |
-WslUser |
可选的 WSL 用户名 |
-WslPythonPath |
可选的 GVHMR Python 解释器 WSL 路径 |
GVHMR 只跟踪一个主要人物。画面同时出现真人和镜像且跟踪错误时,请用 -Crop 隔离目标。程序不会自动判断视频是否拍摄自镜子。
典型目录:
runs/<视频名_任务指纹>/
├─ input_30fps.mp4
├─ pipeline.log
├─ pipeline.report.json
├─ gvhmr/<视频名>/
│ └─ hmr4d_results.pt
└─ final/
├─ <视频名>.vmd
└─ <视频名>.report.json
只有在输入不是恒定 30 fps、使用裁剪或截取片段时才会生成 input_30fps.mp4。相同视频和相同推理设置会复用 GVHMR 结果;修改镜像、根运动、平滑或目标配置时只重做 VMD。失败后修复环境并重新运行同一命令,流水线会从可复用阶段继续。
pipeline.report.json 记录各阶段状态、命令、环境、输入指纹和产物路径。<视频名>.report.json 还记录 root_motion_validation、转换前后位移统计及 VMD 中心骨回读一致性。global/xz 模式下若源轨迹明显存在但中心位移丢失,转换会直接失败。报告通过仍不代表已经针对某个 PMX 模型完成视觉验收。
所有 runs/、outputs/、视频、权重、日志和生成 VMD 都被 .gitignore 排除。
cd D:\Projects\GVHMR-Transfer
.\export_vmd.ps1 `
-Input "D:\Projects\GVHMR\outputs\demo\dance\hmr4d_results.pt" `
-Output "D:\Motions\dance.vmd" `
-Mirror keep `
-RootMotion global `
-Profile standard_mmd如果源视频不是 30 fps,用 -Fps 25 或 -Fps 60 告诉转换器源时间轴。程序会将位移线性插值、旋转进行四元数球面插值,再输出 30 fps VMD。
在含 NumPy 和 PyTorch 的环境中:
cd /mnt/d/Projects/GVHMR-Transfer
PYTHONPATH=src /mnt/d/Projects/GVHMR/.venv/bin/python -m gvhmr_transfer \
/path/to/hmr4d_results.pt \
/path/to/output.vmd \
--space global \
--mirror keep \
--root-motion global \
--smooth medium \
--scale 10也可安装命令行入口:
python -m pip install -e .
gvhmr-transfer /path/to/hmr4d_results.pt /path/to/output.vmd本项目没有把 PyTorch 放入默认依赖,避免意外下载数 GB。需要独立安装时可使用 gvhmr-transfer[pt],通常更建议复用 GVHMR 的 Python 环境。
| GVHMR / SMPL | MMD |
|---|---|
| 根朝向与根位移 | センター |
| spine1 + 0.5 × spine2 | 上半身 |
| 0.5 × spine2 + spine3 | 上半身2 |
| neck / head | 首 / 頭 |
| collar | 左肩 / 右肩 |
| shoulder | 左腕 / 右腕 |
| elbow | 左ひじ / 右ひじ |
| wrist | 左手首 / 右手首 |
| hip | 左足 / 右足 |
| knee | 左ひざ / 右ひざ |
| ankle | 左足首 / 右足首 |
配置文件位于 src/gvhmr_transfer/profiles/。可以复制 JSON,修改骨骼名或脊柱权重,并通过 Python CLI 的 --profile 传入。
当前版本不读取目标 PMX 的静止骨架,因此模型肩宽、身高、局部轴或骨骼结构不同时可能需要调整。GVHMR 的结果不包含:
- 手指动作
- 表情、口型和眼睛
- 头发与服装物理
- 模型感知的高质量足部 IK 与足底锁定
- 提示
unrecognized arguments: --no_render:GVHMR 集成补丁没有应用。 - 提示缺少模型文件:按错误列出的路径补齐权重,文件名大小写必须一致。
CUDA is not available:先在同一个 WSL 发行版和同一个 Python 中验证torch.cuda.is_available()。- 退出码
137或-9:通常是 WSL 内存/交换空间不足;关闭其他 WSL/Docker 工作负载并检查.wslconfig。 - 找不到
.venv/bin/python:传入正确的-WslPythonPath。 - 找不到发行版:用
wsl -l -v查看名称,再传入-WslDistro。 - 左右相反:切换
-Mirror keep与-Mirror undo;此操作会复用 GVHMR 推理。 - 追踪到错误人物:使用
-Crop;裁剪会触发新的 GVHMR 推理。 - 老模型上半身动作缺失:改用
-Profile legacy_mmd。
更完整的人工验收流程见 MANUAL_TEST.md。
cd /mnt/d/Projects/GVHMR-Transfer
PYTHONPATH=src /mnt/d/Projects/GVHMR/.venv/bin/python -m unittest discover -s tests -v在已安装项目的环境中也可以执行:
python -m pytestGVHMR-Transfer 使用 MIT License。GVHMR 及其模型、SMPL、SMPL-X、YOLO、ViTPose、HMR2 和 MikuMikuDance 相关资产均属于各自作者,其许可证与使用条款独立适用。
感谢 GVHMR 作者公开高质量的世界坐标人体动作恢复研究与实现。本项目不是 GVHMR 官方项目。