音视频开发之旅(75)- AI数字人进阶--GeneFace++

目录

1.效果展示和玩法场景

2.GeneFace++原理学习

3.数据集准备以及训练的过程

5.遇到的问题与解决方案

6.参考资料

一、效果展示

AI数字人进阶--GeneFace++(1)

AI数字人进阶--GeneFace++(2)

想象一下,一个专为你打造的AI数字人,不仅可以代表你在屏幕上出现,还能带来实实在在的商业价值。之前sadtalker照片说话的应用场景不同,定制的视频数字人的应用场景就不仅仅是娱乐,而可以带来更多价值:自媒体运营,短视频带货,数字人直播等等,现在抖音、视频号中看到的刘润等很多视频都是来自于其数字人。

由于其训练成本比较高,现在一般的玩法是提供模板视频任务,用户输入自己的文字或者语音,使用选择的模板生成对应的视频。也可以允许个人上传视频进行定制,单独收费。

二、GeneFace++原理学习

实现高嘴形对齐(lip-sync)、高视频真实度(video reality)、高系统效率(system efficiency)的虚拟人视频合成。

整体架构如下

图片

  1. 首先,处理输入的语音并提取关键特征,音高和语音

  2. 然后,预测说话时面部的动作,特别是嘴唇和面部表情

  3. 最后,这些预测被转换成视频帧,

  4. 通过一系列图像处理技术确保生成的视频真实和清晰

1. 音频处理

系统首先接收输入的语音,有两个关键部分:

  • 音高编码器(Pitch Encoder):这个部分捕捉语音中的音高变化,因为音高(声音的高低)对理解说话者的情感和意图很重要。

  • HuBERT:HuBERT是Facebook开发的一种自监督学习模型,用于音频表示学习。用于从语音中提取更丰富的特征,如语速、重音、语音的节奏等,与音高信息结合,以预测面部动作。

2. 面部动作预测

音频信息会被用来预测人脸的动作,特别是嘴唇和面部表情。这个步骤包括:

  • 音高感知音频到动作模型(Pitch-Aware Audio2Motion):这部分使用前面提取的音频特征来预测面部关键点的动作,关键点是面部的重要部位,如眼角、嘴角等。

  • Landmark LLE Proj:帮助模型理解不同面部关键点之间的关系,并确保预测的动作自然和准确。

3. 视频合成

系统将预测的面部动作转换为实际的视频帧。这一过程包括以下几个部分:

  • 即时动作到视频模型(Instant Motion2Video):把预测的关键点动作转换成连续的视频帧,形成一个可以播放的视频。

  • 超分辨率处理:为了确保生成的视频质量尽可能高,系统会对视频帧进行超分辨率处理,提升图像的清晰度和细节。

  • Volume Renderer:用于渲染三维数据以产生真实感的二维图像,增强视频的真实性。

三、数据集准备以及训练推理的过程

3.1 训练视频的要求

训练视频的质量直接影响了训练的结果,一般有下面几个重要的要求

1. 训练视频最好3-5分钟,每一帧都要人脸,头部要一直面对镜头,不能太偏;

2. 需要对录制视频进行预处理,降噪、音频重采样为16000HZ,视频裁剪为512*512,帧率25fps;

3. 裁剪后的视频要保证 头部在视频中占据相对较大的区域。

4. 推理的音频尽量和训练的语调保持一致,增加真实感

关于预处理部分,前面写了篇文章,提供了预处理脚本,可以直接使用

3.2 数据处理的脚本(音频特征提取、截帧、抠图、人脸landmark提取以及3dmm生成、将数据打包为npy)

export PYTHONPATH=./export VIDEO_ID=xxxexport CUDA_VISIBLE_DEVICES=0
mkdir -p data/processed/videos/${VIDEO_ID}
#音频特征提取(hubert以及mel)python data_gen/utils/process_audio/extract_hubert.py --video_id=${VIDEO_ID}python data_gen/utils/process_audio/extract_mel_f0.py --video_id=${VIDEO_ID}# 截帧、抠图mkdir -p data/processed/videos/${VIDEO_ID}/gt_imgsffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -vf fps=25,scale=w=512:h=512 -qmin 1 -q:v 1 -start_number 0 -v quiet data/processed/videos/${VIDEO_ID}/gt_imgs/%08d.jpgpython data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process # 提取2D landmark用于之后Fit 3DMMpython data_gen/utils/process_video/extract_lm2d.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
# Fit 3DMMpython data_gen/utils/process_video/fit_3dmm_landmark.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --reset --debug --id_mode=global
# 将数据打包python data_gen/runs/binarizer_nerf.py --video_id=${VIDEO_ID}

