飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络

Unsupervised generative attentional networks with adaptive layer-instance normalization for image-to-image translation

论文目的

图像之间的风格迁移一直是图像研究领域的热门话题,但作者发现现有的一些网络模型,当图像之间的差异较大时(形状和纹理等等),转换后的图片效果不是很好,作者试图研究一种新的方法去解决这个问题,该论文提出了一种基于attentional模块和自适应的归一化层的深度GAN网络,能够使得图像效果大大提升。

论文主要思想

  1. 利用新的归一化模块和新的归一化函数AdLIN组合成一种新的图像到图像的转换方法
  2. 运用attentional模块通过基于辅助分类器获得的注意力图来区分源域和目标域,从而帮助模型知道在哪里进行集中转换。
  3. 自适应的AdaLIN函数可帮助我们的注意力导向模型灵活地控制形状和纹理的变化量,而无需修改模型架构或超参数。

论文网络结构

作者设计的网络结构是基于cycleGAN网络结构,主要就是在此基础上添加了attentional模块,然后归一化层不再使用instance normalization,而是使用layer normalization与instance normalization的加权进行归一化。我们先从基础慢慢来了解这个网络结构

GAN(生成对抗网络)

生成对抗网络(GAN)具有两个网络,生成器网络和鉴别器网络。这两个网络可以是神经网络,从卷积神经网络,递归神经网络到自动编码器。在这种情况下,这两个网络进行竞争,也可以说成博弈,直到这两个网络达到一种平衡,从算法角度上理解,就是经过数千次迭代后,如果达到平衡状态时,生成器网络可以完美生成逼真的虚假图像,并且鉴别器网络可以很好地判断的图像是真实的还是虚假的。换句话说,生成器网络将来自潜在空间的随机噪声矢量(不是来自潜在空间的所有GAN样本)变换为真实数据集的样本。GAN的网络结构为飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络

cycleGAN

