【论文阅读+复现】AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation

AniPortrait:音频驱动的逼真肖像动画合成。

code:Zejun-Yang/AniPortrait: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation (github.com)
paper:[2403.17694] AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation (arxiv.org)

出处:腾讯,2024.3.26

论文阅读

总结:

AniPortrait,一个由音频和参考肖像图像驱动的动画生成框架。方法分为两个阶段:

  1. 首先,从音频中提取3D中间表示,并将其投影到一系列2D面部地标中。
  2. 随后,采用鲁棒扩散模型,加上运动模块,将landmark序列转换为时间一致的肖像动画。

实验结果表明AniPortrait在面部自然度、姿态多样性和视觉质量方面具有优势,从而提供了增强的感知体验。此外在灵活性和可控性方面表现出相当大的潜力,可以有效地应用于面部动作编辑或面部再现等领域。

1. 介绍

生成肖像动画的挑战:唇部动作、面部表情和头部位置的复杂协调,以创造出逼真的效果。它们依赖于有限容量的生成器来创建视觉内容,如gan[3,17]、NeRF[14,13]或基于运动的解码器[16,8]。这些网络泛化能力有限,并且在生成高质量内容时缺乏稳定性。最近,扩散模型的出现[2,5,9]促进了高质量图像的生成。一些研究在此基础上结合了时间模块。

建立在扩散模型的进步,我们介绍AniPortrait,旨在生成高质量的动画肖像由音频和参考图像驱动。AniPortrait分为两个不同的阶段。

  • 第一阶段,使用基于transformer的模型提取来自音频输入的一系列3D面部网格和头部姿势,投影到一系列2D面部landmark中。这个阶段能够从音频中捕捉细微的表情和嘴唇动作,以及与音频节奏同步的头部动作。
  • 第二阶段,利用鲁棒扩散模型[9],结合运动模块[4],将面部transformer序列转换为时间一致且逼真的动画肖像。具体来说,借鉴了AnimateAnyone[6]的网络架构,使用Stable diffusion 1.5,基于身体运动序列和参考图像生成流体和逼真的视频。(我们在这个网络中重新设计的姿态引导模块。这种修改不仅保持了轻量化的设计,而且在产生唇运动时也表现出更高的精度。)

图1:pipeline。分为两个阶段:首先,从音频中提取三维面部网格和头部姿态,然后将这两个元素投影到二维关键点上。第二阶段,用扩散模型将2D关键点转换为人像视频。两个阶段同时训练。

2. 方法

提出的框架包括两个模块:Audio2Lmk和Lmk2Video。

Audio2Lmk:从音频输入中提取一系列landmark,捕捉复杂的面部表情和嘴唇动作。

Lmk2Video:利用这个landmark序列,生成具有时间稳定性的高质量人像视频。

2.1 Audio2Lmk

表示语音片段序列,目标是预测相应的3D人脸网格序列,其中每个mT∈R N×3,和姿态序列,每个p T是一个6维向量,表示旋转和平移。

用预训练的wav2vec[1]来提取音频特征,由两个fc层组成的简单架构,将提取的音频特征转换为3D面部网格。这种简单的设计不仅保证了准确性,而且提高了推理过程的效率。

在将音频转换为姿态的任务中,使用相同的wav2vec网络作为主干。但不与音频到网格模块共享权重。这是因为姿势与音频中的节奏和音调联系更紧密,这与音频到网格任务的重点不同。

为了考虑先前状态的影响,用transformer解码器来解码姿势序列。在此过程中,音频特征通过交叉注意机制集成到解码器中。

对于上述两个模块,用简单的L1 loss训练。

在获得网格和姿态序列后,用透视投影将它们转换为二维面部地标序列。这些标志随后被用作下一阶段的输入信号。

2.2 Lmk2Video

给定一个参考肖像图像Iref,并表示一个面部landmark序列,其中l T∈R N×2。Lmk2Video模块创建了一个时间上连贯的肖像动画,这个动画将运动与关键点序列对齐,并保持与参考图像一致的外观。将肖像动画表示为肖像帧序列:

Lmk2Video的网络结构设计灵感来自AnimateAnyone。用SD1.5作为主干,结合了一个能够将多帧噪声输入转换为视频帧序列的时间运动模块。同时,采用参照SD1.5结构的ReferenceNet从参考图像中提取外观信息并整合到主干中。这种策略设计确保了面部ID在整个输出视频中保持一致。

