FOMM 笔记
《First order motion model for image animation》
论文:https://papers.nips.cc/paper/8935-first-order-motion-model-for-image-animation
项目:https://github.com/AliaksandrSiarohin/first-order-model
First Order Motion Model for Image Animation 论文解读
用于摆动作
输入人物图像和驱动视频,让人物图像摆出驱动视频中的动作
这篇文章与 Monkey-Net 高度相关,属于后续改进工作
这篇文章提到了很多看起来非常有价值的工作!!!
简单总结
有一部分的像素通过 warp 得到,有一部分的像素通过 inpainting 得到
网络会生成一个 mask ,决定哪些部分靠 warp ,哪些部分靠 inpainting
align 靠的是 关键点
关键点检测器 是 端到端 自监督 学出来的,只需要视频就行,不需要标注
端到端训练,用重建任务训练的时候 ,顺便就把关键点检测器训好了
关键点的数量是一个超参数
总结一下整个模型的行为⭐
排除数学推导过程和改进过程,总结一下模型到底干了啥。
可以看到,一共用了三个网络。
关键点检测与局部运动场
( S \mathbf{S} S 表示源视频,提供人物。 D \mathbf{D} D 表示目标视频,提供动作。 X \mathbf{X} X 表示 S \mathbf{S} S 或 D \mathbf{D} D ,用到 X \mathbf{X} X 的地方表示相同的操作对 S \mathbf{S} S 和 D \mathbf{D} D 都做一遍)
将 X \mathbf{X} X 输入 U-Net 关键点检测器,输出:
- K K K 个通道,表示 K K K 个关键点置信度图。每个关键点对应一个置信度图。
- 4 K 4K 4K 个系数通道。也就是说,对每个关键点 p k p_k pk ,额外输出4个通道,用于计算 d d p T X ← R ( p ) ∣ p = p k \left.\frac{d}{d p} \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}} dpdTX←R(p)∣ ∣p=pk (这是一个2*2的雅可比矩阵)。计算方法是,用置信度图作为空间加权分别在这4个通道中计算平均,得到4个系数(每个通道计算出一个系数)。
于是现在我们得到了所有关键点的 T X ← R ( p k ) \mathcal{T}_{ \mathbf{X} \leftarrow \mathbf{R}} \left( p_{k} \right) TX←R(pk) 和 d d p T X ← R ( p ) ∣ p = p k \left.\frac{d}{d p} \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}} dpdTX←R(p)∣ ∣p=pk
注意到 T X ← R ( p k ) \mathcal{T}_{ \mathbf{X} \leftarrow \mathbf{R}} \left( p_{k} \right) TX←R(pk) 实际上是关键点 p k p_k pk 在 X \mathbf{X} X 中的坐标。
然后,通过 公式(5) 我们可以计算出 局部运动场 T S ← D \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}} TS←D
-
公式(5)
T S ← D ( z ) ≈ T S ← R ( p k ) + J k ( z − T D ← R ( p k ) ) 公式 ( 5 ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) \approx \mathcal{T}_{ \mathbf{S} \leftarrow \mathbf{R}} \left( p_{k} \right)+J_{k}\left(z-\mathcal{T} _{\mathbf{D} \leftarrow \mathbf{R}} \left( p_{k} \right) \right)\qquad公式(5) TS←D(z)≈TS←R(pk)+Jk(z−TD←R(pk))公式(5)
其中
J k = ( d d p T S ← R ( p ) ∣ p = p k ) ( d d p T D ← R ( p ) ∣ p = p k ) − 1 J_{k}=\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)^{-1} Jk=(dpdTS←R(p)∣ ∣p=pk)(dpdTD←R(p)∣ ∣p=pk)−1
一共可以得到 K K K 个 T S ← D \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}} TS←D (注意到, T S ← D \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}} TS←D 用于结合 S \mathbf{S} S 和 D \mathbf{D} D 对应关键点的信息)
全局运动场与遮罩
然后,我们使用 T S ← D ( z ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) TS←D(z) 来 warp 源图像 S \mathbf{S} S ,得到 K K K 个变换过的图像 S 1 , S 2 , … , S K \mathbf{S}^1,\mathbf{S}^2,\dots,\mathbf{S}^K S1,S2,…,SK ,同时,令 S 0 = S \mathbf{S}^0=\mathbf{S} S0=S 。
对每个关键点,计算 K K K个 热图 H k ( z ) \mathbf{H}_{k}(z) Hk(z) ,用于指示发生了变换的位置
-
方法是,将 T S ← R ( p k ) \mathcal{T}_{ \mathbf{S} \leftarrow \mathbf{R}} \left( p_{k} \right) TS←R(pk) 和 T D ← R ( p k ) \mathcal{T}_{ \mathbf{D} \leftarrow \mathbf{R}} \left( p_{k} \right) TD←R(pk) 两个关键点按固定方差画出高斯分布,然后作差
H k ( z ) = exp ( ( T D ← R ( p k ) − z ) 2 σ ) − exp ( ( T S ← R ( p k ) − z ) 2 σ ) \mathbf{H}_{k}(z)=\exp \left(\frac{\left(\mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}\left(p_{k}\right)-z\right)^{2}}{\sigma}\right)-\exp \left(\frac{\left(\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}\left(p_{k}\right)-z\right)^{2}}{\sigma}\right) Hk(z)=exp(σ(TD←R(pk)−z)2)−exp(σ(TS←R(pk)−z)2)
将 指示变换区域的热图 { H k ( z ) } k = 1 K \{\mathbf{H}_{k}(z)\}_{k=1}^K {Hk(z)}k=1K 与 变换后的图像 { S k } k = 0 K \{\mathbf{S}^k\}_{k=0}^K {Sk}k=0K 连接,送入 U-Net 深度运动网络,输出尺寸为 H ′ × W ′ H^{\prime} \times W^{\prime} H′×W′,其中,输出 K + 1 K+1 K+1 个遮罩 { M k } k = 0 K \{M_k\}_{k=0}^K {Mk}k=0K 用于指导计算 稠密运动场 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D ,还输出一个额外通道 O ^ S ← D \hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} O^S←D 用于指示哪里需要 inpainting 。
于是我们根据遮罩,整合所有局部运动场,计算出全局的 稠密运动场 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D (汇集了所有局部光流的全局光流)
T ^ S ← D ( z ) = M 0 z + ∑ k = 1 K M k T S ← D ( z ) \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}}(z)=\mathbf{M}_{0} z+\sum_{k=1}^{K} \mathbf{M}_{k}\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) T^S←D(z)=M0z+k=1∑KMkTS←D(z)
注意, M 0 z \mathbf{M}_0 z M0z 是为了建模不移动的部分,比如背景。
合成目标图像
有一个卷积网络,输入 S \mathbf{S} S ,输出目标图像。
我们将经过两个下采样卷积块后得到的特征图 ξ ∈ R H ′ × W ′ \boldsymbol{\xi} \in \mathbb{R}^{H^{\prime} \times W^{\prime}} ξ∈RH′×W′ 抽出来,进行 warp 和 mask ,如下:
ξ ′ = O ^ S ← D ⊙ f w ( ξ , T ^ S ← D ) \boldsymbol{\xi}^{\prime}=\hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} \odot f_{w}\left(\boldsymbol{\xi}, \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}}\right) ξ′=O^S←D⊙fw(ξ,T^S←D)
其中 f w ( ⋅ , ⋅ ) f_w(\cdot,\cdot) fw(⋅,⋅) 表示 反向warp操作。
然后把这个特征图 ξ ′ \boldsymbol{\xi}^{\prime} ξ′ 喂给后续的层,渲染出最终的图像。
前承工作
此外,在姿态迁移的大任务当中,Monkey-Net 首先尝试了通过自监督范式预测关键点来表征姿态信息,测试阶段估计驱动视频的姿态关键点完成迁移工作。
用了 X2Face 中参考帧的概念。
后续工作
-
后来有人 follow 了一个简化版,不用一阶模型,而是基于OpenCV做的,能实时合成
https://github.com/anandpawara/Real_Time_Image_Animation
方法
我们的目标是,根据给定的驱动视频 D \mathcal{D} D ,让给定源图像 S \mathbf{S} S 中的对象动起来。
直接做有监督学习没法实现,因为没有配对的数据集。
我们受了 Monkey-Net [28] 启发,使用了一个自监督策略。使用大量类型相同的视频来训练。
用重建任务训练模型,从同一个视频中抽出两帧,输入 单帧 和 可学习的 对动作的隐式表征,重建出另一帧。模型将会学会把 动作 编码为 特定于动作的关键点位移 和 局部仿射变换。
模型概述
模型分为两部分,动作估计模型 和 图像生成模型。
动作估计模型的目标是,估计一个 从驱动帧 D ∈ R 3 × H × W \mathbf{D}\in\mathbb{R}^{3\times H\times W} D∈R3×H×W 到 源帧 S ∈ R 3 × H × W \mathbf{S} \in \mathbb{R}^{3 \times H \times W} S∈R3×H×W 的 稠密运动场。稠密运动场是一个函数 T S ← D : R 2 → R 2 \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}: \mathbb{R}^{2} \rightarrow \mathbb{R}^{2} TS←D:R2→R2 ,把 D \mathbf{D} D 中的每个坐标映射为 S \mathbf{S} S 中的坐标。稠密运动场后面会被用来把 S \mathbf{S} S 的特征图 align 到 D \mathbf{D} D 的动作。
稠密运动场 T S ← D \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}} TS←D 一般也称为反向光流。我们使用反向光流,而不是正向光流,因为 反向warp 只要用 双线性采样 就可以 可微 且高效地实现。
我们假设一个抽象的参考帧 R \mathbf{R} R ,我们独立地预测两个变换 T S ← R \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}} TS←R 和 T D ← R \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}} TD←R 。注意,与 X2Face [40] 不同,参考帧是一个抽象概念,我们会在后续推导中抵消掉它,它没有被显式地计算出来,也不能被可视化。参考帧是为了允许我们分别独立处理 S \mathbf{S} S 和 D \mathbf{D} D 。设计参考帧是为了让模型在 test 阶段能够处理, S \mathbf{S} S 和 D \mathbf{D} D 看起来差别很大的情况。
动作估计模型不是直接预测 T S ← R \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}} TS←R 和 T D ← R \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}} TD←R ,而是分两步。
流程概述
第一步,利用使用一个 稀疏轨迹集 来近似 T X ← R \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}} TX←R (其中 X \mathbf{X} X 表示 S \mathbf{S} S 或 D \mathbf{D} D )。稀疏轨迹集由关键点得到。关键点来自于一个 U-Net 。如 Monkey-Net [28] 中展示的,这种稀疏的运动表示非常适合于动画,因为在测试时, S \mathbf{S} S 的关键点可以使用 D \mathbf{D} D 中的轨迹来移动。
我们用 局部仿射变换 来模拟 每个关键点附近的运动(稠密化)。我们想使用泰勒展开式,用一组关键点位置和仿射变换来表示 T D ← R \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}} TD←R 。为此,关键点检测器网络 输出 关键点位置 以及 每个仿射变换的参数。
第二步,使用 深度运动网络 结合局部的近似,产生稠密运动场 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D 和 遮挡掩码 O ^ S ← D \hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} O^S←D 。遮挡掩码用于指示,在重建 D \mathbf{D} D 时, S \mathbf{S} S 中的些部分可以 warp ,哪些部分需要 inpainting 。
最后,使用生成网络 G,对 S \mathbf{S} S 进行 warp 和 inpainting
局部仿射变换
注意,为了简单起见, R \mathbf{R} R 中的坐标都用 p p p 表示, X \mathbf{X} X 中的坐标用 z z z 表示。
定义泰勒展开:
T X ← R ( p ) T X ← R ( p k ) + ( d d p T X ← R ( p ) ∣ p = p k ) ( p − p k ) + o ( ∥ p − p k ∥ ) \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p)\mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}\left(p_{k}\right)+\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p) \right| _{p=p_{k}} \right) \left(p-p_{k}\right) +o\left(\left\|p-p_{k}\right\|\right) TX←R(p)TX←R(pk)+(dpdTX←R(p)∣ ∣p=pk)(p−pk)+o(∥p−pk∥)
其中 p 1 , p 2 , ⋯ , p K p_1,p_2,\cdots,p_K p1,p2,⋯,pK 表示 R \mathbf{R} R 中 K K K 个关键点的坐标。
在这个公式中,运动函数 T X ← R \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}} TX←R ****由在每个关键点 p k p_k pk 处的值以及在每个关键点局部的雅可比矩阵定义:
T X ← R ( p ) ≃ { { T X ← R ( p 1 ) , d d p T X ← R ( p ) ∣ p = p 1 } , … , { T X ← R ( p k ) , d d p T X ← R ( p ) ∣ p = p K } } \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p) \simeq\left\{\left\{\mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}\left(p_{1}\right),\left.\frac{d}{d p} \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p)\right|_{p=p_{1}}\right\},\ldots, \left\{\mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}\left(p_{k}\right), \left.\frac{d}{d p} \mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}(p) \right| _{p=p_{K}}\right\}\right\} TX←R(p)≃{{TX←R(p1),dpdTX←R(p)∣ ∣p=p1},…,{TX←R(pk),dpdTX←R(p)∣ ∣p=pK}}
为了能够估计 T R ← X = T X ← R − 1 \mathcal{T}_{\mathbf{R} \leftarrow \mathbf{X}}=\mathcal{T}_{\mathbf{X} \leftarrow \mathbf{R}}^{-1} TR←X=TX←R−1 ,我们假设在关键点的邻域 T X ← R \mathcal{T}_{\mathbf{X}\leftarrow\mathbf{R}} TX←R 是局部的双射(一对一映射)
于是 T S ← D \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}} TS←D 定义如下:
T S ← D = T S ← R ∘ T R ← D = T S ← R ∘ T D ← R − 1 公式 ( 4 ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}=\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}} \circ \mathcal{T}_{\mathbf{R} \leftarrow \mathbf{D}}=\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}} \circ \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}^{-1} \qquad公式(4) TS←D=TS←R∘TR←D=TS←R∘TD←R−1公式(4)
对其进行泰勒展开,得到:
T S ← D ( z ) ≈ T S ← R ( p k ) + J k ( z − T D ← R ( p k ) ) 公式 ( 5 ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) \approx \mathcal{T}_{ \mathbf{S} \leftarrow \mathbf{R}} \left( p_{k} \right)+ J_{k}\left(z-\mathcal{T} _{\mathbf{D} \leftarrow \mathbf{R}} \left( p_{k} \right) \right) \qquad公式(5) TS←D(z)≈TS←R(pk)+Jk(z−TD←R(pk))公式(5)
其中
J k = ( d d p T S ← R ( p ) ∣ p = p k ) ( d d p T D ← R ( p ) ∣ p = p k ) − 1 J_{k}=\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)^{-1} Jk=(dpdTS←R(p)∣ ∣p=pk)(dpdTD←R(p)∣ ∣p=pk)−1
而 T S ← R ( p k ) \mathcal{T}_{ \mathbf{S} \leftarrow \mathbf{R}} \left( p_{k} \right) TS←R(pk) 和 T D ← R ( p k ) \mathcal{T} _{\mathbf{D} \leftarrow \mathbf{R}} \left( p_{k} \right) TD←R(pk) 来自于关键点预测器。
关于关键点预测器,我们使用一个 U-Net 架构 预测 K K K 个关键点热图,每个热图对应一个关键点。在最后一层用了 softmax 激活,这样得到的热图就可以被解释为关键点置信度图。每个关键点位置的期望都是使用 [28,24] 中的 平均操作 来估计的。
注意到,如果我们令 J k J_k Jk 为一个 2*2 的单位矩阵,就得到 Monkey-Net 中的运动模型。也就是说,Monkey-Net 使用 T S ← D ( z ) − z \mathcal{T}_{ \mathbf{S} \leftarrow \mathbf{D}} \left( z \right)-z TS←D(z)−z 的零阶近似。
实际上,关键点预测器还会对 每个关键点 额外输出 4 个通道,用于计算 公式(5) 中的 d d p T S ← R ( p ) ∣ p = p k \left.\frac{d}{d p} \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}} dpdTS←R(p)∣ ∣p=pk 和 d d p T D ← R ( p ) ∣ p = p k \left.\frac{d}{d p} \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}} dpdTD←R(p)∣ ∣p=pk 的系数。计算方法是,使用 对应的关键点置信度图 的权重 做 空间加权平均。
整合局部运动
使用一个卷积网络 P P P ,输入 T S ← D ( z ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) TS←D(z) 的集合 和源图像 S \mathbf{S} S ,输出 稠密运动场 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D 。
注意, T S ← D ( z ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) TS←D(z) 是从 D \mathbf{D} D 中像素的坐标到 S \mathbf{S} S 中像素的坐标的映射,是与 D \mathbf{D} D 对齐的。然而输入的图像是 S \mathbf{S} S ,这与 T S ← D ( z ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) TS←D(z) 并不对齐,这种不对齐的问题会让网络 P P P 更难工作。
为了得到大致对齐的图像,我们使用 T S ← D ( z ) \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{D}}(z) TS←D(z) 来 warp 源图像 S \mathbf{S} S ,得到 K K K 个变换过的图像 S 1 , S 2 , … , S K \mathbf{S}^1,\mathbf{S}^2,\dots,\mathbf{S}^K S1,S2,…,SK 。还有一个重要的点,我们令 S 0 = S \mathbf{S}^0=\mathbf{S} S0=S ,作为背景提供给 P P P 。
我们为每个关键点计算一个热图 H k ( z ) \mathbf{H}_{k}(z) Hk(z) ,表示有那些地方出现了变化。
为了得到每个 H k ( z ) \mathbf{H}_{k}(z) Hk(z) ,计算 T S ← R \mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}} TS←R 和 T D ← R \mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}} TD←R 为中心的两个热图的差异:
H k ( z ) = exp ( ( T D ← R ( p k ) − z ) 2 σ ) − exp ( ( T S ← R ( p k ) − z ) 2 σ ) \mathbf{H}_{k}(z)=\exp \left(\frac{\left(\mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}\left(p_{k}\right)-z\right)^{2}}{\sigma}\right)-\exp \left(\frac{\left(\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}\left(p_{k}\right)-z\right)^{2}}{\sigma}\right) Hk(z)=exp(σ(TD←R(pk)−z)2)−exp(σ(TS←R(pk)−z)2)
我们使用 σ = 0.01 \sigma=0.01 σ=0.01 ,来自于 [18] 。
将 热图 H k ( z ) \mathbf{H}_{k}(z) Hk(z) 与 变换后的图像 S 0 , … , S K \mathbf{S}^0,\dots,\mathbf{S}^K S0,…,SK 连接,并送入一个 U-Net 。
受 Monkey-Net [28] 启发,我们使用一个 part-based 网络 来预测 稠密运动场 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D 。我们假设一个物体由 K K K 个刚体组成,每个部分都根据 公式(4) 移动。因此,我们估计 K + 1 K+1 K+1 个 掩码 M k , k = 0 , … K \mathbf{M}_k,k=0,\dots K Mk,k=0,…K ,指示哪些地方存在局部变换。
最终的稠密运动场如下:
T ^ S ← D ( z ) = M 0 z + ∑ k = 1 K M k ( T S ← R ( p k ) + J k ( z − T D ← R ( p k ) ) ) \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}}(z)=\mathbf{M}_{0} z+\sum_{k=1}^{K} \mathbf{M}_{k}\left(\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}\left(p_{k}\right)+J_{k}\left(z-\mathcal{T}_{\mathbf{D} \leftarrow \mathbf{R}}\left(p_{k}\right)\right)\right) T^S←D(z)=M0z+k=1∑KMk(TS←R(pk)+Jk(z−TD←R(pk)))
注意, M 0 z \mathbf{M}_0 z M0z 是为了建模不移动的部分,比如背景。
遮挡感知图像生成
前面提到过, S \mathbf{S} S 与 D ^ \hat{\mathbf{D}} D^ 不是像素级 align 的。为了解决这个问题,我们使用了 特征warp策略,就像 [29,28,15] 。更准确的说,经过两个下采样卷积块之后,我们得到一个特征图 ξ ∈ R H ′ × W ′ \boldsymbol{\xi} \in \mathbb{R}^{H^{\prime} \times W^{\prime}} ξ∈RH′×W′ ,我们使用 T ^ S ← D \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}} T^S←D 来 warp 这个 ξ \boldsymbol{\xi} ξ 。
当 S \mathbf{S} S 中存在遮挡时,我们还需要 inpainting。因此,我们引入一个 遮挡图 O ^ S ← D ∈ [ 0 , 1 ] H ′ × W ′ \hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} \in[0,1]^{H^{\prime} \times W^{\prime}} O^S←D∈[0,1]H′×W′ 。
O ^ S ← D \hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} O^S←D 通过在 稠密运动网络 的最后一层加一个通道来预测。
转变后的特征图计算如下:
ξ ′ = O ^ S ← D ⊙ f w ( ξ , T ^ S ← D ) \boldsymbol{\xi}^{\prime}=\hat{\mathcal{O}}_{\mathbf{S} \leftarrow \mathbf{D}} \odot f_{w}\left(\boldsymbol{\xi}, \hat{\mathcal{T}}_{\mathbf{S} \leftarrow \mathbf{D}}\right) ξ′=O^S←D⊙fw(ξ,T^S←D)
其中 f w ( ⋅ , ⋅ ) f_w(\cdot,\cdot) fw(⋅,⋅) 表示 反向warp操作。
最后这个特征图 ξ ′ \boldsymbol{\xi}^{\prime} ξ′ 会喂给后续的层,渲染出最终的图像。
训练损失
使用端到端训练,有多个损失函数。
感知损失
使用了 VGG-19 感知损失 [19] 作为重建损失。我们使用了基于 [37] 的实现。
我们要计算多分辨率的重建损失,也就是计算多次降采样后的重建损失,就像MS-SSIM [39,32]。
重建损失一共有20个项。
加入等变约束(用于关键点检测)
我们的关键点检测器训练时不需要任何标注的数据,这可能导致不稳定的性能。
等变约束 是驱动 无监督关键点检测 的 最重要 的因素之一 [18,43] 。他会 强制模型预测出 与已知的几何变换一致的 关键点。我们使用薄板样条变形,因为它们以前被用于无监督的关键点检测[18, 43],并且与自然图像变形相似。
由于我们的运动估计器不仅预测关键点,而且还预测Jacobian,因此我们扩展了众所周知的等变损失,以额外包括对Jacobian的约束。
等变约束的推导,略,需要先去看看等变约束的原版。
测试阶段
使用驱动视频中 D 1 \mathbf{D}_1 D1 到 D t \mathbf{D}_t Dt 关键点的相对运动来引导 S 1 \mathbf{S}_1 S1 到 S t \mathbf{S}_t St 的合成。
我们将 T D t ← D 1 ( p ) \mathcal{T}_{\mathbf{D_t} \leftarrow \mathbf{D_1}}(p) TDt←D1(p) 变换应用到每个关键点 p k p_k pk 的邻域,,以此从 S 1 \mathbf{S}_1 S1 中生成 S t \mathbf{S}_t St
T S 1 ← S t ( z ) ≈ T S 1 ← R ( p k ) + J k ( z − T S ← R ( p k ) + T D 1 ← R ( p k ) − T D t ← R ( p k ) ) \mathcal{T}_{\mathbf{S}_{1} \leftarrow \mathbf{S}_{t}}(z) \approx \mathcal{T}_{\mathbf{S}_{1} \leftarrow \mathbf{R}}\left(p_{k}\right)+J_{k}\left(z-\mathcal{T}_{\mathbf{S} \leftarrow \mathbf{R}}\left(p_{k}\right)+\mathcal{T}_{\mathbf{D}_{1} \leftarrow \mathbf{R}}\left(p_{k}\right)-\mathcal{T}_{\mathbf{D}_{t} \leftarrow \mathbf{R}}\left(p_{k}\right)\right) TS1←St(z)≈TS1←R(pk)+Jk(z−TS←R(pk)+TD1←R(pk)−TDt←R(pk))
其中
J k = ( d d p T D 1 ← R ( p ) ∣ p = p k ) ( d d p T D t ← R ( p ) ∣ p = p k ) − 1 J_{k}=\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{D}_{1} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)\left(\left.\frac{d}{d p} \mathcal{T}_{\mathbf{D}_{t} \leftarrow \mathbf{R}}(p)\right|_{p=p_{k}}\right)^{-1} Jk=(dpdTD1←R(p)∣ ∣p=pk)(dpdTDt←R(p)∣ ∣p=pk)−1
这种用相对运动的方法可以处理源图像与驱动视频中对象比例不一致的问题。
不过使用相对运动的方法有一定的限制,需要 S 1 \mathbf{S}_1 S1 和 D 1 \mathbf{D}_1 D1 的姿态是大致对齐的(也就是需要两个视频的首帧姿势差不多),不然就会扭出怪姿势。