数字人项目 ER-NeRF 的使用和部署详细教程

2024-04-11 16:12

本文主要是介绍数字人项目 ER-NeRF 的使用和部署详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. ER-NeRF简介
  • 2. ER-NeRF部署
  • 3. 训练自己的数字人
  • 4. 生成数字人视频
  • 常见错误

1. ER-NeRF简介

ER-NeRF(官方链接)是一个Talking Portrait Synthesis(对嘴型)项目。即:给一段某人说话的视频,再给定一段音频,经过该模型后处理后,可将原视频的嘴型与音频保持一致。

该模型的有优点:

  • 可以做到实时响应。即模型比较小,处理速度快。

缺点:

  • 需要对“要对嘴型的视频”进行训练。也就是每段视频对应一个模型
  • 生成出的头部不够稳定。

2. ER-NeRF部署

ER-NeRF的环境要求:

  • Pytroch 1.12
  • CUDA 11.x (必须,否则pytorch3d相关的代码会报错)

部署步骤如下:

  1. 按顺序执行以下命令(一个一个执行)
# 这个知识针对pytorch的,本机的cuda不一定非要是11.6,但必须是11.x
conda install cudatoolkit=11.6 -c pytorch# 安装pytorch
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --index-url https://download.pytorch.org/whl/cu116# 安装pytorch3d,这一步一定要成功。否则后面处理数据会报错
pip install "git+https://github.com/facebookresearch/pytorch3d.git"# 安装tensorflow
pip install tensorflow-gpu==2.8.0# 安装一些必要的依赖
apt-get update
apt install portaudio19-dev
apt-get install ffmpeg# 克隆项目
git clone https://github.com/Fictionarry/ER-NeRF.git# 克隆项目,安装项目所需依赖
cd ER-NeRF
pip install -r requirements.txt# 重新安装protobuf,使用3.20.3版本
pip uninstall protobuf
pip install protobuf==3.20.3
  1. 下载模型。网盘链接地址,结构如下:
-- checkpoints  # 将其放在 `~/.cache/torch/hub/checkpoints` 目录下(这部可以不做,源码也会自己下载)
-- data_utils  # 将其下面的文件放在 `ER-NeRF/data_utils`对应目录下-- face_parsing-- face_tracking

3. 训练自己的数字人

如果就想用现有的模型(只有obama),可以跳转到第4节。

源码中提供了一个训练好的视频(obama)。若想训练自己的数字人模型,需要遵循以下步骤(以源码中提供的obama视频为例):

  1. 下载视频(要训练的视频片段),将其放在data目录下。以data/<ID>/<ID>.mp4明明。例如:kunkun.mp4就放在ER-NeRF/data/kunkun/kunkun.mp4
wget https://github.com/YudongGuo/AD-NeRF/blob/master/dataset/vids/Obama.mp4?raw=true -O data/obama/obama.mp4

视频要求(必须满足):① 帧率:25FPS;② 每一帧都要是人物说话;③ 分辨率:512x512;④ 时长:1-5分钟;⑤ 人物背景要稳定。

  1. 使用data_utils/process.py脚本处理视频
python data_utils/process.py data/<ID>/<ID>.mp4

