[PYTHON] [Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬

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 StyleGANEssayez de mélanger Satoshi Fukuzawa avec StyleGanPuzer/stylegan-encoderNVlabs/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. example17_18.gif

Ce que j'ai fait

·environnement ・ Exécutez pretrained_example.py ・ Déplacez l'espace latent ・ Animation Gif

·environnement

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

・ Exécutez pretrained_example.py

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. example.png

・ Déplacez l'espace latent

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é. latents12.jpg 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: latents.jpg 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. boy2chinren.jpg Il est étrange qu'il y ait une image d'un enfant grandissant vraiment comme un oncle.

・ Animation Gif

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éatoireseed Interpolation bivalente Sous-espace
6 example17_18_256.gif example0_1_256.gif
5 example0_1_256.gif example0_1_256.gif

Résumé

・ 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

[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
[Introduction à StyleGAN] J'ai joué avec "Une femme se transforme en Mayuyu" ♬
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
[Introduction à sinGAN-Tensorflow] J'ai joué avec la super-résolution "Challenge Big Imayuyu" ♬
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[Introduction à StyleGAN] J'ai joué avec style_mixing "Femme qui enlève ses lunettes" ♬
Notez la solution car django n'a pas pu s'installer avec pip
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Je veux sortir le début du mois prochain avec Python
J'ai essayé de créer une liste de nombres premiers avec python
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
[Introduction à Matplotlib] Axes Animation 3D: J'ai joué avec des figurines 3D Lisaju ♬
Je voulais résoudre le problème ABC164 A ~ D avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
[Introduction au style GAN] Apprentissage unique de l'animation avec votre propre machine ♬
J'ai essayé d'agrandir la taille du volume logique avec LVM
Je veux vérifier la position de mon visage avec OpenCV!
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
[Introduction à RasPi4] J'ai joué avec "la conversation de langue empoisonnée d'Hiroko / Hiromi" ♪
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de déverrouiller l'entrée 2 lock sésame d'une simple pression sur le bouton AWS IoT
[Scikit-learn] J'ai joué avec la courbe ROC
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai fait un jeu de vie avec Numpy
[Introduction à AWS] J'ai joué avec des voix masculines et féminines avec Polly et Transcribe ♪
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Je souhaite trier une liste dans l'ordre des autres listes
Je veux exprimer mes sentiments avec les paroles de Mr. Children
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
Je souhaite arrêter la suppression automatique de la zone tmp dans RHEL7
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai fait une erreur en récupérant la hiérarchie avec MultiIndex of pandas
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)