政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成
政安晨的个人主页:政安晨
欢迎 👍点赞✍评论⭐收藏
收录专栏: 零基础玩转各类开源AI项目
希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!
本文目标:在Ubuntu系统上部署Hallo,实现训练和推理
背景介绍
由语音音频输入驱动的肖像图像动画领域在生成逼真的动态肖像方面取得了重大进展。
这项研究深入探讨了同步面部运动的复杂性,以及在基于扩散的方法框架内创建视觉上吸引人、时间上一致的动画。
我们的创新方法摒弃了依赖参数模型进行中间面部表征的传统模式,采用了端到端扩散模式,并引入了分层音频驱动视觉合成模块,以提高音频输入和视觉输出(包括嘴唇、表情和姿势运动)之间的对齐精度。 我们提出的网络架构无缝集成了基于扩散的生成模型、基于 UNet 的去噪器、时序对齐技术和参考网络。 所提出的分层音频驱动视觉合成技术可对表情和姿势多样性进行自适应控制,从而更有效地实现针对不同身份的个性化定制。
通过结合定性和定量分析的综合评估,我们的方法在图像和视频质量、嘴唇同步精度和动作多样性方面都有明显的提升。
项目地址为:
https://github.com/fudan-generative-vision/hallohttps://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 asscripts.train_stage1
orscripts.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.
对于多节点训练,需要在每个节点上分别手动运行不同机器等级的命令。
训练细节后续会继续为大家展示。—— 政安晨
相关文章:
政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文目标:在Ubuntu系统上部署Hallo&#x…...
Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )
目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一:使用 IDEA 直接创建项目 项目创建方式二:使用Spring Initializr 的 Web页面创建项目 (了解&#…...
电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法
在信息爆炸的时代,屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性,我对于录屏软件的需求可以说是既挑剔又实际。今天,我就为大家分享一下我近期体验的三款录屏软件:福昕录屏大师、转转大师录屏大师和OB…...
idea双击没有反应,打不开
问题描述 Error opening zip file or JAR manifest missing : /home/IntelliJ-IDEA/bin/jetbrains-agent.jar解决方案...
关于UniApp使用的个人笔记
UniApp 开发者中心 用于注册应用以及申请对应证书 https://dev.dcloud.net.cn/pages/app/list https://blog.csdn.net/fred_kang/article/details/124988303 下载证书后,获取SHA1关键cmd keytool -list -v -keystore test.keystore Enter keystore password…...
autoware.universe源码略读(3.16)--perception:object_range_splitter
autoware.universe源码略读3.16--perception:object_range_splitter Overviewnode(Class Constructor)ObjectRangeSplitterNode::ObjectRangeSplitterNode(mFunc)ObjectRangeSplitterNode::objectCallback Overview 这里处理的依…...
深度学习落地实战:人脸五官定位检测
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡
一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8、两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡扩展。软件支持windows,Linux操作系统。 二、功能和技术指标: 板卡功…...
【go】Excelize处理excel表 带合并单元格、自动换行与固定列宽的文件导出
文章目录 1 简介2 相关需求与实现2.1 导出带单元格合并的excel文件2.2 导出增加自动换行和固定列宽的excel文件 1 简介 之前整理过使用Excelize导出原始excel文件与增加数据校验的excel导出。【go】Excelize处理excel表 带数据校验的文件导出 本文整理使用Excelize导出带单元…...
uniapp自定义tabBar
uniapp自定义tabBar 1、在登录页中获取该用户所有的权限 getAppFrontMenu().then(res>{if(res.length > 0){// 把所有权限存入缓存中let firstPath res.reverse()[0].path;uni.setStorageSync(qx_data, res);uni.switchTab({url: firstPath,})// 方法二 通过uni.setTabB…...
IDEA2023版本创建JavaWeb项目及配置Tomcat详细步骤!
一、创建JavaWeb项目 第一步 之前的版本能够在创建时直接选成Web项目,但是2023版本在创建项目时没有该选项,需要在创建项目之后才能配置,首先先创建一个项目。 第二步 在创建好的项目中选中项目后(一定要注意选中项目名称然后继…...
WPF中MVVM常用的框架
在WPF开发中,MVVM(Model-View-ViewModel)是一种广泛使用的设计模式,它有助于分离应用程序的用户界面(View)、业务逻辑(Model)和数据表现层(ViewModel)。以下是…...
Mysql----内置函数
前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、日期函数 日期:年月日 时间:时分秒 查询:当前时间,只显示当前日期 注意:如果类型为date或者datetime。表中数据类型为date,你插入时…...
去除重复字母
题目链接 去除重复字母 题目描述 注意点 s 由小写英文字母组成1 < s.length < 10^4需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置) 解答思路 本题与移掉 K 位数字类似,需要注意的是,并不是每个字母都能…...
Xcode进行真机测试时总是断连,如何解决?
嗨。大家好,我是兰若姐姐。最近我在用真机进行app自动化测试的时候,经常会遇到xcode和手机断连,每次断连之后需要重新连接,每次断开都会出现以下截图的报错 当这种情况出现时,之前执行的用例就相当于白执行了ÿ…...
Redis的使用(五)常见使用场景-分布式锁实现原理
1.绪论 为了解决并发问题,我们可以通过加锁的方式来保证数据的一致性,比如java中的synchronize关键字或者ReentrantLock,但是他们只能在同一jvm进程上加锁。现在的项目基本上都是分布式系统,如何对多个java实例进行加锁ÿ…...
AppML 案例:Products
AppML 案例:Products AppML(Application Markup Language)是一种创新的、基于XML的标记语言,旨在简化Web应用程序的开发。它允许开发者通过声明性的方式定义应用程序的界面和数据绑定,从而提高开发效率和减少代码量。…...
数据库端口LookUp功能:从数据库中获取并添加数据到XML
本文将为大家介绍如何使用知行之桥EDI系统数据库端口的Lookup功能,从数据库中获取数据,并添加进输入的XML中。 使用场景:期待以输入xml中的值为判断条件从数据库中获取数据,并添加进输入xml中。 例如:接收到包含采购…...
视频联网共享平台LntonCVS视频监控汇聚平台视频云解决方案
LntonCVS流媒体平台是一款遵循国家GB28181标准协议的先进视频监控与云服务平台。该平台设计独特,能够同时接入并处理多路设备的视频流,支持包括RTSP、RTMP、FLV、HLS、WebRTC在内的多种视频流格式的分发。其功能丰富多样,涵盖了视频直播监控、…...
深入探索Python中的`__slots__`类属性:优化内存与限制灵活性
深入探索Python中的__slots__类属性:优化内存与限制灵活性 在Python编程的广阔领域中,性能优化总是开发者们关注的焦点之一。特别是在处理大量对象或资源受限的环境中,减少内存占用和提高访问速度显得尤为重要。Python的__slots__类属性正是…...
llama 2 改进之 RMSNorm
RMSNorm 论文:https://openreview.net/pdf?idSygkZ3MTJE Github:https://github.com/bzhangGo/rmsnorm?tabreadme-ov-file 论文假设LayerNorm中的重新居中不变性是可有可无的,并提出了均方根层归一化(RMSNorm)。RMSNorm根据均方根(RMS)将…...
Matlab【光伏预测】基于雪融优化算法SAO优化高斯过程回归GPR实现光伏多输入单输出预测附代码
% 光伏预测 - 基于SAO优化的GPR % 数据准备 % 假设有多个输入特征 X1, X2, …, Xn 和一个目标变量 Y % 假设数据已经存储在 X 和 Y 中,每个变量为矩阵,每行表示一个样本,每列表示一个特征 % 参数设置 numFeatures size(X, 2); % 输入特征的…...
ES6 模块
ES6 模块学习记录 ES6(ECMAScript 2015)模块是JavaScript官方的标准模块系统。它允许开发者以模块化的方式编写代码,模块可以在不同的文件之间进行组织和重用。 基本特征 默认导出(Default Exports):每个…...
谷粒商城-全文检索-ElasticSearch
1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…...
Java的LinkedHashMap 源码解析
LinkedHashMap 是 Java 中的一种有序 Map,它扩展了 HashMap,提供了有序的元素存储方式。在 LinkedHashMap 中,元素的有序性可以按照插入顺序或访问顺序来维护,而这个有序性是通过维护一个双向链表来实现的,这也是实现 …...
Linux系统及常用指令
目录 1、什么是Linux系统 2、为什么要用Linux系统 3、Linux系统的种类 4、如何安装Linux系统 5、常见的适配器种类 6、学习第一个Linux指令 7、安装ssh客户端软件 8、Linux系统的目录结构 9、Linux的常用命令 9.1 目录切换命令 9.2 查看目录下的内容 9.3 查看当前…...
Mac Electron 应用如何进行签名(signature)和公证(notarization)?
最近很多客户反映,从官网下载的Mac Electron应用打不开,直接报病毒,类似于这种: 这是因为在MacOS 10.14.5之后,如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核,来判断是否存…...
【C++ | 抽象类】纯虚函数 和 抽象基类,为什么需要抽象基类
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
DP(7) | 打家劫舍① | Java | LeetCode 198, 213, 337 做题总结(未完)
打家劫舍问题 来源于代码随想录:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html#%E6%80%9D%E8%B7%AF ① 确定dp数组(dp table)以及下标的含义 dp[i]:考虑下标i(包括i)以内的房…...
人工智能算法工程师(中级)课程17-模型的量化与部署之剪枝技巧与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程17-模型的量化与部署之剪枝技巧与代码详解。模型剪枝是深度学习领域中一项关键的技术,旨在减少神经网络中的冗余权重,从而降低计算成本和内存占用,同…...
可以做长页的网站/热门搜索排行榜
#-*- coding:utf-8 -*- #定义元素 t (1,2,3) #添加元素 #删除元素 #更新元素 #由于tuple一旦创建就是不可变的,所以不能添加元素也不能删除元素、更新元素 #查找元素,和list类似,下标法 print t[0] print t[2] print t#定义空元组 t ()上面…...
门户网站设计思路/个人优秀网页设计
5G的核心应用是物联网、车联网、大数据的采集等应用领域,其中手机3D摄像头、激光雷达、无人驾驶传感器等器件,实际应用中往往是工作在窄脉冲大电流的工作条件下。例如,手机3D 摄像头的核心器件是VCSEL的半导体激光器阵列,在一个很…...
沈阳市住房和城乡建设厅网站/上海互联网管理系统推广公司
OSPF(Open Shorterst Path First)是一种根据OSI的IS-IS协议提出来的一种链路状态型路由协议。它是IGP协议的一种。由于采用最小生成树算法,因此不会产生回路。另外,OSPF支持可变长子网掩码。但这种链路状态型路由协议也有其问题&a…...
wordpress防垃圾注册/合肥seo排名扣费
1.左连接 left join左表全部保留,右表关联不上的用null表示 select * from t1 left join t2 on t1.idt2.id; 2.右连接 right join3. 内连接 inner join4. 查询左表独有部分数据5.查询右表边独有部分数据6.全连接在mysql中没有full join7....
网页美工设计软件/西安网站seo外包
一、简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名 * 当…...
wordpress电子商务主题下载/优化推广排名网站教程
如果你将应用程序生成x86而不是Any CPU时,在64位操作系统中不会出错错误,而在32位操作系统中可能会出现以下错误 “/xxxxx”应用程序中的服务器错误。 -------------------------------------------------------------------------------- 未能加载文件或…...