这一步耗时较长,且容易出错(前面环境没配好就会导致某步出错,找出相应的环境配置,配好就行)。process.py包含多个任务,每个任务会生成若干文件,放在data/<ID>/*下面。可以根据对应的文件是否生成或日志来判断该任务是否正常完成:

  • task 1:分离视频。生成aud.wav文件。若报错,通常是ffmpeg问题。
  • task 2:生成一些音频数据,aud.npy文件。若报错,一般是protobuf版本问题。
  • task 3:提取视频中的每帧图像。生成ori_imgs/XXX.jpg文件,会有很多jpg文件。
  • task 4:分割人像(语义分割)。生成parsing/XX.png文件,会有很多png文件。
  • task 5:提取背景图像。生成bc.jpg文件。是人物的背景图片。
  • task 6:分割出身体部分与生成Ground Truth图片。生成gt_imgs/XXX.jpgtorso_imgs/XXX.png(只有躯干没有人脸的图片)。
  • task 7:获取人脸各个点位的坐标。生成ori_imgs/XXX.lms
  • task 8:获取人脸跟踪数据,这步要训练一个追踪模型,会很慢。生成track_params.pt文件。这部报错通常是pytorch3d的问题,注意cuda版本。
  • task 9:生成transformers_train.jsontransforms_val.json

如果某个任务报错,可以配置环境后使用:python data_utils/process.py data/<ID>/<ID>.mp4 --task <taskId>来重试。例如(重试任务2):python data_utils/process.py data/obama/obama.mp4 --task 2

  1. 将生成的aud.npy复制一份,改名aud_ds.npy(源码好像有点问题,所以要这么做)。

  2. 使用OpenFace生成<ID>.csv文件。具体步骤:① 下载OpenFace(Windows版本链接);② 解压文件,打卡里面的OpenFaceOffline.exe;③ Record里只勾选Record AUs 在这里插入图片描述 ;④ 打开文件,之后就开始运行。⑤ 等待运行结束,会在./processd文件夹中生成<ID>.csv文件,将其更名为au.csv。⑥ 将其放在data/<ID>/文件夹下。

  3. 训练模型,依次执行以下代码:

# 命令1:训练模型
python main.py data/obama/ --workspace trial_obama/ -O --iters 100000
# 命令2:在命令1完成后,再多训练“25000”次,微调一下lips
python main.py data/obama/ --workspace trial_obama/ -O --iters 125000 --finetune_lips --patch_size 32

trial_obama是工作路径,也就是生成的模型存放路径。运行完后会生成trial_obama文件夹,文件树如下:

-- checkpoints/  # 模型文件├── ngp_ep0013.pth  # 第13个epoch的文件(会保存最后两个epoch的文件)├── ngp_ep0014.pth└── ngp.pth   # 最终的模型文件
-- log_ngp.txt   # 训练过程中的日志文件
-- opt.txt  # 训练时传的启动参数
-- result   # 训练结果文件├── ngp_ep0014_depth.mp4└── ngp_ep0014.mp4  # 可以下载这个文件看效果
-- run/ngp/events.out.xxxxx   # 训练过程中的数据
-- validation

上面两个命令运行完后,运行下面:

python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --head_ckpt trial_obama/checkpoints/ngp.pth --iters 200000

trial_obama/checkpoints/ngp.pth 为上面生成的最终模型文件

4. 生成数字人视频

当模型生成出来后,就可以用我们自己的语音来生成视频了。需要遵循以下3步骤:

  1. 上传音频,提取音频数据(生成对应的npy文件)

例如:

python data_utils/deepspeech_features/extract_ds_features.py --input /root/demo2.wav

将demo2.wav更改为你的音频文件。执行结束后,会在同目录生成demo2.npy文件

  1. 执行模型推理,生成对口型后的视频文件。不过生成的视频没有声音。
python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --test --test_train --aud /root/demo2.npy

最后的/root/demo2.npy就是第一步生成的npy文件

  1. 将音频和视频合并起来。
ffmpeg -i /root/ER-NeRF/trial_obama_torso/results/ngp_ep0028.mp4 -i /root/demo2.wav -c:v copy -c:a aac -strict experimental /root/output.mp4

ngp_ep0028.mp4是第二步生成的视频(日志里可以看到在哪)。
demo2.wav是上传的音频。
/root/output.mp4 是你想要输出文件的路径



常见错误

  1. ValueError: Found array with 0 sample(s) (shape=(0, 2)) while a minimum of 1 is required by NearestNeighbors.:
Traceback (most recent call last):File "data_utils/process.py", line 417, in <module>extract_background(base_dir, ori_imgs_dir)File "data_utils/process.py", line 112, in extract_backgroundnbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree').fit(fg_xys)File "/root/miniconda3/lib/python3.8/site-packages/sklearn/base.py", line 1152, in wrapperreturn fit_method(estimator, *args, **kwargs)File "/root/miniconda3/lib/python3.8/site-packages/sklearn/neighbors/_unsupervised.py", line 175, in fitreturn self._fit(X)File "/root/miniconda3/lib/python3.8/site-packages/sklearn/neighbors/_base.py", line 498, in _fitX = self._validate_data(X, accept_sparse="csr", order="C")File "/root/miniconda3/lib/python3.8/site-packages/sklearn/base.py", line 605, in _validate_dataout = check_array(X, input_name="X", **check_params)File "/root/miniconda3/lib/python3.8/site-packages/sklearn/utils/validation.py", line 967, in check_arrayraise ValueError(
ValueError: Found array with 0 sample(s) (shape=(0, 2)) while a minimum of 1 is required by NearestNeighbors.

原因:视频中的部分帧没有人脸。一般容易出现在视频开头或结尾。可以通过查看生成的parsing文件夹的图片进行确认。详见issus

这篇关于数字人项目 ER-NeRF 的使用和部署详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894557

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash