技术新讯 > 计算推算,计数设备的制造及其应用技术 > 一种基于姿势对抗网络的人脸视频生成方法及系统  >  正文

一种基于姿势对抗网络的人脸视频生成方法及系统

  • 国知局
  • 2024-07-31 22:35:11

本发明涉及计算机视觉与图像处理,具体涉及一种基于姿势对抗网络的人脸视频生成方法及系统。

背景技术:

1、人脸视频生成旨在深入挖掘语音与人脸之间的内在映射关联,建立有效的模型,使之能够从任意给定的语音片段中生成对应的人脸图像序列,所生成的视频不仅画面清晰流畅,而且与输入语音保持高度对齐,口型动作自然协调,从而获得具有高质量、逼真表情的人脸视频。

2、在过去的几年里,受益于深度学习和其他前沿技术的快速发展,人脸视频生成技术取得了显著的进展,但仍然存在着一些特殊的难点,如生成视频的逼真度、时空一致性、多模态信息融合等方面的挑战,目前基于对抗网络的人脸视频生成方法多侧重于人脸的重建,而忽略了头部的自适应运动与口型的自然同步性,导致生成的视频出现恐怖谷效应,限制了人脸视频生成在实际场景中的推广与应用。

技术实现思路

1、本发明的目的在于解决现有技术中忽略头部运动与口型的同步性导致视频效果不佳的问题。

2、本发明解决其技术问题所采用的技术方案是:提供一种基于姿势对抗网络的人脸视频生成方法,包括:

3、构建人脸视频生成模型,包括图像编码器、音频编码器、头部运动预测模块、姿势编码器和解码生成模块,所述人脸视频生成模型接收人脸图像和语音音频,图像编码器对人脸图像提取图像特征,音频编码器对语音音频提取语音特征,头部运动预测模块结合人脸图像和语音音频预测头部姿势序列,姿势编码器对头部姿势序列提取姿势特征;解码生成模块接收图像特征、语音特征、头部姿势序列和人脸图像,生成人脸说话视频;

4、获取具有正面人脸的人脸说话视频并进行预处理,获得人脸图像和语音音频作为训练数据集;

5、利用训练数据集对人脸视频生成模型进行预训练,获得预训练人脸视频生成模型;

6、构建唇型同步判别器作为判别器,对预训练人脸视频生成模型进行生成对抗训练,获得训练好的人脸视频生成模型;

7、利用训练好的人脸视频生成模型,根据输入的人脸图像和语音音频生成人脸说话视频。

8、优选的,所述头部运动预测模块将头部运动建模为刚性的六自由度运动,采用双向长短期记忆网络预测连续的头部姿势序列。

9、优选的,所述双向长短期记忆网络预测连续的头部姿势序列,包括以下步骤:

10、接收人脸图像和语音音频,对人脸图像提取图像特征作为初始空间特征,将语音音频根据时间步骤分解为若干个音频;

11、对于每个时间步骤,使用编码器从音频中提取音频特征,对该音频特征与时间步处的空间特征进行级联;i=1时,空间特征为初始空间特征;将级联的音频特征与空间特征输入到双向长短期记忆网络,得到当前空间特征;使用解码器将解码为头部姿势,表示头部姿势包括7个维度,其中,3个维度表示旋转,3个维度表示平移,1个维度表示缩放;

12、将所有时间步骤的头部姿势作为预测头部姿势序列输出,t表示时间步骤。

13、优选的,所述利用训练数据集对人脸视频生成模型进行预训练,包括采用基于patchgan的判别器d对头部运动预测模块进行生成对抗训练,采用的损失函数为:

14、;

15、其中,表示判别器d的损失;表示结构相似性损失,表示为:

16、;

17、其中,和分别表示预测头部姿势序列的平均值和标准差,和分别表示真实头部姿势序列的平均值和标准差,表示预测头部姿势序列与真实头部姿势序列的协方差,和是两个常数。

18、优选的,所述构建唇型同步判别器作为判别器,包括以下步骤:

