Stanislav Pidhorskyi, Donald A. Adjeroh, Gianfranco Doretto
Dossier Google Drive avec modèles et résultats qualitatifs
Auto-encodeurs latents contradictoires
Stanislav Pidhorskyi, Donald Adjeroh, Gianfranco DorettoRésumé : Les réseaux d'auto-encodeurs sont des approches non supervisées visant à combiner des propriétés génératives et représentationnelles en apprenant simultanément une carte codeur-générateur. Bien qu’elles aient été étudiées de manière approfondie, la question de savoir s’ils ont le même pouvoir générateur que les GAN ou s’ils apprennent des représentations démêlées n’a pas été entièrement abordée. Nous introduisons un auto-encodeur qui résout ces problèmes conjointement, que nous appelons Adversarial Latent Autoencoder (ALAE). Il s'agit d'une architecture générale qui peut tirer parti des améliorations récentes des procédures de formation GAN. Nous avons conçu deux auto-encodeurs : un basé sur un encodeur MLP et un autre basé sur un générateur StyleGAN, que nous appelons StyleALAE. Nous vérifions les propriétés de démêlage des deux architectures. Nous montrons que StyleALAE peut non seulement générer des images de visage de 1 024 x 1 024 avec une qualité comparable à StyleGAN, mais qu'à la même résolution, il peut également produire des reconstructions et des manipulations de visage basées sur des images réelles. Cela fait d'ALAE le premier auto-encodeur capable de comparer et d'aller au-delà des capacités d'une architecture de type générateur uniquement.
@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]},
}
Pour exécuter la démo, vous devrez disposer d'un GPU compatible CUDA, de PyTorch >= v1.3.1 et des pilotes cuda/cuDNN installés. Installez les packages requis :
pip install -r requirements.txt
Téléchargez des modèles pré-entraînés :
python training_artifacts/download_all.py
Exécutez la démo :
python interactive_demo.py
Vous pouvez spécifier la configuration yaml à utiliser. Les configurations se trouvent ici : https://github.com/podgorskiy/ALAE/tree/master/configs. Par défaut, il en utilise un pour l'ensemble de données FFHQ. Vous pouvez modifier la configuration en utilisant le paramètre -c
. Pour exécuter sur celeb-hq
en résolution 256 x 256, exécutez :
python interactive_demo.py -c celeba-hq256
Cependant, pour les configurations autres que FFHQ, vous devez obtenir de nouveaux vecteurs de direction principale pour les attributs.
Le code du référentiel est organisé de telle manière que tous les scripts doivent être exécutés à partir de la racine du référentiel. Si vous utilisez un IDE (par exemple PyCharm ou Visual Studio Code), définissez simplement Working Directory pour qu'il pointe vers la racine du référentiel.
Si vous souhaitez exécuter à partir de la ligne de commande, vous devez également définir la variable PYTHONPATH pour qu'elle pointe vers la racine du référentiel.
Par exemple, disons que nous avons cloné le référentiel dans le répertoire ~/ALAE , puis procédez :
$ cd ~/ALAE
$ export PYTHONPATH=$PYTHONPATH:$(pwd)
Vous pouvez désormais exécuter des scripts comme suit :
$ python style_mixing/stylemix.py
Chemin | Description |
---|---|
ALAE | Dossier racine du référentiel |
├ configurations | Dossier avec les fichiers de configuration yaml. |
│ ├ chambre.yaml | Fichier de configuration pour l'ensemble de données de la chambre LSUN à une résolution de 256 x 256. |
│ ├ celeba.yaml | Fichier de configuration pour l'ensemble de données CelebA à une résolution de 128 x 128. |
│ ├ celeba-hq256.yaml | Fichier de configuration pour l'ensemble de données CelebA-HQ à une résolution de 256 x 256. |
│ ├ celeba_ablation_nostyle.yaml | Fichier de configuration pour l'ensemble de données CelebA 128x128 pour l'étude d'ablation (pas de styles). |
│ ├ celeba_ablation_separate.yaml | Fichier de configuration pour l'ensemble de données CelebA 128x128 pour l'étude d'ablation (encodeur et discriminateur séparés). |
│ ├ celeba_ablation_z_reg.yaml | Fichier de configuration pour l'ensemble de données CelebA 128x128 pour l'étude d'ablation (régression dans l'espace Z, pas W). |
│ ├ ffhq.yaml | Fichier de configuration pour l'ensemble de données FFHQ à une résolution de 1 024 x 1 024. |
│ ├ mnist.yaml | Fichier de configuration pour l'ensemble de données MNIST utilisant l'architecture Style. |
│ └ mnist_fc.yaml | Fichier de configuration pour l'ensemble de données MNIST utilisant uniquement des couches entièrement connectées (Permutation Invariant MNIST). |
├ dataset_preparation | Dossier contenant des scripts pour la préparation des ensembles de données. |
│ ├ prepare_celeba_hq_tfrec.py | Pour préparer TFRecords pour l'ensemble de données CelebA-HQ à une résolution de 256 x 256. |
│ ├ prepare_celeba_tfrec.py | Pour préparer TFRecords pour l'ensemble de données CelebA à une résolution de 128 x 128. |
│ ├ prepare_mnist_tfrec.py | Pour préparer TFRecords pour l’ensemble de données MNIST. |
│ ├ split_tfrecords_chambre.py | Pour diviser les TFRecords officiels du papier StyleGAN pour l'ensemble de données de chambre LSUN. |
│ └ split_tfrecords_ffhq.py | Pour diviser les TFRecords officiels du papier StyleGAN pour l'ensemble de données FFHQ. |
├ ensemble de données_samples | Dossier contenant des exemples d'entrées pour différents ensembles de données. Utilisé pour les figures et pour les entrées de test pendant la formation. |
├ make_figures | Scripts pour réaliser diverses figures. |
├ métriques | Scripts pour calculer les métriques. |
├ directions_principales | Scripts pour calculer les vecteurs de direction principaux pour divers attributs. Pour une démo interactive . |
├ style_mixing | Exemples d'entrées et de script pour produire des figures de mélange de styles. |
├ formation_artefacts | Emplacement par défaut pour enregistrer les points de contrôle/échantillons de sorties/tracés. |
│ └ download_all.py | Script pour télécharger tous les modèles pré-entraînés. |
├ interactive_demo.py | Script exécutable pour une démo interactive. |
├ train_alae.py | Script exécutable pour la formation. |
├ train_alae_separate.py | Script exécutable pour la formation à l'étude de l'ablation (encodeur et discriminateur séparés). |
├ checkpointer.py | Module de sauvegarde/restauration des poids du modèle, de l'état de l'optimiseur et de l'historique des pertes. |
├ custom_adam.py | Optimiseur Adam personnalisé pour l’égalisation du taux d’apprentissage et la version bêta zéro seconde. |
├ dataloader.py | Module avec classes d'ensembles de données, chargeurs, itérateurs, etc. |
├ defaults.py | Définition des variables de configuration avec des valeurs par défaut. |
├ lanceur.py | Aide pour exécuter une formation multi-GPU et multiprocessus. Configure la configuration et la journalisation. |
├ lod_driver.py | Classe d'assistance pour gérer un réseau en croissance/stabilisation. |
├ lreq.py | Modules personnalisés Linear , Conv2d et ConvTranspose2d pour l'égalisation du taux d'apprentissage. |
├ modèle.py | Module avec définition de modèle de haut niveau. |
├ model_separate.py | Comme ci-dessus, mais pour l'étude de l'ablation. |
├ net.py | Définition de tous les blocs réseau pour plusieurs architectures. |
├ registre.py | Registre des blocs réseau à sélectionner dans le fichier de configuration. |
├ planificateur.py | Planificateurs personnalisés avec démarrage à chaud et agrégeant plusieurs optimiseurs. |
├ tracker.py | Module de traçage des pertes. |
└ utils.py | Décorateur pour les appels asynchrones, décorateur pour la mise en cache, registre pour les blocs réseau. |
Dans cette base de code, yacs est utilisé pour gérer les configurations.
La plupart des scripts exécutables acceptent le paramètre -c
qui peut spécifier les fichiers de configuration à utiliser. Par exemple, pour réaliser des figures de reconstruction, vous pouvez exécuter :
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
La configuration par défaut est ffhq
.
La formation se fait à l'aide de TFRecords. Les TFRecords sont lus à l'aide de DareBlopy, ce qui permet de les utiliser avec Pytorch.
Dans les fichiers de configuration ainsi que dans tous les scripts de préparation, il est supposé que tous les ensembles de données se trouvent dans /data/datasets/
. Vous pouvez soit modifier le chemin dans les fichiers de configuration, soit créer un lien symbolique vers l'endroit où vous stockez les ensembles de données.
La manière officielle de générer CelebA-HQ peut être difficile. Veuillez vous référer à cette page : https://github.com/suvojit-0x55aa/celebA-HQ-dataset-download Vous pouvez obtenir l'ensemble de données pré-généré à partir de : https://drive.google.com/drive/folders/11Vz0fqHS2rXDb5pprgTjpD7S2BAJhi1P
Pour télécharger des modèles pré-entraînés, exécutez :
python training_artifacts/download_all.py
Remarque : Il y avait des problèmes avec le téléchargement de modèles depuis Google Drive en raison de la limite de téléchargement. Désormais, le script est configuré de telle manière que s'il ne parvient pas à télécharger les données depuis Google Drive, il essaiera de les télécharger depuis S3.
Si vous rencontrez des problèmes, essayez de supprimer tous les fichiers *.pth, de mettre à jour le package dlutils ( pip install dlutils --upgrade
), puis exécutez à nouveau download_all.py
. Si cela ne résout pas le problème, veuillez ouvrir un problème. Vous pouvez également essayer de télécharger des modèles manuellement à partir d'ici : https://drive.google.com/drive/folders/1tsI1q1u8QRX5t7_lWCSjpniLGlNY-3VY?usp=sharing
Dans les fichiers de configuration, OUTPUT_DIR
indique l'endroit où les poids sont enregistrés et lus. Par exemple : OUTPUT_DIR: training_artifacts/celeba-hq256
Dans OUTPUT_DIR
il enregistre un fichier last_checkpoint
qui contient le chemin d'accès au cornichon .pth
réel avec le poids du modèle. Si vous souhaitez tester le modèle avec un fichier de poids spécifique, vous pouvez simplement modifier le fichier last_checkpoint
.
Pour générer des figures de mélange de styles, exécutez :
python style_mixing/stylemix.py -c <config>
Où au lieu de <config>
mettez l'un des éléments suivants : ffhq
, celeba
, celeba-hq256
, bedroom
Pour générer une reconstruction avec des images à plusieurs échelles :
python make_figures/make_recon_figure_multires.py -c <config>
Pour générer une reconstruction à partir de tous les exemples d’entrées sur plusieurs pages :
python make_figures/make_recon_figure_paged.py -c <config>
Il y a aussi :
python make_figures/old/make_recon_figure_celeba.py
python make_figures/old/make_recon_figure_bed.py
Pour générer une reconstruction à partir de l'ensemble de test de FFHQ :
python make_figures/make_recon_figure_ffhq_real.py
Pour générer un chiffre d'interpolation :
python make_figures/make_recon_figure_interpolation.py -c <config>
Pour générer une figure de parcours :
(Pour les ensembles de données autres que FFHQ, vous devrez d'abord trouver les directions principales)
python make_figures/make_traversarls.py -c <config>
Pour faire fonctionner le chiffre de génération :
make_generation_figure.py -c <config>
En plus d'installer les packages requis :
pip install -r requirements.txt
Vous devrez installer DareBlopy :
pip install dareblopy
Pour exécuter une formation :
python train_alae.py -c <config>
Il exécutera une formation multi-GPU sur tous les GPU disponibles. Il utilise DistributedDataParallel
pour le parallélisme. Si un seul GPU est disponible, il fonctionnera sur un seul GPU, aucun soin particulier n'est nécessaire.
Le nombre recommandé de GPU est de 8. La reproductibilité sur un plus petit nombre de GPU peut poser des problèmes. Vous devrez peut-être ajuster la taille du lot dans le fichier de configuration en fonction de la taille de la mémoire des GPU.
En plus d'installer les packages requis et DareBlopy, vous devez installer TensorFlow et dnnlib à partir de StyleGAN.
Tensorflow doit être de version 1.10
:
pip install tensorflow-gpu==1.10
Il nécessite la version CUDA 9.0.
Le meilleur moyen est peut-être d'utiliser Anaconda pour gérer cela, mais je préfère installer CUDA 9.0 à partir de référentiels pop-os (fonctionne sur 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
Ensuite, définissez simplement la variable LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=/usr/lib/cuda-9.0/lib64
Dnnlib est un package utilisé dans StyleGAN. Vous pouvez l'installer avec :
pip install https://github.com/podgorskiy/dnnlib/releases/download/0.0.1/dnnlib-0.0.1-py3-none-any.whl
Tout le code pour exécuter les métriques est fortement basé sur ceux du référentiel StyleGAN. Il utilise également les mêmes modèles pré-entraînés :
https://github.com/NVlabs/stylegan#licenses
inception_v3_features.pkl et inception_v3_softmax.pkl sont dérivés du réseau Inception-v3 pré-entraîné par Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens et Zbigniew Wojna. Le réseau était initialement partagé sous licence Apache 2.0 sur le référentiel TensorFlow Models.
vgg16.pkl et vgg16_zhang_perceptual.pkl sont dérivés du réseau VGG-16 pré-entraîné par Karen Simonyan et Andrew Zisserman. Le réseau a été initialement partagé sous licence Creative Commons BY 4.0 sur la page du projet Very Deep Convolutional Networks for Large-Scale Visual Recognition.
vgg16_zhang_perceptual.pkl est en outre dérivé des poids LPIPS pré-entraînés par Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman et Oliver Wang. Les poids ont été initialement partagés sous la licence « simplifiée » BSD 2-Clause sur le référentiel PerceptualSimilarity.
Enfin, pour exécuter des métriques :
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