MonoHuman:从单目视频生成可动画人体神经场(CVPR 2023)
MonoHuman:从单目视频生成可动画人体神经场
Zhengming Yu,
Wei Cheng,
Xian Liu,
Wayne Wu,
和 Kwan-Yee Lin
演示视频 | 项目主页
| 论文
这是使用PyTorch实现的MonoHuman官方代码
在各种应用中,如虚拟现实和数字娱乐,使用自由视角控制来制作虚拟化身动画至关重要。先前的研究尝试利用神经辐射场(NeRF)的表示能力从单目视频重建人体。最近的工作提出将变形网络嫁接到NeRF中,以进一步模拟人体神经场的动态,从而制作生动的人体动作动画。然而,这些流程要么依赖于姿态相关的表示,要么由于帧独立优化而缺乏动作连贯性,难以真实地泛化到未见过的姿态序列。在本文中,我们提出了一个新颖的框架MonoHuman,它能够在任意新姿态下稳健地渲染出视角一致且高保真的化身。我们的关键洞见是使用双向约束来建模变形场,并明确利用现成的关键帧信息来推理特征相关性,以获得连贯的结果。具体而言,我们首先提出了一个共享双向变形模块,通过将后向和前向变形对应关系分解为共享的骨骼运动权重和单独的非刚性运动,创建了一个与姿态无关的可泛化变形场。然后,我们设计了一个前向对应搜索模块,查询关键帧的对应特征来指导渲染网络。因此,即使在具有挑战性的新姿态设置下,渲染结果也具有多视角一致性和高保真度。大量实验证明了所提出的MonoHuman优于现有最先进的方法。
安装
我们推荐使用Anaconda。
创建并激活虚拟环境。
conda env create -f environment.yaml
conda activate Monohuman
下载SMPL模型
从这里下载性别中性的SMPL模型,并解压mpips_smplify_public_v2.zip。
复制SMPL模型。
cp /path/to/smpl/smplify_public/code/models/basicModel_neutral_lbs_10_207_0_v1.0.0.pkl third_parties/smpl/models
按照此页面的说明从SMPL模型中移除Chumpy对象。
下载预训练模型
从这里下载预训练模型
在ZJU-Mocap数据集上运行
准备数据集
-
从这里下载ZJU-Mocap数据集。
-
修改
tools/prepare_zju_mocap/377.yaml
中的主体yaml文件,如下所示:
dataset:
zju_mocap_path: /path/to/zju_mocap
subject: '377'
sex: 'neutral'
...
- 运行数据预处理脚本。
cd tools/prepare_zju_mocap
python prepare_dataset.py --cfg 377.yaml
cd ../../
- 修改core/data/dataset_args.py中的'dataset_path'为你的/path/to/dataset
训练
python train.py --cfg configs/monohuman/zju_mocap/377/377.yaml resume False
DDP训练:
python -m torch.distributed.launch --nproc_per_node 4 train.py --cfg configs/monohuman/zju_mocap/377/377.yaml --ddp resume False
渲染和评估
渲染动作序列。(例如,主体377)
python run.py \
--type movement \
--cfg configs/monohuman/zju_mocap/377/377.yaml
在特定帧上渲染自由视角图像(例如,主体387和第100帧)。
python run.py \
--type freeview \
--cfg configs/monohuman/zju_mocap/387/387.yaml \
freeview.frame_idx 100
渲染文本驱动的动作序列。
从MDM生成姿态序列,并将序列放在path/to/pose_sequence/sequence.npy
中(例如,主体394和后空翻)
python run.py \
--type text \
--cfg configs/monohuman/zju_mocap/394/394.yaml \
text.pose_path path/to/pose_sequence/backflip.npy
在野外视频上运行
准备数据集
然后将结果放在数据集路径中,如下所示:
dataset_path
├── images
│ └── ${item_id}.png
├── masks
│ └── ${item_id}.png
└── pare
└── ${item_id}.pkl
运行数据预处理脚本。
cd tools/prepare_wild
python process_pare.py --dataset_path path/to/dataset
python prepare_dataset.py --dataset_path path/to/dataset
python select_keyframe.py --angle_threahold 30 --dataset_path path/to/dataset
然后根据select_keyframe.py的输出修改wild.yaml中的index_a和index_b。
训练过程与ZJU_Mocap数据集相同。
渲染
以下是一个渲染输出示例(我们从互联网上随机收集了一段视频)。
python run.py \
--type freeview \
--cfg configs/monohuman/wild/wild.yaml \
致谢
我们的代码参考了HumanNeRF、IBRNet、Neural Body。我们感谢这些作者的出色工作和开源贡献。
待办事项
- 代码发布。
- 演示视频发布。
- 论文发布。
- DDP训练。
- 预训练模型发布。
引用
如果你发现这项工作对你的研究有用,请考虑引用我们的论文:
@inproceedings{yu2023monohuman,
title={MonoHuman: Animatable Human Neural Field from Monocular Video},
author={Yu, Zhengming and Cheng, Wei and Liu, Xian and Wu, Wayne and Lin, Kwan-Yee},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={16943--16953},
year={2023}
}