PatchGAN
在讲pix2pix之前,有一个重要概念是PatchGAN。传统GAN的判别器中,在卷积层后使用全连接层,而PatchGAN 在判别器中使用全卷积代替全连接层。全连接层最后的输出维度是real or fake,这回破坏对patch的真假判断,使用全卷积,输出为NN的结果,然后平均分数,输出判断结果,保留了对patch的判断。在pix2pix文中使用的最后一层卷积层感受野为7070,作为全卷积的输入,即判别器会判断每个70*70的patch的真假。
CGAN
Pix2Pix
pix2pix是图像翻译(image translation)领域中最经典的论文之一,是GAN的目前在图像到图像转换领域中的一个成功应用。
传统GANs通过输入一个随机噪声学习到目标图像y:
cGANs 通过输入一个随机噪声和一张条件图片来学习目标图像y:
cGANs 可以分为两部分,第一部分为生成器G(generator),用于接受输入图片x及噪声z,生成对应的图片G(x, z),另一部分为判别器D(discriminator),用于在训练过程中判别生成网络生成的真实性,判别器的输入分为两种,一种为{x, y},即输入的条件图片以及标签图片,还有一种为{x, G(x, z)},即输入的条件图片以及生成器生成的图片,输出为0到1的是真实图片的概率。在模型训练完成后,我们在最终应用时,只需要使用训练好的生成器网络即可。
pix2pix与一般cGANs在网络结构上有三点不同:
首先,pix2pix输入中并不包含随机噪声z,而是采用dropout的形式来为生成器提供噪声, 这是由于实验中发现随机噪声z很容易在训练过程中被生成器忽略,从而导致生成图片与输入条件图片产生一一映射的关系,因此pix2pix网络的输入仅为条件图片。
其次,pix2pix的生成器中未不是采用传统的Encoder-decoder结构,而是采用U-Net网络结构(见图1),相较于Encoder-decoder结构,U-Net结构在解码阶段对应层中添加了跳跃连接,这是为了图像在解码阶段获取更多的浅层特征信息,有利于生成图像的边界优化。
最后,pix2pix还采用了PatchGAN的结构,把图像等分成多个patch,然后使用判别器分别判断每个patch的真实程度,最后取平均值作为图像的判别分数,作者认为这样计算的损失可以被看成是一种纹理或风格的损失。
模型结构基本如下:
x是cGAn的输入条件,y为输出的真实图片,G(x)为输出图片,D作为判别器,分为两种情况,第一种情况下,D的输入为G(x)和x,第二种情况下,D的输入为y和x。
L c G A N ( G , D ) = E x , y [ log D ( x , y ) ] + E x , z [ log ( 1 − D ( x , G ( x , z ) ) ] ] \begin{aligned} \mathcal{L}_{c G A N}(G, D)=& \mathbb{E}_{x, y}[\log D(x, y)]+ \mathbb{E}_{x, z}[\log (1-D(x, G(x, z))]] \end{aligned} LcGAN(G,D)=Ex,y[logD(x,y)]+Ex,z[log(1−D(x,G(x,z))]]
L L 1 ( G ) = E x , y , z [ ∥ y − G ( x , z ) ∥ 1 ] \mathcal{L}_{L 1}(G)=\mathbb{E}_{x, y, z}\left[\|y-G(x, z)\|_{1}\right] LL1(G)=Ex,y,z[∥y−G(x,z)∥1]
G ∗ = arg min G max D L c G A N ( G , D ) + λ L L 1 ( G ) G^{*}=\arg \min _{G} \max _{D} \mathcal{L}_{c G A N}(G, D)+\lambda \mathcal{L}_{L 1}(G) G∗=argGminDmaxLcGAN(G,D)+λLL1(G)
α k c = 1 Z ∑ i ∑ j ∂ y c ∂ A i j k \alpha_k^c=\frac{1}{Z}\sum\limits_{i}\sum\limits_{j}\frac{\partial y^c}{\partial A_{ij}^k} αkc=Z1i∑j∑∂Aijk∂yc
虽然论文公式中的生成器包含z随机噪声,但作者在下面指明了,pix2pix模型中,由于随机噪声在训练过程中容易被忽略,因此采用dropout来代替随机噪声,产生多样性结果。
BicycleGAN
在pix2pix中,由于随机噪声z经常会在训练中被忽略,作者去掉了随机噪声的输入,改为使用dropout作为输入。BicycleGAN的即为pix2pix的升级版,作者也是相同的。
在BicycleGAN中,主要结合了两种方法:cVAE-GAN、cLR-GAN。
cVAE-GAN
在VAE的基础上添加了GAN的对抗损失
https://zhuanlan.zhihu.com/p/62139750
https://zhuanlan.zhihu.com/p/31627736
AE:传统的(AE)将图片编码为隐变量(latent variable),可以看做是一个降维,解码器可以通过隐变量还原输入图片。但是存在的问题是,我们无法通过构造隐变量来生成图片,因为隐变量是通过encoder编码生成的。
VAE:变分自动编码器(VAE)通过添加限制,将隐变量粗略遵循一个标准正态分布,这样我们就可以通过标准正态分布去采样,再通过解码器生成新图片。本质上VAE是在常规AE中,对Encoder的结果加入了高斯噪声,使Decoder能够对噪声有鲁棒性,在之后增加一个Encoder来动态调解噪声强度 。(这里不懂)
CVAE:使VAE可控
cLR-GAN
为了使模型不忽略随机噪声z,添加一个L1loss,这个loss不用于原图和生成图的对比,而是生成噪声和原噪声的对比,保证噪声不被忽略。
L
1
latent
(
G
,
E
)
=
E
A
∼
p
(
A
)
,
z
∼
p
(
z
)
∥
z
−
E
(
G
(
A
,
z
)
)
∥
1
\mathcal{L}_{1}^{\text {latent }}(G, E)=\mathbb{E}_{\mathbf{A} \sim p(\mathbf{A}), \mathbf{z} \sim p(\mathbf{z})}\|\mathbf{z}-E(G(\mathbf{A}, \mathbf{z}))\|_{1}
L1latent (G,E)=EA∼p(A),z∼p(z)∥z−E(G(A,z))∥1
G
∗
,
E
∗
=
arg
min
G
,
E
max
D
L
G
A
N
(
G
,
D
)
+
λ
latent
L
1
latent
(
G
,
E
)
G^{*}, E^{*}=\arg \min _{G, E} \max _{D} \quad \mathcal{L}_{\mathrm{GAN}}(G, D)+\lambda_{\text {latent }} \mathcal{L}_{1}^{\text {latent }}(G, E)
G∗,E∗=argG,EminDmaxLGAN(G,D)+λlatent L1latent (G,E)
SinGAN
Single Natural Image GAN (SinGAN)是ICCV2019最佳论文,旨在设计一个生成对抗网络,通过对单张图片进行训练,达到多种效果(生成多张图片、图像融合、手绘图转实景图、图像编辑、图像超分辨率重建)
SinGAN的特点在于:
- 单张图片训练,随机噪声的输入
- 同一个模型可用于多种图像生成任务
- generator和discriminator具有相同的模型结构和相同的感受野
- coarse-to-fine金字塔结构,coarse生成的图片作为fine的输入
上图可以看到,SinGAN适用与多种图像生成任务,并且有较好的效果
上图为论文中SinGAN的模型结构,模型包含了多个从粗粒度到细粒度的生成器加判别器的组合。每个尺度对应一组生成网络和对抗网络。除了最粗尺度N外,生成器的输入由一个随机噪声图片Zn和一张由粗粒度生成器生成的图片上采样到当前分辨率大小组成。网络的输出则是上一个尺度所丢失的参差,加上上一层输出图上采样得到的图片,生成当前生成器的最终输出。
N为最初的一层,可以表示为:
x
~
N
=
G
N
(
z
N
)
\tilde{x}_{N}=G_{N}\left(z_{N}\right)
x~N=GN(zN)
当层次小于N时,表示为:
x
~
n
=
G
n
(
z
n
,
(
x
~
n
+
1
)
↑
r
)
,
n
<
N
\tilde{x}_{n}=G_{n}\left(z_{n},\left(\tilde{x}_{n+1}\right) \uparrow^{r}\right), \quad n<N
x~n=Gn(zn,(x~n+1)↑r),n<N
上图中为了保证随机噪声不被忽略,每层都添加对应尺度的noise输入(作者表示是为了防止出现在conditinalGAN中经常出现的noise被忽略的问题)
x
~
n
=
(
x
~
n
+
1
)
↑
r
+
ψ
n
(
z
n
+
(
x
~
n
+
1
)
↑
r
)
\tilde{x}_{n}=\left(\tilde{x}_{n+1}\right) \uparrow^{r}+\psi_{n}\left(z_{n}+\left(\tilde{x}_{n+1}\right) \uparrow^{r}\right)
x~n=(x~n+1)↑r+ψn(zn+(x~n+1)↑r)
论文中提到的一个概念effective patch size(effective receptive field),文综采用的固定的11*11的感受野(每层相对原图缩放后),因此,在粗粒度的图中,对应的原图感受野非常大,细粒度反之。
论文中作者提到,小的感受野加上对网络容量的限制,有利于防止网络直接记忆单张图片。
损失函数为:
min
G
n
max
D
n
L
a
d
v
(
G
n
,
D
n
)
+
α
L
r
e
c
(
G
n
)
\min _{G_{n}} \max _{D_{n}} \mathcal{L}_{\mathrm{adv}}\left(G_{n}, D_{n}\right)+\alpha \mathcal{L}_{\mathrm{rec}}\left(G_{n}\right)
GnminDnmaxLadv(Gn,Dn)+αLrec(Gn)
前者为对抗损失,惩罚生成图片和输入图片分布之间的距离,使用WGAN-GP loss。后者为重构损失,希望能够保证存在一组随机噪声,最终输出为原图,主要操作是,在当前层,计算生成图片和原图的最小二成损失。
层数小于N时,重构损失为:
L
r
e
c
=
∥
G
n
(
0
,
(
x
~
n
+
1
r
e
c
)
↑
r
)
−
x
n
∥
2
\mathcal{L}_{\mathrm{rec}}=\left\|G_{n}\left(0,\left(\tilde{x}_{n+1}^{\mathrm{rec}}\right) \uparrow^{r}\right)-x_{n}\right\|^{2}
Lrec=∥∥Gn(0,(x~n+1rec)↑r)−xn∥∥2
损失等于N时,重构损失为:
L
r
e
c
=
∥
G
N
(
z
∗
)
−
x
N
∥
2
\mathcal{L}_{\mathrm{rec}}=\left\|G_{N}\left(z^{*}\right)-x_{N}\right\|^{2}
Lrec=∥GN(z∗)−xN∥2
测试的时候,可以从第n层开始作为输入,并不一定需要从第N层,第N层的输入为随机噪声,可能会导致出现一些细节的错误,如上图的斑马出现了多条腿。若使用n<N层作为起始层时,输入为原图缩小到该层对应尺度的图。
选用多尺度去训练,可以让模型能够捕获到更全局的信息。
这里顺便提一下ConsinGAN
主要方法有:
- 在每一步训练的时候,使用学习率递减的方法,可以有效减轻过拟合问题。
- SinGAN中,每次训练下一层生成器时,将上一层生成器固定后,输出的图片作为下一层生成器的输入之一。与SinGAN不同的是,ConsinGAN中,上一层生成器训练好后,将输出特征图作为下一层生成器的输入之一,而不是生成的图片,同时,上一层生成器的权重不固定,达到end2end的效果。
- 与SinGAN相同的是,ConsinGAN也在每层生成器之间添加了随机噪声。