Я пытаюсь сделать непрерывную анимацию интерполяции между лицами, созданными с помощью 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')