论文主要是做image animation,可以根据一个driving video让一张图片也按照该video上的动作去生成一些新视频。csdn放视频不方便,就放一张图好了
图片如下
因为算法会将driving video和图片的尺寸都调整成256*256,所以看起来会有些畸变,虽然在大形变的情况下(原理上感觉应该是keypoint丢失或者不准带来的问题),生成的视频有不少瑕疵,但整体上还是感觉有意思。
本篇主要是记录下自己看该论文时一些难点的理解。个人的难点主要是在论文3.1节这些公式,个人数学水平有限按照作者的思路一开始不太容易理解,不过按照最基本的逻辑慢慢展开和推导,发现这些公式也不是特别难。
公式1和2
我们从最简单的情况推导。假设我们有一个正方形,然后通过旋转,放大缩小等变化拉伸等变换得到了一个长方形,
那这个变换可以用仿射变化来表示(能记得的一个仿射变化特性是平行线依旧保持平行),多视图几何和射影几何对这个讲解更清楚(我都还回去了),opencv也有相应的函数。二维平面上可以以下射影几何表示这个变换
[
x
′
y
′
1
]
=
[
a
b
e
c
d
f
0
0
1
]
[
x
y
1
]
\begin{bmatrix}x'\\ y' \\ 1\end{bmatrix}=\begin{bmatrix}a && b &&e\\ c &&d &&f \\ 0&&0&&1\end{bmatrix}\begin{bmatrix}x\\ y \\ 1\end{bmatrix}
⎣⎡x′y′1⎦⎤=⎣⎡ac0bd0ef1⎦⎤⎣⎡xy1⎦⎤
因为是线性的,多个仿射变换可以利用矩阵乘的形式合并成一个最终矩阵来表示这个仿射变换。
不用矩阵来表示的话,可以变成
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
+
[
e
f
]
\begin{bmatrix}x'\\ y' \end{bmatrix}=\begin{bmatrix}a && b \\ c &&d \end{bmatrix}\begin{bmatrix}x\\ y \end{bmatrix}+\begin{bmatrix}e \\ f\end{bmatrix}
[x′y′]=[acbd][xy]+[ef]
将x,y生成0,可知道e,f代表是原图原点像素在变换图像的坐标。
由于我们处理的任务有形变,所有不能用统一的一个变换来表示。所以作者做了一个假设,在原图和变换图上我能找多对匹配的关键的点,并且在某些关键点的局部区域,它符合某种仿射变换,每个关键点可能对应着不同的仿射变换,那这些关键点附近额仿射变化应该怎么表示?为了简单,我们只考虑对匹配的关键点,分别用k和k’来表示,我们的仿射变化必须保证这两个点的对应。
[ x ′ y ′ ] = [ a b c d ] [ x − k x y − k y ] + [ e + k x ∗ a + b ∗ k y f + c ∗ k x + d ∗ k y ] \begin{bmatrix}x'\\ y' \end{bmatrix}=\begin{bmatrix}a && b \\ c &&d \end{bmatrix}\begin{bmatrix}x-k_x\\ y -k_y\end{bmatrix}+\begin{bmatrix}e +k_x*a+b*k_y\\ f+c*k_x+d*k_y\end{bmatrix} [x′y′]=[acbd][x−kxy−ky]+[e+kx∗a+b∗kyf+c∗kx+d∗ky]
将左右的xy用k代入
[
k
x
′
k
y
′
]
=
[
e
+
k
x
∗
a
+
b
∗
k
y
f
+
c
∗
k
x
+
d
∗
k
y
]
\begin{bmatrix}k_x'\\ k_y' \end{bmatrix}=\begin{bmatrix}e +k_x*a+b*k_y\\ f+c*k_x+d*k_y\end{bmatrix}
[kx′ky′]=[e+kx∗a+b∗kyf+c∗kx+d∗ky]
这样我们可以得到仿射公式,也就是
[
x
′
y
′
]
=
[
k
x
′
k
y
′
]
+
[
a
b
c
d
]
[
x
−
k
x
y
−
k
y
]
\begin{bmatrix}x'\\ y' \end{bmatrix}=\begin{bmatrix}k_x'\\ k_y'\end{bmatrix}+\begin{bmatrix}a && b \\ c &&d \end{bmatrix}\begin{bmatrix}x-k_x\\ y -k_y\end{bmatrix}
[x′y′]=[kx′ky′]+[acbd][x−kxy−ky]
这就是论文的公式1去除忽略项的部分
网络需要去预测的是矩阵中的a b c d
公式345
上面已经提到神经网络的一个任务需要去估计矩阵中的a b c d,而这些值数学上是跟原图S和变换图D都有关系,那就要求网络有特殊的设计需要去提取两者的关系,因为知道仿射变化和opeccv,仿射变化首要任务是去找相应的匹配点,因为有6个自由度,至少需要3对线性不相关的匹配点才能解,会增加神经网络的任务。 作者引入了一个reference image R. 先分别估算R->S和R->D之间的方式,由于仿射变换能用矩阵表示所以其是线性的,多个仿射变换可以组成一个新的仿射变换,因此有了R->S之间的仿射和R->D之间的仿射也很容易得到A->B之间的方式。 那引入了R之后还不是需要两个图片去估计吗? 不是的,作者引入的R是固定的。举个例子,我们把一个正方形经过仿射变换能构的集合称之为S, A,B来自于S,那一个reference可以是该正方形,对于人脸来说,在各个不同的图像中可能有不同的姿态,但R可以是证件照似的标准姿态.有这个隐藏的假设在里面。由于R是固定的,我们就可以直接去估计转换到R的仿射。当然R也是根据任务目标训练出来的,具体是咋样我们也不知道。
为了下面的表示方便,我们将上面的公式做向量化处理,我们有三幅图像S,R,D。用p_s代表一个在S图像的坐标,用 k s k_s ks代表关键点,用 A S A_{S} AS代表从R到S仿射公式中的2*2的矩阵,也就是论文的雅克比矩阵
如果我们已经分别知道R->S和R->D之间的映射,也就是
p
s
=
k
s
+
A
s
(
p
r
−
k
r
)
p
d
=
k
d
+
A
d
(
p
r
−
k
r
)
p_s=k_s+A_{s}(p_r-k_r)\\ p_d=k_d+A_{d}(p_r-k_r)
ps=ks+As(pr−kr)pd=kd+Ad(pr−kr)
现在我们想知道
p
d
p_d
pd到
p
s
p_s
ps的关系,根据线性理论,我们知道这肯定也是一个仿射变化,用简单的数学就可以得到
p
s
=
k
s
+
A
s
(
p
r
−
k
r
)
=
k
s
+
A
s
A
d
−
1
(
p
d
−
k
d
)
p_s=k_s+A_{s}(p_r-k_r)=k_s+A_{s}A^{-1}_d(p_d-k_d)
ps=ks+As(pr−kr)=ks+AsAd−1(pd−kd)
也就是论文的公式4
不过很好奇作者在代码里并没有对 A d A_d Ad这个矩阵可逆性做任何保护,不怕训练的时候有意外发生吗
推理:
作者在最后提的问题和解决方案差点被我忽略了。在训练的时候我们采用的同一个视频,视频里的object比如人脸或者人都是同一个,所以没有尺度的问题。但是在推理的时候,由于driving video和source image不是同一个instance,那就会存在这么尺寸问题。比如我要驱动source image由正常嘴型变成笑脸,但是刚好driving video 人的嘴比较大,比如是source image人嘴的两倍。那如果没有其他pose的因素,那得到的affine transformation的矩阵上的a和c就会变成2,source image按照这个transformation去调整也就变成2倍(如果不算上GAN网络的进一步调整)这不是我们想要的效果。作者就做了一个调整,它假设driving video的第一张图像 d 1 d_1 d1和source image s的pose类似,那如果要得到driving video其他张图像driving的效果,那只要把 d n d_n dn与 d 1 d_1 d1之间的仿射变换用到s上即可。
训练
应用多种局部的仿射变化后,还需要生成网络对一些区域进行调整,对不能映射的区域也要进行inpanting,所以还需要引入GAN网络。训练的数据在同一个视频中选不同的帧的训练。训练的loss除了GAN常用的loss外,还多了个Equivariance loss,主要是用一致性约束来保证 keypoints detection的稳定性和线性变换的一致性。假设有个图片x,我们用已知的变换(仿射或者thin plate spline),那网络学到的变换应该满足
T
A
<
−
R
=
T
X
<
−
Y
∗
T
Y
−
>
R
T_{A<-R}=T_{X<- Y}*T_{Y->R}
TA<−R=TX<−Y∗TY−>R
Thin plate spline在文字检测相关的论文也看到和学习过,不过一直没有掌握,属于看了就忘的那种,大家有兴趣可以看网上的其他资料