學習資料來源
讀芯術 -【學術報告】?阿里巴巴洪佳鵬:生成對抗網絡和隱層屬性交換的人臉屬性遷移
[感謝讀芯君,感謝供稿人:張繼]
學習筆記
1. GAN(生成對抗網絡)介紹
生成體現在生成器從無到有,
對抗體現在生成器和判別器的目標
可以從目標函數看出,判別器的任務就是判別真假樣本,生成器的任務就是要騙過它,使得生成的樣本判定成一個真的樣本。
生成器生成樣本,經過判別器的判別以后反饋給它的信息是生成的還不夠好,也會引導繼續生成更好的樣本。
2. 圖像翻譯(圖像->圖像)
概念
(1)圖像域:具有某種屬性的圖象集合
- 所有戴眼鏡的人可以看成一個圖像域,因為都有一套相同的屬性,就是眼鏡。
(2)屬性相對的圖像域:同一個屬性的不同取值形成的不同圖像域
- 戴眼鏡 vs 不戴眼鏡
(3)圖像ID
- 對于特定屬性來說,一張圖像的ID是指它在該屬性的不同圖像域中的圖像所共有的部分
(4)配對樣本/費配對樣本
- 配對樣本:一個人戴眼鏡和同一個人不戴眼鏡的樣本
- 非配對樣本:一個人戴眼鏡和其他人不戴眼鏡的樣本
(5)人臉圖像編輯
- 添加或者移除一種或多種人臉屬性
3. 常見的翻譯算法
(1)判別器去判斷圖像是否落在圖像域內(最常見做法)
CycleGAN、UNIT、DTN、StarGAN、DNA-GAN、ELEGANT
非匹配樣本可訓練
-
CycleGAN
有兩個互為逆映射的生成器分別負責兩個圖像域互轉,兩個判別器分別判別圖像是否分別來自兩個圖像域。這里判別器的任務有兩個,一個是判別圖像域是不是對的,就是有/沒有屬性,以及圖像質量是不是跟真實樣本匹配。
CycleGAN -
UNIT
把生成器拆成編碼器和解碼器,編碼器分別對兩個域的圖像做編碼,可以共享高層,這樣使得兩個圖像域的編碼落在同一個空間里面,解碼的時候輸入給特定的解碼器,A圖像域解碼器生成的是A圖像域,B圖像域解碼器生成的是B圖像域,然后判別器判斷圖像域是否是對的。
UNIT -
StarGAN
CycleGAN的拓展,可以針對多個圖像域,也有多個屬性,比如眼鏡、劉海和微笑各種屬性,生成器提供的不只是一張圖,可以把想要轉過去的屬性告訴它,就是可以同時指定多個屬性修改,生成器也只修改指定的屬性。多屬性修改的算法很多都是采用條件判別器的做法,StarGAN則采用的是AcGAN的做法,通過判別器接收一張圖,除了判斷真假以外,還要把這個圖像域的信息預測出來。
StarGAN
(2)判別器去判斷翻譯結果的匹配度
- pix2pix
- 需要配對樣本(supervised learning)
-
判別器主要任務:圖像域的正確性,圖片質量,圖像匹配程度
pix2pix
(3)判別器在hidden layer對抗
- FaderNets
- 通過對抗分離屬性與圖像ID
- 缺點:訓練難度大
-
判別器主要任務
判別器要從圖像的編碼當中預測出圖像域的信息,對編碼器來說則不能讓判別器得逞,要將屬性的信息從圖像編碼中剝離出去。也就是說它需要使得判別器的預測是相反的。
FaderNets
4.報告作者的主要工作
(1)DNA-GAN
交換隱形編碼
*編碼器分別編碼各個屬性,然后交換兩張圖特定屬性的編碼就可以交換屬性,因為是通過跟范例圖交換屬性,因此可以引入多樣性。前面介紹的其他圖像翻譯方法都很難引入多樣性,針對屬性的建模就是1和0,也就是有和沒有,沒辦法確定加上什么類型的眼鏡或者劉海,而我們這里是可以控制的。-
如何分別編碼?
首先需要指定編碼的順序,要求前面一部分是編碼眼鏡,后面一部分是編碼劉海,還有一部分是編碼和兩個屬性無關的圖像ID。考慮第一個屬性的時候只用第一個屬性的圖片,上面帶加號的代表有這個屬性,減號代表沒有這個屬性。考慮第一個屬性的時候只用第一個屬性的圖片,考慮第二個屬性的時候只用第二個屬性的圖片,這樣就可以和屬性編碼掛上鉤。然后會做一個交叉重組,會有四個結果:兩種是和原來的一樣,另外兩個結果就是換了特定的部分,比如換了第一個屬性,然后解碼出來四張圖,兩張是和原圖一樣的,兩張是新的圖,就是只換了第一個屬性。
DNA-GAN
(2)ELEGANT
繼承自隱層做差。
無需湮滅/零化操作
-
無需建模圖像ID
隱層直接做差的話可能不太好學,因為兩張得到兩張新圖所需要的殘差圖,它們的編碼在隱層做差意義下,只差了一個符號,這是有點難學的。ELEGANT則會自己去學習做差的操作,簡單的做法就是把兩個編碼拼起來,要求從前面的編碼轉化到后面的編碼,這也可以看成是一種做差的做法,解碼器自己去學做差。這樣做也沒有平凡解的問題,不需要建模圖像ID。
ELEGANT -
Batch Normalization 有問題
*訓練結果正常,測試沒效果
BN回破壞圖像色彩、亮度、對比度等信息(U_net可解決)
涉及到兩批來自不同域的圖,BN不收斂導致歸一化失效- 替代方案:l2 normalization