1
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標題 T2F: Text to Face generation using Deep Learning,作者為 Animesh Karnewar。
翻譯 | 趙朋飛 整理 | 凡江
由 T2F 基于相應的描述生成的示例圖像
項目的代碼可以在我的版本庫獲得:https://github.com/akanimax/T2F
簡介
閱讀小說時,我經(jīng)常好奇小說中描述的角色在現(xiàn)實中會是怎樣的。從整體想象任務角色是可行的,但要將描述變?yōu)楦鼮樯羁痰募毠?jié)是相當有挑戰(zhàn)的,而且經(jīng)常不同的人有不同的解釋。很多時候,我只能想象到一個非常模糊的面孔,直到故事的結(jié)尾。只有書本被翻譯成電影時,模糊的面孔才會被細節(jié)所填滿。例如,我無法想象《列車上的女孩》中 Rachel 的具體長相。但當這部電影播出時,我可以將 Emily Blunt 的臉和 Rachel 聯(lián)系起來。演員們肯定付出了很多努力才能從劇本中準確獲得角色。
圖片來源:http://www.finalreel.co.uk/the-girl-on-the-train-release-date-2016/
這個問題激發(fā)了我的靈感,激勵我去尋找解決問題的辦法。之后,我們開始通過研究深度學習文獻尋找類似的東西。幸運的是,有大量的從文本中合成圖像的研究可供參考。下面是我參考的一些資料。
https://arxiv.org/abs/1605.05396「Generative Adversarial Text to Image Synthesis」
https://arxiv.org/abs/1612.03242「StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks」
https://arxiv.org/abs/1710.10916「StackGAN++: Realistic Image Synthesis with Stacked Generative Adversarial Networks」
通過研究文獻資料,我提出了一種比 StackGAN++更簡單的架構(gòu),并且很容易解決問題。在隨后的章節(jié),我將解釋所做的工作并分享到目前為止獲得的初步結(jié)果。我也將提到一些代碼和訓練細節(jié),這些花費了我很多時間才弄清楚。
數(shù)據(jù)分析
用于創(chuàng)建深度學習模型的數(shù)據(jù)毫無疑問是最原始的人工制品:正如吳恩達教授在他的 deeplearning.aicourses 上所說「在機器學習領(lǐng)域成功的人并不是哪些擁有優(yōu)秀算法的人,而是擁有優(yōu)秀數(shù)據(jù)的人」。因此,我開始尋找一組有漂亮、豐富和多樣的文本描述的臉部數(shù)據(jù)集。我偶然發(fā)現(xiàn)了大量的數(shù)據(jù)集要么僅僅只有人臉,要么是人臉和 ID(用于識別),要么是含有其他信息的人臉數(shù)據(jù),比如眼睛顏色:藍,臉型:橢圓,頭發(fā):金色,等。但這都不是我所需要的。我最終的選擇是使用一個早期的項目(從結(jié)構(gòu)化數(shù)據(jù)中生成自然語言描述),在這個早期的項目中實現(xiàn)了從結(jié)構(gòu)化數(shù)據(jù)生成自然語言摘要。但這會對已經(jīng)充滿噪聲的數(shù)據(jù)集再增加噪聲信息。
隨著時間的流逝和研究的進展,提出了 Face2Text:收集一個帶注釋的圖像描述語料庫,用于生成豐富的面部描述:這就是我想要的。特別感謝 Albert Gattand Marc Tanti 提供了 Face2Text 數(shù)據(jù)集的 v1.0 版本。
Face2Text v1.0 版本數(shù)據(jù)集包含 400 個隨機從 LFW(自然環(huán)境下已標記的人臉數(shù)據(jù))選擇的圖像的自然語言描述。這些描述被清理干凈,去除了那些對圖片中人物的不相關(guān)的說明。其中一些描述不只描述了臉部特征,也提供了一些圖片的隱藏信息。例如,其中一個臉部描述:「照片中的人可能是一個罪犯」?;谶@些因素,以及數(shù)據(jù)集相對較小,我決定使用它證明我的架構(gòu)。最終,我們可以擴展這個模型,并灌輸更大、更多樣的數(shù)據(jù)集。
架構(gòu)
從文字描述中生成人臉的 T2F 架構(gòu)
T2F 架構(gòu)結(jié)合了 2 個 stackGAN 架構(gòu)(之前已提到),使用條件增強的文本編碼和 ProGAN(衍生自 GAN),用于合成面部圖像。原始的 stackgan++ 架構(gòu)在不同的空間分辨率下使用了多個 GAN,我發(fā)現(xiàn)對于任何給定的分布式匹配問題,都是有點過分了。而 ProGAN 僅使用一個 GAN,通過不斷增加分辨率來逐步訓練。所以我決定將這兩部分結(jié)合起來。
為了更好解釋網(wǎng)絡中的數(shù)據(jù)流,這里有一些要點:通過 LSTM 網(wǎng)絡嵌入(psy_t)將文本描述編碼成摘要向量,如框圖所示。嵌入被傳入條件增強模塊(單獨線性層)以獲取隱向量的文本部分(使用類似于重新參數(shù)化技術(shù)的 VAE)作為 GAN 輸入。隱向量的第二部分是隨機高斯噪聲。隱向量輸入 GAN 的生成模塊,而嵌入被輸入到鑒別器最后一層用于條件增強匹配。對 GAN 的訓練正如 ProGAN 論文中提到的一樣;即一層一層地增加空間分辨率。新層是使用 fade-in 技術(shù)引入的,以避免破壞以前的學習。
實現(xiàn)和其他細節(jié)
該架構(gòu)是使用 PyTorch 框架在 python 中實現(xiàn)的。我之前使用 tensorflow 和 keras,所以這次我想嘗試一下 PyTorch。我非常喜歡使用 python 本地調(diào)試器來調(diào)試網(wǎng)絡架構(gòu);這是 eager execution 策略的優(yōu)勢。TensorFlow 目前也包含一個 eager execution 模式。不管怎樣,這不是一個關(guān)于哪個框架更好的辯論,我只是想強調(diào)一下這個體系結(jié)構(gòu)的代碼是用 PyTorch 寫的。你可以在我的 github repo 上找到代碼實現(xiàn)和如何執(zhí)行的筆記,https://github.com/akanimax/T2F。
我發(fā)現(xiàn)這個架構(gòu)的很多部分是可以重用的。特別是 ProGAN(有條件或無條件的)。因此,我將他們作為 PyTorch 模塊擴展單獨編寫,也可以用于其他數(shù)據(jù)集。您只需要指定 GAN 的深度和最新/特性大小,模型就會產(chǎn)生適當?shù)募軜?gòu)。對于任何您可能想要的數(shù)據(jù)集,GAN 都可以逐步接受訓練。
訓練細節(jié)
我使用不同的超參數(shù)訓練了相當多的版本。如前一節(jié)所述,與訓練有關(guān)的細節(jié)如下:
因為,在鑒別器中沒有 batch-norm 或 layer-norm 操作,WGAN-GP 損失(用于訓練)可能會激增。為此,我使用了 lamda=0.001 的漂移懲罰。
為了控制從編碼文本中產(chǎn)生的潛在的流形,我們需要使用 KL 散度(在 CA 的輸出和標準正態(tài)分布之間)在生成器的損失中。
為了使生成的圖像更好地符合輸入文本的分布,使用匹配鑒別器的 WGAN 變體是有幫助的。
對于較低層次的層,需要的 fade-in 時間比在底層的時間要多。為了解決這個問題,我使用了一個百分比(確切地說,是 85%),在訓練的時候,它會在新層上增加。
我發(fā)現(xiàn),與較低分辨率的樣本相比,更高分辨率(32 x 32 和 64 x 64)生成的樣本具有更多的背景噪聲。我認為這是由于數(shù)據(jù)量不足導致(只有 400 張圖片)。
對于漸進訓練,在較低的分辨率下花費更多的時間(更多的時間),并為更高的分辨率減少適當?shù)臅r間。
下面的gif顯示了生成器的訓練時間延遲。該gif是使用 GAN 在不同空間分辨率下訓練過程中產(chǎn)生的圖像創(chuàng)建的。
T2F 訓練時間延遲
結(jié)論
從初步結(jié)果中,我可以斷言 T2F 是一個可行的項目,有一些非常有趣的應用。例如,T2F 可以幫助從描述中識別出罪犯/受害者。基本上,我們需要一些領(lǐng)先的方面來激發(fā)想象力的應用。我將致力于擴展這個項目,并在 Flicker8K 數(shù)據(jù)集、Coco 標題數(shù)據(jù)集等方面對其進行基準測試。歡迎提出建議。
GAN 的逐步增長是一種非凡的技術(shù),可以更快、更穩(wěn)定地訓練 GAN。這可以與其他論文的新穎的貢獻相結(jié)合。應用約束 GAN 訓練的技巧,我們還可以在許多領(lǐng)域使用 GAN。
原文鏈接:https://medium.com/@animeshsk3/t2f-text-to-face-generation-using-deep-learning-b3b6ba5a5a93
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。