Bild: Diese Personen sind nicht real – sie wurden von unserem Generator erzeugt, der die Kontrolle über verschiedene Aspekte des Bildes ermöglicht.
Dieses Repository enthält die offizielle TensorFlow-Implementierung des folgenden Dokuments:
Eine stilbasierte Generatorarchitektur für generative gegnerische Netzwerke
Tero Karras (NVIDIA), Samuli Laine (NVIDIA), Timo Aila (NVIDIA)
https://arxiv.org/abs/1812.04948Zusammenfassung: Wir schlagen eine alternative Generatorarchitektur für generative kontradiktorische Netzwerke vor, die sich an der Literatur zum Stiltransfer orientiert. Die neue Architektur führt zu einer automatisch erlernten, unbeaufsichtigten Trennung von Attributen auf hoher Ebene (z. B. Pose und Identität beim Training an menschlichen Gesichtern) und stochastischer Variation in den generierten Bildern (z. B. Sommersprossen, Haare) und ermöglicht intuitive, skalierbare spezifische Steuerung der Synthese. Der neue Generator verbessert den Stand der Technik in Bezug auf traditionelle Verteilungsqualitätsmetriken, führt zu nachweislich besseren Interpolationseigenschaften und entwirrt auch die latenten Variationsfaktoren besser. Zur Quantifizierung der Interpolationsqualität und Entflechtung schlagen wir zwei neue, automatisierte Methoden vor, die auf jede Generatorarchitektur anwendbar sind. Abschließend stellen wir einen neuen, sehr vielfältigen und qualitativ hochwertigen Datensatz menschlicher Gesichter vor.
Für geschäftliche Anfragen besuchen Sie bitte unsere Website und senden Sie das Formular ab: NVIDIA Research Licensing
★★★ NEU: StyleGAN2-ADA-PyTorch ist jetzt verfügbar; Die vollständige Liste der Versionen finden Sie hier ★★★
Material zu unserem Artikel ist über die folgenden Links verfügbar:
Papier: https://arxiv.org/abs/1812.04948
Video: https://youtu.be/kSLJriaOumA
Code: https://github.com/NVlabs/stylegan
FFHQ: https://github.com/NVlabs/ffhq-dataset
Weiteres Material finden Sie auf Google Drive:
Weg | Beschreibung |
---|---|
StyleGAN | Hauptordner. |
├ stylegan-paper.pdf | Hochwertige Version des Papier-PDF. |
├ stylegan-video.mp4 | Hochwertige Version des Ergebnisvideos. |
├ Bilder | Beispielbilder, die mit unserem Generator erstellt wurden. |
│ ├ repräsentative Bilder | Hochwertige Bilder zur Verwendung in Artikeln, Blogbeiträgen usw. |
│ └ 100.000 generierte Bilder | 100.000 generierte Bilder für unterschiedliche Kürzungsgrade. |
│ ├ ffhq-1024x1024 | Erstellt mit dem Flickr-Faces-HQ-Datensatz bei 1024×1024. |
│ ├ Schlafzimmer-256x256 | Erstellt mit dem LSUN-Schlafzimmer-Datensatz bei 256 × 256. |
│ ├ Autos-512x384 | Erstellt mit dem LSUN Car-Datensatz bei 512×384. |
│ └ Katzen-256x256 | Erstellt mit dem LSUN Cat-Datensatz bei 256×256. |
├ Videos | Beispielvideos, die mit unserem Generator erstellt wurden. |
│ └ hochwertige Videoclips | Einzelne Segmente des Ergebnisvideos als hochwertiges MP4. |
├ ffhq-Datensatz | Rohdaten für den Flickr-Faces-HQ-Datensatz. |
└ Netzwerke | Vorab trainierte Netzwerke als ausgewählte Instanzen von dnnlib.tflib.Network. |
├ stylegan-ffhq-1024x1024.pkl | StyleGAN wurde mit dem Flickr-Faces-HQ-Datensatz bei 1024×1024 trainiert. |
├ stylegan-celebahq-1024x1024.pkl | StyleGAN wurde mit dem CelebA-HQ-Datensatz bei 1024×1024 trainiert. |
├ stylegan-schlafzimmer-256x256.pkl | StyleGAN wurde mit dem LSUN-Schlafzimmer-Datensatz bei 256×256 trainiert. |
├ stylegan-cars-512x384.pkl | StyleGAN wurde mit dem LSUN Car-Datensatz bei 512×384 trainiert. |
├ stylegan-cats-256x256.pkl | StyleGAN wurde mit dem LSUN Cat-Datensatz bei 256×256 trainiert. |
└ Metriken | Hilfsnetzwerke für die Qualitäts- und Entflechtungsmetriken. |
├ inception_v3_features.pkl | Standard-Inception-v3-Klassifikator, der einen Rohmerkmalsvektor ausgibt. |
├ vgg16_zhang_perceptual.pkl | Standard-LPIPS-Metrik zur Schätzung der Wahrnehmungsähnlichkeit. |
├ celebahq-classifier-00-male.pkl | Binärer Klassifikator, der darauf trainiert ist, ein einzelnes Attribut von CelebA-HQ zu erkennen. |
└ ⋯ | Weitere Netzwerke finden Sie in der Dateiliste. |
Sämtliches Material, mit Ausnahme des Flickr-Faces-HQ-Datensatzes, wird unter der Creative Commons BY-NC 4.0-Lizenz von NVIDIA Corporation zur Verfügung gestellt. Sie können das Material für nicht-kommerzielle Zwecke verwenden, weiterverbreiten und anpassen , sofern Sie die entsprechende Quellenangabe machen, indem Sie unser Dokument zitieren und alle von Ihnen vorgenommenen Änderungen angeben .
Lizenzinformationen zum FFHQ-Datensatz finden Sie im Flickr-Faces-HQ-Repository.
inception_v3_features.pkl
und inception_v3_softmax.pkl
sind aus dem vorab trainierten Inception-v3-Netzwerk von Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens und Zbigniew Wojna abgeleitet. Das Netzwerk wurde ursprünglich unter der Apache 2.0-Lizenz im TensorFlow Models-Repository geteilt.
vgg16.pkl
und vgg16_zhang_perceptual.pkl
sind aus dem vorab trainierten VGG-16-Netzwerk von Karen Simonyan und Andrew Zisserman abgeleitet. Das Netzwerk wurde ursprünglich unter der Creative Commons BY 4.0-Lizenz auf der Projektseite „Very Deep Convolutional Networks for Large-Scale Visual Recognition“ geteilt.
vgg16_zhang_perceptual.pkl
ist außerdem von den vorab trainierten LPIPS-Gewichten von Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman und Oliver Wang abgeleitet. Die Gewichtungen wurden ursprünglich unter der BSD 2-Clause „Simplified“-Lizenz im PerceptualSimilarity-Repository geteilt.
Sowohl Linux als auch Windows werden unterstützt, aus Leistungs- und Kompatibilitätsgründen empfehlen wir jedoch dringend Linux.
64-Bit-Python 3.6-Installation. Wir empfehlen Anaconda3 mit Numpy 1.14.3 oder neuer.
TensorFlow 1.10.0 oder neuer mit GPU-Unterstützung.
Eine oder mehrere High-End-NVIDIA-GPUs mit mindestens 11 GB DRAM. Wir empfehlen NVIDIA DGX-1 mit 8 Tesla V100 GPUs.
NVIDIA-Treiber 391.35 oder neuer, CUDA Toolkit 9.0 oder neuer, cuDNN 7.3.1 oder neuer.
Ein minimales Beispiel für die Verwendung eines vorab trainierten StyleGAN-Generators finden Sie in pretrained_example.py. Bei der Ausführung lädt das Skript einen vorab trainierten StyleGAN-Generator von Google Drive herunter und generiert damit ein Bild:
> 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
Ein fortgeschritteneres Beispiel finden Sie in „generate_figures.py“. Das Skript gibt die Zahlen aus unserer Arbeit wieder, um Stilmischungen, Rauscheingaben und Kürzungen zu veranschaulichen:
> 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
Die vorab trainierten Netzwerke werden als Standard-Pickle-Dateien auf Google Drive gespeichert:
# 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.
Der obige Code lädt die Datei herunter und entpackt sie, um drei Instanzen von dnnlib.tflib.Network zu erhalten. Zum Generieren von Bildern werden Sie normalerweise Gs
verwenden wollen – der Vollständigkeit halber werden die beiden anderen Netzwerke angegeben. Damit pickle.load()
funktioniert, müssen Sie das dnnlib
-Quellverzeichnis in Ihrem PYTHONPATH und eine tf.Session
als Standard festgelegt haben. Die Sitzung kann durch Aufruf von dnnlib.tflib.init_tf()
initialisiert werden.
Es gibt drei Möglichkeiten, den vorab trainierten Generator zu verwenden:
Verwenden Sie Gs.run()
für den Betrieb im Sofortmodus, bei dem die Ein- und Ausgänge Numpy-Arrays sind:
# 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)
Das erste Argument ist ein Stapel latenter Vektoren der Form [num, 512]
. Das zweite Argument ist für Klassenbezeichnungen reserviert (wird von StyleGAN nicht verwendet). Die übrigen Schlüsselwortargumente sind optional und können zur weiteren Modifikation der Operation verwendet werden (siehe unten). Die Ausgabe ist ein Stapel von Bildern, deren Format durch das Argument output_transform
bestimmt wird.
Verwenden Sie Gs.get_output_for()
um den Generator als Teil eines größeren TensorFlow-Ausdrucks einzubinden:
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))
Der obige Code stammt von metrics/frechet_inception_distance.py. Es generiert einen Stapel zufälliger Bilder und leitet sie direkt an das Inception-v3-Netzwerk weiter, ohne dass die Daten zwischendurch in Numpy-Arrays konvertiert werden müssen.
Suchen Sie nach Gs.components.mapping
und Gs.components.synthesis
um auf einzelne Subnetzwerke des Generators zuzugreifen. Ähnlich wie bei Gs
werden die Subnetzwerke als unabhängige Instanzen von dnnlib.tflib.Network dargestellt:
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)
Der obige Code stammt von generic_figures.py. Es transformiert zunächst mithilfe des Mapping-Netzwerks einen Stapel latenter Vektoren in den Zwischen- W -Raum und wandelt diese Vektoren dann mithilfe des Synthesenetzwerks in einen Stapel Bilder um. Das dlatents
-Array speichert eine separate Kopie desselben w -Vektors für jede Schicht des Synthesenetzwerks, um das Mischen von Stilen zu erleichtern.
Die genauen Details des Generators sind in training/networks_stylegan.py definiert (siehe G_style
, G_mapping
und G_synthesis
). Die folgenden Schlüsselwortargumente können angegeben werden, um das Verhalten beim Aufruf von run()
und get_output_for()
zu ändern:
truncation_psi
und truncation_cutoff
steuern den Kürzungstrick, der standardmäßig ausgeführt wird, wenn Gs
(ψ=0,7, Cutoff=8) verwendet wird. Es kann deaktiviert werden, indem man truncation_psi=1
oder is_validation=True
setzt, und die Bildqualität kann auf Kosten der Variation weiter verbessert werden, indem man z. B. truncation_psi=0.5
setzt. Beachten Sie, dass die Kürzung immer deaktiviert ist, wenn die Subnetzwerke direkt verwendet werden. Das durchschnittliche w , das zur manuellen Durchführung des Kürzungstricks benötigt wird, kann mit Gs.get_var('dlatent_avg')
nachgeschlagen werden.
randomize_noise
bestimmt, ob die Rauscheingaben für jedes generierte Bild erneut randomisiert werden sollen ( True
, Standard) oder ob bestimmte Rauschwerte für den gesamten Minibatch verwendet werden sollen ( False
). Auf die spezifischen Werte kann über die tf.Variable
-Instanzen zugegriffen werden, die mit [var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
gefunden werden.
Wenn Sie das Mapping-Netzwerk direkt verwenden, können Sie dlatent_broadcast=None
angeben, um die automatische Duplizierung von dlatents
über die Schichten des Synthesenetzwerks zu deaktivieren.
Die Laufzeitleistung kann über structure='fixed'
und dtype='float16'
fein abgestimmt werden. Ersteres deaktiviert die Unterstützung für progressives Wachstum, was für einen vollständig trainierten Generator nicht erforderlich ist, und letzteres führt alle Berechnungen mit Gleitkommaarithmetik halber Genauigkeit durch.
Die Trainings- und Bewertungsskripte arbeiten mit Datensätzen, die als TFRecords mit mehreren Auflösungen gespeichert sind. Jeder Datensatz wird durch ein Verzeichnis dargestellt, das dieselben Bilddaten in mehreren Auflösungen enthält, um ein effizientes Streaming zu ermöglichen. Für jede Auflösung gibt es eine separate *.tfrecords-Datei. Wenn der Datensatz Beschriftungen enthält, werden diese ebenfalls in einer separaten Datei gespeichert. Standardmäßig erwarten die Skripte, die Datensätze unter datasets/<NAME>/<NAME>-<RESOLUTION>.tfrecords
zu finden. Das Verzeichnis kann durch Bearbeiten von config.py geändert werden:
result_dir = 'results' data_dir = 'datasets' cache_dir = 'cache'
Um den FFHQ-Datensatz ( datasets/ffhq
) zu erhalten, lesen Sie bitte das Flickr-Faces-HQ-Repository.
Um den CelebA-HQ-Datensatz ( datasets/celebahq
) zu erhalten, lesen Sie bitte das Progressive GAN-Repository.
Um andere Datensätze, einschließlich LSUN, zu erhalten, konsultieren Sie bitte die entsprechenden Projektseiten. Die Datensätze können mit dem bereitgestellten dataset_tool.py in TFRecords mit mehreren Auflösungen konvertiert werden:
> 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
Sobald die Datensätze eingerichtet sind, können Sie Ihre eigenen StyleGAN-Netzwerke wie folgt trainieren:
Bearbeiten Sie train.py, um den Datensatz und die Trainingskonfiguration anzugeben, indem Sie bestimmte Zeilen auskommentieren oder bearbeiten.
Führen Sie das Trainingsskript mit python train.py
aus.
Die Ergebnisse werden in ein neu erstelltes Verzeichnis results/<ID>-<DESCRIPTION>
geschrieben.
Die Schulung kann je nach Konfiguration mehrere Tage (oder Wochen) dauern.
Standardmäßig ist train.py
so konfiguriert, dass das StyleGAN höchster Qualität (Konfiguration F in Tabelle 1) für den FFHQ-Datensatz mit einer Auflösung von 1024 x 1024 und 8 GPUs trainiert wird. Bitte beachten Sie, dass wir in allen unseren Experimenten 8 GPUs verwendet haben. Das Training mit weniger GPUs führt möglicherweise nicht zu identischen Ergebnissen. Wenn Sie mit unserer Technik vergleichen möchten, empfehlen wir dringend, die gleiche Anzahl an GPUs zu verwenden.
Erwartete Trainingszeiten für die Standardkonfiguration mit Tesla V100-GPUs:
GPUs | 1024×1024 | 512×512 | 256×256 |
---|---|---|---|
1 | 41 Tage 4 Stunden | 24 Tage 21 Stunden | 14 Tage 22 Stunden |
2 | 21 Tage 22 Stunden | 13 Tage 7 Stunden | 9 Tage 5 Stunden |
4 | 11 Tage 8 Stunden | 7 Tage 0 Stunden | 4 Tage 21 Stunden |
8 | 6 Tage 14 Stunden | 4 Tage 10 Stunden | 3 Tage 8 Stunden |
Die in unserem Artikel verwendeten Qualitäts- und Entflechtungsmetriken können mit run_metrics.py ausgewertet werden. Standardmäßig wertet das Skript die Fréchet Inception Distance ( fid50k
) für den vorab trainierten FFHQ-Generator aus und schreibt die Ergebnisse in ein neu erstelltes Verzeichnis unter results
. Das genaue Verhalten kann geändert werden, indem bestimmte Zeilen in run_metrics.py auskommentiert oder bearbeitet werden.
Erwartete Evaluierungszeit und Ergebnisse für den vorab trainierten FFHQ-Generator mit einer Tesla V100-GPU:
Metrisch | Zeit | Ergebnis | Beschreibung |
---|---|---|---|
fid50k | 16 Min | 4.4159 | Fréchet-Anfangsentfernung anhand von 50.000 Bildern. |
ppl_zfull | 55 Min | 664.8854 | Wahrnehmungspfadlänge für vollständige Pfade in Z. |
ppl_wfull | 55 Min | 233.3059 | Wahrnehmungspfadlänge für vollständige Pfade in W. |
ppl_zend | 55 Min | 666.1057 | Wahrnehmungspfadlänge für Pfadendpunkte in Z. |
ppl_wend | 55 Min | 197.2266 | Wahrnehmungspfadlänge für Pfadendpunkte in W. |
ls | 10 Stunden | z: 165.0106 B: 3,7447 | Lineare Trennbarkeit in Z und W. |
Bitte beachten Sie, dass die genauen Ergebnisse aufgrund der nichtdeterministischen Natur von TensorFlow von Lauf zu Lauf variieren können.
Wir danken Jaakko Lehtinen, David Luebke und Tuomas Kynkäänniemi für ausführliche Diskussionen und hilfreiche Kommentare; Janne Hellsten, Tero Kuosmanen und Pekka Jänis für die Recheninfrastruktur und Hilfe bei der Codefreigabe.