政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

政安晨的个人主页:政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: 零基础玩转各类开源AI项目

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

本文目标在Ubuntu系统上部署Hallo,实现训练和推理


背景介绍 

由语音音频输入驱动的肖像图像动画领域在生成逼真的动态肖像方面取得了重大进展。

这项研究深入探讨了同步面部运动的复杂性,以及在基于扩散的方法框架内创建视觉上吸引人、时间上一致的动画。

我们的创新方法摒弃了依赖参数模型进行中间面部表征的传统模式,采用了端到端扩散模式,并引入了分层音频驱动视觉合成模块,以提高音频输入和视觉输出(包括嘴唇、表情和姿势运动)之间的对齐精度。 我们提出的网络架构无缝集成了基于扩散的生成模型、基于 UNet 的去噪器、时序对齐技术和参考网络。 所提出的分层音频驱动视觉合成技术可对表情和姿势多样性进行自适应控制,从而更有效地实现针对不同身份的个性化定制。

通过结合定性和定量分析的综合评估,我们的方法在图像和视频质量、嘴唇同步精度和动作多样性方面都有明显的提升。

项目地址为:

https://github.com/fudan-generative-vision/halloicon-default.png?t=N7T8https://github.com/fudan-generative-vision/hallo

本方法所提议的流程概览如下:

具体而言,我们将包含肖像的参考图像与相应的音频输入整合,并用于驱动肖像动画。

可选的视觉合成权重可用于平衡嘴唇、表情和姿势权重。

ReferenceNet编码全局视觉纹理信息,用于实现一致且可控的角色动画。

人脸和音频编码器分别生成高保真的肖像身份特征和将音频编码为动作信息。

层次化音频驱动的视觉合成模块建立了音频和视觉组件(嘴唇、表情、姿势)之间的关系,并在扩散过程中使用UNet降噪器。

音频驱动的层次视觉合成的可视化及原始全方法与我们提出的层次音频-视觉交叉注意力之间的比较分析。

训练与推理

训练

训练过程包括两个不同的阶段:

(1) 在第一阶段的训练中,利用参考图像和目标视频帧对生成单个视频帧。

VAE编码器和解码器的参数以及面部图像编码器被固定,同时允许优化ReferenceNet和去噪UNet的空间交叉注意力模块的权重,以提高单帧生成能力。提取包含14帧的视频片段作为输入数据,从面部视频片段中随机选择一帧作为参考帧,从同一个视频中选择另一帧作为目标图像。

(2) 在第二阶段的训练中,使用参考图像、输入音频和目标视频数据进行视频序列训练。

ReferenceNet和去噪UNet的空间模块保持静态,专注于增强视频序列生成能力。这个阶段主要侧重于训练层次化的音频-视觉交叉注意力,建立音频作为运动指导和嘴唇、表情和姿势的视觉信息之间的关系。

此外,引入运动模块来改善模型的时间连贯性和平滑性,该模块使用来自AnimateDiff 的预设权重进行初始化。在这个阶段,从视频剪辑中随机选择一个帧作为参考图像。

与现有的肖像图像动画方法在HDTF数据集上的定量比较。本框架提出的方法在生成高质量、时间上连贯的说话头像动画以及优越的嘴唇同步性能方面表现出色。

上图为:在HDTF数据集上与现有方法的定性比较。

推理

在推理阶段,网络以一张参考图像和驾驶音频作为输入,根据相应的音频生成一个动画化的视频序列。为了产生视觉上一致的长视频,我们利用上一个视频片段的最后2帧作为下一个片段的初始k帧,实现逐步递增的视频片段生成。

开始部署

1. 把项目源码下载到本地

git clone git@github.com:fudan-generative-vision/hallo.git

2. 创建 conda 环境

  conda create -n hallo python=3.10conda activate hallo

 

 

3. 使用 pip 安装软件包

(此外,还需要 ffmpeg:sudo apt-get install ffmpeg, 如果没有安装的话可以在系统中安装一下)

4. 下载预训练模型

您可以从该项目的 HuggingFace 软件仓库轻松获取推理所需的所有预训练模型。

通过下面的 cmd 将预训练模型克隆到 ${PROJECT_ROOT}/pretrained_models 目录中:

git lfs install
git clone https://huggingface.co/fudan-generative-ai/hallo pretrained_models

 

 

 

 

最后,这些预训练模型的组织结构如下:

./pretrained_models/
|-- audio_separator/
|   |-- download_checks.json
|   |-- mdx_model_data.json
|   |-- vr_model_data.json
|   `-- Kim_Vocal_2.onnx
|-- face_analysis/
|   `-- models/
|       |-- face_landmarker_v2_with_blendshapes.task  # face landmarker model from mediapipe
|       |-- 1k3d68.onnx
|       |-- 2d106det.onnx
|       |-- genderage.onnx
|       |-- glintr100.onnx
|       `-- scrfd_10g_bnkps.onnx
|-- motion_module/
|   `-- mm_sd_v15_v2.ckpt
|-- sd-vae-ft-mse/
|   |-- config.json
|   `-- diffusion_pytorch_model.safetensors
|-- stable-diffusion-v1-5/
|   `-- unet/
|       |-- config.json
|       `-- diffusion_pytorch_model.safetensors
`-- wav2vec/`-- wav2vec2-base-960h/|-- config.json|-- feature_extractor_config.json|-- model.safetensors|-- preprocessor_config.json|-- special_tokens_map.json|-- tokenizer_config.json`-- vocab.json

5. 准备推理数据

Hallo 对输入数据有几个简单的要求:

源图像:

1. 应裁剪成正方形。

2. 人脸应是主要焦点,占图像的 50%-70%。

3. 人脸应朝向前方,旋转角度小于 30°(无侧面轮廓)。

驱动音频:

1. 必须是 WAV 格式。

2. 必须是英语,因为我们的训练数据集仅使用英语。

3. 确保人声清晰,背景音乐也可接受。 

项目提供了一些样本供您参考(文件在项目源码中,小伙伴们自行获取 -- 政安晨)。

6. 运行推理

只需运行 scripts/inference.py,并将 source_image 和 driving_audio 作为输入即可:

python scripts/inference.py --source_image examples/reference_images/1.jpg --driving_audio examples/driving_audios/1.wav

动画结果默认保存为 ${PROJECT_ROOT}/.cache/output.mp4。 你可以通过 --output 来指定输出文件名。 您可以在 examples 文件夹中找到更多推理示例。

在使用推理的过程中,您可能会遇到问题,比如提示xformers不可用,重新安装xformers等。

按照提示地址打开xformers官网重新安装:

conda install xformers -c xformers

之后,再重新按照上述方式在miniconda虚拟环境中重装依赖。

接下来,就可以正常操作了,我的示例如下:

python scripts/inference.py --source_image examples/YDBaba/2.jpg --driving_audio examples/YDBaba/1.wav

更多操作说明如下:

usage: inference.py [-h] [-c CONFIG] [--source_image SOURCE_IMAGE] [--driving_audio DRIVING_AUDIO] [--output OUTPUT] [--pose_weight POSE_WEIGHT][--face_weight FACE_WEIGHT] [--lip_weight LIP_WEIGHT] [--face_expand_ratio FACE_EXPAND_RATIO]options:-h, --help            show this help message and exit-c CONFIG, --config CONFIG--source_image SOURCE_IMAGEsource image--driving_audio DRIVING_AUDIOdriving audio--output OUTPUT       output video file name--pose_weight POSE_WEIGHTweight of pose--face_weight FACE_WEIGHTweight of face--lip_weight LIP_WEIGHTweight of lip--face_expand_ratio FACE_EXPAND_RATIOface region

关于训练

为训练准备数据

训练数据使用了一些与推理所用源图像类似的会说话的人脸视频,也需要满足以下要求:

1. 照片应裁剪成正方形。

2. 面部应是主要焦点,占画面的 50%-70%。

3. 面部应朝向前方,旋转角度小于 30°(无侧面轮廓)。

将原始视频整理到以下目录结构中:

