cGAN 介紹與實作說明 with Tensorflow Keras
那在之前我們已經介紹過GAN的內部原理跟簡單實作了(🔗連結),那今天要繼續鑽研這美妙的酷東西的另一種延伸:cGAN(conditonal generative adversial network),正如其名,可以自動生成符合某些條件或特徵(condition)的圖像。
原理
cGAN 不只是輸入圖片,其還需要額外輸入年紀訊息y作為條件,普通GAN無法特別決定輸出類型,像我們上次的MNIST GAN就無法指定要生成哪一種數字的圖片,而cGAN可以生成多峰模型,藉由不同條件訊息生成不同類別。
架構
上面呈現的是一個cGAN架構圖,Generator(G) 跟Discriminator(D)都以y輸入作為額外條件,y可以是任何輔助訊息,像是圖片標籤之類等等的,我們可以通過輸入y到G跟D中作爲額外設置的輸入layer來達到目的,在G中,先前輸入的噪音p(z)跟y會合併作為資料輸入,而在D中,x(圖片)跟y會一起輸入做判斷。
cGAN的訓練目標函數如下,其中D(Discriminator),G(Generator),log(D(x|y)) 代表discriminator在基於y的前提下的loss,log(1-D(G(z|y )))代表 Generator基於y的前提下產生的圖片丟進Discriminator後的loss,z是代表從正態機率分布中採樣的100維數列,可以看出跟GAN的些微差異。
Age-cGAN
那前面大概理解了cGAN,我們還嘗試實作一下其中一個應用:Age- cGAN,以年紀為附加訊息做輸入,實現人臉老化的一個作法。Age-cGAN的架構較為複雜,主要由四種 network 組成:
1.Encoder
用於將輸入圖片生成高維度向量抓取特徵,此網路由四層 Convolution layer跟兩層 FCN 所構成,每個Convolution layer其後都會一如既往地緊跟一層Batch normalization 。
2. Generator
由隨機抓取噪音分佈跟額外年紀資訊y 生成指定大小圖片,由FCN跟upsample 跟Convolution layer組成。
3. Discriminator
判斷圖片真假,由downsample跟 image classification組成。
4. FaceNet
目的是能判斷人的身份,在此處會使用預訓練的Inception-ResNet2模型,去除其最後的FCN,已傳回其圖像embedding後的特徵,計算重新建立後的圖片跟真實圖片的Euclidean Distance。
訓練階段
1. Given an input face image x of age y0, find an optimal latent vector z∗ which allows to generate a reconstructed face x = G(z∗, y0) as close as possible to the initial one (cf. Figure 1-(a)).
2. Given the target age ytarget, generate the resulting face image xtarget = G(z∗, ytarget) by simply switching the age at the input of the generator (cf. Figure 1-(b)).
訓練主要分為三階段
- cGAN 訓練:此階段訓練G跟D,此階段和普通GAN 相似。
- 初始潛在向量相似:對潛在向量進行近似以重構人臉圖片,主要訓練Encoder,使其可以學到抓出重要的潛在特徵向量。
- 潛在向量優化:同時對Enoder跟G進行優化,看一下論文中的公式,其中FR是人臉辨識網路,在這階段會嘗試最小化歐式距離及最大化身份特徵保留。
In order to encode person’s age, we have defined six age categories: 0–18, 19–29, 30–39, 40–49, 50–59 and 60+ years old. They have been selected so that the training dataset (cf. Subsection 3.1) contains at least 5, 000 examples in each age category. Thus, the conditions of Age-cGAN are six-dimensional one-hot vectors.
論文作者將年齡分為六個不同level當作輸入。
Dataset
作者從維基百科爬取圖像,並製成dataset供學術研究使用(🔗dataset連結 點擊下載就會開始),裡面有圖片資料夾跟一個關於圖像年齡資料的wiki.mat,建議在colab中執行。
#colab 下載資料集!wget https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/wiki_crop.tar!tar -xvf wiki_crop.tar
Code說明
我們這邊主要看主程式的運作,有空可以去執行玩玩看,我自己是在colab執行過,但圖片有6萬多張,所以讀取會很久XD,當然訓練也是,大家可以斟酌一下,或是讀個幾千張跑跑看就好。這邊也不會完全執行,因為Colab沒辦法跑那麼久😅。
但先讓我們看一下Discriminator裡面
這邊處理年紀訊息y跟圖片的方式是將y拓展成跟圖片資料一樣大小在進行疊加後進去做輸出判斷,跟我一開始以為會跟圖片array Flatten後做concate的想法完全不同。
首先是第一階段
Discriminator一樣分別餵進generator的假圖片跟真實圖片,兩者的年齡訊息y是必須相同的(line26,28),這樣才有比較的價值。Generator則必須包含在Adversarial Model 中一起訓練:將Generator輸入 y 的假圖片 跟 y 丟進去Discriminator 所得出的loss即是現在generator的loss(造假技術跟現在驗證技術的差異,)。
看看我們Generator在一開始生成了什麼~
接者第二階段
如上面所說,我們在這裡要訓練Encoder從輸入的人臉圖片中盡量抓出100維度特徵。所以我們一樣先隨機生成一串100維數字,丟進generator生成一張圖片,再將這張圖片丟進Encoder跟一開始的100維數字作差異比較,得到Encoder的loss。
最後是第三階段
這一階段用FR來優化Encode跟Generator,做法是將generator跟Encode合併成 fr_adversarial_model 跟 keras裡面已經訓練好的InceptionResNetV2 比較,其中呼叫的 K.resize_image 中的一個參數"channels_last"
假定为 (rows, cols, channels)
,傳回一般常見的影像格式。在此訓練過程中,Encode會強化其萃取特徵能力,而Generator生產出來也會更接近人像。
那今天的解說就到這裡~希望以後能多寫幾篇關於GAN的不同變形,有興趣的話可以follow我或底下拍手🖐。
程式碼來源
cGAN論文
Age-cGAN論文
Face Aging With Conditional Generative Adversarial Networkshttps://arxiv.org › cs