P r o f i l e \mathbf{Profile} Profile
直接上图好吧,👆,本文要实现的任务:
1️⃣ 只使用一组图像对 ( a ) , ( b ) (a), (b) (a),(b) 作为训练数据,其中称 ( a ) (a) (a) 为元素图像( P r i m i t i v e I m a g e \mathbf {Primitive~Image} Primitive Image),称 ( b ) (b) (b) 为目标图像( T a r g e t I m a g e \mathbf{Target~Image} Target Image);
2️⃣ 训练完模型之后,模型具备根据元素图像指定的语义位置、在目标图像上生成对应的外观(或:纹理)的能力;
3️⃣ 因此,对 ( a ) (a) (a) 做修改(这里称之为:形状编辑( S h a p e M a n i p u l a t i o n \mathbf{Shape~Manipulation} Shape Manipulation),包括形状扭曲、位置移动、增/删形状等操作),🌰,将 ( a ) / ( c ) → ( d ) (a)/(c)\rightarrow(d) (a)/(c)→(d),对应生成的目标图像就由 ( b ) (b) (b) 变成 ( e ) (e) (e);最右边一列是一些细节图。
p . s . \mathbf{p.s.} p.s. 本方法最终能够实现的图像编辑任务包括:
- S h a p e W a r p i n g \mathbf{Shape~Warping} Shape Warping → 形状变形
- O b j e c t R e a r r a n g e m e t n \mathbf{Object~Rearrangemetn} Object Rearrangemetn → 对象重安排
- O b j e c t R e m o v a l / A d d i t i o n \mathbf{Object~Removal/Addition} Object Removal/Addition → 对象去除/添加
- C r e a t i o n o f p a i n t e d a n d p h o t o r e a l i s t i c a n i m a t e d c l i p s \mathbf{Creation~of~painted~and~photorealistic~animated~clips} Creation of painted and photorealistic animated clips → 艺术化或自然的视频片段生成
具体方法与局限性见下方分析👇。
1. Related Works
- P i x 2 P i x H D \mathbf{Pix2PixHD} Pix2PixHD
- S i n G A N \mathbf{SinGAN} SinGAN
- T u i G A N \mathbf{TuiGAN} TuiGAN
2. DeepSIM: Learning Conditional Generators from a Single Image
2.1 主要思想
本文的目的是学习一个条件 G A N GAN GAN,且仅基于一组图像对( P r i m i t i v e , T a r g e t \mathbf{Primitive,~Target} Primitive, Target)。其中为了解决训练数据稀缺、防止生成器过拟合,需要对这唯一的训练样本作增强,文中强调了,使用 T P S TPS TPS: Thin-plate-spline 作为图像增强方式是算法成功的关键。
2.2 Augmentations
我们先看看这种 T P S TPS TPS 增强方式,先来个图感受一下:
也就是对图像内容做扭曲,类似于 C a r i G A N s CariGANs CariGANs 中对人脸做扭曲使之结构上更接近于讽刺漫画脸,且使用的技术是一样的。
✍ T P S TPS TPS 的使用需要准备两组点,使之一一对应,每一对点的偏移将带动周围的像素区域发生“起始点指向目标点的方向”扭曲,因此,要解决的问题就只有:如何随机生成这两组点?
1️⃣ 将图像区域划分为等间距的(equispaced
)的 3 × 3 3\times3 3×3 的网格,每个格子(的中心)有一个控制点(control points
) ( i , j ) (i,j) (i,j);
2️⃣ 对每个控制点在水平方向、竖直方向上分别随机偏移(shift
)随机数量的像素距离(为了防止变形后的图像质量退化(即局部扭曲得太厉害),严格控制最大偏移幅度不能超过对应图像宽度和高度的 10 % 10\% 10%);
3️⃣ 这样就构造了初始的等间距分布的一组点和随机打乱后的一组点,根据这两组点优化下面的目标函数得到期望的密集形变场 f f f:
min f ∑ i , j ∥ t ( i , j ) − f ( i , j ) ∥ 2 + λ ∫ ∫ ( f x x 2 + f y y 2 + f x y 2 ) d x d y \min_f \sum_{i,j}\|t(i,j)-f(i,j)\|^2+\lambda \int\int(f_{xx}^2+f_{yy}^2+f_{xy}^2)dxdy fmini,j∑∥t(i,j)−f(i,j)∥2+λ∫∫(fxx2+fyy2+fxy2)dxdy其中, f x x , f y y , f x y f_{xx}, f_{yy}, f_{xy} fxx,fyy,fxy 分别代表形变场 f f f 上每个点处的二阶导数:公式中第二项希望相邻位置的形变是相似的,即形变场的局部变化平滑性——明确我们要构造的并不是仿射变换那样尽可能处处偏移相等的变换,而是允许局部之间不同、但这种不同(位移的方向和大小)是渐变的;因此允许一阶导数非零,但二阶导数趋近于 0 0 0。
4️⃣ 这个优化能够被非常非常快地求解,如此,我们能够在线源源不断采样不同的形变场,记这些形变场构成的分布是 Ω \Omega Ω,则 f ∈ Ω f\in \Omega f∈Ω.
2.2 Model
记训练数据对为: { x ∈ R d x × d y × d p , y ∈ R d x × d y × 3 } \{x\in\mathbb R^{d_x\times d_y\times d_p}, y\in \mathbb R^{d_x \times d_y \times 3}\} {x∈Rdx×dy×dp,y∈Rdx×dy×3};
目标是学习一个生成网络 G : R d x × d y × d p → R d x × d y × 3 G:\mathbb R^{d_x\times d_y\times d_p}\rightarrow \mathbb R^{d_x \times d_y \times 3} G:Rdx×dy×dp→Rdx×dy×3,其中 d p d_p dp 是根据选择不同的元素图像取不同的值。
因此, G G G 可以是任意的enc-dec
结构的网络,如Pix2PixHD
。
好了,很快来到了目标函数,无非✌个:
- V G G P e r c e p t u a l L o s s VGG~Perceptual~Loss VGG Perceptual Loss
L r e c ( x , y ; G ) = L p e r c ( G ( x ) , y ) \mathcal L_{rec}(x,y;G)=\mathcal L_{perc}(G(x),y) Lrec(x,y;G)=Lperc(G(x),y)- C o n d i t i o n a l G A N L o s s Conditional~GAN~Loss Conditional GAN Loss
L a d v ( x , y ; G , D ) = log ( D ( x , y ) ) + log ( 1 − D ( x , G ( x ) ) ) \mathcal L_{adv}(x,y;G,D)=\log(D(x,y))+\log(1-D(x,G(x))) Ladv(x,y;G,D)=log(D(x,y))+log(1−D(x,G(x)))最终的目标函数是二者的加权和,即 L t o t a l ( x , y ; G , D ) = L r e c + α L a d v ( x , y ; D , G ) \mathcal L_{total}(x,y;G,D)=\mathcal L_{rec}+\alpha\mathcal L_{adv}(x,y;D,G) Ltotal(x,y;G,D)=Lrec+αLadv(x,y;D,G).好,讲完方法,就这?就这!
2.3 Primitive Images
元素图像要求具备的性质有两个:
1️⃣ 能够准确确定期望的输出图像;
2️⃣ 编辑方面足够简单。
常用的两种图像元素表示就有:
1️⃣ 线谱:无法直接指示高级的语义信息,但包含丰富的细节纹理信息;
2️⃣ 分割谱:能够提供高级的语义信息,但缺乏针对生成图像细节上的指导。
3️⃣ 将二者结合!!👈
不妨先看看关于元素图像选择上的消融:
可以发现使用线谱与分割谱的结合能够实现最佳的视觉效果。
当然,在某些场景中,单独使用线谱或者分割谱也是足够的:
往往二者的结合对于处理更复杂的结构效果更好:
3. Experiments
3.1 对比实验
首先看到本方法与经典有监督的图像翻译方法的比较,其中
M
I
\mathbf{MI}
MI 指的是“multi images”,即基于多图训练的模型:
量化比较采用的是
L
P
I
P
S
LPIPS
LPIPS 和
S
I
F
I
D
SIFID
SIFID,前者度量的是预测误差,后者度量的是生成图像的真实性,即“FID for Single Image”。这里的
S
I
A
\mathbf{SIA}
SIA 指的是“single image + augmented(random crop-and-flip)”.
3.2 一些好玩的应用
生成视频片段或者动画!
1️⃣
x
→
y
x\rightarrow y
x→y 生成自然的视频帧
2️⃣
x
←
y
x\leftarrow y
x←y 生成风格化的视频帧
反向也就是将目标图像视为条件或者元素,将元素图像视为目标渲染的模态。
4. 写在后面
可以见得,本文的思路十分简明,使用
T
P
S
TPS
TPS 对单个样本对作数据增强,训练一个 Pix2PixHD 模型。
最后建议读者们观看两个作者公开的📺视频.
作者提到本文的不足有以下3点:
1️⃣ 不能生成未见过的对象,如第一组中去掉眼睛无法生成狗的眼睛;
2️⃣ 背景复制的现象,如第二组中添加海龟,周边的背景被附带过来但无法融入原来区域周边的背景(想也是,因为不管怎么变形,海龟只有一只,海龟与海岸的特定区域的特定纹理的相对位置或结构关系都是不变的);
3️⃣ 空白区域的插值现象,如第三组中把猫的鼻子以下区域往下拉伸,这部分多出来的空白就被插值——以重复的模式填充了(这也是必然的,因为
T
P
S
TPS
TPS 变形本质上就是插值)。
好辽,赶紧去看代码跑跑看,试试乱七八糟的想法、快速实现验证~