【AD-NeRF】音频驱动人脸NeRF

这篇具有很好参考价值的文章主要介绍了【AD-NeRF】音频驱动人脸NeRF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AD-NeRF: Audio Driven Neural Radiance Fields for Talking Head Synthesis

🔗 PDF Link 🍺 GitHub Code

Introduction

任务目标:生成高质量的音频驱动的面部视频序列合成,实现音频到视觉人脸的跨模态映射。

应用方向:数字人、聊天机器人、虚拟会议等

针对这个任务,目前已经有了一些解决方案。早期的方案基于专业的建模师以及动作捕捉系统,近些年深度学习的发展演化出了一系列基于GAN的方案来实现audio2face的领域迁移。但是这类任务目标的核心难点在于如何把音频信号和脸部变形(表情+嘴唇)联系起来。因此,绝大多数方法使用了人脸的一些中间表示,这些中间表示通常例如一些显式建模的3D人脸(🏷这里注意一定是显示的,区别于NeRF的implicit modeling),人脸的表情回归系数或者2D的人脸landmarks点集。而往往这类方法一点中间表示的信息有miss或者偏差,那么最后的audio-face之间也会存在明确的语义不匹配。这些方法的另外一个局限性在于大多数模型都是静态的头部以及动态的嘴部视频渲染,这类方法对姿态的操作以及背景替换而言都比较糟糕。

为了解决这些问题,我们尝试转向利用NeRF来对人脸的外观的变化进行建模。我们提出了AD-NeRF,利用辐射场来避免在处理跨模态的映射问题中引入中间表示。得益于神经辐射场,我们可以对脸部细节组件如牙齿和头发进行细致化地建模,对比基于GAN的方法能取得更好的图像质量。此外,体积表示提供了一种自然的方式来自由调整动画扬声器的整体变形,这是传统的二维图像生成方法无法实现的。此外,我们的方法考虑了头部姿态和上身运动,能够产生极为真实的Talking Head视频。

具体来看,我们的方法以视频序列,包括目标说话人的视频和音轨作为输入。基于DeepSpeech提取的音频特征,结合人脸解析的maps,旨在构建一个audio-conditional的隐式函数(🏷简单理解以下,实际上就是以音频信息作为条件,以此条件给到NeRF完成视频序列的生成。便于理解的话可以假象cGAN做Domain Translation)。由于头部部分的运动与头部以下的上半身的运动差异,我们进一步将NeRF分为两个部分来进行渲染,一个是前景的脸,另一个是前景的躯干。通过这种方式,我们可以从收集到的训练数据中生成自然的说话头序列。

言而总之,工作贡献主要有以下几个方面:

  • 我们提出了一种音频驱动的Talking Head的方法,该方法直接将音频特征映射到动态NeRF,没有任何可能导致信息丢失的中间模式。消融研究表明,这种直接映射方法能够较好地通过现有视频的训练,产生精确的唇动结果。

  • 我们将人体人像场景的神经辐射场分解为两个分支,分别对头部和躯干变形进行建模,这有助于生成更自然的头部说话结果。

  • 利用AD-NeRF,可以实现Talking Head视频的编辑,如姿态操作和背景替换,这在虚拟现实的应用中有明确的潜在价值。

Related Work

Audio-driven Facial Animation

音频驱动面部动画的目标是用任意输入的语音序列同步再现一个特定的人的人脸表情。这了技术基本分为两类,基于模型的方法和数据驱动的方法。前者需要一些专门的工作去完成音频语义和嘴唇运动的关系建模,例如音素-viseme映射。这种方法除了在电影、游戏以及高精度的数字人中,在其他的常规场景中应用并不太容易。随着DNN的兴起,基于数据驱动的方法开始浮现。早期的方法是尝试利用训练数据来拟合静态头像的嘴部运动。随后的改进点在于

根据应用的目标和技术,可将其分为两类:基于模型的方法和数据驱动的方法。基于模型的方法[39,12,60]需要专门的工作来建立音频语义和嘴唇运动之间的关系,如音素-人脸映射[14]。因此,除了电影、游戏等先进的数字形象之外,它们在一般应用中都不方便。随着深度学习技术的兴起,许多数据驱动的方法被提出来生成逼真的说话头结果。早期的方法试图合成嘴唇的运动来满足静止面部图像的训练数据。随后的改进便是尝试对完整的图像进行渲染(🏷不在局限于脸部)。另一套前面提到的方案是利用中间表示的方法,基于3D人脸重构以及GAN,很多工作尝试去通过利用音频信息去估计3DMM或者人脸的landmark点来实现驱动目标。但是这类方法往往需要很多数据(🏷这一点我个人不是很认可,one-shot,few-shot的方案也有呀)。