与AnimateAnyone不同的是,我们增强了poseguide设计的复杂性。原始版本仅包括了几个卷积层,之后将关键点特征与骨干网络的输入层的潜在特征合并。

实验发现这种简单的设计无法捕捉嘴唇的复杂运动。因此,我们采用了ControlNet的多尺度策略,将相应尺度的关键点特征合并到骨干网络的不同模块中。尽管进行了这些增强,还是保持了较低的参数数量。

额外的改进:将参考图像的关键点作为额外输入。PoseGuider的交叉注意力模块促进了参考关键点与每帧目标关键点之间的交互。这个过程为网络提供了额外的线索,帮助理解面部关键点和外观之间的相关性,从而有助于生成具有更精确运动的肖像动画。

3. 实验

3.1 Implementation Details 

在Audio2Lmk阶段,用wav2vec2.0作为骨干网络。用MediaPipe[7]提取3D网格和6D姿势进行注释。Audio2Mesh的训练数据来自我们的内部数据集,该数据集包含来自单个发言者的近一个小时的高质量语音数据。为了确保由MediaPipe提取的3D网格的稳定性,我们指示演员在整个录制过程中保持稳定的头部位置,面向摄像机。用HDTF[18]对Audio2Pose进行训练。所有训练都在一块A100上进行,使用Adam优化器,学习率为1e-5。

在Lmk2Video过程中,我们采用了两阶段训练方法。在初始阶段,我们专注于训练骨干网络的2D组件,ReferenceNet和Pose Guider,而不涉及运动模块。在随后的阶段,冻结所有其他组件,集中精力训练运动模块。用数据集VFHQ[12]和CelebV-HQ[19]来训练模型。所有数据都经过MediaPipe处理,以提取2D面部关键点。为了增强网络对唇部运动的敏感性,在渲染从2D关键点得到的姿势图像时,我们用不同的颜色区分上下唇。图像分辨率调整为512x512。用4块A100 GPU进行模型训练,每个阶段耗时两天。采用AdamW优化器,并使用恒定的学习率1e-5。

3.2 Results

利用中间的3D表示,可以对其进行编辑以操纵最终的输出。例如,我们可以从源图像中提取关键点并改变其ID,从而创建面部再现效果。

4. 结论

本研究提出了一个基于扩散模型的肖像动画框架。通过输入音频片段和一个参考图像,能够生成具有平滑的嘴唇运动和自然的头部运动的肖像视频。

利用扩散模型强大的泛化能力,该框架创建的动画展示了令人印象深刻的逼真图像质量和逼真的运动。然而,这种方法需要使用中间的3D表示,而获得大规模、高质量的3D数据的成本相当高。因此,生成的肖像视频中的面部表情和头部姿势无法摆脱“反直觉谷”效应。在未来,我们计划遵循EMO[10]的方法,直接从音频中预测肖像视频。

复现

1. Inference

环境配置基本和 MooreThreads/Moore-AnimateAnyone (github.com) 相同

下载好的权重目录:

问题1:ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决:

sudo apt update
sudo apt install libgl1-mesa-glx

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

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

相关文章

Soot入门学习笔记

Soot 适合参考的文档和教程如下: 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料: 南京大学《软件分析》课程笔记 比较好的入门作业或者案例: CSCE710 Assignmen…

MySQL8 中文参考翻译完成

MySQL8 中文参考前言和法律声明第一章 一般信息1.1 关于本手册1.2 MySQL 数据库管理系统概述1.2.1 什么是 MySQL?1.2.2 MySQL 的主要特性1.2.3 MySQL 的历史1.3 MySQL 8.0 中的新功能1.4 MySQL 8.0 中新增、弃用或删除的服务器和状态变量和选项1.5 如何报告错误或问…

产品说明书二维码生成的优势:数字化时代的智能选择

随着二维码技术的不断发展,越来越多的企业开始选择使用二维码来展示产品使用说明,以取代传统的纸质说明书。这一趋势不仅符合数字化时代的潮流,更为消费者提供了更便捷、更智能的产品使用体验。以下是产品说明书二维码生成的优势:…

Android WebView的使用与后退键处理

目录 前言首先,我们需要在布局文件中添加webView组件在Activity中获取webView实例,并加载网页内容 前言 webView是Android中常用的组件之一,用于展示网页内容。它可以加载HTML文件、URL链接等网页内容,并提供交互功能。在使用webV…

