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

文章目录

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

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 是你想要输出文件的路径

5. 其他数字人模型比较

模型名称推理速度单独训练优点缺点
video-retalking无需单独训练1. 部署简单
2.无需训练,可直接对任意视频使用
3.项目成熟,兼容性强
4. 包含视频处理部分,无需自行处理视频
1. 推理速度慢,无法做到实时。
2.效果不稳定,有些视频效果很差
ER-NeRF需要自主训练模型1. 模型小,推理速度快,可满足实时要求
2. 嘴型效果较好,但头部晃动严重
1. 项目不成熟,为论文源码,坑比较多
2. 兼容性较差,对部署环境要求严格
3. 数据处理与训练耗时较长,5分钟的视频大约需要1天
Wav2Lip--1. 项目成熟1. 项目太老(4年前的)



常见错误

  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_background
    nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree').fit(fg_xys)
  File "/root/miniconda3/lib/python3.8/site-packages/sklearn/base.py", line 1152, in wrapper
    return fit_method(estimator, *args, **kwargs)
  File "/root/miniconda3/lib/python3.8/site-packages/sklearn/neighbors/_unsupervised.py", line 175, in fit
    return self._fit(X)
  File "/root/miniconda3/lib/python3.8/site-packages/sklearn/neighbors/_base.py", line 498, in _fit
    X = self._validate_data(X, accept_sparse="csr", order="C")
  File "/root/miniconda3/lib/python3.8/site-packages/sklearn/base.py", line 605, in _validate_data
    out = check_array(X, input_name="X", **check_params)
  File "/root/miniconda3/lib/python3.8/site-packages/sklearn/utils/validation.py", line 967, in check_array
    raise ValueError(
ValueError: Found array with 0 sample(s) (shape=(0, 2)) while a minimum of 1 is required by NearestNeighbors.

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/549822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-长按显示,点击空白区域关闭

<view bind:tap"closeLongAction"><view bind:longpress"openAction></view><view wx:if"{{longActionIsShow}}"> 长按显示的区域 </view> </view>openAction(e) {console.log(322,e);this.setData({longActionI…

【解读】《中华人民共和国网络安全法》:所有IT从业者都应知应懂

随着网络的快速发展&#xff0c;当今社会存在的网络安全问题也是接踵而来&#xff1a;网络入侵、网络攻击等非法活动威胁信息安全&#xff1b;非法获取公民信息、侵犯知识产权、损害公民合法利益&#xff1b;宣扬恐怖主义、极端主义&#xff0c;严重危害国家安全和社会公共利益…

IDM2024破解版 IDM软件破解注册序列号 idm教程 idm序列激活永久授权 Internet Download Manager网络下载加速神器

你是不是感觉下载东西资源的时候&#xff0c;下载的非常慢&#xff0c;即便是五十兆的光纤依旧慢、是不是想下载网页上的视频但不知如何进行下载……这些问题是否一直在困扰着您&#xff0c;今日小编特意我大家带来了这款IDM 2024破解版。 众所周知&#xff0c;IDM是一款功能强…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

redis五种类型介绍

Redis是一种内存数据存储系统&#xff0c;它支持五种不同的数据类型&#xff1a; 1. String String是Redis中最基本的数据类型&#xff0c;它可以存储任何形式的字符串数据&#xff0c;例如普通的文本字符串&#xff0c;二进制数据或JSON格式的数据。除此之外&#xff0c;还可以…

LD3320语音模块开发以及未来拿到其他模块的开发方式

当我们拿到一块模块进行开发的时候&#xff0c;一定要拿到配套的使用手册&#xff0c;不然在短时间内根本下不了手 一、使用source Insight来阅读源码 1.建立文件夹 2. 在source Insight放入该文件 3.添加源码 4.解决Source Insight乱码的问题 5.让各个代码模块之间有关联 二、…

动态IP代理API是什么?怎么用?

“动态”意味着每次连接或每隔一段时间&#xff0c;用户的IP地址都会发生改变。由于IP地址的不断变化&#xff0c;用户可以避免因频繁访问同一网站而导致的IP被封锁的问题。API叫做应用程序接口&#xff0c;是一种让软件之间相互通信的接口。API允许用户通过编程方式来调用动态…

mPEG-Succinamide Acid能够作为连接分子,将不同的生物分子偶联在一起,从而构建生物偶联物聚乙二醇衍生物

【试剂详情】 英文名称 mPEG-SAA&#xff0c;mPEG-Succinamide Acid&#xff0c; Methoxy PEG SAA 中文名称 聚乙二醇单甲醚酰胺丁二酸 外观性状 由分子量决定&#xff0c;粘性液体或者固体 分子量 400&#xff0c;600&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件&#xff0c;还可以将它们跨进程组成ActivityTask&#xff0c;这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看&#xff0c;Task有先后之分&#xff0c;源码实现上采取了…

类的加载,反射和注解详解

文章目录 类的加载概述类加载器作用分类获取类加载器的方式 双亲委派机制3种加载器的关系工作机制 类加载器的应用 反射概述关键获取类对象获取构造器对象获取方法对象获取成员变量对象作用 注解概述作用自定义注解格式属性类型 元注解常见的元注解 注解解析概述方法技巧 类的加…

Qt学习记录(C++)——Day 3

目录 一、封装自定义控件 1.添加界面类 2.添加控件 3.提升封装的控件 4.实现功能 5.提供接口 6.测试接口 二、鼠标事件 前言&#xff1a; 1.鼠标进入事件 enterEvent 2.鼠标离开事件 leaveEvent 3.鼠标按下事件 mousePressEvent 4.鼠标释放事件 mouseReleaseEv…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展&#xff1f;知识跟踪可用于量化学生的知识状态&#xff0c;即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

不借助第三方工具打包QT程序

准备工作&#xff1a; 项目/可执行文件名&#xff1a;QTAppName 打包项目存放的文件名&#xff1a;pack&#xff08;这个文件名无所谓&#xff09; 脚本名&#xff1a; copylib.sh&#xff08;类似ldd命令&#xff09;&#xff1a;用于将.so库文件的依赖项复制并放入自动生…

docker拉取镜像速度慢

解决办法是配置阿里云镜像加速 在docker desktop的docker engine里添加 "registry-mirrors": ["https://owzy8hoh.mirror.aliyuncs.com"] 修改以后重启docker 参考&#xff1a; 【docker】Windows10系统下安装并配置阿里云镜像加速_docker desktop 配置…

Steam平台FPS游戏节来袭,速来免费领取头像、边框和贴纸

首先&#xff0c;活动时间从4月16日持续到4月23日&#xff0c;想领取免费物品的小伙伴们要抓紧时间啦&#xff01;领取链接就在传送门等你哦。《战地》和《使命召唤》系列没有打折哦&#xff0c;有点遗憾。不过&#xff0c;别灰心&#xff0c;这次活动还是很给力的哦&#xff0…

Hyperledger Fabric

一.Hyperledger Fabric介绍 Hyperledger区块链全家桶 Hyperledger Fabric技术特性 资产 — 资产定义使得几乎任何具有货币价值的东西都可以在网络上交 换&#xff0c;包括从食品到古董汽车再到货币期货。链码 — 链码执行与交易排序的分离&#xff0c;限制了跨节点类型所需的…

Hibernate框架

什么是Hibernate 我们可以从度娘上摘抄这样有关Hibernate的介绍&#xff1a; Hibernate是一个开放源代码的对象关系映射框架&#xff0c;它对JDBC进行了非常轻量级的对象封装&#xff0c;它将POJO(简单java对象)与数据库表建立映射关系&#xff0c;是一个全自动的orm框架&…

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

nnUNet是一个自适应的深度学习框架&#xff0c;专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点&#xff1a; 自适应框架&#xff1a;nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等&#xff0c;从而避免了繁琐的手工调参过程。 自动化流程&a…

LeetCode 80—— 删除有序数组中的重复项 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 让 index指向删除重复元素后数组的新长度&#xff1b;让 st_idx 指向重复元素的起始位置&#xff0c;而 i 指向重复元素的结束位置&#xff0c;duplicate_num代表重复元素的个数&#xff1b;一段重复元素结束后&am…

入侵检测数据预处理 特征工程 面临的问题

数据预处理 对于分类任务来说,由于原始数据可能存在异常、缺失值以及不同特征的取值范围差 异大等问题,对机器学习会产生影响,因此,在进行机器学习模型训练之前,需要先对数据 进行预处理。数据预处理的主要过程包括数据清洗、去量纲、离散化等。 1.数据清洗 对采集到的数据进行…