图像生成:SaGAN
- 2019 年 10 月 7 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chaipp0607/article/details/100995379
简介
首先需要说明下,SaGAN不是SAGAN,SAGAN是Self-Attention GAN,Ian Goodfellow大牛挂名的论文,而这篇文章要介绍的是SaGAN是Spatial Attention GAN,即空间注意力的生成对抗网络,来自中科院,它的论文是《Generative Adversarial Network with Spatial Attention for Face Attribute Editing》。 SaGAN用来做面部属性编辑,是一种结合VAE的GAN结构,功能比较简单,一个模型只能修改一种属性,相比其他的GAN模型这并不酷炫,但是对应的模型比较轻量,训练没有压力。对属性无关区域的保留做的很好。
SaGAN原理
设计理念
SaGAN是一种用来做面部属性编辑的方法,比如一个不戴眼镜的人脸图像加上眼镜,或是一个戴眼镜的人脸图像移除眼镜。面部属性编辑有一个大前提是保证属性无关区域不被改变,SaGAN的Spatial Attention机制,就是用来做这个,总结起来SaGAN有三个方面的贡献,其实也可以说是两个:
- 在GAN中引入了空间注意力(spatial attention),自动关注并修改相关属性,忽略和保留无关属性;
- 和image-to-image方法不同,SaGAN使用一种属性条件控制,可以用一个生产模型完成一种属性的0,1变换,而不是G1(0)=1G_{1}(0)=1G1(0)=1和G2(1)=0G_{2}(1)=0G2(1)=0这样,使用两个模型;
- 由于spatial attention的引入,SaGAN对属性无关区域的保留非常出色,如何要使用GAN做人脸识别增广的话,这一点会变的尤其重要,因为起码要保证生成前后一个ID。
SaGAN网络结构

上图就是SaGAN的网络结构,例子是将一个戴眼镜的人脸图像III生成不戴眼镜的人脸图像I^hat{I}I^。 首先作为一个GAN结构,一定有生成器G和判别器D两个部分,分别是上图中白色的Generator部分和灰色的Discriminator部分。 首先是生成器部分G,它的输入是原始图像III和属性控制信号ccc,负责输出修改后的图像I^hat{I}I^: I^=G(I,c)hat{I}=G(I,c)I^=G(I,c) 生成器又拆分为两个网络,一个是attribute manipulation network(AMN),定义为FmF_{m}Fm。它的输入是原始图像III和属性控制信号ccc,负责输出中间结果IaI_{a}Ia,IaI_{a}Ia是对整副图像直接操作的结果: Ia=Fm(I,c)I_{a}=F_{m}(I,c)Ia=Fm(I,c) 另一个网络就是这个方法的核心,空间注意力网络spatial attention network (SAN) ,定义为FaF_{a}Fa。它的输入是原始图像III,负责输出一个掩码图像bbb,它是一个二值图。在这个二值图中,1应该对应属性相关的区域,0对应属性无关的区域。但是这是一种理想化的结果,由于bbb是网络反卷积出来的,所以没办法控制bbb中的像素非1即0,而是一个被压缩到0-1内的连续值,所以实际上是bbb中非0的像素对应属性相关的区域,为0的像素对应属性无关的区域。 b=Fa(I)b=F_{a}(I)b=Fa(I) 有了III,IaI_{a}Ia和bbb之后,就可以输出最后的结果了,即: I^=G(I,c)=Ia×b+I×(1−b)hat{I}=G(I,c)=I_{a}times b+Itimes(1-b)I^=G(I,c)=Ia×b+I×(1−b) 就是用掩码bbb之和中间结果IaI_{a}Ia做乘,再将掩码取反,和原图IaI_{a}Ia做成乘,最后把它们加起来。

上图是生成器G的网络结构,AMN和SAN结构是一样的,并且IaI_{a}Ia和bbb都靠反卷积得到。SAN最后用Sigmoid把范围压缩到0-1。
判别器部分D也有两部分,分别是原始的DsrcD_{src}Dsrc和增加的DclsD_{cls}Dcls,分别用来评价图像生成的效果和属性编辑的效果。因为如果没有DclsD_{cls}Dcls,也可以生成出质量高的图像,但是做不到属性的控制。DsrcD_{src}Dsrc和DclsD_{cls}Dcls共用了主干网络。

