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 verwenden ② Versuchen Sie, Satoshi Fukuzawa mit StyleGan zu mischen ③Puzer/stylegan-encoder ④NVlabs/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.
·Umgebung ・ Führen Sie pretrained_example.py aus ・ Verschieben Sie den latenten Raum ・ Gif-Animation
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
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.
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. 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: 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. Es ist seltsam, dass es ein Bild von einem Kind gibt, das wirklich als Onkel aufwächst.
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.
Zufallszahl |
Zweiwertige Interpolation | Unterraum |
---|---|---|
6 | ||
5 |
・ 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