RELATED WORK

传统的Image Animation工作主要是对一种类别的图像进行建模重建,比如单独针对人脸。但是在有些领域,比如对商品进行image animation,很难找到相关类型的数据或者模型。

后来有一种思路是直接用GAN进行训练,但是这需要对于每一个对象进行单独训练,比如训练一个人体运动就需要一段几十分钟甚至几小时的这个人运动的视频,然后单独对他进行训练,可以看出这种工作的泛用性是很差的。

METHOD

PIPELINE

算法框架由两个模块组成:运动估计模块和图像生成模块。

MOTION MODULE

首先预测出一个由 3HW3*H*W 的帧D到S的运动场 TSDT_{S\gets D} ,也被称为反向光流,这个场把D中每个像素的位置映射到S上。这里之所以用反向光流而不用正向光流,是因为反向光流在实现的时候可以通过双线性采样比较方便地算出。

由于T和D的来源未知,所以其差异可能会非常大,故直接进行 TSDT_{S\gets D} 的运算可能会导致计算误差比较大,于是作者在这里引入了一个中间量R,这个R实际上就是个抽象的中间量,后面会化简掉,没有实际的存在。

由此我们现在要预测的量变为了 TSRT_{S \gets R}TRDT_{R \gets D} ,同时 TRD=TDR1T_{R \gets D}=T_{D \gets R}^{-1} ,所以可以把问题归结为 TXR,X=(S,D)T_{X \gets R}, X=(S,D) 。用 pkp_k 表示R中的kp, zkz_k 表示X中的kp,p、z分别表示R和X中的每一个像素,根据一阶泰勒展开可以得到:

TXR(p)=TXR(pk)+(ddpTXR(p)p=pk)(ppk)+o(ppk)T_{X \gets R}(p)=T_{X \gets R}(p_k)+(\frac{d}{dp}T_{X \gets R}(p)|_{p=p_k})(p-p_k)+o(\|p-p_k\|)

根据雅可比矩阵表示可以得到:

TXR(p){{TXR(p1),ddpTXR(p)p=p1},...,{TXR(pk),ddpTXR(p)p=pk}}T_{X \gets R}(p)\backsimeq \{\{T_{X \gets R}(p_1),\frac{d}{dp}T_{X \gets R}(p)|_{p=p_1}\},...,\{T_{X \gets R}(p_k),\frac{d}{dp}T_{X \gets R}(p)|_{p=p_k}\}\}

所以最终得出:

TSD(z)=TSRTDR1TSR(pk)+Jk(zTDR(pk))Jk(ddpTSR(p)p=pk)(ddpTDR(p)p=pk)1\begin{array}{cc} T_{S \gets D}(z)=T_{S \gets R}\circ T_{D \gets R}^{-1}\approx T_{S \gets R}(p_k)+J_k(z-T_{D \gets R}(p_k)) \\ J_k \approx (\frac{d}{dp}T_{S \gets R}(p)|_{p=p_k})(\frac{d}{dp}T_{D \gets R}(p)|_{p=p_k})^{-1} \end{array}

在这个式子中, TSR(pk)T_{S \gets R}(p_k)TDR(pk)T_{D \gets R}(p_k) 直接由关键点的预测模块得出。根据这个式子,我们可以通过每一个kp计算出一张变换后的图像 SKS^K ,然后添加一张 S0=SS^0=S 作为背景等静态部分。

与此同时,作者还额外计算出了k张heatmap来说明哪些部分出现了运动:

Hk(z)=exp((TDR(pk)z)2σ)exp((TSR(pk)z)2σ)H_k(z)=exp(\frac{(T_{D \gets R}(p_k)-z)^2}{\sigma})-exp(\frac{(T_{S \gets R}(p_k)-z)^2}{\sigma})

然后把这些 HkH_kSKS^K 一起丢进网络,预测出 k+1张mask MkM_k ,这样一来,完整的运动场 T^SD(z)\hat T_{S \gets D}(z) 可以表示为:

T^SD(z)=M0z+k=1KMk(TSR(pk)+Jk(zTDR(pk)))\hat T_{S \gets D}(z)=M_0 z+\displaystyle\sum^K_{k=1} M_k(T_{S \gets R}(p_k)+J_k(z-T_{D \gets R}(p_k)))

同时,网络还给出了一个mask O^SD{\hat O}_{S \gets D} ,这个mask定义了哪些部分是由源图像扭曲可以得到,哪些部分是需要进行image inpainting预测出来。

GENERATION MODULE

图像生成模块实际上就是个用 S1S_1D1,...,DTD_1,...,D_T 来生成 S2,...,STS_2,...,S_T 的过程,作者这里不是把 TS1Dt(pk)T_{S_1 \gets D_t}(p_k) 施加到 S1S_1 上(我感觉这里应该是防止动作差异较大),而是把 TDtD1(p)T_{D_t \gets D_1}(p) 施加到 S1S_1 上:

TS1St(z)TS1R(pk)+Jk(zTSR(pk)+TD1R(pk)TDtR(pk))T_{S_1 \gets S_t}(z) \approx T_{S_1 \gets R}(p_k) + J_k(z-T_{S \gets R}(p_k)+T_{D_1 \gets R}(p_k)-T_{D_t \gets R}(p_k))

当然这样计算也存在一定的局限性,如果 S1S_1D1D_1 的pose差异较大,计算出来的效果就不好。