Pour être clair, rien qu'en utilisant Example, vous pouvez immédiatement reproduire la vidéo populaire (conversion d'homme en femme), et quand vous l'essayez, c'est vraiment incroyable. Cette fois, c'est un article d'introduction que je n'ai essayé que la première entrée. La référence est la suivante. 【référence】 ① J'ai essayé d'utiliser StyleGAN ② Essayez de mélanger Satoshi Fukuzawa avec StyleGan ③Puzer/stylegan-encoder ④NVlabs/stylegan Actuellement, il semble que styleGAN2 soit également disponible, mais je voudrais faire le premier pas de StyleGAN et en avoir une idée. En conséquence, j'ai pu créer la vidéo suivante en presque un jour, je vais donc écrire un article sur ce qui m'intéressait.
·environnement ・ Exécutez pretrained_example.py ・ Déplacez l'espace latent ・ Animation Gif
L'environnement Keras-gpu est cassé car j'ai installé Pytorch l'autre jour, donc je l'ai installé à partir de zéro. Machine; base 1060 OS;Windows10 La base est comme dans l'article précédent. Cependant, Chainer etc. ne sera pas installé. Lorsque j'ai fini de créer l'environnement, j'ai eu une erreur dans Tensorflow. Donc, je l'ai remplacé par Tensorflow = 1.13.1 comme indiqué ci-dessous. Après l'avoir remplacé, cela ne fonctionne pas bien, alors je le redémarre. 【référence】 ⑤ Comment spécifier la construction avec l'installation conda d'Anaconda Cela a fonctionné de manière stable avec cela. La preuve est la suivante (il y a un avertissement dans la partie de ..., mais cette fois cela n'a aucun effet, donc je l'ai supprimé)
(keras-gpu) C:\Users\user\stylegan-encoder-master>python
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 14:00:49) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
...
>>> print(tf.__version__)
1.13.1
Pour que cela fonctionne, Weights n'a pas pu être téléchargé dans le code, comme dans Reference ①. Par conséquent, je l'ai téléchargé à partir de Reference ⑦ ci-dessous et l'ai placé de la même manière que Reference ① dans la version Tensorflow. La référence ⑥ semble intéressante, mais elle reste difficile à comprendre, donc je la reporterai la prochaine fois. 【référence】 ⑥ Jouez à StyleGAN !! ~ Édition d'image sans apprentissage supplémentaire ~ ⑦pacifinapacific/StyleGAN_LatentEditor
Donc, le premier code est:
pretrained_example.py
# Copyright (c) 2019, 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.
"""Minimal script for generating an image using pre-trained StyleGAN generator."""
import os
import pickle
import numpy as np
import PIL.Image
import dnnlib
import dnnlib.tflib as tflib
import config
def main():
# Initialize TensorFlow.
tflib.init_tf()
# 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)
fpath = './weight_files/tensorflow/karras2019stylegan-ffhq-1024x1024.pkl'
with open(fpath, mode='rb') 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.
# Print network details.
Gs.print_layers()
# 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)
# Save image.
os.makedirs(config.result_dir, exist_ok=True)
png_filename = os.path.join(config.result_dir, 'example.png')
PIL.Image.fromarray(images[0], 'RGB').save(png_filename)
if __name__ == "__main__":
main()
L'essence de ce code est de donner un nombre aléatoire de la même taille que la valeur d'entrée initiale du générateur Gs ci-dessous.
latents = rnd.randn(1, Gs.input_shape[1])
Il s'agit de la partie convertie en image ci-dessous en l'utilisant.
images = Gs.run(latents, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt)
【référence】
⑧ Résumé de la génération de nombres aléatoires par Numpy
La sortie suivante avec ce code.
La prochaine chose à faire est de changer les nombres aléatoires latents ci-dessus et de les afficher. Donc, je l'ai essayé avec le code suivant. (Si seule la partie principale est décrite)
def main():
# Initialize TensorFlow.
tflib.init_tf()
fpath = './weight_files/tensorflow/karras2019stylegan-ffhq-1024x1024.pkl'
with open(fpath, mode='rb') as f:
_G, _D, Gs = pickle.load(f)
# Print network details.
Gs.print_layers()
# Pick latent vector.
rnd = np.random.RandomState(5) #5
latents1 = rnd.randn(1, Gs.input_shape[1])
latents2 = rnd.randn(1, Gs.input_shape[1])
for i in range(1,101,4):
latents = i/100*latents1+(1-i/100)*latents2
# 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)
# Save image.
os.makedirs(config.result_dir, exist_ok=True)
png_filename = os.path.join(config.result_dir, 'example{}.png'.format(i))
PIL.Image.fromarray(images[0], 'RGB').save(png_filename)
En d'autres termes, il s'agit d'un nombre aléatoire, mais les latents continus1 latents2 sont calculés et les paramètres sont modifiés entre eux pour dessiner. Avec cette opération, vous pouvez voir comment le passage en douceur de la femelle au mâle 1 puis au mâle 2 est effectué. Ici, j'ai réfléchi à comment parcourir l'espace latent un peu plus loin. Autrement dit, remplacez cette partie par le code suivant. Vous pouvez maintenant voir quel type d'image est caché bien qu'il fasse partie de l'espace latent.
# Pick latent vector.
rnd = np.random.RandomState(6) #5
for i in range(1,101,4):
latents = rnd.randn(1, Gs.input_shape[1])
J'ai obtenu ce qui suit: Lorsque cela se produit, vous voudrez sélectionner n'importe quelle personne dans cette image et voir la transition. J'ai donc essayé de dessiner une image d'un homme d'exemple73 et d'un enfant d'exemple69, ce qui semble changer le plus. Il se trouve que c'est l'un à côté de l'autre ... Le code est ci-dessous.
# Pick latent vector.
rnd = np.random.RandomState(6) #5
latents_=[]
a=17
b=18
for i in range(1,101,4):
latents = rnd.randn(1, Gs.input_shape[1])
latents_.append(latents)
for j in range(25):
latents_mean=j/25*latents_[a]+(1-j/25)*latents_[b]
# Generate image.
fmt = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True)
images = Gs.run(latents_mean, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt)
# Save image.
os.makedirs(config.result_dir, exist_ok=True)
png_filename = os.path.join(config.result_dir, 'example{}.png'.format(j))
PIL.Image.fromarray(images[0], 'RGB').save(png_filename)
Le résultat de sortie a dépassé les attentes, comme indiqué ci-dessous. Il est étrange qu'il y ait une image d'un enfant grandissant vraiment comme un oncle.
Enfin, je veux en faire une animation Gif comme tout le monde le fait. Pour ce faire, mettez le code suivant à la fin et le gif sera enregistré.
s=50
images = []
for i in range(25):
im = Image.open(config.result_dir+'/example'+str(i)+'.png')
im =im.resize(size=(512, 512), resample=Image.NEAREST)
images.append(im)
for i in range(24,0,-1):
im = Image.open(config.result_dir+'/example'+str(i)+'.png')
im =im.resize(size=(512, 512), resample=Image.NEAREST)
images.append(im)
images[0].save(config.result_dir+'/example{}_{}.gif'.format(a,b), save_all=True, append_images=images[1:s], duration=100*2, loop=0)
Le résultat suivant est remplacé par size = (256, 256) en raison de la taille de la publication. De plus, la sortie est s = 25, à l'exclusion de l'interpolation binaire de 6.
nombre aléatoire |
Interpolation bivalente | Sous-espace |
---|---|---|
6 | ||
5 |
・ Je pense qu'il peut être déplacé si l'environnement peut être construit. ・ Excellente interpolation d'image
・ Il existe de nombreuses applications possibles pour cette application seule, je vais donc l'essayer avec ma propre image. ・ Je voudrais relever le défi de la soi-disant vidéo d'une manière plus évolutive.
Recommended Posts