本文做者:楊蕊1002python
前幾天量子位發佈的一篇文章中曾提到國外的AI捏臉應用FaceApp引起大量關注。它能讓人一鍵變成老人,一鍵返老還童,一鍵由男變女,一鍵破涕爲笑,一鍵失去頭髮……git
福布斯報道說,它在Google Play的下載量已經超過了1億。github
蘋果用戶也一樣熱情,App Annie數據顯示,目前在121個國家的iOS商店排名第一。算法
看起來,這是一種神奇的黑科技,可是實際上,揭開神祕的面紗,技術自己並不是高不可攀。從GAN的角度來探索解決這類問題,能作到什麼樣呢?數組
如今,飛槳核心框架Paddle Fluid v1.5宣佈開源了PaddleGAN圖像生成庫,爲用戶提供易上手的、一鍵式可運行的GAN模型。網絡
飛槳(PaddlePaddle)致力於讓深度學習技術的創新與應用更簡單。生成式對抗網絡(GAN)近年來被普遍應用於無監督學習任務以及生成任務中,經過讓兩個神經網絡相互博弈的方法進行學習,經常使用於生成以假亂真的圖片、影片、三維物體模型等。歡迎你們來體驗~框架
下面送上真·乾貨(附代碼)!函數
如下效果均採用百度與哈工大聯合開發的STGAN模型在飛槳開源的實現學習
看到標籤是「Bald」的變臉照片,是否是不少讀者感覺到了一種來自骨髓的涼意,你們多保重!測試
PaddleGAN圖像生成模型庫覆蓋當前主流的GAN算法,可簡單上手各種GAN任務,也方便擴展本身的研究。
Pix2Pix和CycleGAN採用cityscapes數據集進行風格轉換,StarGAN,AttGAN和STGAN採用celeba數據集對圖片進行局部或者總體的屬性修改。
STGAN是由百度和哈工大聯合研發的模型,提出STGAN方法用於圖片/視頻的端到端屬性轉換。對傳統方法提出了兩點改進,在celebA數據集上轉換效果好於已有的方法:
在自編碼網絡結構中引入選擇性屬性編輯單元強化了屬性編輯的效果。
提出了將基於屬性標籤替換爲基於屬性更改的訓練機制。
本次PaddleGAN總共開源5個預訓練模型。安裝好飛槳環境後,能夠下載預訓練模型快速驗證推理效果。
每一個GAN都給出了一份測試示例,放在scripts文件夾內,用戶能夠直接運行測試腳本獲得測試結果。
執行如下命令獲得CyleGAN的預測結果:
python infer.py \
--model_net=CycleGAN \
--init_model=$(path_to_init_model) \
--image_size=256 \
--dataset_dir=$(path_to_data) \
--input_style=$(A_or_B) \
--net_G=$(generator_network) \
--g_base_dims=$(base_dim_of_generator)
執行如下命令獲得Pix2Pix的預測結果:
python infer.py \
--model_net=Pix2pix \
--init_model=$(path_to_init_model) \
--image_size=256 \
--dataset_dir=$(path_to_data) \
--net_G=$(generator_network)
執行如下命令獲得StarGAN,AttGAN或者STGAN的預測結果:
python infer.py \
--model_net=$(StarGAN_or_AttGAN_or_STGAN) \
--init_model=$(path_to_init_model)\
--dataset_dir=$(path_to_data)
模型庫中提供了download.py數據下載腳本,該腳本支持下載MNIST數據集(CGAN和DCGAN所須要的數據集)以及CycleGAN和Pix2Pix所須要的數據集,使用如下命令下載數據:python download.py —dataset=mnist 經過指定dataset參數來下載相應的數據集。
StarGAN, AttGAN和STGAN所須要的Celeba數據集須要用戶自行下載。
自定義數據集:用戶可使用自定義的數據集,只要設置成所對應的生成模型所須要的數據格式便可。
注意: pix2pix模型數據集準備中的list文件須要經過scripts文件夾裏的make_pair_data.py來生成,可使用如下命令來生成:python scripts/make_pair_data.py—direction=A2B,用戶能夠經過設置—direction參數生成list文件,從而確保圖像風格轉變的方向。
python train.py \
--model_net=$(name_of_model) \
--dataset=$(name_of_dataset) \
--data_dir=$(path_to_data) \
--train_list=$(path_to_train_data_list) \
--test_list=$(path_to_test_data_list) \
--batch_size=$(batch_size)
可選參數見python train.py —help
—model_net參數來選擇想要訓練的模型
—dataset參數來選擇訓練所須要的數據集
每一個GAN都給出了一份運行示例,放在scripts文件夾內,用戶能夠直接運行訓練腳本快速開始訓練。
在快讀實現之餘,對於目前主流的GAN的開源模型,咱們也須要一塊兒瞭解一下。
由百度和哈工大聯合研發,在原有的ATTGAN基礎上,引入GRU結構,更好的選擇變化的屬性,可用於人臉特定屬性轉換。
STGAN中生成網絡在編碼器和解碼器之間加入Selective Transfer Units(STU),有選擇的轉換編碼網絡,從而更好的適配解碼網絡。
生成網絡中的編碼網絡主要由convolution-instance norm-ReLU組成,解碼網絡主要由transpose convolution-norm-leaky_ReLU組成,判別網絡主要由convolution-leaky_ReLU組成,詳細網絡結構能夠查看network/STGAN_network.py文件。
生成網絡的損失函數是由WGAN的損失函數,重構損失和分類損失組成,判別網絡的損失函數由預測損失,分類損失和梯度懲罰損失組成。飛槳核心框架Paddle Fluid v1.5中,新增了梯度懲罰的OP,進而支持了WGAN-GP的算法。在本次對外開放的模型中,WGAN均是使用了WGAN-GP算法。
條件生成對抗網絡,一種帶條件約束的GAN,使用額外信息對模型增長條件,能夠指導數據生成過程。
深度卷積生成對抗網絡,將GAN和卷積網絡結合起來,利用卷積神經網絡做爲網絡結構進行圖像生成,能夠獲得更加豐富的層次表達。爲了提升生成樣本的質量和網絡的收斂速度,在網絡結構上進行了一些改進:取消 pooling 層、加入 batch normalization、使用全卷積網絡、在生成器(G)中,最後一層使用Tanh函數,其他層採用 ReLu 函數 ; 判別器(D)中都採用LeakyReLu。
利用成對的圖片進行圖像翻譯,即輸入爲同一張圖片的兩種不一樣風格,可用於進行風格遷移。
Pix2Pix由一個生成網絡和一個判別網絡組成。生成網絡中編碼部分的網絡結構都是採用convolution-batch norm-ReLU做爲基礎結構,解碼部分的網絡結構由transpose convolution-batch norm-ReLU組成,判別網絡基本是由convolution-norm-leaky_ReLU做爲基礎結構,詳細的網絡結構能夠查看network/Pix2pix_network.py文件。
生成網絡提供兩種可選的網絡結構:Unet網絡結構和普通的encoder-decoder網絡結構。網絡利用損失函數學習從輸入圖像到輸出圖像的映射,生成網絡損失函數由GAN的損失函數和L1損失函數組成,判別網絡損失函數由GAN的損失函數組成。生成器的網絡結構以下圖所示。
能夠利用非成對的圖片進行圖像翻譯,即輸入爲兩種不一樣風格的不一樣圖片,自動進行風格轉換。
CycleGAN由兩個生成網絡和兩個判別網絡組成,生成網絡A是輸入A類風格的圖片輸出B類風格的圖片,生成網絡B是輸入B類風格的圖片輸出A類風格的圖片。
生成網絡中編碼部分的網絡結構都是採用convolution-norm-ReLU做爲基礎結構,解碼部分的網絡結構由transpose convolution-norm-ReLU組成,判別網絡基本是由convolution-norm-leaky_ReLU做爲基礎結構,詳細的網絡結構能夠查看network/CycleGAN_network.py文件。
生成網絡提供兩種可選的網絡結構:Unet網絡結構和普通的encoder-decoder網絡結構。生成網絡損失函數由LSGAN的損失函數,重構損失和自身損失組成,判別網絡的損失函數由LSGAN的損失函數組成。
多領域屬性遷移,引入輔助分類幫助單個判別器判斷多個屬性,可用於人臉屬性轉換。
StarGAN中生成網絡的編碼部分主要由convolution-instance norm-ReLU組成,解碼部分主要由transpose convolution-norm-ReLU組成,判別網絡主要由convolution-leaky_ReLU組成,詳細網絡結構能夠查看network/StarGAN_network.py文件。
生成網絡的損失函數是由WGAN的損失函數,重構損失和分類損失組成,判別網絡的損失函數由預測損失,分類損失和梯度懲罰損失組成。
圖:starGAN流程圖
圖:StarGAN的生成網絡結構[左]和判別網絡結構[右]
利用分類損失和重構損失來保證改變特定的屬性,可用於人臉特定屬性轉換。
AttGAN中生成網絡的編碼部分主要由convolution-instance norm-ReLU組成,解碼部分由transpose convolution-norm-ReLU組成,判別網絡主要由convolution-leaky_ReLU組成,詳細網絡結構能夠查看network/AttGAN_network.py文件。
生成網絡的損失函數是由WGAN的損失函數,重構損失和分類損失組成,判別網絡的損失函數由預測損失,分類損失和梯度懲罰損失組成。
圖:AttGAN網絡流程圖
圖:AttGAN的網絡結構
若是您想詳細瞭解更多飛槳的相關內容,請參閱如下文檔。
官網地址:
https://www.paddlepaddle.org.cn
項目地址:
https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleCV/PaddleGAN