cycleGAN的提出主要是为了解决图片转换问题,此前已经有比较成功的网络pix2pix,但是cycleGAN跟pix2pix的不同之处在于
1.pix2pix网络要求提供image pairs,即要提供x和y一对数据,整个思路为:从噪声z,根据条件x,生成和真实图片y相近的y’。条件x和图像y是具有一定关联性的
2.而cycleGAN不要求提供pairs,这时X和Y不要求有什么较好的关联性,可以是毫不相干的两幅图像。飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络
核心思想为:
从X生成Y,再从Y生成回X,如此循环往复,故名为cycleGAN
飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络
从图上可以看出,这里有两个生成器网络G,F,两个判别器网络DX,DYD_X,D_Y,所以Adversarial Loss有两部分:
LGAN(G,DY,X,Y)=Eypdata(y)[logDY(y)]+Expdata(x)[log(1DY(G(X))]LGAN(F,DX,Y,X)=Expdata(x)[logDX(x)]+Eypdata(y)[log(1DX(F(Y))]\mathcal{L}_{GAN}(G,D_Y,X,Y)=\mathbb{E}_{y\sim p_{data}(y)}[\log D_Y(y)]+\mathbb{E}_{x\sim p_{data}(x)}[\log(1-D_Y(G(X))]\\ \mathcal{L}_{GAN}(F,D_X,Y,X)=\mathbb{E}_{x\sim p_{data}(x)}[\log D_X(x)]+\mathbb{E}_{y\sim p_{data}(y)}[\log(1-D_X(F(Y))]
另外还有一个Cycle Consistency Loss,以确保F(G(X))=XF(G(X))=X,反之亦然。一般采用L1L_1损失函数
Lcyc(G,F)=Expdata(x)[F(G(X))x1]+Eypdata(y)[G(F(Y))y1]\mathcal{L}_{cyc}(G,F)=\mathbb{E}_{x\sim p_{data}(x)}[||F(G(X))-x||_1]+\mathbb{E}_{y\sim p_{data}(y)}[||G(F(Y))-y||_1]
故总的损失函数为
L(G,F,DX,DY)=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+λLcyc(G,F)\mathcal{L}(G,F,D_X,D_Y)=\mathcal{L}_{GAN}(G,D_Y,X,Y)+\mathcal{L}_{GAN}(F,D_X,Y,X)+\lambda\mathcal{L}_{cyc}(G,F)
此外,值得注意的是,作者在代码里还添加了一个identity loss。具体来说,就是本来我要从X经过G生成fake,但如果我把Y输入进G呢?它还是应该生成fake,我们可以称为fake2;也就是说,本来生成器G是用来生成Y这种风格的图像的,如果输入本身就是Y,那么就更应该生成Y这个图像了,这就是要让这个生成器G能够做到identity mapping,所以可以计算fake2和输入Y的L1-loss,称之为identity-loss;同样,identity loss也有两部分,分别为生成器G和F

论文网络结构

我们先来看下论文中的网络结构图
飞浆论文复现:用于图像到图像翻译的具有自适应层实例化的非监督的生成对抗网络

生成器

x{Xs,Xt}x\in\{X_s,X_ t\}表示来自源域和目标域的样本。我们的翻译模型GstG_{s\rightarrow t}包含一个编码器EsE_s,一个解码器GtG_t和一个辅助分类器ηs\eta_s,其中ηs(x)η_s(x)表示xx来自XsX_s的概率。令Esk(x)E^k_s(x)为编码器的第k个**图,而Eskij(x)E^{k_{ij}}_s(x)为在(i,j)(i,j)处的值。训练了辅助分类器时,以使用全局平均池和全局最大池来学习源域第kk个特征图的权重wskw^k_s,即ηs(x)=σ(kwskijEskij(x))η_s(x)=\sigma(\sum_k w^k_s \sum_{ij} E^{k_{ij}}_s(x))。通过利用wskw^k_s,我们可以计算一组领域特定的attentional特征图as(x)=wsEs(x)={wskEsk(x)1kn}a_s(x)= w_s\ast E_s(x)=\{w^k_s\ast E^k_s(x)|1\leq k\leq n\},其中n是已编码特征图的数量。然后,我们的转换模型GstG_{s\rightarrow t}等于Gt(as(x))G_t(a_s(x))。然后,我们为残差块配备AdaLIN,其参数γ\gammaβ\beta为完全连接的图层从attentional图中动态计算得出。

AdaLIN(a,γ,β)=γ(ρaI^+(1ρ)aL^)+βaI^=aμIσI2+ϵ,aL^=aμLσL2+ϵρclip[0,1](ρτΔρ)AdaLIN(a,\gamma,\beta)=\gamma\cdot(\rho\cdot\hat{a_I}+(1-\rho)\cdot\hat{a_L})+\beta \\ \hat{a_I}=\frac{a-\mu_I}{\sqrt{\sigma^2_I+\epsilon}},\hat{a_L}=\frac{a-\mu_L}{\sqrt{\sigma^2_L+\epsilon}}\\ \rho\leftarrow clip_{[0,1]}(\rho-\tau\Delta\rho)

其中μI,μL\mu_I,\mu_LσI,σL\sigma_I,\sigma_L分别是通道,层的均值和标准偏差,其中γ\gammaβ\beta是由全连接层生成的参数,τ\tau是学习率,而Δρ\Delta\rho表示
由优化器确定的参数更新向量(例如梯度)。 作者通过在参数更新步骤中施加边界,即可将ρ\rho的值限制在[0,1][0,1]的范围内。生成器会调整该值,在归一化时,当instance normalization更重要时使ρ\rho的值接近1,而在LN很重要时使ρ\rho的值接近0。ρ\rho的值在解码器的残差块中初始化为1,在解码器的上采样块中初始化为0。

判别器

x{Xt,Gst(Xs)}x\in\{X_t,G_{s\rightarrow t}(X_s)\}表示来自目标域和翻译后的源域的样本。与其他转换模型相似,鉴别器DtD_t是多尺度模型,由编码器EDtE_{D_t},分类器CDtC_{D_t}和辅助分类器ηDt\eta_{D_t}组成。 与其他转换模型不同,ηDt(x)\eta_{D_t(x)}Dt(x)D_t(x)都经过训练以区分xx是来自XtX_t还是Gst(Xs)G_{s\rightarrow t}(X_s)。 给定样本xxDt(x)D_t(x)利用attentional特征图aDt(x)=wDtEDt(x)a_{D_t}(x)= w_{D_t}\ast E_{D_t(x)},使用编码特征图EDE_D上的
wDtw_{D_t},由ηDt(x)\eta_{D_t(x)}训练的。然后,我们的鉴别器Dt(x)D_t(x)等于CDt(aDt(x))C_{D_t}(a_{D_t(x)})

损失函数

该论文的模型包括四个损失函数,并且使用最小二乘GAN来稳定训练
Adversarial loss
Llsganst=ExXt[(Dt(x))2]+ExXs[(1Dt(Gst(x)))2]L_{lsgan}^{s\rightarrow t}=\mathbb{E}_{x\sim X_t}[(D_t(x))^2]+\mathbb{E}_{x\sim X_s}[(1-D_t(G_{s\rightarrow t}(x)))^2]

Cycle loss
Lcyclest=ExXs[xGst(Gst(x))1]L_{cycle}^{s\rightarrow t}=\mathbb{E}_{x\sim X_s}[|x-G_{s\rightarrow t}(G_{s\rightarrow t}(x))|_1]

Identity loss
Lidentityst=ExXt[xGst(x)1]L_{identity}^{s\rightarrow t}=\mathbb{E}_{x\sim X_t}[|x-G_{s\rightarrow t}(x)|_1]

CAM loss
Lcamst=ExXs[log(ηs(x))]ExXt[log(1ηs(x))]LcamDt=ExXt[(ηDt(x))2]+ExXs[(1ηDt(Gst(x)))2]L_{cam}^{s\rightarrow t}=-\mathbb{E}_{x\sim X_s}[\log(\eta_s(x))]-\mathbb{E}_{x\sim X_t}[\log(1-\eta_s(x))]\\ L_{cam}^{D_t}=\mathbb{E}_{x\sim X_t}[(\eta_{D_t}(x))^2]+\mathbb{E}_{x\sim X_s}[(1-\eta_{D_t}(G_{s\rightarrow t}(x)))^2]

Full objective
minGst,Gts,ηs,ηtmaxDs,Dt,ηDs,ηDtλ1Llsgan+λ2Lcycle+λ3Lidentity+λ4Lcam\min_{G_{s\rightarrow t},G_{t\rightarrow s},\eta_s,\eta_t}\max_{D_s,D_t,\eta_{D_s},\eta_{D_t}} \lambda_1 L_{lsgan}+\lambda_2 L_{cycle}+\lambda_3 L_{identity}+\lambda_4 L_{cam}

其中λ1=1,λ2=10,λ3=10,λ4=1000\lambda_1=1,\lambda_2=10,\lambda_3=10,\lambda_4=1000。需要注意的是Llsgan=Llsganst+LlsgantsL_{lsgan}=L_{lsgan}^{s\rightarrow t}+L_{lsgan}^{t\rightarrow s},其他的损失也是一样计算。

论文代码

原作者的pytorch代码
https://github.com/znxlwm/UGATIT-pytorch

paddle 复现论文代码

后面,我会根据pytorch代码,用百度的paddle框架将这篇文章的代码复现,尽情期待。