19、构建包含一个面部编码器和一个音频编码器的唇型同步判别器,以预训练人脸视频生成模型作为生成器;面部编码器接收生成器输出的人脸说话视频并针对下半部分人脸提取视频特征;音频编码器接收输入生成器的语音音频并提取音频特征;

20、对唇型同步判别器进行预训练,采用的损失函数为:

21、;

22、其中,表示同步概率,用于评价唇型与音频的同步程度,表示为:

23、

24、其中,表示面部编码器提取的视频特征,表示音频编码器提取的音频特征,。

25、优选的,面部编码器包括多个交替连接的卷积层和批归一化层与relu激活函数,其中,部分卷积层包含残差块;音频编码器包括多个交替连接的卷积层和批归一化层与relu激活函数,其中,部分卷积层包含残差块。

26、优选的,所述对预训练人脸视频生成模型进行生成对抗训练,表示为:

27、<mstyle displaystyle="true" mathcolor="#000000"><mstyle displaystyle="true" mathcolor="#000000"><munder><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>m</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>i</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>n</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle></mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>g</mi></mstyle></munder></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi></mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><munder><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>m</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>a</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>x</mi></mstyle></mrow><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>d</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>1</mi></mstyle></mrow></munder></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi></mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>v</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>d</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mn>1</mn></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>,</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>g</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>=</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>e</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><msub><mrow /><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>z</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>∼</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi></mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><msub><mrow /><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>d</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>a</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>t</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>a</mi></mstyle></mrow></msub></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>z</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle></mrow></msub></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>[</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>l</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>o</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>g</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>d</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mn>1</mn></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>x</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>]</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mo>+</mo></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>e</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><msub><mrow /><mrow><mstyle displaystyle="true" mathcolor="#000000"><mi>z</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>∼</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi></mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><msub><mrow /><mstyle displaystyle="true" mathcolor="#000000"><mi>⋮</mi></mstyle></msub></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>z</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle></mrow></msub></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>[</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>l</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>o</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>g</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mn>1</mn></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>−</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>d</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mn>1</mn></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>g</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>(</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>z</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>)</mi></mstyle><mstyle displaystyle="true" mathcolor="#000000"><mi>]</mi></mstyle></mstyle>;

28、其中,e表示变量的期望值,表示真实数据分布,表示生成数据分布;g表示预训练人脸视频生成模型,d1表示唇型同步判别器,v表示损失函数;x表示真实数据样本,z 表示随机噪声向量。

29、本发明还提供一种基于姿势对抗网络的人脸视频生成系统,包括:

30、模型构建模块,用于构建人脸视频生成模型,包括图像编码器、音频编码器、头部运动预测模块、姿势编码器和解码生成模块,所述人脸视频生成模型接收人脸图像和语音音频,图像编码器对人脸图像提取图像特征,音频编码器对语音音频提取语音特征,头部运动预测模块结合人脸图像和语音音频预测头部姿势序列,姿势编码器对头部姿势序列提取姿势特征;解码生成模块接收图像特征、语音特征、头部姿势序列和人脸图像,生成人脸说话视频;

31、数据集获取模块,用于获取具有正面人脸的人脸说话视频并进行预处理,获得人脸图像和语音音频作为训练数据集;

32、预训练模块,用于利用训练数据集对人脸视频生成模型进行预训练,获得预训练人脸视频生成模型;

33、生成对抗训练模块,构建唇型同步判别器作为判别器,对预训练人脸视频生成模型进行生成对抗训练,获得训练好的人脸视频生成模型;

34、模型应用模块,用于利用训练好的人脸视频生成模型,根据输入的人脸图像和语音音频生成人脸说话视频。

35、本发明具有如下有益效果:通过根据头部运动属性构建头部运动预测模块,对音频信号的动态特性进行捕捉以在时序上对头部运动进行建模,并结合生成对抗网络与唇型同步判别器,有效地在提高了人脸视频的唇形同步精度的同时兼顾了视频的逼真度,使得其更加真实、自然。

36、以下结合附图及实施例对本发明作进一步详细说明,但本发明不局限于实施例。

本文地址:https://www.jishuxx.com/zhuanli/20240731/193727.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。