Progressive Growing of GANs inference in PyTorch with CelebA training snapshot
Description
This is an inference sample written in PyTorch of the original Theano/Lasagne code.
I recreated the network as described in the paper of Karras et al. Since some layers seemed to be missing in PyTorch, these were implemented as well. The network and the layers can be found in model.py
.
For the demo, a 100-celeb-hq-1024x1024-ours snapshot was used, which was made publicly available by the authors. Since I couldn't find any model converter between Theano/Lasagne and PyTorch, I used a quick and dirty script to transfer the weights between the models (transfer_weights.py
).
This repo does not provide the code for training the networks.
Simple inference
To run the demo, simply execute predict.py
. You can specify other weights with the --weights
flag.
Example image:
Latent space interpolation
To try the latent space interpolation, use latent_interp.py
. All output images will be saved in ./interp
.
You can chose between the "gaussian interpolation" introduced in the original paper and the "slerp interpolation" introduced by Tom White in his paper Sampling Generative Networks using the --type
argument.
Use --filter
to change the gaussian filter size for the gaussian interpolation and --interp
for the interpolation steps for the slerp interpolation.
The following arguments are defined:
--weights
- path to pretrained PyTorch state dict--output
- Directory for storing interpolated images--batch_size
- batch size forDataLoader
--num_workers
- number of workers forDataLoader
--type
{gauss, slerp} - interpolation type--nb_latents
- number of latent vectors to generate--filter
- gaussian filter length for interpolating latent space (gauss interpolation)--interp
- interpolation length between each latent vector (slerp interpolation)--seed
- random seed for numpy and PyTorch--cuda
- use GPU
The total number of generated frames depends on the used interpolation technique.
For gaussian interpolation the number of generated frames equals nb_latents
, while the slerp interpolation generates nb_latents * interp
frames.
Example interpolation:
Live latent space interpolation
A live demo of the latent space interpolation using PyGame can be seen in pygame_interp_demo.py
.
Use the --size
argument to change the output window size.
The following arguments are defined:
--weights
- path to pretrained PyTorch state dict--num_workers
- number of workers forDataLoader
--type
{gauss, slerp} - interpolation type--nb_latents
- number of latent vectors to generate--filter
- gaussian filter length for interpolating latent space (gauss interpolation)--interp
- interpolation length between each latent vector (slerp interpolation)--size
- PyGame window size--seed
- random seed for numpy and PyTorch--cuda
- use GPU
Transferring weights
The pretrained lasagne weights can be transferred to a PyTorch state dict using transfer_weights.py
.
To transfer other snapshots from the paper (other than CelebA), you have to modify the model architecture accordingly and use the corresponding weights.
Environment
The code was tested on Ubuntu 16.04 with an NVIDIA GTX 1080 using PyTorch v.0.2.0_4.
transfer_weights.py
needs Theano and Lasagne to load the pretrained weights.pygame_interp_demo.py
needs PyGame to visualize the output
A single forward pass took approx. 0.031 seconds.
Links
License
This code is a modified form of the original code under the CC BY-NC license with the following copyright notice:
# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
#
# This work is licensed under the Creative Commons Attribution-NonCommercial
# 4.0 International License. To view a copy of this license, visit
# http://creativecommons.org/licenses/by-nc/4.0/ or send a letter to
# Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
According the Section 3, I hereby identify Tero Karras et al. and NVIDIA as the original authors of the material.