Bootstrap

论文阅读:HeadGAN: One-shot Neural Head Synthesis and Editing

介绍

  • 这是种wrap的方式, 整体有两个网络, 一个flow network F计算flow field, 一个rendering network进行变换
  • 这个说是运用了3DMM, 好像也就是建模的时候用了点
    提出了HeadGAN, 一种适用于头部动画和编辑的基于GAN的 one-shot方法。 这里特别的是使用了PNCC特征, 同时使用了3DMM。HeadGAN可以:
  1. 以20fps的速率运行实时reenactment系统
  2. 面部视频压缩和面部重建的有效方法
  3. 面部表情编辑方法
  4. 新颖的view分析方法, 包括正面化

相关工作提到:Warp-Guided GANs is a more recent work that uses 2D facial landmarks and 2D warps to animate an image, MarioNETte tries to solve this problem, by proposing a method for landmark transformation that adapts the driving landmarks to the reference head shape

方法

3D面部表示

为了转移驱动人的表情, 同时保留source身份的face geometry, 利用3dmm中的先验知识, 给定T帧的视频帧, y 1 : t y_{1:t} y1:t= { y t ∣ t = 1 , . . . . . T y_t|t=1, .....T ytt=1,.....T}, 3Dmm fitting阶段产生了相机参数 c 1 : T c_{1:T} c1:T,形状参数 p 1 : T p_{1:T} p1:T, 以及 p t = [ p t i d T ; p t e x p T ] T p_t=[p_t^{idT}; p_t^{expT}]^T pt=[ptidT;ptexpT]T的序列. 对于每帧t, 我们获得两种shape 参数, 一个是 p t i d ∈ R n i d p_t^{id}∈R^{n_{id}} ptidRnid身份有关的参数, 另一个是表情参数 p t e x p ∈ R n e x p p_t^{exp}∈R^{n_{exp}} ptexpRnexp,表示面部变形.
这里3DMM fitting阶段使用密集的3d points, 是用RetinaFace回归的(所以是一帧帧回归的吗,用半监督的那个方法应该也行?), 这个模型是在WIDER FACE 数据集上预训练的. 给定源身份的参考图 y r e f y_{ref} yref, 对其进行3dmm fitting, 获得形状参数 p r e f i d p_{ref}^{id} prefid, p r e f e x p p_{ref}^{exp} prefexp, 相机参数 c r e f c_{ref} cref,下面是fit 算法:

  • 给定面部图像y,3DMM fitting阶段恢复形状p和相机c参数。它依赖于面部密集的3D点,这些点通过Retinaface501网络回归,在WIDER FACE dataset上预先训练。使用Procrustes分析将回归点register为LSFM 3DMM的平均形状x
    在这里插入图片描述

对于每帧t, 计算出的3d mesh公式如下:

在这里插入图片描述
其中 s t : s_t: st:
在这里插入图片描述

x ˉ ∈ R 3 N \bar x ∈R^{3N} xˉR3N 是平均形状, U i d U_{id} Uid是正交化的bias, U e x p U_{exp} Uexp是来自LSTM morphable 表情正交化bias(论文A 3d morphable model learnt from 10,000 faces.). 然后再就是渲染出3d 脸部的representation, x t = R ( s t , c t ) x_t=R(s_t, c_t) xt=R(st,ct) c是相机参数, 这个 x t x_t xt是一张类似PNCC的RGB图. 同样也渲染出 x r e f x_{ref} xref, 这是从参考图像 y r e f y_{ref} yref中恢复的3D表达,如下图所示.

在这里插入图片描述

综上, 给定驱动视频 y 1 : t y_{1:t} y1:t以及一个源参考图 y r e f y_{ref} yref, 数据预处理阶段恢复了一系列图片 x 1 : T x_{1:T} x1:T,这些x描述了从驱动视频提取到的并且可以应用到源图片的面部几何信息, 同时还有 x r e f x_{ref} xref

声音特征

我们将音频信号分成T个部分 a 1 : T a_{1:T} a1:T,其中每个部分对应于长度为T的驱动视频的第 y t y_t yt帧。
然后,我们将音频特征提取应用于2L长度的音频窗口。 a t − L − 1 : t + L = { a t − L − 1 , . . . . a t , . . . . a t + L } a_{t-L-1:t+L} = \{a_{t-L-1},....a_t,....a_{t+L}\} atL1:t+L={atL1,....at,....at+L},以帧t为中心,得到一个特征向量 h t ( a ) h_t^{(a)} ht(a), 它包含了过去和未来的时间步骤的信息. 我们采用(论文An opensource python library for audio signal analysis.)来提取低层次的特征,如MFCCs,信号能量和熵,从而得到一个特征向量 h t ( a L ) h^{(aL)}_t ht(aL) R 84 R^{84} R84
然后,我们使用DeepSpeech从每个音频部分提取字符级别的logits。这结果是2L个logits,串联后得到一个特征向量 h t ( a H ) h^{(aH)}_t ht(aH) R 2 L ∗ 27 R^{2L*27} R2L27。我们最终的音频特征向量为 h t ( a ) h^{(a)}_t ht(a) = [ h t ( a L ) T ] [h_t^{(aL)^T}] [ht(aL)T]; h t ( a H ) T ] T h_t^{(aH)^T}]^T ht(aH)T]T ∈R300,对于L = 4。

  • L是指的t前后的帧数, 合起来是2L, 也就是说论文是8帧一个单元
HeadGan 框架

