Gambar: Orang-orang ini tidak nyata – mereka diproduksi oleh generator kami yang memungkinkan kontrol atas berbagai aspek gambar.
Repositori ini berisi implementasi TensorFlow resmi dari makalah berikut:
Arsitektur Generator Berbasis Gaya untuk Jaringan Adversarial Generatif
Tero Karras (NVIDIA), Samuli Laine (NVIDIA), Timo Aila (NVIDIA)
https://arxiv.org/abs/1812.04948Abstrak: Kami mengusulkan arsitektur generator alternatif untuk jaringan permusuhan generatif, meminjam dari literatur transfer gaya. Arsitektur baru ini mengarah pada pemisahan atribut tingkat tinggi yang dipelajari secara otomatis dan tanpa pengawasan (misalnya, pose dan identitas ketika dilatih pada wajah manusia) dan variasi stokastik dalam gambar yang dihasilkan (misalnya, bintik-bintik, rambut), dan memungkinkan intuitif, skala- kontrol khusus sintesis. Generator baru ini meningkatkan kecanggihan dalam hal metrik kualitas distribusi tradisional, menghasilkan sifat interpolasi yang terbukti lebih baik, dan juga menguraikan faktor-faktor laten variasi dengan lebih baik. Untuk mengukur kualitas interpolasi dan penguraian, kami mengusulkan dua metode otomatis baru yang dapat diterapkan pada arsitektur generator apa pun. Terakhir, kami memperkenalkan kumpulan data wajah manusia yang baru, sangat bervariasi, dan berkualitas tinggi.
Untuk pertanyaan bisnis, silakan kunjungi situs web kami dan kirimkan formulir: Lisensi Penelitian NVIDIA
★★★ BARU: StyleGAN2-ADA-PyTorch kini tersedia; lihat daftar lengkap versinya di sini ★★★
Materi terkait makalah kami tersedia melalui tautan berikut:
Makalah: https://arxiv.org/abs/1812.04948
Video: https://youtu.be/kSLJriaOumA
Kode: https://github.com/NVlabs/stylegan
FFHQ: https://github.com/NVlabs/ffhq-dataset
Materi tambahan dapat ditemukan di Google Drive:
Jalur | Keterangan |
---|---|
GayaGAN | Folder utama. |
├ stylegan-kertas.pdf | Versi kertas PDF berkualitas tinggi. |
├ stylegan-video.mp4 | Versi video hasil berkualitas tinggi. |
├ gambar | Contoh gambar yang dihasilkan menggunakan generator kami. |
│ ├ gambar representatif | Gambar berkualitas tinggi untuk digunakan dalam artikel, postingan blog, dll. |
│ └ 100 ribu gambar yang dihasilkan | 100.000 gambar yang dihasilkan untuk jumlah pemotongan yang berbeda. |
│ ├ ffhq-1024x1024 | Dihasilkan menggunakan kumpulan data Flickr-Faces-HQ pada 1024×1024. |
│ ├ kamar tidur-256x256 | Dihasilkan menggunakan kumpulan data LSUN Bedroom pada 256×256. |
│ ├ mobil-512x384 | Dihasilkan menggunakan dataset LSUN Car pada 512×384. |
│ └ kucing-256x256 | Dihasilkan menggunakan dataset LSUN Cat pada 256×256. |
├ video | Contoh video yang diproduksi menggunakan generator kami. |
│ └ klip video berkualitas tinggi | Segmen individual dari video hasil sebagai MP4 berkualitas tinggi. |
├ kumpulan data ffhq | Data mentah untuk kumpulan data Flickr-Faces-HQ. |
└ jaringan | Jaringan yang telah dilatih sebelumnya sebagai contoh acar dari dnnlib.tflib.Network. |
├ stylegan-ffhq-1024x1024.pkl | StyleGAN dilatih dengan kumpulan data Flickr-Faces-HQ pada 1024×1024. |
├ stylegan-celebahq-1024x1024.pkl | StyleGAN dilatih dengan kumpulan data CelebA-HQ pada 1024×1024. |
├ stylegan-kamar tidur-256x256.pkl | StyleGAN dilatih dengan kumpulan data LSUN Bedroom pada 256×256. |
├ stylegan-cars-512x384.pkl | StyleGAN dilatih dengan dataset LSUN Car pada 512×384. |
├ stylegan-cats-256x256.pkl | StyleGAN dilatih dengan kumpulan data LSUN Cat pada 256×256. |
└ metrik | Jaringan tambahan untuk metrik kualitas dan penguraian. |
├ permulaan_v3_features.pkl | Pengklasifikasi Standar Inception-v3 yang menghasilkan vektor fitur mentah. |
├ vgg16_zhang_perseptual.pkl | Metrik LPIPS standar untuk memperkirakan kesamaan persepsi. |
├ celebahq-classifier-00-male.pkl | Pengklasifikasi biner dilatih untuk mendeteksi satu atribut CelebA-HQ. |
└ ⋯ | Silakan lihat daftar file untuk jaringan yang tersisa. |
Semua materi, kecuali kumpulan data Flickr-Faces-HQ, tersedia di bawah lisensi Creative Commons BY-NC 4.0 oleh NVIDIA Corporation. Anda dapat menggunakan, mendistribusikan ulang, dan mengadaptasi materi untuk tujuan non-komersial , selama Anda memberikan penghargaan yang sesuai dengan mengutip makalah kami dan menunjukkan perubahan apa pun yang telah Anda buat.
Untuk informasi lisensi mengenai kumpulan data FFHQ, silakan lihat repositori Flickr-Faces-HQ.
inception_v3_features.pkl
dan inception_v3_softmax.pkl
berasal dari jaringan Inception-v3 yang telah dilatih sebelumnya oleh Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, dan Zbigniew Wojna. Jaringan ini awalnya dibagikan di bawah lisensi Apache 2.0 pada repositori Model TensorFlow.
vgg16.pkl
dan vgg16_zhang_perceptual.pkl
berasal dari jaringan VGG-16 yang telah dilatih sebelumnya oleh Karen Simonyan dan Andrew Zisserman. Jaringan ini awalnya dibagikan di bawah lisensi Creative Commons BY 4.0 di halaman proyek Jaringan Konvolusional Sangat Dalam untuk Pengenalan Visual Skala Besar.
vgg16_zhang_perceptual.pkl
selanjutnya diturunkan dari beban LPIPS yang telah dilatih sebelumnya oleh Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, dan Oliver Wang. Bobot awalnya dibagikan di bawah Lisensi "Sederhana" Klausul 2 BSD pada repositori PerceptualSimilarity.
Linux dan Windows keduanya didukung, namun kami sangat menyarankan Linux karena alasan kinerja dan kompatibilitas.
Instalasi Python 3.6 64-bit. Kami merekomendasikan Anaconda3 dengan numpy 1.14.3 atau lebih baru.
TensorFlow 1.10.0 atau lebih baru dengan dukungan GPU.
Satu atau lebih GPU NVIDIA kelas atas dengan DRAM minimal 11 GB. Kami merekomendasikan NVIDIA DGX-1 dengan 8 GPU Tesla V100.
Driver NVIDIA 391.35 atau lebih baru, CUDA toolkit 9.0 atau lebih baru, cuDNN 7.3.1 atau lebih baru.
Contoh minimal penggunaan generator StyleGAN terlatih diberikan di pretrained_example.py. Saat dijalankan, skrip mengunduh generator StyleGAN terlatih dari Google Drive dan menggunakannya untuk menghasilkan gambar:
> 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
Contoh lebih lanjut diberikan di generate_figures.py. Skrip mereproduksi gambar dari makalah kami untuk mengilustrasikan pencampuran gaya, masukan kebisingan, dan pemotongan:
> 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
Jaringan terlatih disimpan sebagai file acar standar di 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.
Kode di atas mengunduh file dan menghapusnya untuk menghasilkan 3 instance dnnlib.tflib.Network. Untuk menghasilkan gambar, Anda biasanya ingin menggunakan Gs
– dua jaringan lainnya disediakan untuk kelengkapan. Agar pickle.load()
berfungsi, Anda harus memiliki direktori sumber dnnlib
di PYTHONPATH Anda dan tf.Session
ditetapkan sebagai default. Sesi dapat diinisialisasi dengan memanggil dnnlib.tflib.init_tf()
.
Ada tiga cara untuk menggunakan generator terlatih:
Gunakan Gs.run()
untuk operasi mode langsung yang input dan outputnya berupa array 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)
Argumen pertama adalah kumpulan vektor laten berbentuk [num, 512]
. Argumen kedua dicadangkan untuk label kelas (tidak digunakan oleh StyleGAN). Argumen kata kunci yang tersisa bersifat opsional dan dapat digunakan untuk memodifikasi operasi lebih lanjut (lihat di bawah). Outputnya adalah kumpulan gambar, yang formatnya ditentukan oleh argumen output_transform
.
Gunakan Gs.get_output_for()
untuk menggabungkan generator sebagai bagian dari ekspresi TensorFlow yang lebih besar:
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))
Kode di atas berasal dari metrics/frachet_inception_distance.py. Ini menghasilkan sekumpulan gambar acak dan memasukkannya langsung ke jaringan Inception-v3 tanpa harus mengonversi data menjadi array numpy di antaranya.
Cari Gs.components.mapping
dan Gs.components.synthesis
untuk mengakses masing-masing subjaringan generator. Mirip dengan Gs
, sub-jaringan direpresentasikan sebagai instance independen dari 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)
Kode di atas berasal dari generate_figures.py. Pertama-tama ia mengubah sekumpulan vektor laten menjadi ruang W perantara menggunakan jaringan pemetaan dan kemudian mengubah vektor-vektor ini menjadi kumpulan gambar menggunakan jaringan sintesis. Array dlatents
menyimpan salinan terpisah dari vektor w yang sama untuk setiap lapisan jaringan sintesis untuk memfasilitasi pencampuran gaya.
Detail persis generator ditentukan di training/networks_stylegan.py (lihat G_style
, G_mapping
, dan G_synthesis
). Argumen kata kunci berikut dapat ditentukan untuk mengubah perilaku saat memanggil run()
dan get_output_for()
:
truncation_psi
dan truncation_cutoff
mengontrol trik pemotongan yang dilakukan secara default saat menggunakan Gs
(ψ=0.7, cutoff=8). Ini dapat dinonaktifkan dengan menyetel truncation_psi=1
atau is_validation=True
, dan kualitas gambar dapat ditingkatkan lebih lanjut dengan mengorbankan variasi dengan menyetel misalnya truncation_psi=0.5
. Perhatikan bahwa pemotongan selalu dinonaktifkan saat menggunakan subjaringan secara langsung. Rata-rata w yang diperlukan untuk melakukan trik pemotongan secara manual dapat dicari menggunakan Gs.get_var('dlatent_avg')
.
randomize_noise
menentukan apakah akan menggunakan pengacakan ulang input noise untuk setiap gambar yang dihasilkan ( True
, default) atau apakah akan menggunakan nilai noise tertentu untuk keseluruhan minibatch ( False
). Nilai spesifik dapat diakses melalui instance tf.Variable
yang ditemukan menggunakan [var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
.
Saat menggunakan jaringan pemetaan secara langsung, Anda dapat menentukan dlatent_broadcast=None
untuk menonaktifkan duplikasi otomatis dlatents
pada lapisan jaringan sintesis.
Performa runtime dapat disesuaikan melalui structure='fixed'
dan dtype='float16'
. Yang pertama menonaktifkan dukungan untuk pertumbuhan progresif, yang tidak diperlukan untuk generator yang terlatih penuh, dan yang terakhir melakukan semua komputasi menggunakan aritmatika floating point setengah presisi.
Skrip pelatihan dan evaluasi beroperasi pada kumpulan data yang disimpan sebagai TFRecords multi-resolusi. Setiap kumpulan data diwakili oleh direktori yang berisi data gambar yang sama dalam beberapa resolusi untuk memungkinkan streaming yang efisien. Ada file *.tfrecords terpisah untuk setiap resolusi, dan jika kumpulan data berisi label, maka file tersebut juga disimpan dalam file terpisah. Secara default, skrip berharap menemukan kumpulan data di datasets/<NAME>/<NAME>-<RESOLUTION>.tfrecords
. Direktori dapat diubah dengan mengedit config.py:
result_dir = 'results' data_dir = 'datasets' cache_dir = 'cache'
Untuk mendapatkan kumpulan data FFHQ ( datasets/ffhq
), silakan merujuk ke repositori Flickr-Faces-HQ.
Untuk mendapatkan kumpulan data CelebA-HQ ( datasets/celebahq
), silakan merujuk ke repositori Progressive GAN.
Untuk mendapatkan kumpulan data lain, termasuk LSUN, silakan lihat halaman proyek terkait. Kumpulan data dapat dikonversi ke TFRecords multi-resolusi menggunakan dataset_tool.py yang disediakan:
> 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
Setelah kumpulan data disiapkan, Anda dapat melatih jaringan StyleGAN Anda sendiri sebagai berikut:
Edit train.py untuk menentukan kumpulan data dan konfigurasi pelatihan dengan menghapus komentar atau mengedit baris tertentu.
Jalankan skrip pelatihan dengan python train.py
.
Hasilnya ditulis ke direktori yang baru dibuat results/<ID>-<DESCRIPTION>
.
Pelatihan mungkin memerlukan waktu beberapa hari (atau minggu) untuk diselesaikan, bergantung pada konfigurasinya.
Secara default, train.py
dikonfigurasi untuk melatih StyleGAN kualitas tertinggi (konfigurasi F pada Tabel 1) untuk kumpulan data FFHQ pada resolusi 1024×1024 menggunakan 8 GPU. Harap dicatat bahwa kami telah menggunakan 8 GPU dalam semua percobaan kami. Pelatihan dengan GPU yang lebih sedikit mungkin tidak memberikan hasil yang sama – jika Anda ingin membandingkan dengan teknik kami, kami sangat menyarankan penggunaan jumlah GPU yang sama.
Waktu pelatihan yang diharapkan untuk konfigurasi default menggunakan GPU Tesla V100:
GPU | 1024×1024 | 512×512 | 256×256 |
---|---|---|---|
1 | 41 hari 4 jam | 24 hari 21 jam | 14 hari 22 jam |
2 | 21 hari 22 jam | 13 hari 7 jam | 9 hari 5 jam |
4 | 11 hari 8 jam | 7 hari 0 jam | 4 hari 21 jam |
8 | 6 hari 14 jam | 4 hari 10 jam | 3 hari 8 jam |
Metrik kualitas dan penguraian yang digunakan dalam makalah kami dapat dievaluasi menggunakan run_metrics.py. Secara default, skrip akan mengevaluasi Fréchet Inception Distance ( fid50k
) untuk generator FFHQ terlatih dan menulis hasilnya ke direktori yang baru dibuat di bawah results
. Perilaku sebenarnya dapat diubah dengan menghapus komentar atau mengedit baris tertentu di run_metrics.py.
Perkiraan waktu dan hasil evaluasi untuk generator FFHQ terlatih menggunakan satu GPU Tesla V100:
Metrik | Waktu | Hasil | Keterangan |
---|---|---|---|
fid50k | 16 menit | 4.4159 | Jarak Awal Fréchet menggunakan 50.000 gambar. |
ppl_zfull | 55 menit | 664.8854 | Panjang Jalur Perseptual untuk jalur lengkap di Z . |
ppl_wfull | 55 menit | 233.3059 | Panjang Jalur Perseptual untuk jalur penuh di W . |
ppl_zend | 55 menit | 666.1057 | Panjang Jalur Perseptual untuk titik akhir jalur di Z . |
ppl_wend | 55 menit | 197.2266 | Panjang Jalur Perseptual untuk titik akhir jalur di W . |
aku | 10 jam | z: 165.0106 w: 3,7447 | Keterpisahan Linier di Z dan W . |
Harap perhatikan bahwa hasil pastinya mungkin berbeda dari satu proses ke proses lainnya karena sifat TensorFlow yang non-deterministik.
Kami berterima kasih kepada Jaakko Lehtinen, David Luebke, dan Tuomas Kynkäänniemi atas diskusi mendalam dan komentar bermanfaat; Janne Hellsten, Tero Kuosmanen, dan Pekka Jänis untuk infrastruktur komputasi dan bantuan dalam rilis kode.