影像生成: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上做了個人臉識別的實驗,為了驗證上面提到的數據增廣對人臉識別的促進作用。 數據增廣是這樣:

識別效果提升是這樣:
