Stanislav Pidhorskyi • Donald A. Adjeroh • Gianfranco Doretto
Google Drive-Ordner mit Modellen und qualitativen Ergebnissen
Widersprüchliche latente Autoencoder
Stanislav Pidhorskyi, Donald Adjeroh, Gianfranco DorettoZusammenfassung: Autoencoder-Netzwerke sind unbeaufsichtigte Ansätze, die darauf abzielen, generative und repräsentative Eigenschaften durch gleichzeitiges Lernen einer Encoder-Generator-Karte zu kombinieren. Obwohl ausführlich untersucht, wurde die Frage, ob sie über die gleiche generative Kraft wie GANs verfügen oder entwirrte Darstellungen lernen, nicht vollständig geklärt. Wir stellen einen Autoencoder vor, der diese Probleme gemeinsam angeht, den wir Adversarial Latent Autoencoder (ALAE) nennen. Es handelt sich um eine allgemeine Architektur, die jüngste Verbesserungen der GAN-Trainingsverfahren nutzen kann. Wir haben zwei Autoencoder entwickelt: einen basierend auf einem MLP-Encoder und einen anderen basierend auf einem StyleGAN-Generator, den wir StyleALAE nennen. Wir überprüfen die Entflechtungseigenschaften beider Architekturen. Wir zeigen, dass StyleALAE nicht nur 1024x1024-Gesichtsbilder mit vergleichbarer Qualität wie StyleGAN erzeugen kann, sondern bei gleicher Auflösung auch Gesichtsrekonstruktionen und -manipulationen auf Basis realer Bilder erstellen kann. Dies macht ALAE zum ersten Autoencoder, der mit einer reinen Generatorarchitektur vergleichbar ist und deren Fähigkeiten übertrifft.
@InProceedings{pidhorskyi2020adversarial,
author = {Pidhorskyi, Stanislav and Adjeroh, Donald A and Doretto, Gianfranco},
booktitle = {Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR)},
title = {Adversarial Latent Autoencoders},
year = {2020},
note = {[to appear]},
}
Um die Demo auszuführen, müssen Sie eine CUDA-fähige GPU, PyTorch >= v1.3.1 und cuda/cuDNN-Treiber installiert haben. Installieren Sie die erforderlichen Pakete:
pip install -r requirements.txt
Laden Sie vorab trainierte Modelle herunter:
python training_artifacts/download_all.py
Führen Sie die Demo aus:
python interactive_demo.py
Sie können die zu verwendende Yaml -Konfiguration angeben. Konfigurationen finden Sie hier: https://github.com/podgorskiy/ALAE/tree/master/configs. Standardmäßig wird einer für den FFHQ-Datensatz verwendet. Sie können die Konfiguration mit dem Parameter -c
ändern. Um auf celeb-hq
in einer Auflösung von 256 x 256 zu laufen, führen Sie Folgendes aus:
python interactive_demo.py -c celeba-hq256
Für andere Konfigurationen als FFHQ müssen Sie jedoch neue Hauptrichtungsvektoren für die Attribute erhalten.
Der Code im Repository ist so organisiert, dass alle Skripte im Stammverzeichnis des Repositorys ausgeführt werden müssen. Wenn Sie eine IDE (z. B. PyCharm oder Visual Studio Code) verwenden, legen Sie das Arbeitsverzeichnis einfach so fest, dass es auf das Stammverzeichnis des Repositorys verweist.
Wenn Sie über die Befehlszeile ausführen möchten, müssen Sie auch die Variable PYTHONPATH so festlegen, dass sie auf das Stammverzeichnis des Repositorys verweist.
Nehmen wir zum Beispiel an, wir haben das Repository in das Verzeichnis ~/ALAE geklont und gehen dann wie folgt vor:
$ cd ~/ALAE
$ export PYTHONPATH=$PYTHONPATH:$(pwd)
Jetzt können Sie Skripte wie folgt ausführen:
$ python style_mixing/stylemix.py
Weg | Beschreibung |
---|---|
ALAE | Repository-Stammordner |
├ Konfigurationen | Ordner mit Yaml-Konfigurationsdateien. |
│ ├ Schlafzimmer.yaml | Konfigurationsdatei für den LSUN-Schlafzimmerdatensatz mit einer Auflösung von 256 x 256. |
│ ├ celeba.yaml | Konfigurationsdatei für CelebA-Datensatz mit einer Auflösung von 128 x 128. |
│ ├ celeba-hq256.yaml | Konfigurationsdatei für den CelebA-HQ-Datensatz mit einer Auflösung von 256 x 256. |
│ ├ celeba_ablation_nostyle.yaml | Konfigurationsdatei für CelebA 128x128-Datensatz für Ablationsstudie (keine Stile). |
│ ├ celeba_ablation_separate.yaml | Konfigurationsdatei für CelebA 128x128-Datensatz für Ablationsstudie (separater Encoder und Diskriminator). |
│ ├ celeba_ablation_z_reg.yaml | Konfigurationsdatei für CelebA 128x128-Datensatz für Ablationsstudie (Regress im Z-Raum, nicht W). |
│ ├ ffhq.yaml | Konfigurationsdatei für FFHQ-Datensatz mit einer Auflösung von 1024 x 1024. |
│ ├ mnist.yaml | Konfigurationsdatei für MNIST-Datensatz mit Style-Architektur. |
│ └ mnist_fc.yaml | Konfigurationsdatei für den MNIST-Datensatz, der nur vollständig verbundene Schichten verwendet (Permutation Invariant MNIST). |
├ dataset_preparation | Ordner mit Skripten zur Datensatzvorbereitung. |
│ ├ Prepare_celeba_hq_tfrec.py | Zur Vorbereitung von TFRecords für den CelebA-HQ-Datensatz mit einer Auflösung von 256 x 256. |
│ ├ Prepare_celeba_tfrec.py | Zur Vorbereitung von TFRecords für den CelebA-Datensatz mit einer Auflösung von 128 x 128. |
│ ├ Prepare_mnist_tfrec.py | Zur Vorbereitung von TFRecords für den MNIST-Datensatz. |
│ ├ split_tfrecords_schlafzimmer.py | Um offizielle TFRecords aus StyleGAN-Papier für den LSUN-Schlafzimmerdatensatz aufzuteilen. |
│ └ split_tfrecords_ffhq.py | Um offizielle TFRecords aus StyleGAN-Papier für den FFHQ-Datensatz aufzuteilen. |
├ dataset_samples | Ordner mit Beispieleingaben für verschiedene Datensätze. Wird für Zahlen und für Testeingaben während des Trainings verwendet. |
├ make_figures | Skripte zur Herstellung verschiedener Figuren. |
├ Metriken | Skripte zur Berechnung von Metriken. |
├ Principal_Directions | Skripte zur Berechnung von Hauptrichtungsvektoren für verschiedene Attribute. Zur interaktiven Demo . |
├ style_mixing | Beispieleingaben und Skript zur Erstellung stilvermischender Figuren. |
├ Training_Artefakte | Standardspeicherort für Prüfpunkte/Beispielausgaben/Plots. |
│ └ download_all.py | Skript zum Herunterladen aller vorab trainierten Modelle. |
├ Interactive_demo.py | Ausführbares Skript für interaktive Demo. |
├ train_alae.py | Ausführbares Skript für das Training. |
├ train_alae_separate.py | Ausführbares Skript für das Training für Ablationsstudien (separater Encoder und Diskriminator). |
├ checkpointer.py | Modul zum Speichern/Wiederherstellen von Modellgewichten, Optimiererstatus und Verlustverlauf. |
├ custom_adam.py | Angepasster Adam-Optimierer für Lernratenausgleich und Null-Sekunden-Beta. |
├ dataloader.py | Modul mit Datensatzklassen, Loadern, Iteratoren usw. |
├ defaults.py | Definition für Konfigurationsvariablen mit Standardwerten. |
├ launcher.py | Helfer zum Ausführen von Multi-GPU- und Multiprozess-Training. Richtet Konfiguration und Protokollierung ein. |
├ lod_driver.py | Hilfsklasse zur Verwaltung wachsender/stabilisierender Netzwerke. |
├ lreq.py | Benutzerdefinierte Linear , Conv2d und ConvTranspose2d -Module für den Lernratenausgleich. |
├ model.py | Modul mit High-Level-Modelldefinition. |
├ model_separate.py | Wie oben, jedoch für Ablationsstudien. |
├ net.py | Definition aller Netzwerkblöcke für mehrere Architekturen. |
├ Registry.py | Registrierung von Netzwerkblöcken zur Auswahl aus der Konfigurationsdatei. |
├ Scheduler.py | Benutzerdefinierte Planer mit Warmstart und Aggregation mehrerer Optimierer. |
├ tracker.py | Modul zur Darstellung von Verlusten. |
└ utils.py | Dekorator für asynchrone Aufrufe, Dekorator für Caching, Registrierung für Netzwerkblöcke. |
In dieser Codebasis wird Yacs zum Verwalten von Konfigurationen verwendet.
Die meisten ausführbaren Skripte akzeptieren den Parameter -c
, der die zu verwendenden Konfigurationsdateien angeben kann. Um beispielsweise Rekonstruktionsfiguren zu erstellen, können Sie Folgendes ausführen:
python make_figures/make_recon_figure_paged.py
python make_figures/make_recon_figure_paged.py -c celeba
python make_figures/make_recon_figure_paged.py -c celeba-hq256
python make_figures/make_recon_figure_paged.py -c bedroom
Die Standardkonfiguration ist ffhq
.
Das Training erfolgt mit TFRecords. TFRecords werden mit DareBlopy gelesen, was die Verwendung mit Pytorch ermöglicht.
In Konfigurationsdateien sowie in allen Vorbereitungsskripten wird davon ausgegangen, dass sich alle Datensätze in /data/datasets/
befinden. Sie können entweder den Pfad in den Konfigurationsdateien ändern oder einen symbolischen Link zu dem Ort erstellen, an dem Sie Datensätze speichern.
Der offizielle Weg zur Generierung von CelebA-HQ kann eine Herausforderung sein. Bitte beachten Sie diese Seite: https://github.com/suvojit-0x55aa/celebA-HQ-dataset-download Sie können den vorgenerierten Datensatz erhalten von: https://drive.google.com/drive/folders/11Vz0fqHS2rXDb5pprgTjpD7S2BAJhi1P
Um vorab trainierte Modelle herunterzuladen, führen Sie Folgendes aus:
python training_artifacts/download_all.py
Hinweis : Aufgrund des Download-Limits gab es früher Probleme beim Herunterladen von Modellen von Google Drive. Jetzt ist das Skript so eingerichtet, dass es versucht, Daten von S3 herunterzuladen, wenn der Download von Daten von Google Drive fehlschlägt.
Wenn Probleme auftreten, löschen Sie alle *.pth-Dateien, aktualisieren Sie das dlutils -Paket ( pip install dlutils --upgrade
) und führen Sie dann download_all.py
erneut aus. Wenn das Problem dadurch nicht gelöst wird, öffnen Sie bitte ein Problem. Sie können auch versuchen, Modelle manuell von hier herunterzuladen: https://drive.google.com/drive/folders/1tsI1q1u8QRX5t7_lWCSjpniLGlNY-3VY?usp=sharing
In Konfigurationsdateien zeigt OUTPUT_DIR
an, wo Gewichte gespeichert und von wo gelesen werden. Zum Beispiel: OUTPUT_DIR: training_artifacts/celeba-hq256
In OUTPUT_DIR
wird eine Datei last_checkpoint
gespeichert, die den Pfad zum tatsächlichen .pth
Pickle mit Modellgewichtung enthält. Wenn Sie das Modell mit einer bestimmten Gewichtsdatei testen möchten, können Sie einfach die Datei last_checkpoint
ändern.
Um stilvermischende Figuren zu generieren, führen Sie Folgendes aus:
python style_mixing/stylemix.py -c <config>
Wo anstelle von <config>
eines von: ffhq
, celeba
, celeba-hq256
, bedroom
eingefügt wird
So erstellen Sie eine Rekonstruktion mit Bildern in mehreren Maßstäben:
python make_figures/make_recon_figure_multires.py -c <config>
So generieren Sie eine Rekonstruktion aller Beispieleingaben auf mehreren Seiten:
python make_figures/make_recon_figure_paged.py -c <config>
Es gibt auch:
python make_figures/old/make_recon_figure_celeba.py
python make_figures/old/make_recon_figure_bed.py
So generieren Sie eine Rekonstruktion aus dem Testsatz von FFHQ:
python make_figures/make_recon_figure_ffhq_real.py
Um eine Interpolationszahl zu erzeugen:
python make_figures/make_recon_figure_interpolation.py -c <config>
So generieren Sie eine Traversierungsfigur:
(Für andere Datensätze als FFHQ müssen Sie zuerst die Hauptrichtungen ermitteln.)
python make_figures/make_traversarls.py -c <config>
So führen Sie die Generierungsfigur aus:
make_generation_figure.py -c <config>
Zusätzlich zur Installation erforderlicher Pakete:
pip install -r requirements.txt
Sie müssen DareBlopy installieren:
pip install dareblopy
So führen Sie das Training durch:
python train_alae.py -c <config>
Es führt ein Multi-GPU-Training auf allen verfügbaren GPUs durch. Es verwendet DistributedDataParallel
für Parallelität. Wenn nur eine GPU verfügbar ist, läuft es auf einer einzigen GPU, es ist keine besondere Sorgfalt erforderlich.
Die empfohlene Anzahl von GPUs beträgt 8. Bei einer kleineren Anzahl von GPUs kann es zu Problemen bei der Reproduzierbarkeit kommen. Abhängig von der Speichergröße der GPUs müssen Sie möglicherweise die Stapelgröße in der Konfigurationsdatei anpassen.
Zusätzlich zur Installation der erforderlichen Pakete und DareBlopy müssen Sie TensorFlow und dnnlib von StyleGAN installieren.
Tensorflow muss Version 1.10
haben:
pip install tensorflow-gpu==1.10
Es erfordert CUDA Version 9.0.
Vielleicht ist es am besten, Anaconda zu verwenden, aber ich bevorzuge die Installation von CUDA 9.0 aus Pop-OS-Repositorys (funktioniert unter Ubuntu):
sudo echo "deb http://apt.pop-os.org/proprietary bionic main" | sudo tee -a /etc/apt/sources.list.d/pop-proprietary.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 204DD8AEC33A7AFF
sudo apt update
sudo apt install system76-cuda-9.0
sudo apt install system76-cudnn-9.0
Dann legen Sie einfach die Variable LD_LIBRARY_PATH
fest:
export LD_LIBRARY_PATH=/usr/lib/cuda-9.0/lib64
Dnnlib ist ein Paket, das in StyleGAN verwendet wird. Sie können es installieren mit:
pip install https://github.com/podgorskiy/dnnlib/releases/download/0.0.1/dnnlib-0.0.1-py3-none-any.whl
Der gesamte Code zum Ausführen von Metriken basiert stark auf denen aus dem StyleGAN-Repository. Es werden auch dieselben vorab trainierten Modelle verwendet:
https://github.com/NVlabs/stylegan#licenses
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.
Zum Schluss noch die Metriken ausführen:
python metrics/fid.py -c <config> # FID score on generations
python metrics/fid_rec.py -c <config> # FID score on reconstructions
python metrics/ppl.py -c <config> # PPL score on generations
python metrics/lpips.py -c <config> # LPIPS score of reconstructions