Video-driven Facial Animation

这个方向是指将人脸的姿态和表情从源视频迁移到目标(🏷这里的目标应该值得是图像)的过程。

这里插一句,其实总的来看就是两种方案:

  1. 音频驱动图像,图像的人脸的表情、嘴唇根据音频特征进行运动。
  2. 视频驱动图像,图像中的人脸参照视频中的人脸进行运动(src视频人脸怎么动,tgt图像人脸怎么动)。

这项任务的大多数方法依赖于基于模型的面部表现捕捉。一个方案是用RGB-D摄像机跟踪动态3D人脸,然后将面部表情从源actor转移到目标。后续的方案也尝试着使用RGB图像来实现相同的功能。也有利用GAN来进行渲染,可以实现逼真的皮肤纹理。Kim等人分析了人脸表情风格这么个概念,并展示了其对基于视频的配音的重要性(🏷这个work讲的我有点迷幻…)。

Implicit Neural Scene Networks

Neural scene representation是利用神经网络来表示场景的形状和外观。神经场景表示网络(SRNs)是由Sitzmann等人首先提出的,其中对象的几何形状和外观被表示为一个可以在空间点上采样的神经网络(🏷这句话看起来比较难理解,其实就是在讲NeRF的概念,物体的形态和颜色等信息可以通过MLP进行建模,输入是空间中任意一个观察点位置,输出的对象的一些表征信息例如Signed Distance Field之类的)。从去年开始,神经辐射场(NeRF)在神经渲染和神经重建任务中受到了广泛关注。三维物体的形状和外观的潜在隐式表示可以转化为体积射线采样结果。后续工作扩展了这一思想,使用in-the-wild训练数据,包括appearance embedding(🏷源自论文: Nerf in the wild),引入可变形的NeRF来表示non-rigidly的物体运动,并在不预先计算相机参数的情况下优化NeRF。

Neural Rendering for Human

这里我就不列具体论文名字的引用了,感兴趣的可以参考以下原文。

头部以及身体的神经渲染已经引起了非常多的关注。基于最近的隐式神经场景表示,Wang等人提出了一种合成的3D场景表示,用于学习高质量的upper body动态NeRF。Raj等人在NeRF中利用pixel-aligned特征,将模型泛化到非训练集数据。Gao等人提出了一个元学习框架,可以实现通过单张人像输入完成NeRF的估计。Gafni等人提出了动态神经辐射场用于动态人脸建模。Peng等人整合了视频帧的视角观察信息,从而能够利用稀疏的多视角视频,实现人体的进行新视角图像生成。

Method

3.1. Overview

整体框架如下图所示。

【AD-NeRF】音频驱动人脸NeRF

3.2. Neural Radiance Fields for Talking Heads

在标准神经辐射场场景表示的基础上,受Gafni等人在facial animation上采用动态神经辐射场的启发,我们利用额外的音频编码作为输入,构建一个条件隐式函数,提出了一个说话头的条件辐射场。除了观察方向 d \mathbf{d} d和3D位置 x \mathbf{x} x外,音频 a \mathbf{a} a的语义特征将作为隐式函数 F θ \mathcal{F}_{\theta} Fθ的另一个输入。在实际应用中, F θ \mathcal{F}_{\theta} Fθ是由多层感知器(MLP)实现的。将所有的输入向量 ( a , d , x ) (\mathbf{a}, \mathbf{d}, \mathbf{x}) (a,d,x)拼接起来,网络将沿散射光线估计颜色值 c \mathbf{c} c以及密度 σ \mathbf{\sigma} σ。完整的函数定义可以看作为:
F θ : ( a , d , x ) → ( c , σ ) . \mathcal{F}_\theta : (\mathbf{a}, \mathbf{d}, \mathbf{x}) \rightarrow (\mathbf{c},\sigma). Fθ:(a,d,x)(c,σ).

Semantic Audio Feature

为了从声音信号中提取有语义意义的信息,我们使用流行的DeepSpeech模型,对每个20ms的音频片段生成一个29维的特征编码。在我们的实现中,为了消除原始输入的噪声信号,几个连续的音频特征会被拼接起来送入一个时间卷积网络。具体来看,我们使用16个相邻的音频特征编码 a ∈ R 16 × 29 \mathbf{a} \in \mathbb{R}^{16\times29} aR16×29来表示音频形态的当前状态(❓ current state of audio modality 没看明白)。使用音频特征来代替表情回归系数或是face landmarks这种中间编码状态,有利于减轻中间网络的训练成本(🏷这里个人理解实际就是减少了从landmark或者表情回归系数到实际人脸表情运动的转换),同时减少audio-visual信号之间潜在的语义不匹配问题。

