文章解决的是图片动画的问题。假设有源图片和驱动视频,并且其中的物体是同一类的,文章的方法让源图片中的物体按照驱动视频中物体的动作而动。
文章的方法只需要一个同类物体的视频集,不需要而外的标注。
方法
该方法基于self-supervised策略。简单而言就是基于训练视频中的一帧图像和和学习到的动作表示,重建出训练视频。其中,动作表示是动作特定的关键点(motion-specific keypoint)和局部仿射变换(local affine transformations)。
框架图如上图所示,由两个部分组成,一个是运动估计模块,一个是图像生成模块。
运动估计模块的目的是估计从驱动视频的一帧
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的稠密运动场(dense motion field)。运动场
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。
T
S
←
D
\mathcal T_{\mathbf S \leftarrow \mathbf D}
TS←D也被称为反向光流(backward optical flow)。使用反向光流而不是正向光流,因为可以使用双线性采样以可微分的方式有效地实现后向扭曲。
仿射变换
在齐次坐标上,仿射变换可以用下面的式子表示:
[
y
⃗
1
]
=
[
B
b
⃗
0
,
…
,
0
1
]
[
x
⃗
1
]
{\begin{bmatrix}{\vec{y}}\\1\end{bmatrix}}= {\begin{bmatrix}B&{\vec {b}}\ \\0,\ldots ,0&1\end{bmatrix}} {\begin{bmatrix}{\vec {x}}\\1\end{bmatrix}}
[y1]=[B0,…,0b 1][x1]在2维图像上,仿射变换由矩阵
A
∈
R
2
×
3
\mathbf A \in \mathbb R^{2 \times 3}
A∈R2×3表示。
运动估计
粗运动估计
粗运动估计预测关键点处的运动模式。
动作估计模块估计反向光流
T
S
←
D
\mathcal T_{\mathbf S \leftarrow \mathbf D}
TS←D。
T
S
←
D
\mathcal T_{\mathbf S \leftarrow \mathbf D}
TS←D用在关键点附近的一阶泰勒展开表示。
假设存在一个抽象参考帧
R
\mathbf R
R。这样,我们需要估计两个变换:从
R
\mathbf R
R到
S
\mathbf S
S(
T
S
←
R
\mathcal T_{\mathbf S \leftarrow \mathbf R}
TS←R)和从
R
\mathbf R
R到
D
\mathbf D
D(
T
D
←
R
\mathcal T_{\mathbf D \leftarrow \mathbf R}
TD←R)。抽象参考帧的好处是可以让我们独立的处理
D
\mathbf D
D和
S
\mathbf S
S。
为了描述方便,用
X
\mathbf X
X表示
S
\mathbf S
S或者
D
\mathbf D
D,用
p
1
,
⋯
,
p
K
p_1,\cdots,p_K
p1,⋯,pK表示抽象参考帧
R
\mathbf R
R上的关键点的坐标,用
z
z
z表示在其他帧上的点的坐标。我们估计在关键点
p
1
,
⋯
,
p
K
p_1,\cdots,p_K
p1,⋯,pK周围的
T
X
←
R
\mathcal T_{\mathbf X \leftarrow \mathbf R}
TX←R。具体而言,我们考虑
T
X
←
R
\mathcal T_{\mathbf X \leftarrow \mathbf R}
TX←R在关键点
p
1
,
⋯
,
p
K
p_1,\cdots,p_K
p1,⋯,pK的一阶泰勒展开:
T
X
←
R
(
p
)
=
T
X
←
R
(
p
k
)
+
(
d
T
X
←
R
(
p
)
d
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}(p_k)+(\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})(p-p_k)+o(\|p-p_k\|)
TX←R(p)=TX←R(pk)+(dpdTX←R(p)∣p=pk)(p−pk)+o(∥p−pk∥)这是可以看做一个仿射变换
A
X
←
R
k
∈
R
2
×
3
\mathbf A^k_{\mathbf X \leftarrow \mathbf R} \in \mathbb R^{2 \times 3}
AX←Rk∈R2×3,
T
X
←
R
(
p
k
)
\mathcal T_{\mathbf X \leftarrow \mathbf R}(p_k)
TX←R(pk)是平移参数,
d
T
X
←
R
(
p
)
d
p
∣
p
=
p
k
\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_k}
dpdTX←R(p)∣p=pk是线性映射的参数。
T
X
←
R
\mathcal T_{\mathbf X \leftarrow \mathbf R}
TX←R用其在K个关键点处的值和Jacobian表示。
T
X
←
R
(
p
)
≈
{
{
T
X
←
R
(
p
1
)
,
d
T
X
←
R
(
p
)
d
p
∣
p
=
p
1
}
,
⋯
,
{
T
X
←
R
(
p
K
)
,
d
T
X
←
R
(
p
)
d
p
∣
p
=
p
K
}
}
\mathcal T_{\mathbf X \leftarrow \mathbf R}(p) \approx \{\{ \mathcal T_{\mathbf X \leftarrow \mathbf R}(p_1),\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_1}\}, \cdots,\{ \mathcal T_{\mathbf X \leftarrow \mathbf R}(p_K),\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_K}\}\}
TX←R(p)≈{{TX←R(p1),dpdTX←R(p)∣p=p1},⋯,{TX←R(pK),dpdTX←R(p)∣p=pK}}
我们假设
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
D
←
R
−
1
\mathcal T_{\mathbf S \leftarrow \mathbf D}=\mathcal T_{\mathbf S \leftarrow \mathbf R} \circ \mathcal T^{-1}_{\mathbf D \leftarrow \mathbf R}
TS←D=TS←R∘TD←R−1用一阶泰勒展开近似有
T
S
←
D
(
z
)
≈
T
S
←
R
(
p
k
)
+
J
k
(
z
−
T
D
←
R
(
p
k
)
)
J
k
=
(
d
T
S
←
R
(
p
)
d
p
∣
p
=
p
k
)
(
d
T
D
←
R
(
p
)
d
p
∣
p
=
p
k
)
−
1
\mathcal T_{\mathbf S \leftarrow \mathbf D}(z) \approx \mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) + J_k(z-\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k))\\ J_k=(\frac{d \mathcal T_{\mathbf S \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})(\frac{d \mathcal T_{\mathbf D \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})^{-1}
TS←D(z)≈TS←R(pk)+Jk(z−TD←R(pk))Jk=(dpdTS←R(p)∣p=pk)(dpdTD←R(p)∣p=pk)−1
T
S
←
R
(
p
k
)
\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k)
TS←R(pk)和
T
D
←
R
(
p
k
)
\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k)
TD←R(pk)用U-Net结构的关键点预测网络(keypoint predictor network)预测。每个关键点一个heatmap,总共预测K个heatmap。decoder的最后一层用softmax预测关键点置信图(keypoint confidence map),也就是关键点在每个像素位置的置信度,满足
∑
z
∈
Z
W
k
(
z
)
=
1
\sum_{z \in \mathcal Z} \mathbf W^k(z)=1
∑z∈ZWk(z)=1,其中
Z
\mathcal Z
Z表示所有的像素位置。
T
S
←
R
(
p
k
)
\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k)
TS←R(pk)和
T
D
←
R
(
p
k
)
\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k)
TD←R(pk)相当于仿射变换中的平移参数,用关键点置信图加权计算:
b
k
=
∑
z
∈
Z
W
k
(
z
)
z
b^k = \sum_{z \in \mathcal Z} \mathbf W^k(z)z
bk=z∈Z∑Wk(z)z
d
T
S
←
R
(
p
)
d
p
∣
p
=
p
k
\frac{d \mathcal T_{\mathbf S \leftarrow \mathbf R}(p)}{dp}|_{p=p_k}
dpdTS←R(p)∣p=pk和
d
T
D
←
R
(
p
)
d
p
∣
p
=
p
k
\frac{d \mathcal T_{\mathbf D \leftarrow \mathbf R}(p)}{dp}|_{p=p_k}
dpdTD←R(p)∣p=pk相当于仿射变换中的线性变换部分,他们作为仿射变换中剩下的4个参数用关键点预测网络的额外的4个通道估计,每个关键点4个估计图。用
P
i
j
k
∈
R
H
×
W
P^k_{ij} \in \mathbb R^{H \times W}
Pijk∈RH×W表示其中一个通道的估计值,其中
i
,
j
i,j
i,j是仿射变换的坐标。线性变换的参数用关键点置信图加权融合:
B
k
[
i
,
j
]
=
∑
z
∈
Z
W
k
(
z
)
P
i
j
k
(
z
)
\mathbf B^k[i,j] = \sum_{z \in \mathcal Z} \mathbf W^k(z)P^k_{ij}(z)
Bk[i,j]=z∈Z∑Wk(z)Pijk(z)
密集运动估计
密集运动估计预测整个图像每个像素点的运动模式 T ^ S ← D \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D} T^S←D。
我们使用卷积网络从
K
K
K个关键点处的泰勒展开
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。
用关键点处的变换扭曲源图像帧
S
\mathbf S
S,可以得到
K
K
K个变换后的图像
S
1
,
⋯
,
S
K
\mathbf S^1, \cdots, \mathbf S^K
S1,⋯,SK。另外,考虑额外的图像
S
0
=
S
\mathbf S^0 = \mathbf S
S0=S作为背景。
对每一个关键点计算heatmap
H
k
(
z
)
\mathbf H_k(z)
Hk(z)表示每个变换在哪发生。
H
k
(
z
)
=
e
x
p
(
(
T
D
←
R
(
p
k
)
−
z
)
2
σ
)
−
e
x
p
(
(
T
S
←
R
(
p
k
)
−
z
)
2
σ
)
\mathbf H_k(z) = exp(\frac{(\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k)-z)^2}{\sigma}) - exp(\frac{(\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k)-z)^2}{\sigma})
Hk(z)=exp(σ(TD←R(pk)−z)2)−exp(σ(TS←R(pk)−z)2)
将
H
k
\mathbf H_k
Hk和
S
0
,
⋯
,
S
K
\mathbf S^0, \cdots, \mathbf S^K
S0,⋯,SK拼接起来用U-Net处理,我们估计
K
+
1
K+1
K+1个掩码
M
k
,
k
=
0
,
⋯
,
K
\mathbf M_k, k = 0, \cdots, K
Mk,k=0,⋯,K 表示每个位置用哪个局部变换,满足
∑
k
=
0
K
M
k
(
z
)
=
1
\sum_{k=0}^K \mathbf M^k(z)=1
∑k=0KMk(z)=1。最后的密集运动场表示为:
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_0z + \sum_{k=1}^K \mathbf M_k(\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) + J_k(z-\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k)))
T^S←D(z)=M0z+k=1∑KMk(TS←R(pk)+Jk(z−TD←R(pk)))
对于每一个像素点的位置如下计算:
O
(
z
)
=
M
0
(
z
)
z
+
∑
k
=
1
K
M
k
(
z
)
A
S
←
D
k
[
z
1
]
\mathbf O(z) = \mathbf M^0(z)z + \sum_{k=1}^K \mathbf M^k(z) \mathbf A^k_{\mathbf S \leftarrow \mathbf D} {\begin{bmatrix}{z}\\1\end{bmatrix}}
O(z)=M0(z)z+k=1∑KMk(z)AS←Dk[z1]