最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

[Intensive Reading]图像生成:SaGAN

IT圈 admin 5浏览 0评论

[Intensive Reading]图像生成:SaGAN

简介

首先需要说明下,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变换,而不是 G 1 ( 0 ) = 1 G_{1}(0)=1 G1​(0)=1和 G 2 ( 1 ) = 0 G_{2}(1)=0 G2​(1)=0这样,使用两个模型;
  • 由于spatial attention的引入,SaGAN对属性无关区域的保留非常出色,如何要使用GAN做人脸识别增广的话,这一点会变的尤其重要,因为起码要保证生成前后一个ID。

SaGAN网络结构


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


上图是生成器G的网络结构,AMN和SAN结构是一样的,并且 I a I_{a} Ia​和 b b b都靠反卷积得到。SAN最后用Sigmoid把范围压缩到0-1。

判别器部分D也有两部分,分别是原始的 D s r c D_{src} Dsrc​和增加的 D c l s D_{cls} Dcls​,分别用来评价图像生成的效果和属性编辑的效果。因为如果没有 D c l s D_{cls} Dcls​,也可以生成出质量高的图像,但是做不到属性的控制。 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​共用了主干网络。

上图是判别器D的网络结构, D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​公用了前6层主干。

SaGAN损失函数

首先是SaGAN的判别器D损失,由于判别器有 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​两个部分,所以损失函数也是:
D s r c D_{src} Dsrc​的损失函数和原始GAN是一样的,即:
L s r c D = E I [ l o g D s r c ( I ) ] + E I ^ [ l o g ( 1 − ( D s r c ( 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^))]
D c l s D_{cls} Dcls​和 D s r c D_{src} Dsrc​的作用是相似的,是对属性做二分类,所以它也可以用二值交叉熵来表示,即:
L c l s D = E I , c g [ − l o g D c l s ( c g , I ) ] L_{cls}^{D}=\mathbb{E}_{I,c^{g}}[-logD_{cls}(c^g,I)] LclsD​=EI,cg​[−logDcls​(cg,I)]
所以判别器的总损失,在原文中表示为:
m i n D s r c , D c l s L D = L s r c D + L c l s D \underset{D_{src},D_{cls}}{min}L_{D}=L_{src}^{D}+L_{cls}^{D} Dsrc​,Dcls​min​LD​=LsrcD​+LclsD​
但是感觉这个有问题, L s r c D L_{src}^{D} LsrcD​没有加负号,不应该是最小化 L s r c D L_{src}^{D} LsrcD​,而是最大化,多以个人认为上式应该修改为:

m i n D s r c , D c l s L D = − L s r c D + L c l s D \underset{D_{src},D_{cls}}{min}L_{D}=-L_{src}^{D}+L_{cls}^{D} Dsrc​,Dcls​min​LD​=−LsrcD​+LclsD​

其次是SaGAN的生成器G损失,由于判别器有 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​两个部分,所以生成器G也要有两个对应的损失函数,分别是固定判别器时生成更真实的图像 L s r c G L_{src}^{G} LsrcG​和生成更对应属性的图像 L c l s G L_{cls}^{G} LclsG​:
L s r c G = E I ^ [ − l o g ( D s r c ( I ^ ) ] L_{src}^{G}=\mathbb{E}_{\hat{I}}[-log(D_{src}(\hat{I})] LsrcG​=EI^​[−log(Dsrc​(I^)]
L c l s G = E I ^ [ − l o g ( D c l s ( I ^ ) ] L_{cls}^{G}=\mathbb{E}_{\hat{I}}[-log(D_{cls}(\hat{I})] LclsG​=EI^​[−log(Dcls​(I^)]
它们应该是二值交叉熵的右侧部分,但是论文里改写了下,拿 L s r c G L_{src}^{G} LsrcG​举例, m i n ( E I ^ [ − l o g ( D s r c ( I ^ ) ] ) min(\mathbb{E}_{\hat{I}}[-log(D_{src}(\hat{I})]) min(EI^​[−log(Dsrc​(I^)])等效于 m i n ( E I ^ [ l o g ( 1 − D s r c ( I ^ ) ) ] ) min(\mathbb{E}_{\hat{I}}[log(1-D_{src}(\hat{I}))]) min(EI^​[log(1−Dsrc​(I^))])
生成器部分还有第三个损失函数,就是重塑损失 L r e c G L_{rec}^{G} LrecG​,它是一个均方误差损失。它的目的是

  • 原图通过目标属性控制信号 c c c生成 I ^ \hat{I} I^, I ^ \hat{I} I^再经过原属性控制信号 c g c_{g} cg​生成的图,应该和原图是一样。
  • 原图通过属性控制信号 c g c_{g} cg​生成的图,应该保持不变,和原图是一样。

L r e c G = λ 1 E I , c , c g [ I − G ( G ( I , c ) , c g ] + λ 2 E I , c , c g [ I − G ( I , c g ) ] 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​=λ1​EI,c,cg​​[I−G(G(I,c),cg​]+λ2​EI,c,cg​​[I−G(I,cg​)]

最后的总损失,还是把他们加起来:
m i n F m , F a L G = − L s r c G + L c l s G + L r e c G \underset{F_{m},F_{a}}{min}L_{G}=-L_{src}^{G}+L_{cls}^{G}+L_{rec}^{G} Fm​,Fa​min​LG​=−LsrcG​+LclsG​+LrecG​

SaGAN生成效果


SaGAN的效果就像上图这样,Mask是属相相关的二值掩码图像。

此外,SaGAN还特意在CelebA是FLW上做了个人脸识别的实验,为了验证上面提到的数据增广对人脸识别的促进作用。
数据增广是这样:

识别效果提升是这样:

[Intensive Reading]图像生成:SaGAN

简介

首先需要说明下,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变换,而不是 G 1 ( 0 ) = 1 G_{1}(0)=1 G1​(0)=1和 G 2 ( 1 ) = 0 G_{2}(1)=0 G2​(1)=0这样,使用两个模型;
  • 由于spatial attention的引入,SaGAN对属性无关区域的保留非常出色,如何要使用GAN做人脸识别增广的话,这一点会变的尤其重要,因为起码要保证生成前后一个ID。

SaGAN网络结构


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


上图是生成器G的网络结构,AMN和SAN结构是一样的,并且 I a I_{a} Ia​和 b b b都靠反卷积得到。SAN最后用Sigmoid把范围压缩到0-1。

判别器部分D也有两部分,分别是原始的 D s r c D_{src} Dsrc​和增加的 D c l s D_{cls} Dcls​,分别用来评价图像生成的效果和属性编辑的效果。因为如果没有 D c l s D_{cls} Dcls​,也可以生成出质量高的图像,但是做不到属性的控制。 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​共用了主干网络。

上图是判别器D的网络结构, D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​公用了前6层主干。

SaGAN损失函数

首先是SaGAN的判别器D损失,由于判别器有 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​两个部分,所以损失函数也是:
D s r c D_{src} Dsrc​的损失函数和原始GAN是一样的,即:
L s r c D = E I [ l o g D s r c ( I ) ] + E I ^ [ l o g ( 1 − ( D s r c ( 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^))]
D c l s D_{cls} Dcls​和 D s r c D_{src} Dsrc​的作用是相似的,是对属性做二分类,所以它也可以用二值交叉熵来表示,即:
L c l s D = E I , c g [ − l o g D c l s ( c g , I ) ] L_{cls}^{D}=\mathbb{E}_{I,c^{g}}[-logD_{cls}(c^g,I)] LclsD​=EI,cg​[−logDcls​(cg,I)]
所以判别器的总损失,在原文中表示为:
m i n D s r c , D c l s L D = L s r c D + L c l s D \underset{D_{src},D_{cls}}{min}L_{D}=L_{src}^{D}+L_{cls}^{D} Dsrc​,Dcls​min​LD​=LsrcD​+LclsD​
但是感觉这个有问题, L s r c D L_{src}^{D} LsrcD​没有加负号,不应该是最小化 L s r c D L_{src}^{D} LsrcD​,而是最大化,多以个人认为上式应该修改为:

m i n D s r c , D c l s L D = − L s r c D + L c l s D \underset{D_{src},D_{cls}}{min}L_{D}=-L_{src}^{D}+L_{cls}^{D} Dsrc​,Dcls​min​LD​=−LsrcD​+LclsD​

其次是SaGAN的生成器G损失,由于判别器有 D s r c D_{src} Dsrc​和 D c l s D_{cls} Dcls​两个部分,所以生成器G也要有两个对应的损失函数,分别是固定判别器时生成更真实的图像 L s r c G L_{src}^{G} LsrcG​和生成更对应属性的图像 L c l s G L_{cls}^{G} LclsG​:
L s r c G = E I ^ [ − l o g ( D s r c ( I ^ ) ] L_{src}^{G}=\mathbb{E}_{\hat{I}}[-log(D_{src}(\hat{I})] LsrcG​=EI^​[−log(Dsrc​(I^)]
L c l s G = E I ^ [ − l o g ( D c l s ( I ^ ) ] L_{cls}^{G}=\mathbb{E}_{\hat{I}}[-log(D_{cls}(\hat{I})] LclsG​=EI^​[−log(Dcls​(I^)]
它们应该是二值交叉熵的右侧部分,但是论文里改写了下,拿 L s r c G L_{src}^{G} LsrcG​举例, m i n ( E I ^ [ − l o g ( D s r c ( I ^ ) ] ) min(\mathbb{E}_{\hat{I}}[-log(D_{src}(\hat{I})]) min(EI^​[−log(Dsrc​(I^)])等效于 m i n ( E I ^ [ l o g ( 1 − D s r c ( I ^ ) ) ] ) min(\mathbb{E}_{\hat{I}}[log(1-D_{src}(\hat{I}))]) min(EI^​[log(1−Dsrc​(I^))])
生成器部分还有第三个损失函数,就是重塑损失 L r e c G L_{rec}^{G} LrecG​,它是一个均方误差损失。它的目的是

  • 原图通过目标属性控制信号 c c c生成 I ^ \hat{I} I^, I ^ \hat{I} I^再经过原属性控制信号 c g c_{g} cg​生成的图,应该和原图是一样。
  • 原图通过属性控制信号 c g c_{g} cg​生成的图,应该保持不变,和原图是一样。

L r e c G = λ 1 E I , c , c g [ I − G ( G ( I , c ) , c g ] + λ 2 E I , c , c g [ I − G ( I , c g ) ] 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​=λ1​EI,c,cg​​[I−G(G(I,c),cg​]+λ2​EI,c,cg​​[I−G(I,cg​)]

最后的总损失,还是把他们加起来:
m i n F m , F a L G = − L s r c G + L c l s G + L r e c G \underset{F_{m},F_{a}}{min}L_{G}=-L_{src}^{G}+L_{cls}^{G}+L_{rec}^{G} Fm​,Fa​min​LG​=−LsrcG​+LclsG​+LrecG​

SaGAN生成效果


SaGAN的效果就像上图这样,Mask是属相相关的二值掩码图像。

此外,SaGAN还特意在CelebA是FLW上做了个人脸识别的实验,为了验证上面提到的数据增广对人脸识别的促进作用。
数据增广是这样:

识别效果提升是这样:

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论