HeadGan的生成器有两种模式, 一种是从驱动视频视频和参考图片中提取出的3d 面部表达, 一种是来自驱动者的音频.
网络输入有两个:(1) x t − k : t x_{t-k:t} xtk:t, 即从t帧里得到的3d 脸部表达, 和过去的k=2帧 channel级的连接起来, (2)参考图片 y r e f y_{ref} yref及其对应的 x r e f x_{ref} xref, 以及声音特征 h t ( a ) h_t^{(a)} ht(a), 生成器可以将这些输入的特征变为真实的图片, 公式如下:

在这里插入图片描述
生成器由两个子网络组成:一个密集流网络F和一个渲染网络R, 整个网络架构如下图:
image.png

Dense flow network F
  • 渲染网络R是依赖前一个阶段的信息的,但是只从参考图像中提取信息不太行, 假如是视觉特征和想要的头部姿态对齐就好了, 头部姿态在我们的驱动视频的3d model x t x_t xt 中有体现

F可以学习到流 w t w_t wt来扭曲视觉特征.
把参考图片和其对应的3d 特征 cat起来 ( y r e f , x r e f y_{ref}, x_{ref} yref,xref) 通过encoder提取三个空间尺度的特征 h ( 1 ) , h ( 2 ) , h ( 3 ) h^{(1)}, h^{(2)}, h^{(3)} h(1),h(2),h(3) 来表示原图片 identity 的信息. (参考图片有三个空间尺度的身份信息)

输入驱动视频的3d特征 x t − k : t x_{t-k:t} xtk:tdecoder, 预测出流 w t w_t wt 然后 w 被注入F, 通过SPADE blocks , 这个block 是论文(Semantic image synthesis with spatially-adaptive normalization.)里面的, 结构大致如下:

在这里插入图片描述

理想情况下, 通过这个流, 参考图片就能做出和驱动视频同样的动作和表情了, 这个流w是用到每个视觉特征的, 之前不是提取了 h ( 1 ) , h ( 2 ) , h ( 3 ) h^{(1)}, h^{(2)}, h^{(3)} h(1),h(2),h(3) 来表示原图片 identity 的信息, 都用上这个场就得到了warped 视觉特征, h ˉ t ( 1 ) , h ˉ t ( 2 ) , h ˉ t ( 3 ) \bar h_t^{(1)}, \bar h_t^{(2)}, \bar h_t^{(3)} hˉt(1),hˉt(2),hˉt(3),以及warped 参考图片 y ˉ t r e f \bar y_t^{ref} yˉtref,

Rendering network
  • 这个部分的主要输入是驱动视频的3d model 的类似pncc的图 x t − k : t x_{t-k:t} xtk:t
  • 其他额外的辅助输入还有之前提取的音频特征 h t ( a ) h^{(a)}_t ht(a) (这个音频特征提取的挺多, 还用两种cat起来) , 还有之前被流wrap后的特征 h ˉ t ( 1 ) , h ˉ t ( 2 ) , h ˉ t ( 3 ) \bar h_t^{(1)}, \bar h_t^{(2)}, \bar h_t^{(3)} hˉt(1),hˉt(2),hˉt(3)既然可以直接得到wrap的图片 y r e f y_{ref} yref 为啥不到这里就停止了呢

编码器接收 x t − k : t x_{t-k:t} xtk:t 然后对其进行卷积下采样, 然后由交替的SPADE和AdaIN层 组成的解码器生成需要的帧 y ~ t \tilde y_t y~t. (用到辅助信息了, 声音ha和wrap的特征ht)
这些自适应归一化层能够将2d 的特征图通过SPADE blocks注入到渲染网络中, 也可以将1d 的音频特征通过AdaIN注入到渲染网络中.

与SPADE的原始工作相反,所有SPADE层的条件输入都是相同的分割图(segmentation map)向下采样以匹配每个层的空间大小,我们利用了多个空间尺度的视觉特征图 h ˉ t ( 1 ) , h ˉ t ( 2 ) , h ˉ t ( 3 ) \bar h_t^{(1)}, \bar h_t^{(2)}, \bar h_t^{(3)} hˉt(1),hˉt(2),hˉt(3) y ˉ t r e f \bar y_t^{ref} yˉtref作为SPADE blocks的调制输入。

我们将相同的音频特征向量 h t ( a ) h_t^{(a)} ht(a)传递给所有空间尺度的AdaIN块。解码器还配备有用于上采样的PixelShuffle layers,来自论文(Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network) , 这有助于提高生成样本的质量。

Discriminators D and Dm.

图像鉴别器接收合成的一对 ( x t ; y ~ t ) (x_t; \tilde y_t) (xt;y~t),或一个真实的一对 ( x t ; y t ) (x_t; y_t) (xt;yt),并且学习如何区分它们。我们使用第二个鉴别器Dm,它专注于嘴部区域。除了真实的 y t m y^m_t ytm或生成的 y ~ t m \tilde y^m_t y~tm裁剪的嘴部区域, 该网络以音频特征向量 h t ( a ) h^{(a)}_t ht(a)为条件,在空间上进行复制(spatially replicated),然后与裁剪后的图像进行channel-wise级联。

Training Objective.

构成生成器的网络F和R联合优化。我们通过应用感知和像素损失(perceptual and pixel losses) L F V G G , L G V G G L_F^{VGG}, L_G^{VGG} LFVGG,LGVGG, L F L 1 , L G L 1 L_F^{L1}, L_G^{L1} LFL1,LGL1上面结构图中所示(红色箭头)。还有其他的损失作者在附录中讲了.

  • 这里对warp的图和生成的都用这两个loss
    image.png
    这个ground truth是哪的???

在这里插入图片描述

实验

3D Face Rendering

这里的参数是shape参数和相机参数, 也就是35维度加上驱动视频帧就可以重建出人脸来
在这里插入图片描述
在这里插入图片描述

  • VoxCeleb
;