深入理解風格遷移三部曲(一)–UNIT
- 2019 年 12 月 27 日
- 筆記
01
簡介
近期我研究的方向轉向了GAN的應用, 其中圖像的風格遷移是GAN中一個非常有意思的應用,傳統的方法基於拉普拉斯金字塔對成對的圖像進行紋理上的風格遷移.隨着2014年GAN的爆火,研究者發現GAN通過判別器D學習兩個圖像域的關係,實現了unpaired image-to-image(非成對圖像數據集的風格遷移)的功能,其中有兩個廣為人知的應用分別是pix2pix和cycleGAN,今天我們另闢蹊徑,從NVIDIA-Lab提出的UNIT框架來探索image-to-image的實現原理.
在開始說UNIT之前,我們先來簡要的回顧一下GAN和VAE,這也是在我之前的ODOG項目中有過詳細的介紹.
02
GAN
生成對抗網絡(英語:Generative Adversarial Network,簡稱GAN)是非監督式學習的一種方法,通過讓兩個神經網絡相互博弈的方式進行學習。該方法由伊恩·古德費洛等人於2014年提出。
核心公式:

這個公式我們要分成兩個部分來看:
先看前半部分:

這個公式的意思是,先看加號前面

,我們希望D最大,所以

應該最大,意味着我的判別器可以很好的識別出,真實世界圖像是"true",在看加號後面

,要讓log儘可能的大,需要的是

儘可能的小,意味着我們生成模型的圖片應該儘可能的被判別模型視為"FALSE".
再看後半部分部分

,
我們應該讓儘可能的小,加號前面的式子並沒有G,所以無關,在看加號後面的式子

,要讓G儘可能地小,就要

儘可能的大,也就是說本來就一張→噪聲生成的圖片,判別器卻被迷惑了,以為是一張真實世界圖片.這就是所謂的以假亂真.

03
VAE
VAE也叫變分自動編碼機, 其基礎是自編碼機(autoencoder),AE通過對輸入X進行編碼後得到一個低維的向量y,然後根據這個向量還原出輸入X,。通過對比與X,

的誤差,再利用神經網絡去訓練使得誤差逐漸 減小從而達到非監督學習的目的.

簡單點來說,就是先通過f把x映射到y,一般來說我們假定

,再通過把y映射到

,在這裡不長篇大論Reparametrization tricks.
04
UNIT
UNIT(Unsupervised Image-to-Image Translation Networks),由NVIDIA-Lab在NIPS 2017年提出,該文章首次提Image-Image Translation這個概念,將計算機視覺和計算機圖形學的許多任務總結進去,分為一對多和多對一的兩類轉換任務,包括CV里的邊緣檢測,圖像分割,語義標籤以及CG里的mapping labels or sparse user inputs to realistic images.

該文章定義了

和

作為兩個圖像域.傳統的supervised Image-to-image 通過對圖像域進行採樣,求其聯合概率分佈

,通過Encoder-Decoder的思想,作者定義了兩個E和G,希望使得

在latent space上近可能的分佈一致.意味着當我們同時對

時,我們希望得出:

這樣,我們得到了兩個Domain下image的一致表示,再通過令G=D,從latent space中重構,

因此,我們兩個採樣下的

經過

後得到了

,再把:

通過Adv_loss對抗學習跨域生成圖片的效果.
可能細心的你以及發現了這是不是很類似VAE-GAN嗎?是的.
05
損失函數
作者通過聯合訓練4個網絡

的三個loss function來訓練整個網絡:

# ------------------------------- # Train Encoders and Generators # ------------------------------- # Total loss loss_G = ( loss_KL_1 + loss_KL_2 + loss_ID_1 + loss_ID_2 + loss_GAN_1 + loss_GAN_2 + loss_KL_1_ + loss_KL_2_ + loss_cyc_1 + loss_cyc_2 ) loss_D1 = criterion_GAN(D1(X1), valid) + criterion_GAN(D1(fake_X1.detach()), fake) loss_D2 = criterion_GAN(D2(X2), valid) + criterion_GAN(D2(fake_X2.detach()), fake)
VAE的目標是minimize source domain to latent space's KL diversity and latent space to destination domain's KL diversity(我覺得中文太拗口了,這句話實在是說不來)來最小化變分上界,VAE的定義如下:

# Get shared latent representation mu1, Z1 = E1(X1) mu2, Z2 = E2(X2) # Reconstruct images recon_X1 = G1(Z1) recon_X2 = G2(Z2) # Translate images fake_X1 = G1(Z2) fake_X2 = G2(Z1) loss_KL_1 = lambda_1 * compute_kl(mu1) loss_KL_2 = lambda_1 * compute_kl(mu2) loss_KL_1_ = lambda_3 * compute_kl(mu1_) loss_KL_2_ = lambda_3 * compute_kl(mu2_)
對抗:GAN_LOSS被用於確保翻譯圖像類似圖像在目標域.定義如下:

loss_GAN_1 = lambda_0 * criterion_GAN(D1(fake_X1), valid) loss_GAN_2 = lambda_0 * criterion_GAN(D2(fake_X2), valid) loss_D1 = criterion_GAN(D1(X1), valid) + criterion_GAN(D1(fake_X1.detach()), fake) loss_D2 = criterion_GAN(D2(X2), valid) + criterion_GAN(D2(fake_X2.detach()), fake)
循環一致性:由於shared latent-space假設暗含了循環一致性約束,因此我們在提出的框架中實施循環一致性約束,以進一步規範不適定的無監督圖像間轉換問題。產生的信息處理流稱為循環重建流,定義如下:

# Cycle translation mu1_, Z1_ = E1(fake_X1) mu2_, Z2_ = E2(fake_X2) cycle_X1 = G1(Z2_) cycle_X2 = G2(Z1_) loss_ID_1 = lambda_2 * criterion_pixel(recon_X1, X1) loss_ID_2 = lambda_2 * criterion_pixel(recon_X2, X2) loss_cyc_1 = lambda_4 * criterion_pixel(cycle_X1, X1) loss_cyc_2 = lambda_4 * criterion_pixel(cycle_X2, X2)
訓練好的網絡,我們可以通過對latent sapce
的latent variable
重編碼,進而把輸入圖像遷移到各個域中:
06
實驗結果


作者在展示的時候看起來好像可以實現一對多的風格轉換,實際上這個算法只能實現1對1的風格遷移,是作者做了N對1對1的實驗,所以看起來像1對N的結果.
這算是比較早期的一篇文章,其實現原理也是借鑒很很多前人的工作,實際上我覺得從原創性上來看比不上cycleGAN,不過這這個VAE-GAN延伸的應用性似乎更好一些.接下來會介紹NVIDIA-Lab的FUNIT和MUNIT.