3.3. Volume Rendering with Radiance Field

根据上述隐式模型 F θ \mathcal{F}_\theta Fθ预测的颜色 c \mathbf{c} c和密度 σ \sigma σ,我们可以采用volume rendering将采样的密度和RGB值沿每个像素投射的射线进行累积,计算出图像渲染结果。与NeRF类似,摄像机射线 r ( t ) = o + t d \mathbf{r}(t) = \mathbf{o} + t\mathbf{d} r(t)=o+td,摄像机中心为 o \mathbf{o} o,观看方向 d \mathbf{d} d,从 t n t_n tn和远端 t f t_f tf的期望颜色 C \mathcal{C} C被计算为:
C ( r ; θ , Π , a ) = ∫ t n t f σ θ ( r ( t ) ) ⋅ c θ ( r ( t ) , d ) ⋅ T ( t ) d t , \mathcal{C}(\mathbf{r} ; \theta, \Pi, \mathbf{a})=\int_{t_{n}}^{t_{f}} \sigma_{\theta}(\mathbf{r}(t)) \cdot \mathbf{c}_{\theta}(\mathbf{r}(t), \mathbf{d}) \cdot T(t) d t, C(r;θ,Π,a)=tntfσθ(r(t))cθ(r(t),d)T(t)dt,
其中 c θ ( ⋅ ) \mathbf{c}_\theta(\centerdot) cθ()以及 σ θ ( ⋅ ) \sigma_\theta(\centerdot) σθ() F θ \mathcal{F}_\theta Fθ的输出, T ( t ) T(t) T(t)是沿着光线传播方向从 t n t_n tn t t t的累计透光率:
T ( t ) = exp ⁡ ( − ∫ t n t σ ( r ( s ) ) d s ) T(t)=\exp \left(-\int_{t_{n}}^{t} \sigma(\mathbf{r}(s)) d s\right) T(t)=exp(tntσ(r(s))ds)
其中 Π = { R , t } \Pi = \{R, t\} Π={R,t}是人脸的刚体姿态参数,通过旋转矩阵 R ∈ R 3 × 3 R \in \mathbb{R}^{3\times3} RR3×3以及一个转换矩阵 t ∈ R 3 × 1 t \in \mathbb{R}^{3\times 1} tR3×1进行表示。其中 Π \Pi Π这个参数可以被用于将一个采样点转换到canonical空间中。注意在网络训练阶段我们只使用了head pose信息而不是任何的3D人脸形态。我们采用了两阶段拼接的方式,具体来看就是首先用一个coarse网络来沿着一条光线预测物体的密度,然后在利用一个fine网络来采样更多的点(🏷应该就是原始NeRF提到的那个用来减轻计算负担的模块)

3.4. Individual NeRFs Representation

与静态背景相比,人体部位(包括头部和躯干)是动态地从一帧移动到另一帧,这也是为什么需要在渲染过程中考虑头部姿势。因此,将相机空间中的deformed点转换到canonical空间来进行辐射场训练是十分必要的。Gafni等人尝试通过预测出来的密度对前景和背景进行解耦来处理头部的运动状态。简单来看,即是通过前景物体散射(🏷原文是dispatched)出来的密度来判断前景背景,高密度光线来预测人体的部位,忽略低密度的背景图像。然而,将躯干区域转化到canonical空间存在一些模糊性。由于头部部分的运动与躯干部分的运动通常不一致,且姿态参数 Π \Pi Π仅用于面部形态的估计,因此对头部和躯干区域同时应用相同的刚性变换,对upper body的渲染结果并不那么让人满意。为了解决这个问题,我们用两个单独的神经辐射场来模拟这两个部分:一个用于头部部分,另一个用于躯干部分。

如下图所示,我们最初利用一种自动人脸解析方法将训练图像分为静态背景、头部和躯干三部分。我们首先训练头部部分的隐函数 F θ h e a d \mathcal{F}_\theta^{head} Fθhead。在此步骤中,我们将解析出来的头部区域作为前景,其余区域作为背景。头部姿态 Π \Pi Π应用于沿通过每个像素投射的射线的采样点。然后将 F θ h e a d \mathcal{F}_\theta^{head} Fθhead的绘制头像和静态背景加起来作为新的背景区域,将躯干部分作为前景,训练第二个隐式模型 F θ t o r s o \mathcal{F}_\theta^{torso} Fθtorso。在这个阶段,对于躯干区域实际并没有可用的姿态参数。换句话说,我们隐式地将头部姿态参数 Π \Pi Π作为额外的输入,而不是在 F θ t o r s o \mathcal{F}_\theta^{torso} Fθtorso中使用 Π \Pi Π进行显式转换。

【AD-NeRF】音频驱动人脸NeRF

在推理阶段,头部部位模型 F θ h e a d \mathcal{F}_\theta^{head} Fθhead和躯干部位模型 F θ t o r s o \mathcal{F}_\theta^{torso} Fθtorso接受相同的输入参数,包括音频特征码 a \mathbf{a} a和姿态系数 Π \Pi Π。Volume Rendering过程,首先采用头部模型积累像素的采样密度和RGB值。然后把渲染好头部图像贴到静态背景上。然后躯干模型通过预测躯干区域的前景像素来填充缺失的躯干部分。一般来说,这种单独的神经辐射场表示设计有助于模拟不一致的头部和上身运动,并产生自然的结果。

3.5.Editing of Talking Head Video

由于两个神经辐射场都以语义音频特征和姿态系数作为输入来控制说话内容和说话头的运动,我们的方法可以通过替换音频输入和调整姿态系数来实现声音驱动和姿态操纵说话头视频的生成。此外,与Gafni等人的方法类似,我们用类似的方式实现了对前景和背景进行了解耦。通过这样的方式,我们就可以简单的替换背景来实现背景编辑。

3.6. Training Details

Dataset.

对于目标任务需要3-5分钟25fps的视频,且假定视频背景是固定的。测试阶段允许任意的音频输入,可以是不同的人,不同的性别,甚至不同的语言。

Training Data Preprocessing.
  • 首先是人脸解析模块来确定每一帧视频的不同区域。
  • 使用光束法平差(bundle adjustment)以及多帧光流估计方法来获得姿态参数。值得注意的是,所估计的姿势仅对面部有效,对颈部、肩部等身体其他部位无效,即面部姿势不能代表上半身的全部动作。
  • 构建一个干净的没有人像的背景图,对于扣掉的人像部分使用Poisson Blending填充。
Network & Loss Function.

总的来看我们有两个主要的约束项。在[3.2节](#3.2. Neural Radiance Fields for Talking Heads)我们提到用了DeepSpeech特征,window size为16,然后这16个连续的audio features将会被送入到1D卷积中去,回归出每一帧的latent code。为了保证音频信号的稳定性,我们采用Self-Attention,在连续音频编码上训练一个时间滤波器。该滤波器由具有softmax激活层的1D卷积层实现。因此,最终的音频条件输入 a \mathbf{a} a由时间滤波的latent code给出。

其次,我们必须约束了我们的方法渲染出来的图像和Ground Truth尽可能相似。让 I r ∈ R W × H × 3 I_r \in \mathbb{R}^{W\times H\times3} IrRW×H×3作为渲染结果,标签为 I g ∈ R W × H × 3 I_g \in \mathbb{R}^{W\times H\times3} IgRW×H×3。优化目标就可以呗定义为:
L photo  ( θ ) = ∑ w = 0 W ∑ h = 0 H ∥ I r ( w , h ) − I g ( w , h ) ∥ 2 I r ( w , h ) = C ( r w , h ; θ , Π , a ) \begin{aligned} &\mathcal{L}_{\text {photo }}(\theta)=\sum_{w=0}^{W} \sum_{h=0}^{H}\left\|I_{r}(w, h)-I_{g}(w, h)\right\|^{2} \\ &I_{r}(w, h)=\mathcal{C}\left(r_{w, h} ; \theta, \Pi, \mathbf{a}\right) \end{aligned} Lphoto (θ)=w=0Wh=0HIr(w,h)Ig(w,h)2Ir(w,h)=C(rw,h;θ,Π,a)

Experiments

4.1. Implementation Details

框架用了PyTorch,优化器用了Adam,初始学习率0.0005。两个 F \mathcal{F} F都训练 400 k 400k 400k次迭代。在每个迭代中,每一个像素着每一个像素随机采样2048条光线。用RTX 3090来训练模型,五分钟的450x450像素的视频大约耗费36个小时,每一帧大约需要12秒来渲染。

4.2. Ablation Study

这部分后面就不看了,包含两个部分,看图理解。

  • Audio condition.

    【AD-NeRF】音频驱动人脸NeRF

  • Individual training for head and torso region.

    【AD-NeRF】音频驱动人脸NeRF

4.3. Evaluations

没啥好讲的,量化评估结果,有兴趣去原文看图看表。

Demo

最后一部分用自己的头像测试了一下~ 实际效果有限吧,全部用的默认参数,大概占了12-14G显存左右,单卡A100-80G两个模型顺序跑,每一个都跑满400k轮迭代,平均28h一个模型,推理阶段大概30s一帧。

可以说效果有限吧。文章来源地址https://www.toymoban.com/news/detail-405245.html

到了这里,关于【AD-NeRF】音频驱动人脸NeRF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA驱动AD9240实现AD转换

    在做项目中,经常会用到AD转换模块。前段时间做毕业设计的时候需要用到FPGA驱动AD9240模块实现模拟数据的采集和转换,尽管相对来说AD9240算比较简单的驱动模块,但是也想记录下分析和设计过程。 首先通过芯片手册可以看到AD9240是14位,最高速率可达10Mbps的模数转换器件。

    2024年02月06日
    浏览(56)
  • STM32驱动AD9833模块

    淘宝上买了个AD9833模块,stm32用商家的例程代码可以调频,可以调相,就是调不了幅度。换了几块不同32开发板都不行,重新以正点原子F103的工程为基础把驱动移植进去,最后实现了调幅的功能。这里把代码放上来,希望能帮助遇到相同问题的同学。 开发板: stm32f103c8t6核心

    2024年02月12日
    浏览(50)
  • stm32+AD9910 并口驱动

    搞了好几天DAC芯片AD9910 ,找到多数资料时SPI控制内部RAM或者DDS输出波形,这里总结一下STM32 FMSC 总线输出到AD9910 ,由于AD9910 的PDCLK 为输出,这里采用PWM输入捕获模式获取 AD9910 PDCLK 的下降沿,采用捕获信号触发DMA2  ,DMA 在将数据搬移到总线上,具体代码如下: 使用方法:

    2024年02月13日
    浏览(37)
  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(50)
  • 用FPGA驱动AD9910输出跳频信号

    虽然AD9910芯片老掉牙了,但是还有人在使用。前段时间一直比较忙,又赶上换工作,没时间写博文。最近才慢慢的闲下来,所以又开始分享一下自己工作中的调试经验。 AD9910是一种直接数字合成器(DDS),具有集成的14位DAC,支持高达1 Gsps的采样率。AD9910采用了先进的专有DDS技

    2024年02月02日
    浏览(43)
  • 【GD32篇】驱动AD7616完成数据采集

    1.1 概述:          AD7616 是一款 16 位 DAS(数据采集系统) ,支持对 16 个通道进行双路同步采样。 AD7616 采用 5 V 单电源供电,可以处理 ±10 V 、 ±5 V 和±2.5 V 真双极性输入信号 ,同时每对通道均能以高达 1 MSPS的吞吐速率和 90.5 dB SNR 采样。利用片内过采样模式可实现更高

    2024年02月13日
    浏览(41)
  • STM32的硬件SPI驱动AD7124的方法

    AD7124是一款适合高精度测量应用的低功耗、低噪声、完整模拟前端。该器件内置一个低噪声24位Σ-Δ型模数转换器(ADC),可配置来提供8个差分输入或15个单端或伪差分输入。片内低噪声级确保ADC中可直接输入小信号。可用于温度测量、压力测量、工业过程控制、仪器仪表和只能

    2024年02月07日
    浏览(78)
  • STM32(HAL库)驱动AD8232心率传感器

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置  2.4 GPIO配置  2.5 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代码整合 4 硬件连接 5 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对AD8232心率

    2024年02月16日
    浏览(42)
  • stm32 AD7606 芯片驱动 hal库 spi通讯

             这两天用来个ad7606 的芯片,结果硬件出来个问题,花了不少时间看这个芯片手册,干脆分享一下。         OS0 OS1 OS2         这个三个引脚用于配置芯片的采样频率,只要不设置为111即可正常采样; CONVSTA CONVSTB 这两个引脚用于启动芯片采集转换,默认高电平,

    2024年04月26日
    浏览(40)
  • 挂在Avalon总线上的AD7656芯片驱动verilog程序实现

            AD7656是一款 16位同步采样双极ADC转换器,本文中用状态机方式实现了AD7656芯片的Verilog驱动,并且将驱动直接挂在了altera芯片的Avalon总线上,使其altera芯片能够通过总线直接控制ADC芯片,其代码如下: module AD7656_drive(clk,rst_n,slave_rd_n,slave_cs_n,slave_address,slave_rddata,ad

    2024年04月26日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包