C#_泛型_委托

文章目录 泛型泛型的使用泛型的约束委托委托的实例化多播委托委托的调用内置委托类型委托练习泛型委托Lambda表达式(进阶)上期习题答案本期习题 泛型 泛型(Generic) 是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编…

Linux进程概念(下)

1. 进程的状态 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。 下面的状态在kernel源代码里定义: /* * The task state array is…

数对 离散化BIT

先把公式变个形&#xff0c;然后直接BIT 枚举右端点查询左端点累加答案 离散化好题&#xff0c;注意BIT写的时候右端点的范围是离散化区间的大小 #include<bits/stdc.h> using namespace std; #define int long long using ll long long; using pii pair<int,int&…

【ZZULIOJ】1011: 圆柱体表面积(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入圆柱体的底面半径r和高h&#xff0c;计算圆柱体的表面积并输出到屏幕上。要求定义圆周率为如下宏常量 #define PI 3.14159 输入 输入两个实数&#xff0c;为圆柱体的底面半径r和高h。 输出 输…

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…

UE5数字孪生系列笔记(三)

C创建Pawn类玩家 创建一个GameMode蓝图用来加载我们自定义的游戏Mode新建一个Pawn的C&#xff0c;MyCharacter类作为玩家&#xff0c;新建一个相机组件与相机臂组件&#xff0c;box组件作为根组件 // Fill out your copyright notice in the Description page of Project Set…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family,

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

修改Docker Gitlab root 的密码

一、进入git docker 容器 docker exec -it [容器ID或名称] /bin/bash 二、查找并修改账号 user User.find_by(username: ‘root’) user.password ‘root********’ user.password_confirmation ‘root********’ user.save! 三、重启生效 附&#xff1a;第一次&#xff…

Golang实战:深入hash/crc64标准库的应用与技巧

Golang实战&#xff1a;深入hash/crc64标准库的应用与技巧 引言hash/crc64简介基本原理核心功能 环境准备安装Golang创建一个新的Golang项目引入hash/crc64包测试环境配置 hash/crc64的基本使用计算字符串的CRC64校验和计算文件的CRC64校验和 高级技巧与应用数据流和分块处理网…

Jmeter 配置说明之线程组

一、线程组介绍&#xff1a; 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组&#xff1a; 通俗理解&#xff1a; 线程组&#xff1a;就是一个线程组&#xff0c;里面有若干个请求&#xff1b; 线程&am…

vue3.0 + ts + eslint报错:error Parsing error: ‘>‘ expected

eslint报错 这里加上对应的 eslint配置即可&#xff1a; parser: vue-eslint-parser, parserOptions: {parser: "typescript-eslint/parser",ecmaVersion: 2020,sourceType: module, }具体如下&#xff1a; module.exports {parser: vue-eslint-parser,parserOpti…

企业数据定制:营销/画像/大数据模型

随着信息技术的发展&#xff0c;数据已经成为企业发展的重要基石。现在信息广泛地分布在网络&#xff0c;人工收集对于企业运作来说效率太低了。 因此&#xff0c;很多企业选择将数据采集工作交给专业的团队来做&#xff0c;选择直接外包或者购买数据。 不管是哪种情况&#…

​马来语翻译中文去哪比较好?

据了解&#xff0c;马来语是马来西亚、文莱的官方语言&#xff0c;也是新加坡的官方语言之一&#xff0c;马来语跟印尼语是同一种语言&#xff0c;它在整个东南亚有着极大的影响力。如今在国内市场上&#xff0c;马来语翻译的需求也是供不应求&#xff0c;那么&#xff0c;如何…

【Go】三、Go指针

文章目录 1、指针2、说明 1、指针 &符号变量 就可以获取这个变量内存的地址*int 是一个指针类型 &#xff08;可以理解为 指向int类型的指针&#xff09; package main import("fmt" ) func main(){var age int 18//&符号变量 就可以获取这个变量内存的地…

ubuntu22 安装docker26

ubuntu22 安装docker 在Ubuntu 22.04上安装Docker&#xff0c;你可以按照以下步骤操作&#xff1a; 1.更新软件包索引&#xff1a; sudo apt-get update 2.安装必要的软件包&#xff0c;以允许apt通过HTTPS来使用仓库&#xff1a; sudo apt-get install ca-certificates c…