玩轉StyleGAN2模型:教你生成動漫人物
- 2020 年 9 月 23 日
- AI
字幕組雙語原文:玩轉StyleGAN2模型:教你生成動漫人物
英語原文:Generating Anime Characters with StyleGAN2
翻譯:雷鋒字幕組(Icarus、)
生成式對抗網路
生成式對抗網路(GAN)是一種能夠生成新內容的生成式模型。由於其有趣的應用,如生成合成訓練數據、創造藝術、風格轉換、影像到影像的翻譯等,這個話題在機器學習界真的很受歡迎。
GAN架構 [圖片由作者提供]
GAN由2個網路組成,即生成器和鑒別器。生成器將嘗試生成假樣本,並愚弄鑒別器,使其相信是真實樣本。鑒別器將試圖從真假樣本中檢測出生成的樣本。這個有趣的對抗性概念是由Ian Goodfellow在2014年提出的。已經有很多資源可以用來學習GAN,因此為了避免冗餘,我就不解釋GAN了。
我推薦大家閱讀Joseph Rocca寫的這篇理解GAN的美文。
StyleGAN2
NVIDIA 在2018年發表了StyleGAN論文《A Style-Based Architecture for GANs》。該論文為GAN提出了一種新的生成器架構,允許他們控制生成樣本的不同細節水平,從粗糙的細節(如頭部形狀)到更精細的細節(如眼睛顏色)。
StyleGAN還融合了Progressive GAN的思想,即網路最初在較低解析度(4×4)上進行訓練,穩定後再逐步增加更大的層數。這樣做,訓練時間變得更快,訓練也更穩定。
漸進式增長GAN[來源:薩拉-沃爾夫]
StyleGAN進一步改進了它,增加了一個映射網路,將輸入向量編碼成一個中間的潛伏空間,w,然後將有單獨的值用來控制不同層次的細節。
StyleGAN生成器架構 [圖片由作者提供]。
為什麼要增加一個映射網路?
GAN的問題之一是它的糾纏潛碼錶示(輸入向量,z)。例如,假設我們有2個維度的潛伏碼,它代表了臉的大小和眼睛的大小。在這種情況下,人臉的大小與眼睛的大小高度糾纏在一起(眼睛越大也就意味著人臉越大)。另一方面,我們可以通過存儲臉部和眼睛的比例來簡化這個問題,這將使我們的模型更簡單,因為無糾纏的表示方式更容易讓模型解釋。
在糾纏表示下,數據分布不一定遵循正態分布,我們希望從那裡抽取輸入向量z的樣本。例如,數據分布會有這樣一個缺角,它代表了眼睛和臉部的比例變得不現實的區域。
如果我們從正態分布中對z進行取樣,我們的模型會試圖也生成缺失的區域,其中的比例是不現實的,由於沒有具有這種特徵的訓練數據Is,生成器會生成不良的影像。因此,映射網路的目的是拆分潛伏表徵,並扭曲潛伏空間,使其能夠從正態分布中取樣。
此外,在每個層次上有單獨的輸入向量w,允許生成器控制不同層次的視覺特徵。前幾層(4×4,8×8)將控制更高級別的細節,如頭型、姿勢和髮型。最後幾層(512×512,1024×1024)將控制更精細的細節,如頭髮和眼睛的顏色。
粗層次細節的變化(頭型、髮型、姿勢、眼鏡)[來源:文件]
細部細節的變化(發色)[來源:文件]
關於StyleGAN架構的完整細節,我推薦大家閱讀NVIDIA官方關於他們實現的論文。下面是論文本身的完整架構圖示。
隨機變化
StyleGAN還允許你通過在各自的圖層上給予雜訊來控制不同層次的細節的隨機變化。隨機變化是影像上的小隨機性,不會改變我們的感知或影像的身份,如不同的梳理的頭髮,不同的頭髮位置等。你可以在下面的動畫影像中看到變化的效果。
粗隨機變化[來源:論文]
精細隨機變化[來源:論文]
StyleGAN還做了一些其他的改進,我在這些文章中就不一一介紹了,比如AdaIN的規範化和其他常規化。你可以閱讀官方論文,Jonathan Hui的這篇文章,或者Rani Horev的這篇文章來代替閱讀進一步的細節。
截斷技巧
當訓練樣本中存在代表性不足的數據時,生成器可能無法學習樣本,生成效果不佳。為了避免這種情況,StyleGAN使用了一個 “截斷技巧”,通過截斷中間的潛伏向量w,迫使其接近平均值。
?(psi)是閾值,用來截斷和重新取樣高於閾值的潛向量。因此,如果使用更高的?,你可以在生成的影像上獲得更高的多樣性,但它也有更高的機會生成奇怪或破碎的面孔。對於這個網路來說,?的值在0.5到0.7之間,根據Gwern的說法,似乎可以得到一個具有足夠多樣性的好影像。雖然,可以隨意試驗一下閾值。
用0.3磅/平方英寸(左)與0.7磅/平方英寸(中)與1.3磅/平方英寸(右)生成的3×3網格影像。
生成動漫人物
我將使用Aaron Gokaslan預先訓練好的Anime StyleGAN2,這樣我們就可以直接載入模型並生成動漫臉。所以,打開你的Jupyter筆記型電腦或Google Colab,讓我們開始編碼吧。
註:如果你有困難,可以參考我的Colab筆記型電腦。
所以首先,我們應該克隆styleGAN repo。
$ git clone //github.com/NVlabs/stylegan2.git |
如果你使用的是 Google Colab,你可以在命令前加上’!’來作為命令運行。!”git clone //github.com/NVlabs/stylegan2.git
接下來,我們需要下載預訓練的權重並載入模型。當你使用Google Colab時,請確保你是在GPU運行時運行,因為模型被配置為使用GPU。
這段程式碼是從這個筆記型電腦上修改而來的。
現在,我們需要生成隨機向量z,作為生成器的輸入。讓我們創建一個函數,從給定的種子中生成潛伏程式碼z。
然後,我們可以創建一個函數,將生成的隨機向量z,生成影像。
現在,我們可以嘗試生成一些影像,看看結果。
該函數將返回一個PIL.Image的數組。在Google Colab中,你可以直接通過列印變數來顯示影像。這裡是第一張生成的圖片。
圖片由作者提供
讓我們用圖片的網格來顯示,這樣我們就可以同時看到多張圖片。
然後我們可以將生成的影像顯示在3×3網格中。
圖片由作者提供
GAN的一個好處是,GAN有一個平滑和連續的潛伏空間,而不像VAE(Variational Auto Encoder)有間隙。因此,當你在潛伏空間中取兩個點,將產生兩個不同的面,你可以通過在兩個點之間取一個線性路徑來創建兩個面的過渡或插值。
潛在空間的插值[來源:Joseph Rocca]
讓我們在程式碼中實現這一點,並創建一個函數來在z向量的兩個值之間進行插值。
讓我們看看插值結果。你可以看到,第一幅影像逐漸過渡到第二幅影像。
圖片由作者提供
現在我們已經完成了插值工作。我們終於可以嘗試製作上面縮略圖中的插值動畫了。我們將使用moviepy庫來創建影片或GIF文件。
當你運行這段程式碼時,它會生成一個插值的GIF動畫。你還可以使用頂部的變數修改持續時間、網格大小或fps。
生成的StyleGAN2插值GIF [圖片由作者提供]。
如果你做到了這一步,恭喜你! 你已經使用StyleGAN2生成了動畫面孔,並學會了GAN和StyleGAN架構的基礎知識。
下一步是什麼?
現在我們已經完成了,你還可以做什麼,進一步改進呢?以下是你可以做的幾件事。
其他數據集
顯然,StyleGAN並不局限於動漫數據集,還有很多可用的預訓練數據集,你可以盡情玩耍,比如真實的臉部影像、貓咪、藝術和繪畫。請查看這個GitHub repo,了解可用的預訓練權重。另一方面,你也可以用自己選擇的數據集來訓練StyleGAN。
有條件的GAN
目前,我們無法真正控制我們想要生成的特徵,如頭髮的顏色,眼睛的顏色,髮型和配件。條件GAN允許你在輸入向量z旁邊給出一個標籤,從而將生成的影像調節成我們想要的樣子。另外,你也可以嘗試通過回歸或手動來理解潛伏空間。如果你想往這個方向走,Snow Halcy repo也許能幫到你,因為他已經做了,甚至在這個Jupyter筆記型電腦上做了互動。
鳴謝
我要感謝Gwern Branwen的大量文章和關於用StyleGAN生成動漫面孔的解釋,我在文章中強烈提到了這一點。我完全推薦你訪問他的網站,因為他的著作是一個知識的寶庫。此外,還可以去ThisWaifuDoesNotExists網站看看,那裡有StyleGAN模型生成動漫臉譜和GPT模型生成動漫情節。
雷鋒字幕組是一個由AI愛好者組成的翻譯團隊,匯聚五五多位志願者的力量,分享最新的海外AI資訊,交流關於人工智慧技術領域的行業轉變與技術創新的見解。
團隊成員有大數據專家,演算法工程師,影像處理工程師,產品經理,產品運營,IT諮詢人,在校師生;志願者們來自IBM,AVL,Adobe,阿里,百度等知名企業,北大,清華,港大,中科院,南卡羅萊納大學,早稻田大學等海內外高校研究所。
如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。