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