[PYTHON] [Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt

Um es klar auszudrücken: Mit Beispiel können Sie das beliebte Video (Konvertierung von männlich zu weiblich) sofort reproduzieren. Wenn Sie es ausprobieren, ist es wirklich erstaunlich. Diesmal ist es ein Einführungsartikel, dass ich nur den ersten Eingang ausprobiert habe. Die Referenz ist wie folgt. 【Referenz】 ① Ich habe versucht, StyleGAN zu verwendenVersuchen Sie, Satoshi Fukuzawa mit StyleGan zu mischenPuzer/stylegan-encoderNVlabs/stylegan Derzeit scheint styleGAN2 ebenfalls verfügbar zu sein, aber ich möchte den ersten Schritt von StyleGAN machen und ein Gefühl dafür bekommen. Infolgedessen konnte ich an fast einem Tag das folgende Video erstellen, sodass ich einen Artikel über das schreiben werde, woran ich interessiert war. example17_18.gif

Was ich getan habe

·Umgebung ・ Führen Sie pretrained_example.py aus ・ Verschieben Sie den latenten Raum ・ Gif-Animation

·Umgebung

Die Keras-GPU-Umgebung ist kaputt, weil ich Pytorch neulich installiert habe, also habe ich es von Grund auf neu installiert. Maschine, 1060 Basis OS;Windows10 Die Basis ist wie im vorherigen Artikel. Chainer usw. werden jedoch nicht installiert. Als ich mit dem Erstellen der Umgebung fertig war, wurde in Tensorflow ein Fehler angezeigt. Also habe ich es durch Tensorflow = 1.13.1 ersetzt, wie unten gezeigt. Nach dem Ersetzen funktioniert es nicht gut, daher starte ich es neu. 【Referenz】 ⑤ So legen Sie den Build mit der Conda-Installation von Anaconda fest Damit hat es stabil geklappt. Die Beweise sind wie folgt (Es gibt eine Warnung in dem Teil von ..., aber diesmal hat sie keine Wirkung, also habe ich sie gelöscht)

(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

・ Führen Sie pretrained_example.py aus

Damit dies funktioniert, konnten Gewichte nicht wie in Referenz ① im Code heruntergeladen werden. Daher habe ich es von Referenz Reference unten heruntergeladen und auf die gleiche Weise wie Referenz ① in der Tensorflow-Version platziert. Referenz ⑥ scheint interessant zu sein, ist aber immer noch schwer zu verstehen, daher werde ich sie beim nächsten Mal verschieben. 【Referenz】 ⑥ StyleGAN abspielen !! ~ Bildbearbeitung ohne zusätzliches Lernen ~pacifinapacific/StyleGAN_LatentEditor

Der erste Code lautet also:

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()

Der Kern dieses Codes besteht darin, eine Zufallszahl anzugeben, die der Größe des anfänglichen Eingabewerts des Generators Gs entspricht. latents = rnd.randn(1, Gs.input_shape[1]) Dies ist der Teil, der mit ihm in ein Bild unten konvertiert wird. images = Gs.run(latents, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt) 【Referenz】 ⑧ Zusammenfassung der Zufallszahlengenerierung durch Numpy Die folgende Ausgabe mit diesem Code. example.png

・ Verschieben Sie den latenten Raum

Als nächstes müssen Sie die obigen latenten Zufallszahlen ändern und ausgeben. Also habe ich es mit dem folgenden Code versucht. (Wenn nur der Hauptteil beschrieben wird)

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)

Mit anderen Worten, es ist eine Zufallszahl, aber kontinuierliche Latente1 Latente2 werden berechnet und die Parameter werden zwischen ihnen geändert, um zu zeichnen. Mit dieser Operation können Sie sehen, wie der reibungslose Wechsel von weiblich zu männlich 1 und dann männlich 2 durchgeführt wird. latents12.jpg Hier habe ich darüber nachgedacht, wie ich den latenten Raum noch einen Schritt weiter wandern kann. Ersetzen Sie diesen Teil durch den folgenden Code. Jetzt können Sie sehen, welche Art von Bild verborgen ist, obwohl es Teil des latenten Raums ist.

    # Pick latent vector.
    rnd = np.random.RandomState(6) #5
    for i in range(1,101,4):
        latents = rnd.randn(1, Gs.input_shape[1])

Ich habe folgendes bekommen: latents.jpg In diesem Fall möchten Sie eine beliebige Person in diesem Bild auswählen und den Übergang sehen. Also habe ich versucht, ein Bild von einem Mann von Beispiel73 und einem Kind von Beispiel69 zu zeichnen, was sich am meisten zu ändern scheint. Es ist zufällig nebeneinander ... Der Code ist unten.

    # 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)

Das Output-Ergebnis hat die unten gezeigten Erwartungen übertroffen. boy2chinren.jpg Es ist seltsam, dass es ein Bild von einem Kind gibt, das wirklich als Onkel aufwächst.

・ Gif-Animation

Schließlich möchte ich daraus eine Gif-Animation machen, wie es jeder tut. Fügen Sie dazu am Ende den folgenden Code ein und das GIF wird gespeichert.

    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)    

Das folgende Ergebnis wird aufgrund der Veröffentlichungsgröße in size = (256, 256) geändert. Außerdem ist die Ausgabe s = 25, ausgenommen die binäre Interpolation von 6.

Zufallszahlseed Zweiwertige Interpolation Unterraum
6 example17_18_256.gif example0_1_256.gif
5 example0_1_256.gif example0_1_256.gif

Zusammenfassung

・ Ich denke, es kann verschoben werden, wenn die Umgebung konstruiert werden kann. ・ Großartige Bildinterpolation

・ Es gibt viele mögliche Anwendungen für diese App allein, daher werde ich es mit meinem eigenen Bild versuchen. ・ Ich möchte das sogenannte Video entwicklungspolitischer herausfordern

Recommended Posts

[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
[Einführung in StyleGAN] Ich habe mit "Eine Frau verwandelt sich in Mayuyu" gespielt ♬
[Einführung in Pytorch] Ich habe mit sinGAN ♬ gespielt
[Einführung in sinGAN-Tensorflow] Ich habe mit der hochauflösenden "Challenge Big Imayuyu" ♬ gespielt
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
[Einführung in StyleGAN] Ich habe mit style_mixing "Frau, die die Brille abnimmt" ♬ gespielt
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
[Einführung in Matplotlib] Achsen 3D-Animation: Ich habe mit 3D-Lisaju-Figuren gespielt ♬
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
[Einführung in Style GAN] Einzigartiges Lernen von Animation mit Ihrer eigenen Maschine ♬
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
[Einführung in RasPi4] Ich habe mit "Hiroko / Hiromis giftigem Zungengespräch" gespielt ♪
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, den Sesam für Eingang 2 mit einem einzigen Druck auf die AWS IoT-Taste zu entsperren
[Scikit-learn] Ich habe mit der ROC-Kurve gespielt
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe ein Lebensspiel mit Numpy gemacht
[Einführung in AWS] Ich habe mit Polly und Transcribe male mit Männer- und Frauenstimmen gespielt
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich möchte das automatische Löschen des tmp-Bereichs in RHEL7 stoppen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.