3.3 训练模型

需要分为两步,训练Head NeRF (头部)模型和Torso NeRF(躯干)模型

# 训练 Head NeRF 模型# 模型与tensorboard会被保存在 `checkpoints/<exp_name>`CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/videoid/lm3d_radnerf_sr.yaml --exp_name=motion2video_nerf/videoid_head --reset
# 训练 Torso NeRF 模型CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/videoid/lm3d_radnerf_torso_sr.yaml --exp_name=motion2video_nerf/videoid_torso --hparams=head_model_dir=checkpoints/motion2video_nerf/videoid_head --reset

如果从头开始训练加上-reset,否则去掉即可实现继续上次step继续训练

训练的过程比较耗时,4090显卡,两个模型都训练完大概需要十几个小时,需要注意训练过程中是否有log报错信息(代码中可能会catch,如果出现错误继续执行,可能存在训练模型异常),数据集的准备十分关键,如果准备不到位,很可能就要来来回回折腾很多次。第四节大家会看到一些由于训练视频数据问题导致的奇葩现象。

3.4 推理

推理就很快了,十几秒的视频生成也就十几秒钟的时间

​​​​​​​

推理脚本. (输入音频支持mp3,会重采样为16k)CUDA_VISIBLE_DEVICES=0  python inference/genefacepp_infer.py --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/videoid_torso --drv_aud=data/raw/val_wavs/input.mp3 --out_name output.mp4

四、遇到的问题和解决方案

记录有价值的问题和解决方案,避免踩坑

4.1 工程类错误

(1)Inference ERROR: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

环境问题,按照readme重新创建venv环境

(2)数据处理环节提取图片时卡住

加上 --force_single_process可以解决

python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process

https://github.com/yerfor/GeneFacePlusPlus/issues/98

(3) loss_output['ambient_loss'].item() AttributeError

​​​​​​​

Traceback (most recent call last):  File "tasks/radnerfs/radnerf_sr.py", line 293, in _training_step    current_ambient_loss = loss_output['ambient_loss'].item()AttributeError: 'int' object has no attribute 'item'| WARNING: ERROR calculating ambient loss| WARNING: ERROR calculating ambient loss

修改代码兼容即可

​​​​​​​

try:    current_ambient_loss = loss_output['ambient_loss'].item()except AttributeError as e:    current_ambient_loss = loss_output['ambient_loss']

4.2 效果类问题

(1)推理后的视频,人脸直接糊掉了

图片

原因:人脸占的区域太小了,训练后效果很差,我这个视频原始宽高就比较小 544x900的,裁剪为512x512后,人脸区域就是很小,改为256x256就满足要求,但是需要对齐进行超分到512x512再进行训练

(2)推理后画质降低

可以尝试修改lm3d_radnerf_sr.yaml和lm3d_radnerf_torso_sr.yaml中的lambda_lpips_loss ,例如从 0.001 到 0.003。

https://github.com/yerfor/GeneFacePlusPlus/issues/29

五、参考资料

  1. GeneFace++: Generalized and StableReal-Time 3D Talking Face Generation  https://genefaceplusplus.github.io/

  2. 【AI数字人-论文】GeneFace++ https://blog.csdn.net/weixin_42111770/article/details/136052069
  3. GeneFace++:https://github.com/yerfor/GeneFacePlusPlus/tree/main
  4. GeneFace++保姆式训练教程 https://www.bilibili.com/video/BV1xx421f7PV/?spm_id_from=333.788.recommend_more_video.1&vd_source=03a763fa6cf49b01f658f32592f5a6f3
  5. AI数字人方案、多种解决方案全解析 https://www.bilibili.com/video/BV1KC4y137TT/?p=2&spm_id_from=pageDriver
  6. AI 数字人训练GeneFace++ https://www.bilibili.com/video/BV1LB421z76c/?vd_source=03a763fa6cf49b01f658f32592f5a6f3

感谢你的阅读

接下来我们继续学习输出AIGC相关内容,关注公众号“音视频开发之旅”,回复:“数字人” 获取资料,一起学习成长。

欢迎交流

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[算法] 牛课题霸 - DP6 连续子数组最大和 - 动态规划

文章目录 题目链接解题过程思路一思路二 题目链接 DP6 连续子数组最大和 解题过程 思路一 两个for循环&#xff0c;遍历。 因为每个元素都要遍历两遍&#xff0c;所以时间复杂度O(n^2)。 简单的测试用例可以通过&#xff0c;但是提交时&#xff0c;一个巨大的数组用例&…

2024春秋蓝桥杯reverse——crackme01

尝试了下输入没有任何反应 查看——32位——IDA打开 我之前没怎么写过win32&#xff0c;所以我开始在string里面找flag,wrong,right什么的字符&#xff0c;都不行 然后我又在函数里面找main&#xff0c;也什么收获的没有,OK废话完了 在win32里面 关于弹窗的函数&#xff1a;…

Pytorch学习 day14(模型的验证步骤)

如何利用已经训练好的模型&#xff0c;验证它的结果&#xff0c;步骤如下&#xff1a; 步骤一&#xff1a;加载测试输入并更改为合适尺寸 保存图片到指定文件夹下&#xff0c;注意是否为同级目录注意&#xff1a;返回上一级目录为“…/xxx"有时&#xff0c;我们自己的输…

C++入门篇(2)

1. 内联函数 1.1 概念 C中&#xff0c;以 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 #include <iostream> using namespace std;int Add(int…

DMSP夜间灯光卫星介绍和数据下载

DMSP(Defense Meteorological Sate-llite Program)是美国国防部的极轨卫星计划&#xff0c;与NOAA卫星同属于一类&#xff0c;只不过星上载荷不同。 DMSP卫星简介 现有DMSP为三轴姿态稳定卫星&#xff0c;运行在高度约830km的太阳同步轨道&#xff0c;周期约101min&#xff0c…

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境 基于包管理器进行安装 Linux 会把一些软件包放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包给下载安装 ubuntu系统上的包管理器是 apt centos系统上的包管理器 yum 注&#xff1a;…

谈谈Darknet53为啥这么难训练

在我使用Imagenet2012对Darknet53进行预训练的时候&#xff0c;往往训练到一半&#xff0c;就会出现过拟合&#xff0c;导致无法继续向下训练&#xff0c;尝试了很多方法&#xff0c;最后发现问题出现在下图红框的部分。 得出这个结论是因为当我使用Resnet中&#xff0c;包含有…

医药大数据案例分析

二、功能 &#xff08;1&#xff09;流量分析 &#xff08;2&#xff09;经营状态分析 &#xff08;3&#xff09;大数据可视化系统 配置tomcat vim /root/.bash_profile添加以下内容&#xff1a; export CATALINA_HOME/opt/tomcat export PATH P A T H : PATH: PATH:CATALIN…

leetcode一天一题-第1天

为了增加自己的代码实战能力&#xff0c;希望通过刷leetcode的题目&#xff0c;不断提高自己&#xff0c;增加对代码的理解&#xff0c;同时开拓自己的思维方面。 题目名称&#xff1a;两数之和 题目编号&#xff1a;1 题目介绍&#xff1a; 给定一个整数数组 nums 和一个整数…

【算法与数据结构】队列的实现详解

文章目录 &#x1f4dd;队列的概念及结构&#x1f320; 队列的顺序实现&#x1f309;初始化&#x1f320;入队&#x1f309;出队&#x1f320;获取队列首元素&#x1f309;获取队列尾部元素&#x1f320;获取队列中有效元素个数&#x1f309; 队列是否为空&#x1f320;查看队列…

Django框架的全面指南:从入门到高级【第128篇—Django框架】

Django框架的全面指南&#xff1a;从入门到高级 Django是一个高效、功能强大的Python Web框架&#xff0c;它被广泛用于构建各种规模的Web应用程序。无论是初学者还是有经验的开发人员&#xff0c;都可以从入门到掌握Django的高级技巧。在本指南中&#xff0c;我们将带你逐步了…

十三届试题B(山)

这天小明正在学数数。 他突然发现有些正整数的形状像一座“山”&#xff0c;比如 123565321 、 145541 &#xff0c;它们左右对称&#xff08;回文&#xff09;且数位上的数字先单调不减&#xff0c;后单调不增。 小明数了很久也没有数完&#xff0c;他想让你告诉他在区间[2022…