dataset_name/
|-- videos/
|   |-- 0001.mp4
|   |-- 0002.mp4
|   |-- 0003.mp4
|   `-- 0004.mp4

您可以使用任何数据集名称,但要确保视频目录的名称如上所示。

接下来,使用以下命令处理视频:

python -m scripts.data_preprocess --input_dir dataset_name/videos --step 1
python -m scripts.data_preprocess --input_dir dataset_name/videos --step 2

:由于步骤 1 和步骤 2 执行不同的任务,因此应按顺序执行。

步骤 1 将视频转换为帧,从每个视频中提取音频,并生成必要的掩码。

步骤 2 使用 InsightFace 生成人脸嵌入,使用 Wav2Vec 生成音频嵌入,需要 GPU。 要进行并行处理,可使用 -p 和 -r 参数。 -p参数指定要启动的实例总数,将数据分成 p 部分。 -r参数指定当前进程应处理的部分。 您需要使用不同的 -r 值手动启动多个实例。

使用以下命令生成元数据 JSON 文件:

python scripts/extract_meta_info_stage1.py -r path/to/dataset -n dataset_name
python scripts/extract_meta_info_stage2.py -r path/to/dataset -n dataset_name

将 path/to/dataset 替换为视频父目录的路径,例如上例中的 dataset_name。 这将在 ./data 目录中生成 dataset_name_stage1.json 和 dataset_name_stage2.json。

训练

更新配置 YAML 文件 configs/train/stage1.yaml 和 configs/train/stage2.yaml 中的数据元路径设置:

#stage1.yaml
data:
  meta_paths:
    - ./data/dataset_name_stage1.json

#stage2.yaml
data:
  meta_paths:
    - ./data/dataset_name_stage2.json

使用以下命令开始训练:

accelerate launch -m \
  --config_file accelerate_config.yaml \
  --machine_rank 0 \
  --main_process_ip 0.0.0.0 \
  --main_process_port 20055 \
  --num_machines 1 \
  --num_processes 8 \
  scripts.train_stage1 --config ./configs/train/stage1.yaml

加速使用说明

加速启动命令用于以分布式设置启动训练过程。

accelerate launch [arguments] {training_script} --{training_script-argument-1} --{training_script-argument-2} ...

支持加速的理由

  • -m, --module: 将启动脚本解释为 Python 模块。
  • --config_file: 抱脸加速的配置文件。
  • --machine_rank: 多节点设置中当前机器的等级。
  • --main_process_ip: 主节点的 IP 地址。
  • --main_process_port: 主节点的端口。
  • --num_machines: 参与训练的节点总数。
  • --num_processes: 训练进程总数,与所有机器的 GPU 总数相匹配。

训练论据

  • {training_script}: The training script, such as scripts.train_stage1 or scripts.train_stage2.
  • --{training_script-argument-1}: Arguments specific to the training script. Our training scripts accept one argument, --config, to specify the training configuration file.

对于多节点训练,需要在每个节点上分别手动运行不同机器等级的命令。

训练细节后续会继续为大家展示。—— 政安晨

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

高频面试题-CSS

BFC 介绍下BFC (块级格式化上下文) 1>什么是BFC BFC即块级格式化上下文,是CSS可视化渲染的一部分, 它是一块独立的渲染区域,只有属于同一个BFC的元素才会互相影响,且不会影响其它外部元素。 2>如何创建BFC 根元素,即HTM…

【好玩的经典游戏】Docker环境下部署赛车小游戏

【好玩的经典游戏】Docker环境下部署赛车小游戏 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 安装Docker环境3.2 检查Docker服务状态3.3 检查Docker版本3.4 检查docker compose 版本四、构建容器镜像4.1 下…

基于springboot新生宿舍管理系统

系统背景 在当今高等教育日益普及的时代背景下,高校作为知识传播与创新的重要基地,其基础设施的智能化管理显得尤为重要。新生宿舍作为大学生活的起点,不仅是学生日常生活与学习的重要场所,也是培养学生独立生活能力和团队合作精神…

IP溯源工具--IPTraceabilityTool

工具地址:xingyunsec/IPTraceabilityTool: 蓝队值守利器-IP溯源工具 (github.com) 工具介绍: 在攻防演练期间,对于值守人员,某些客户要求对攻击IP都进行分析溯源,发现攻击IP的时候,需要针对攻击IP进行分析…

【electron6】浏览器实时播放PCM数据

pcm介绍:PCM(Puls Code Modulation)全称脉码调制录音,PCM录音就是将声音的模拟信号表示成0,1标识的数字信号,未经任何编码和压缩处理,所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信…

单片机程序设计模式

RTOS:多任务拆分交叉执行 Q:状态机和多任务模式有什么区别 Q:任务创建和任务调度器是什么? 裸机程序的设计模式可以分为:轮询、前后台、定时器驱动、基于状态机。前面三种方 法都无法解决一个问题:假设有 A、B 两个都很耗时的函数&#xf…

基于牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)的无人机三维路径规划

牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)是一种新型的元启发式算法(智能优化算法),该成果由Sowmya等人于2024年2月发表在中科院2区Top SCI期刊《Engineering Applications of Artificial Intelligence》上。 1、算法原理…

前端开发_注意事项

无论使用哪种框架开发(vue、react、...),前端开发终究是结构(HTML)、样式(CSS)、逻辑(用户操作数据处理对接后端API)。那么开发过程中都需要注意哪些事项,本文…

VScode:前端项目中yarn包的安装和使用

一、首先打开PowerShell-管理员身份运行ISE 输入命令: set-ExecutionPolicy RemoteSigned 选择“全是”,表示允许在本地计算机上运行由本地用户创建的脚本,没有报错就行了 二、接着打开VScode集成终端,安装yarn插件 输入 npm ins…

新版本 idea 创建不了 spring boot 2 【没有jkd8选项】

创建新项目 将地址换成如下 https://start.aliyun.com/

vue this.$refs 动态拼接

业务需要&#xff0c;refs是不固定的 <vxe-grid refgridWarehouse v-bind"gridWarehouseOptions" v-if"tableHeight" :height"tableHeight":expand-config"{iconOpen: vxe-icon-square-minus, iconClose: vxe-icon-square-plus}"c…

Filebeat k8s 部署(Deployment)采集 PVC 日志发送至 Kafka——日志处理(二)

文章目录 前言Filebeat Configmap 配置Filebeat Deployment验证总结 前言 在上篇文章中总结了 Django 日志控制台输出、文件写入按天拆分文件&#xff0c;自定义 Filter 增加 trace_id 以及过滤——日志处理&#xff08;一)&#xff0c;将日志以 JSON 格式写入日志文件。我们的…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

【IC前端虚拟项目】reference model编写与合入

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 本来按照规划,这一篇应该写ral model的生成与合入,不过因为前面在这一篇文章中已经介绍了mvu的寄存器体系: 【IC前端虚拟项目】MVU寄存器文档编写与RTL代码生成-CSDN博客文章浏览阅读209次。那可就多…

VLAN 划分案例详解

vlan 的应用在网络项目中是非常广泛的&#xff0c;基本上大部分的项目都需要划分 vlan&#xff0c;这里从基础的 vlan 的知识开始&#xff0c;了解 vlan 的划分原理。 为什么需要 vlan&#xff1a; 1、什么是 VLAN&#xff1f; VLAN&#xff08;Virtual LAN&#xff09;&…

MySQL练习01

题目 步骤 创建数据库 create database mydb6_product; #创建数据库 use mydb6_product; #使用数据库 创建表 employees表 create table employees(id int primary key,-> name varchar(50) not null,-> age int,-> gender varchar(10) not null default&qu…

开关电源中的局部放电

一、局部放电现象 局部放电&#xff08;partial discharge&#xff0c;简称PD&#xff09;现象&#xff0c;通常主要指的是高压电气设备绝缘层在足够强的电场作用下局部范围内发生的放电&#xff0c;某个区域的电场强度一旦达到其介质击穿场强时&#xff0c;该区域就会出现放电…

牛客TOP101:链表中环的入口结点

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 3. 代码实现 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {} }; */ class Solution { public:ListNode* hasCycle(ListNode *head) {if(head nullptr) retu…

Python 工程师对 3D 高斯溅射的介绍(第 2 部分)

理解并编码如何在 3D 高斯溅射中使用高斯 欢迎来到雲闪世界现在开始讨论高斯&#xff01;这是每个人最喜欢的分布。如果您刚刚加入我们&#xff0c;我们已经在第1 部分中介绍了如何根据相机的位置获取 3D 点并将其转换为 2D 。在本文中&#xff0c;我们将讨论高斯分布的高斯部分…

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中&#xff0c;战锤入侵是一个重要的游戏环节&#xff0c;了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧&#xff0c;帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…