看過這部劇後,我突然很想知道自己禿頭是什麼樣子,於是查了一下飛槳官網,果然它有圖片生成的模型庫。那麼,我們如何使用PaddlePaddle做出一個禿頭生成器呢。
說到圖像生成,就必須說到GAN,它是一種非監督學習的方式,通過讓兩個神經網絡相互博弈的方法進行學習,該方法由lan Goodfellow等人在2014年提出。生成對抗網絡由一個生成網絡和一個判別網絡組成,生成網絡從潛在的空間(latent space)中隨機採樣作為輸入,其輸出結果需要儘量模仿訓練集中的真實樣本。判別網絡的輸入為真實樣本或生成網絡的輸出,其目的是將生成網絡的輸出從真實樣本中儘可能的分辨出來。而生成網絡則儘可能的欺騙判別網絡,兩個網絡相互對抗,不斷調整參數。生成對抗網絡常用於生成以假亂真的圖片。此外,該方法還被用於生成影片,三維物體模型等。普通的GAN模型對每一對圖像風格域都需要獨立地建立一個模型,相比之下,StarGAN就是個多面手了,即單個 StarGAN 模型就可以實現多個不同風格域的轉換,它允許在一個網絡中同時使用不同風格域的多個數據集進行訓練。這導致 StarGAN 的轉化圖像質量優於現有模型,並且可以靈活地轉換輸入圖像到任何想要的風格領域。(a)為處理多個域,應該在每一對域都建立跨域模型。(b)StarGAN用單個generator學習多域之間的映射。該圖表示連接多個域的拓撲圖。AttGAN利用分類損失和重構損失來保證改變特定的屬性AttGAN算法是基於encoder-decoder結構的,根據所需屬性對給定人臉的潛在表徵進行解碼,實現人臉屬性的編輯。現有些方法試圖建立一個獨立於屬性的潛在表示,來編輯屬性。然而,這種對潛在表徵的屬性無關約束過多,限制了潛在表徵的能力,可能導致信息丟失,從而導致生成過於平滑和扭曲。AttGAN沒有對潛在表示施加約束,而是對生成的圖像應用屬性分類約束(attribute classification constraint),以保證所需屬性的正確改變,即「改變你想要的」。同時,引入重構損失來保證只改變特定的屬性。還可以直接應用於屬性強度控制,並且可以自然地擴展到屬性樣式操作。STGAN只輸入有變化的標籤,引入GRU結構,更好的選擇變化的屬性STGAN是在AttGAN的基礎上做的改進。STGAN中生成網絡在編碼器和解碼器之間加入Selective Transfer Units(STU),同時引入屬性差異向量(只輸入需要改變的屬性),這樣一來,網絡變得更容易訓練,相比於目標屬性標籤,屬性差異標籤可以提供更多有價值的信息,使屬性生成精度明顯提升。STGAN差不多是AttGAN的升級版,Paddle的StarGAN不包含禿頭屬性,所以我們使用STGAN。STGAN效果預覽如下所示:上圖中每個頭像圖片對應的屬性分別為:original image、Bald、Bangs、Black Hair、Blond Hair、Brown Hair、Bushy Eyebrows、Eyeglasses、Male、Mouth Slightly Open、Mustache、No Beard、Pale Skin、Young。我們看到了什麼?Bald!對,這正是我們想要的禿頭屬性!AI Studio是百度飛槳提供的免費雲算力平臺,具有免費的GPU算力,notebook的UI風格,預裝的PaddlePaddle,非常適合我這樣的新手煉丹師去隨意搗鼓。下面我們在AI Studio上來開啟 「禿頭」之旅吧……1. 準備數據集本項目採用CelebA數據集,CelebA是CelebFaces Attribute的縮寫,意即名人人臉屬性數據集,其包含10177個名人身份的202599張人臉圖片。關於CelebA數據集的具體介紹,請詳見https://zhuanlan.zhihu.com/p/35975956。
# 解壓數據集
unzip data/data21325/imgAlignCeleba.zip -d dataset/
cp data/data21325/*.txt -d dataset/
# 獲取GAN模型
# paddlepaddle/models的倉庫裡含有其支持的所有gan模型
!git clone https://gitee.com/paddlepaddle/models.git -b release/1.8
!cp -r models/PaddleCV/gan/* ./work/
# 訓練
%cd ~/dataset
!python ../work/train.py --model_net STGAN \ # 指定stgan模型網絡
--data_dir ../dataset \ # 數據集目錄
--dataset . \ # 數據集相對位置
--crop_size 170 \
--image_size 128 \
--train_list ../dataset/attr_celeba.txt \ # 訓練集位置
--gan_mode wgan \
--batch_size 32 --print_freq 1 \
--num_discriminator_time 5 \
--epoch 50 \
--dis_norm instance_norm \
--output ~/output/stgan/
%cd ~
# 輸入的參數可以看看infer_bald.py開頭的解釋哦,主要需要注意的是
# n_samples:它的個數決定了輸出的結果圖中含有幾張圖的結果,我設置為1,那麼就會只有一張圖的屬性變換輸出。
# crop_size、image_size最好不要修改,經過我測試會影響效果,因此最好把圖片控制在178的寬度
!python ./work/infer_bald.py \
--model_net STGAN \
--init_model ./33/ \
--dataset_dir my_dataset \
--test_list dataset/test1.txt \
--use_gru True \
--output ./infer_result/stgan/ \
--n_samples 1 \
--selected_attrs "Bald,Bangs,Black_Hair,Blond_Hair,Brown_Hair,Bushy_Eyebrows,Eyeglasses,Male,Mouth_Slightly_Open,Mustache,No_Beard,Pale_Skin,Young" \
--c_dim 13 \
--crop_size 178 \
--image_size 128 \
--load_height 128 \
--load_width 128 \
--crop_height 128 \
--crop_width 128 \
# 安裝Paddlehub和stgan_celeba預訓練模型
!pip install paddlehub==1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
!hub install stgan_celeba
import paddlehub as hub
stgan = hub.Module(name="stgan_celeba")
test_img_path = ["my_dataset/img_align_celeba/000003.jpg"]
# org_info是一個只有一個元素的列表 如:["Bald,Bangs"]
# org_info要儘可能詳細的說明輸入圖片的特徵情況,否則會影響輸出效果:
# 必須填寫性別( "Male" 或 "Female")可選值"Bald", "Bangs", "Black_Hair", #"Blond_Hair", "Brown_Hair", "Bushy_Eyebrows", "Eyeglasses", #"Mouth_Slightly_Open", "Mustache", "No_Beard", "Pale_Skin", "Aged"
org_info = ["Male"]
# 指定要變化的特徵:禿頭
trans_attr = ["Bald"]
# set input dict
input_dict = {"image": test_img_path, "style": trans_attr, "info": org_info}
# execute predict and print the result
results = stgan.generate(data=input_dict)
print(results)
覺得不錯,請點個在看呀!