上图是判别器D的网络结构,DsrcD_{src}Dsrc和DclsD_{cls}Dcls公用了前6层主干。
SaGAN损失函数
首先是SaGAN的判别器D损失,由于判别器有DsrcD_{src}Dsrc和DclsD_{cls}Dcls两个部分,所以损失函数也是: DsrcD_{src}Dsrc的损失函数和原始GAN是一样的,即: LsrcD=EI[logDsrc(I)]+EI^[log(1−(Dsrc(I^))]L_{src}^{D}=mathbb{E}_{I}[logD_{src}(I)] +mathbb{E}_{hat{I}}[log(1-(D_{src}(hat{I}))]LsrcD=EI[logDsrc(I)]+EI^[log(1−(Dsrc(I^))] DclsD_{cls}Dcls和DsrcD_{src}Dsrc的作用是相似的,是对属性做二分类,所以它也可以用二值交叉熵来表示,即: LclsD=EI,cg[−logDcls(cg,I)]L_{cls}^{D}=mathbb{E}_{I,c^{g}}[-logD_{cls}(c^g,I)] LclsD=EI,cg[−logDcls(cg,I)] 所以判别器的总损失,在原文中表示为: minDsrc,DclsLD=LsrcD+LclsDunderset{D_{src},D_{cls}}{min}L_{D}=L_{src}^{D}+L_{cls}^{D}Dsrc,DclsminLD=LsrcD+LclsD 但是感觉这个有问题,LsrcDL_{src}^{D}LsrcD没有加负号,不应该是最小化LsrcDL_{src}^{D}LsrcD,而是最大化,多以个人认为上式应该修改为:
minDsrc,DclsLD=−LsrcD+LclsDunderset{D_{src},D_{cls}}{min}L_{D}=-L_{src}^{D}+L_{cls}^{D}Dsrc,DclsminLD=−LsrcD+LclsD
其次是SaGAN的生成器G损失,由于判别器有DsrcD_{src}Dsrc和DclsD_{cls}Dcls两个部分,所以生成器G也要有两个对应的损失函数,分别是固定判别器时生成更真实的图像LsrcGL_{src}^{G}LsrcG和生成更对应属性的图像LclsGL_{cls}^{G}LclsG: LsrcG=EI^[−log(Dsrc(I^)]L_{src}^{G}=mathbb{E}_{hat{I}}[-log(D_{src}(hat{I})]LsrcG=EI^[−log(Dsrc(I^)] LclsG=EI^[−log(Dcls(I^)]L_{cls}^{G}=mathbb{E}_{hat{I}}[-log(D_{cls}(hat{I})]LclsG=EI^[−log(Dcls(I^)] 它们应该是二值交叉熵的右侧部分,但是论文里改写了下,拿LsrcGL_{src}^{G}LsrcG举例,min(EI^[−log(Dsrc(I^)])min(mathbb{E}_{hat{I}}[-log(D_{src}(hat{I})])min(EI^[−log(Dsrc(I^)])等效于min(EI^[log(1−Dsrc(I^))])min(mathbb{E}_{hat{I}}[log(1-D_{src}(hat{I}))])min(EI^[log(1−Dsrc(I^))]) 生成器部分还有第三个损失函数,就是重塑损失LrecGL_{rec}^{G}LrecG,它是一个均方误差损失。它的目的是
- 原图通过目标属性控制信号ccc生成I^hat{I}I^,I^hat{I}I^再经过原属性控制信号cgc_{g}cg生成的图,应该和原图是一样。
- 原图通过属性控制信号cgc_{g}cg生成的图,应该保持不变,和原图是一样。
LrecG=λ1EI,c,cg[I−G(G(I,c),cg]+λ2EI,c,cg[I−G(I,cg)]L_{rec}^{G}=lambda _{1}mathbb{E}_{I,c,c_{g}}[I-G(G(I,c),c_{g}]+lambda _{2}mathbb{E}_{I,c,c_{g}}[I-G(I,c_{g})]LrecG=λ1EI,c,cg[I−G(G(I,c),cg]+λ2EI,c,cg[I−G(I,cg)]
最后的总损失,还是把他们加起来: minFm,FaLG=−LsrcG+LclsG+LrecGunderset{F_{m},F_{a}}{min}L_{G}=-L_{src}^{G}+L_{cls}^{G}+L_{rec}^{G}Fm,FaminLG=−LsrcG+LclsG+LrecG
SaGAN生成效果

SaGAN的效果就像上图这样,Mask是属相相关的二值掩码图像。
此外,SaGAN还特意在CelebA是FLW上做了个人脸识别的实验,为了验证上面提到的数据增广对人脸识别的促进作用。 数据增广是这样:

识别效果提升是这样:
