圖片:這些人不是真實的——他們是由我們的生成器生成的,可以控制圖像的不同方面。
該存儲庫包含以下論文的官方 TensorFlow 實作:
用於生成對抗網路的基於樣式的生成器架構
Tero Karras (NVIDIA)、Samuli Laine (NVIDIA)、Timo Aila (NVIDIA)
https://arxiv.org/abs/1812.04948摘要:我們借鑒風格遷移文獻,提出了一種用於生成對抗網路的替代生成器架構。新的架構導致了高級屬性(例如,在人臉上訓練時的姿勢和身份)和生成圖像(例如,雀斑、頭髮)中的隨機變化的自動學習、無監督分離,並且它實現了直觀的、規模化的。新的生成器改進了傳統分佈品質指標的最先進水平,帶來明顯更好的插值屬性,並且還更好地消除了潛在的變化因素。為了量化插值品質和解纏結,我們提出了兩種適用於任何生成器架構的新的自動化方法。最後,我們引入了一個新的、高度多樣化且高品質的人臉資料集。
如需業務諮詢,請造訪我們的網站並提交表格:NVIDIA 研究許可
★★★ 新功能:StyleGAN2-ADA-PyTorch 現已推出;在這裡查看完整的版本清單 ★★★
與我們論文相關的資料可透過以下連結取得:
論文:https://arxiv.org/abs/1812.04948
影片:https://youtu.be/kSLJriaOumA
程式碼:https://github.com/NVlabs/stylegan
FFHQ:https://github.com/NVlabs/ffhq-dataset
其他材料可以在 Google 雲端硬碟上找到:
小路 | 描述 |
---|---|
風格GAN | 主資料夾。 |
├ stylegan-paper.pdf | 論文 PDF 的高品質版本。 |
├ stylegan-video.mp4 | 結果影片的高品質版本。 |
├ 圖片 | 使用我們的生成器產生的範例圖像。 |
│ ├ 代表性圖片 | 用於文章、部落格文章等的高品質圖像。 |
│ └ 100k 生成影像 | 100,000 張針對不同截斷量所產生的影像。 |
│ ├ ffhq-1024x1024 | 使用 Flickr-Faces-HQ 資料集以 1024×1024 產生。 |
│ ├ 臥室-256x256 | 使用 256×256 的 LSUN Bedroom 資料集產生。 |
│ ├ 汽車-512x384 | 使用 512×384 的 LSUN 汽車資料集產生。 |
│ └ 貓-256x256 | 使用 256×256 的 LSUN Cat 資料集產生。 |
├ 視頻 | 使用我們的生成器產生的範例影片。 |
│ └ 高品質影片剪輯 | 結果影片的各個片段為高品質 MP4。 |
├ ffhq-資料集 | Flickr-Faces-HQ 資料集的原始資料。 |
└ 網路 | 預先訓練的網路作為 dnnlib.tflib.Network 的 pickle 實例。 |
├ stylegan-ffhq-1024x1024.pkl | StyleGAN 使用 1024×1024 的 Flickr-Faces-HQ 資料集進行訓練。 |
├ stylegan-celebahq-1024x1024.pkl | StyleGAN 使用 CelebA-HQ 資料集在 1024×1024 下進行訓練。 |
├ stylegan-bedrooms-256x256.pkl | StyleGAN 使用 256×256 的 LSUN Bedroom 資料集進行訓練。 |
├ stylegan-cars-512x384.pkl | StyleGAN 使用 512×384 的 LSUN 汽車資料集進行訓練。 |
├ stylegan-cats-256x256.pkl | StyleGAN 使用 256×256 的 LSUN Cat 資料集進行訓練。 |
└ 指標 | 用於品質和解纏結指標的輔助網路。 |
├ inception_v3_features.pkl | 輸出原始特徵向量的標準 Inception-v3 分類器。 |
├ vgg16_zhang_perceptual.pkl | 用於估計感知相似性的標準 LPIPS 指標。 |
├ celebahq-classifier-00-male.pkl | 訓練二元分類器來偵測 CelebA-HQ 的單一屬性。 |
└⋯ | 請參閱剩餘網路的檔案清單。 |
所有資料(不包括 Flickr-Faces-HQ 資料集)均由 NVIDIA Corporation 根據 Creative Commons BY-NC 4.0 授權提供。您可以出於非商業目的使用、重新分發和改編這些材料,只要您引用我們的論文並註明您所做的任何更改來給予適當的認可。
有關 FFHQ 資料集的許可信息,請參閱 Flickr-Faces-HQ 儲存庫。
inception_v3_features.pkl
和inception_v3_softmax.pkl
源自 Christian Szegedy、Vincent Vanhoucke、Sergey Ioffe、Jonathon Shlens 和 Zbigniew Wojna 預訓練的 Inception-v3 網路。該網路最初是在 TensorFlow 模型儲存庫上根據 Apache 2.0 許可證共享的。
vgg16.pkl
和vgg16_zhang_perceptual.pkl
源自 Karen Simonyan 和 Andrew Zisserman 預訓練的 VGG-16 網路。該網路最初是在用於大規模視覺識別的非常深卷積網路專案頁面上根據 Creative Commons BY 4.0 授權共享的。
vgg16_zhang_perceptual.pkl
進一步源自 Richard Zhu、Phillip Isola、Alexei A. Efros、Eli Shechtman 和 Oliver Wang 預訓練的 LPIPS 權重。這些權重最初是在 PerceptualSimilarity 儲存庫上的 BSD 2-Clause「簡化」許可證下共享的。
Linux 和 Windows 均受支援,但出於效能和相容性原因,我們強烈建議使用 Linux。
64 位元 Python 3.6 安裝。我們推薦使用 Anaconda3 和 numpy 1.14.3 或更高版本。
TensorFlow 1.10.0 或更高版本,支援 GPU。
一個或多個具有至少 11GB DRAM 的高階 NVIDIA GPU。我們推薦配備 8 個 Tesla V100 GPU 的 NVIDIA DGX-1。
NVIDIA 驅動程式 391.35 或更高版本、CUDA 工具包 9.0 或更高版本、cuDNN 7.3.1 或更高版本。
pretrained_example.py 中給出了使用預訓練 StyleGAN 生成器的最小範例。執行時,該腳本會從 Google Drive 下載預先訓練的 StyleGAN 產生器,並使用它來產生圖像:
> python pretrained_example.py Downloading https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ .... done Gs Params OutputShape WeightShape --- --- --- --- latents_in - (?, 512) - ... images_out - (?, 3, 1024, 1024) - --- --- --- --- Total 26219627 > ls results example.png # https://drive.google.com/uc?id=1UDLT_zb-rof9kKH0GwiJW_bS9MoZi8oP
generate_figures.py 中給出了更高級的範例。該腳本重現了我們論文中的數據,以說明風格混合、雜訊輸入和截斷:
> python generate_figures.py results/figure02-uncurated-ffhq.png # https://drive.google.com/uc?id=1U3r1xgcD7o-Fd0SBRpq8PXYajm7_30cu results/figure03-style-mixing.png # https://drive.google.com/uc?id=1U-nlMDtpnf1RcYkaFQtbh5oxnhA97hy6 results/figure04-noise-detail.png # https://drive.google.com/uc?id=1UX3m39u_DTU6eLnEW6MqGzbwPFt2R9cG results/figure05-noise-components.png # https://drive.google.com/uc?id=1UQKPcvYVeWMRccGMbs2pPD9PVv1QDyp_ results/figure08-truncation-trick.png # https://drive.google.com/uc?id=1ULea0C12zGlxdDQFNLXOWZCHi3QNfk_v results/figure10-uncurated-bedrooms.png # https://drive.google.com/uc?id=1UEBnms1XMfj78OHj3_cx80mUf_m9DUJr results/figure11-uncurated-cars.png # https://drive.google.com/uc?id=1UO-4JtAs64Kun5vIj10UXqAJ1d5Ir1Ke results/figure12-uncurated-cats.png # https://drive.google.com/uc?id=1USnJc14prlu3QAYxstrtlfXC9sDWPA-W
預先訓練的網路作為標準 pickle 檔案儲存在 Google Drive 上:
# Load pre-trained network. url = 'https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ' # karras2019stylegan-ffhq-1024x1024.pkl with dnnlib.util.open_url(url, cache_dir=config.cache_dir) as f: _G, _D, Gs = pickle.load(f) # _G = Instantaneous snapshot of the generator. Mainly useful for resuming a previous training run. # _D = Instantaneous snapshot of the discriminator. Mainly useful for resuming a previous training run. # Gs = Long-term average of the generator. Yields higher-quality results than the instantaneous snapshot.
上面的程式碼下載該檔案並將其解封以產生 dnnlib.tflib.Network 的 3 個實例。要產生圖像,您通常需要使用Gs
為了完整性而提供了其他兩個網路。為了讓pickle.load()
運作,您需要在 PYTHONPATH 中設定dnnlib
來源目錄,並將tf.Session
設定為預設目錄。可以透過呼叫dnnlib.tflib.init_tf()
來初始化會話。
使用預訓練產生器的方式有以下三種:
使用Gs.run()
進行立即模式操作,其中輸入和輸出是 numpy 陣列:
# Pick latent vector. rnd = np.random.RandomState(5) latents = rnd.randn(1, Gs.input_shape[1]) # Generate image. fmt = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True) images = Gs.run(latents, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt)
第一個參數是一批形狀為[num, 512]
的潛在向量。第二個參數保留用於類別標籤(StyleGAN 不使用)。其餘的關鍵字參數是可選的,可用於進一步修改操作(見下文)。輸出是一批影像,其格式由output_transform
參數決定。
使用Gs.get_output_for()
將生成器合併為更大的 TensorFlow 表達式的一部分:
latents = tf.random_normal([self.minibatch_per_gpu] + Gs_clone.input_shape[1:]) images = Gs_clone.get_output_for(latents, None, is_validation=True, randomize_noise=True) images = tflib.convert_images_to_uint8(images) result_expr.append(inception_clone.get_output_for(images))
上面的程式碼來自metrics/frechet_inception_distance.py。它會產生一批隨機圖像並將它們直接輸入到 Inception-v3 網絡,而無需在中間將資料轉換為 numpy 數組。
尋找Gs.components.mapping
和Gs.components.synthesis
以存取生成器的各個子網路。與Gs
類似,子網路表示為 dnnlib.tflib.Network 的獨立實例:
src_latents = np.stack(np.random.RandomState(seed).randn(Gs.input_shape[1]) for seed in src_seeds) src_dlatents = Gs.components.mapping.run(src_latents, None) # [seed, layer, component] src_images = Gs.components.synthesis.run(src_dlatents, randomize_noise=False, **synthesis_kwargs)
上面的程式碼來自generate_figures.py。它首先使用映射網路將一批潛在向量轉換為中間W空間,然後使用合成網路將這些向量轉換為一批圖像。 dlatents
數組為合成網路的每一層儲存相同w向量的單獨副本,以方便風格混合。
生成器的確切細節在training/networks_stylegan.py中定義(請參閱G_style
、 G_mapping
和G_synthesis
)。可以指定下列關鍵字參數來修改呼叫run()
和get_output_for()
時的行為:
truncation_psi
和truncation_cutoff
控制使用Gs
時預設執行的截斷技巧(ψ=0.7,cutoff=8)。可以透過設定truncation_psi=1
或is_validation=True
來停用它,並且可以透過設定例如truncation_psi=0.5
以變更為代價進一步提高影像品質。請注意,直接使用子網路時始終會停用截斷。可以使用Gs.get_var('dlatent_avg')
來找出手動執行截斷技巧所需的平均w 。
randomize_noise
決定是否對每個產生的影像使用重新隨機化雜訊輸入( True
,預設值)或是否對整個小批量使用特定雜訊值( False
)。可以透過使用[var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
找到的tf.Variable
實例來存取特定值。
直接使用映射網路時,可以指定dlatent_broadcast=None
以停用在合成網路各層上自動複製dlatents
。
可以透過structure='fixed'
和dtype='float16'
微調運行時效能。前者禁用了對漸進增長的支持,這對於完全訓練的生成器來說是不需要的,後者使用半精度浮點算術執行所有計算。
訓練和評估腳本對儲存為多解析度 TFRecord 的資料集進行操作。每個數據集都由目錄表示,該目錄包含多種解析度的相同影像數據,以實現高效的串流傳輸。每個解析度都有一個單獨的 *.tfrecords 文件,如果資料集包含標籤,它們也會儲存在單獨的文件中。預設情況下,腳本期望在datasets/<NAME>/<NAME>-<RESOLUTION>.tfrecords
處找到資料集。可以透過編輯 config.py 來更改目錄:
result_dir = 'results' data_dir = 'datasets' cache_dir = 'cache'
若要取得 FFHQ 資料集 ( datasets/ffhq
),請參閱 Flickr-Faces-HQ 儲存庫。
若要取得 CelebA-HQ 資料集 ( datasets/celebahq
),請參閱 Progressive GAN 儲存庫。
若要取得其他資料集(包括 LSUN),請查閱對應的項目頁面。可以使用提供的 dataset_tool.py 將資料集轉換為多重解析度 TFRecord:
> python dataset_tool.py create_lsun datasets/lsun-bedroom-full ~/lsun/bedroom_lmdb --resolution 256 > python dataset_tool.py create_lsun_wide datasets/lsun-car-512x384 ~/lsun/car_lmdb --width 512 --height 384 > python dataset_tool.py create_lsun datasets/lsun-cat-full ~/lsun/cat_lmdb --resolution 256 > python dataset_tool.py create_cifar10 datasets/cifar10 ~/cifar10 > python dataset_tool.py create_from_images datasets/custom-dataset ~/custom-images
設定資料集後,您可以訓練自己的 StyleGAN 網絡,如下所示:
編輯 train.py 以透過取消註解或編輯特定行來指定資料集和訓練配置。
使用python train.py
運行訓練腳本。
結果將寫入新建立的目錄results/<ID>-<DESCRIPTION>
。
培訓可能需要幾天(或幾週)才能完成,具體取決於配置。
預設情況下, train.py
配置為使用 8 個 GPU 以 1024×1024 解析度為 FFHQ 資料集訓練最高品質的 StyleGAN(表 1 中的配置 F)。請注意,我們在所有實驗中都使用了 8 個 GPU。使用較少 GPU 進行訓練可能不會產生相同的結果 - 如果您想與我們的技術進行比較,我們強烈建議使用相同數量的 GPU。
使用 Tesla V100 GPU 的預設配置的預期訓練時間:
GPU | 1024×1024 | 512×512 | 256×256 |
---|---|---|---|
1 | 41天4小時 | 24天21小時 | 14天22小時 |
2 | 21天22小時 | 13天7小時 | 9天5小時 |
4 | 11天8小時 | 7天0小時 | 4天21小時 |
8 | 6天14小時 | 4天10小時 | 3天8小時 |
我們論文中使用的品質和解纏度量可以使用 run_metrics.py 進行評估。預設情況下,腳本將評估預先訓練 FFHQ 產生器的 Fréchet 起始距離 ( fid50k
),並將結果寫入results
下新建立的目錄。可以透過取消註解或編輯 run_metrics.py 中的特定行來更改確切的行為。
使用 Tesla V100 GPU 的預訓練 FFHQ 產生器的預期評估時間和結果:
公制 | 時間 | 結果 | 描述 |
---|---|---|---|
50k | 16分鐘 | 4.4159 | 使用 50,000 張影像的 Fréchet 起始距離。 |
ppl_zfull | 55分鐘 | 664.8854 | Z中完整路徑的感知路徑長度。 |
ppl_wfull | 55分鐘 | 233.3059 | W中完整路徑的感知路徑長度。 |
ppl_zend | 55分鐘 | 666.1057 | Z中路徑端點的感知路徑長度。 |
ppl_wend | 55分鐘 | 197.2266 | W中路徑端點的感知路徑長度。 |
LS | 10小時 | 號:165.0106 寬:3.7447 | Z和W的線性可分離性。 |
請注意,由於 TensorFlow 的不確定性,每次運行的確切結果可能會有所不同。
我們感謝 Jaakko Lehtinen、David Luebke 和 Tuomas Kynkäänniemi 的深入討論和有益的評論; Janne Hellsten、Tero Kuosmanen 和 Pekka Jänis 負責計算基礎設施並協助發布程式碼。