Как сделать непрерывную анимацию интерполяции изображений StyleGan2? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь сделать непрерывную анимацию интерполяции между лицами, созданными с помощью StyleGan2. Я умею делать анимацию между двумя изображениями, используя версию этого скрипта: https://github.com/parameter-pollution/stylegan_paintings/blob/master/generate_interpolation_animation.py.

У меня есть минимальный воспроизводимый пример ниже, который показывает версию функции, которая берет два скрытых вектора и делает анимацию. Затем я генерирую три вектора и передаю их функции дважды. Я ожидаю, что конец первой анимации будет выглядеть как начало второй анимации. Вместо этого вторая анимация начинается с совершенно другого изображения.

Я еще не очень хорошо понимаю StyleGan, поэтому мне интересно, неправильно ли я интерпретирую скрытые векторы; Я думал, что они представляют изображения, и, таким образом, передавая один и тот же вектор в функцию дважды, сначала как первый аргумент, а затем как второй, я получу ожидаемый результат. Вместо этого работает функция, которую я предоставил, а не то, что второй вектор arg просто манипулирует первым, а не является переходом от одного изображения к другому.

Надеюсь, кто-то может помочь с этим, спасибо большое!

import os
import pickle
import numpy as np
import PIL.Image
import dnnlib
import dnnlib.tflib as tflib
import config

def make_interpolation(latent_vector1, latent_vector2,
                       animation_name='animation', number_of_frames=240):
    frame_step = 1.0/number_of_frames
    x = 0
    for frame_count in range(1, number_of_frames):
        x = x + frame_step
        latent_input = latent_vector1.copy()
        for i in range(512):
            f1 = latent_vector1[0][i]
            f2 = latent_vector2[0][i]
            if f1 > f2:
                tmp = f2
                f2 = f1
                f1 = tmp
            fnew = f1 + (f2-f1)*x
            latent_input[0][i] = fnew
        images = Gs.run(latent_input, None, truncation_psi=1,
                        randomize_noise=False, output_transform=fmt)

        # Save image.
        os.makedirs('results', exist_ok=True)
        png_filename = os.path.join(
            'results', str('animation') + '_' + str(frame_count) + '.png')
        PIL.Image.fromarray(images[0], 'RGB').save(png_filename)


tflib.init_tf()
model_path = "./network-snapshot-008040.pkl"
with open(model_path,"rb") as f:
        _G, _D, Gs = pickle.load(f)
fmt = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True)
rnd = np.random.RandomState(42)

lv1 = rnd.randn(1, 512)
lv2 = rnd.randn(1, 512)
lv3 = rnd.randn(1, 512)

make_interpolation(lv1, lv2, animation_name='animation1-2')
make_interpolation(lv2, lv3, animation_name='animation2-3')
...