Implicit Identity Representation Conditioned Memory Compensation Network

论文随记|Implicit Identity Representation Conditioned Memory Compensation Network for Talking Head Video Generation用于头部说话视频生成的隐式身份表示条件记忆补偿网络

任务目标:给定静态源图像和动态驱动视频,生成talking head视频。

1 引文

现存问题:

  • 高动态和复杂运动会导致生成模糊图像,因为静止的源图像不能为被遮挡的区域或微表情变化提供足够的信息,现住降低生成质量。
贡献
  • 提出学习一个全局性的面部元记忆库来转移代表性的面部模式,以处理从静止源图像进行高度动态生成所引起的外观和结构模糊性;
  • 提出了一种新的隐式身份表征条件记忆补偿网络(MCNet),该网络设计了隐式身份表征条件记忆模块(IICM)和面部记忆补偿模块(MCM),分别执行元记忆查询和特征补偿;
  • 实验验证了模型的sota性能

3 方法

image-20231201161013313

3.1 模型概述
  • 首先用关键点检测器,得到成对的驱动和源图像的K对关键点;
  • 估计两个关键点得到密集运动流,对源图像特征进行扭曲后得到扭曲特征;
  • 将关键点特征和扭曲特征一起经过MLP编码送入IICM模块,以编码隐式身份表征。它将作为元存储Mo的查询条件,来产生源身份相关的存储体Ms;
  • 内存补偿模块(MCM),在获得Ms之后,利用动态交叉注意机制在MCM模块中对变形的源特征图进行空间补偿,然后输出补偿后的特征图Fi cpt。
  • 通过解码器解码生成目标图像。
3.2 学习隐式身份表示条件下的全局面部元记忆

目标: 学习一个全局元存储库来对整个面部数据集的面部结构和外观表示进行建模。使用方式是:从源面部的离散关键点坐标和相应的扭曲源特征图中学习隐式身份表示。然后,它用于作为全局元存储库的查询条件并获得源身份相关的特征存储,从而补偿生成时扭曲的源特征图。

全局面部元记忆

建立一个基于训练数据的全局面部元记忆库,存储所有先验面部外观与结构。

将元存储体 M o M_{o} Mo初始化为一个形状为 C m × H m × W m Cm×Hm×Wm Cm×Hm×Wm的立方体张量。此外,多通道为元记忆库提供了足够容量来学习不同面部。

利用元记忆中学到的面部先验来补偿生成面部中的模糊区域。

隐式身份表示学习

利用源关键点 { x s , t , y s , t } t = 1 K \{x_{s,t},y_{s,t}\}_{t=1}^{K} {xs,t,ys,t}t=1K以及对应的扭曲特征 F w i F_{w}^{i} Fwi提供额外的外观约束,用于学习源面部的隐式身份表示。

s

学习源图像特征的原因:需要使用源的身份来补偿扭曲的面部特征图。

如上图3,左上部分是将关键点信息展平并归一化,左下部分是将扭曲特征 F w i F_{w}^{i} Fwi卷积产生的投影特征 F p r o j i F_{proj}^{i} Fproji的全集空间信息进行全局平均池化(GAP),两部分压缩为通道描述后进行concate。

右半部分将级联后的特征输入MLP网络,学习身份隐式表征。

上述操作可表示为公式:

image-20231202121731806

隐式身份表征条件下的元记忆学习

利用学习到的隐式身份表示 S i d S_{id} Sid 来作为检索全局面部元记忆 M o Mo Mo的条件,为每个源面部图像生成依赖于身份的面部记忆 M s Ms Ms

使用 S i d S_{id} Sid控制3x3卷积层来产生条件面部记忆。

image-20231202123107500

image-20231202123129332

image-20231202123141393

其中w是卷积核的权重。si是 S i d S_{id} Sid中的第i个元素,j和k分别枚举了输出特征图和卷积的空间足迹。经上述操作,得到了依赖于源的面部记忆:

image-20231202123810509

上述操作表示由w’‘参数控制的卷积层。

借助与身份无关的记忆 M s Ms Ms,扭曲的源特征图可以通过与源相关的面部先验进行补偿(模型图中b模块),以实现更有效地面部生成。

3.3 全局记忆补偿与生成

image-20231202125821945

如图4所示,MCM记忆补偿模块,通过学习的源身份相关的面部记忆库Ms来细化扭曲特征 F w i F^{i}_{w} Fwi

扭曲的面部特征的投影

为保持原特征图像中的身份信息,补偿采用了通道分割的策略:沿着通道维度将 F w i F^{i}_{w} Fwi分为两部分:

  • F w i , 0 F^{i,0}_{w} Fwi0 :前半部分,直接以贡献源身份而保留;
  • F w i , 1 F^{i,1}_{w} Fwi1 :其余半部分,由源身份相关的存储体Ms进行调整,细化细节。分割后,使用1x1卷积层改变通道数,得到投影特征图 F p r o j i F_{proj}^{i} Fproji
扭曲的面部特征补偿

采用动态交叉注意力机制,在空间上补偿扭曲的源特征图。

  • 采用Ms通过两个动态卷积层 f d c 1 f_{dc}^{1} fdc1 f d c 2 f_{dc}^{2} fdc2,以投影特征 F p r o j i F_{proj}^{i} Fproji为条件来生成key和value。这样的key和value是与身份相关的并且可以提供上下文信息;
  • 通过非线性投影,通过1x1卷积层和ReLU层将 F p r o j i F_{proj}^{i} Fproji映射到查询特征 F Q i F_{Q}^{i} FQi,通过交叉注意力机制来重建更鲁棒的特征 F c a i F_{ca}^{i} Fcai

image-20231202141727195

  • 为了保持与源图像的一致性,将上述结构与前半部分通道 F w i , 0 F^{i,0}_{w} Fwi0连接:

image-20231202142004168

最终的输特征可以有效的结合从存储库中学习到的面部先验信息,并由动态交叉注意力机制进行调制。

一致性正则化

为了从输入的训练人脸图像中学习全局面部外观和结构表示,我们需要使元记忆的学习受到训练数据中每个图像的约束

本文使用的方法是:强制当前训练图像的投影特征 F p r o j i F_{proj}^{i} Fproji与全局内存的特征 F V i F_{V}^{i} FVi之间的一致性:

image-20231202142553946

其中 de(·) 表示梯度分离函数,|| · ||1 是 L1 损失。通过使用该函数,正则化增强了全局元记忆学习的一致性,同时不影响源图像特征的学习。

多层生成

基于多尺度特征进行工作,如图2,通过运动流来扭曲每层的编码特征 F e i F_{e}^{i} Fei,产生扭曲特 F w i F_{w}^{i} Fwi,随后将其依次输入本文设计的IICM和MCM模块,以生成补偿特征图 F c p t i F_{cpt}^{i} Fcpti

  • 在解码过程中,将 F c p t 1 F_{cpt}^{1} Fcpt1视为 F d 1 F_{d}^{1} Fd1 F d 2 F_{d}^{2} Fd2通过由 F d 1 F_{d}^{1} Fd1上采样生成。

  • 在第i(i>1)层,输出补偿特征图 F c p t i F_{cpt}^{i} Fcpti与同一层的解码特征 F d i F_{d}^{i} Fdi连接以产生解码特征 F d i + 1 F_{d}^{i+1} Fdi+1

  • 最后,将 F c p t N F_{cpt}^{N} FcptN F d N F_{d}^{N} FdN的串联结果输入卷积层,sigmod激活后生成最终面部图像。

每层的生成过程共享相同的Mo。

3.4 训练

损失函数:

image-20231202150309775

Lp:输出和驱动图像间的差距
Leq:学习更稳定的关键点
Ldist:避免观点拥挤字在一个区域
Lcon:正则一致化损失

4 实验

4.1 性能对比

image-20231202151029266

通过相同身份和跨身份驱动图像的生成对比,本文提出的模型展现了较好的性能。

4.2 消融实验

image-20231202151527773
在这里插入图片描述

由表2可以看出,通过实验验证了各个模块的效果。

image-20231202153454223

在图 7 中可视化学习到的元记忆,其目的是学习全局代表性的面部外观和结构模式。在图 7 中,我们可视化了面部元记忆库的部分通道。可以观察到,这些通道代表具有不同外观、结构、尺度和姿势的面部,这些信息非常丰富,并且明显有利于面部补偿和生成,证实了我们学习全局面部表征以解决头部说话生成中的歧义的动机。

记忆补偿的影响

表2和图6对比了记忆补偿模块的影响。还进行了公式(3)的消融实验,证明了通道分割可以提高性能。这些结果表明,学习全局面部记忆确实可以有效地补偿扭曲的面部特征图,从而为头部说话的生成产生更高保真度的结果。

公式4的一致性正则化

image-20231202154029624

如果没有它,如图 8 所示,面部记忆库显然会学到较少辨别力的面部模式和更多噪声表示。

泛化性实验

将所提出的 MCM 和 IICM 模块嵌入到不同的代表性头部说话生成框架中,包括 FOMM [25] 和 TPSM [48],以验证我们设计的记忆机制可以灵活地推广到现有模型。

image-20231202154219715

在图9中展示了一些域外样本的生成结果,以验证我们模型的域外生成能力。如图9所示,我们的方法能够有效地修改油画和卡通面孔的表情。

4 结论

本文提出了一种隐式身份表示条件记忆补偿网络(MCNet)来全局学习代表性面部模式,以解决头部说话视频生成任务中动态运动引起的模糊问题。MCNet 利用设计的隐式身份表示条件记忆模块来学习身份相关的面部记忆,并通过提出的记忆补偿模块进一步用于补偿扭曲的源特征图。通过实验验证了性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Implicit representation neural networks are a type of neural network that can learn to represent complex, high-dimensional data without the need for explicit feature engineering. DNNs (Deep Neural Networks) are a type of neural network that can have multiple hidden layers, and they can be used for a variety of tasks, including image classification, speech recognition, and natural language processing. CNNs (Convolutional Neural Networks) are a type of DNN that are particularly well-suited for image processing tasks, as they can learn to recognize patterns in images. MLPs (Multilayer Perceptrons) are another type of DNN that can be used for a variety of tasks, including classification and regression. To write a DNN in Python, you can use a deep learning library such as TensorFlow or PyTorch. Here is an example of how to create a simple DNN using TensorFlow: ``` import tensorflow as tf # Define the model architecture model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # Compile the model model.compile(optimizer=tf.keras.optimizers.Adam(0.01), loss='categorical_crossentropy', metrics=['accuracy']) # Train the model model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val)) ``` To write a CNN in Python, you can use a similar approach, but with convolutional layers instead of fully connected layers. Here is an example of how to create a simple CNN using TensorFlow: ``` import tensorflow as tf # Define the model architecture model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # Compile the model model.compile(optimizer=tf.keras.optimizers.Adam(0.01), loss='categorical_crossentropy', metrics=['accuracy']) # Train the model model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val)) ``` To write an MLP in Python, you can use a similar approach to the DNN example above, but with only fully connected layers. Here is an example of how to create a simple MLP using TensorFlow: ``` import tensorflow as tf # Define the model architecture model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # Compile the model model.compile(optimizer=tf.keras.optimizers.Adam(0.01), loss='categorical_crossentropy', metrics=['accuracy']) # Train the model model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值