GANcMRI / app.py
vukadinovic936
switched to imageio
92a78e5
raw
history blame
2.82 kB
import streamlit as st
import tensorflow as tf
import pickle
import numpy as np
from pathlib import Path
import dnnlib
from dnnlib import tflib
import imageio
import os
import subprocess
def check_gpu():
return tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None)
model_path = 'best_net.pkl'
#define load model functions
_cached_networks = dict()
def load_networks(path):
if path in _cached_networks:
return _cached_networks[path]
stream = open(path, 'rb')
tflib.init_tf()
with stream:
G, D, Gs = pickle.load(stream, encoding='latin1')
_cached_networks[path] = G, D, Gs
return G, D, Gs
# Code to load the StyleGAN2 Model
def load_model():
_G, _D, Gs = load_networks(model_path)
noise_vars = [var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
Gs_kwargs = dnnlib.EasyDict()
Gs_kwargs.output_transform = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True)
Gs_kwargs.randomize_noise = False
return Gs, noise_vars, Gs_kwargs
#define helper functions
def get_control_latent_vectors(path):
files = [x for x in Path(path).iterdir() if str(x).endswith('.npy')]
latent_vectors = {f.name[:-4]:np.load(f) for f in files}
return latent_vectors
#load latent directions
latent_controls = get_control_latent_vectors('trajectories/')
def generate_image_from_projected_latents(latent_vector):
images = Gs.components.synthesis.run(latent_vector, **Gs_kwargs)
return images
def frame_to_frame(latent_code):
modified_latent_code = np.copy(latent_code)
full_video = [generate_image_from_projected_latents(modified_latent_code)]
for i in range(49):
modified_latent_code = modified_latent_code + latent_controls[f'{i}{i+1}']
ims = generate_image_from_projected_latents(modified_latent_code)
full_video.append(ims)
return np.array(full_video).squeeze()
#load the model
Gs, noise_vars, Gs_kwargs = load_model()
#select a random latent code
rnd = np.random.RandomState(3)
z = rnd.randn(1, *Gs.input_shape[1:])
noise_vars = [var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
tflib.set_vars({var: rnd.randn(*var.shape.as_list()) for var in noise_vars})
random_img_latent_code = Gs.components.mapping.run(z,None)
#make it be ED frame
random_img_latent_code -= 0.7*latent_controls['time']
vid = frame_to_frame(random_img_latent_code)
temp_video_path="output.mp4"
writer=imageio.get_writer(temp_video_path, fps=20)
for i in range(vid.shape[0]):
frame = vid[i]
writer.append_data(frame)
writer.close()
out_path = "fixed_out.mp4"
command = ["ffmpeg", "-i", temp_video_path, "-vcodec", "libx264", out_path]
subprocess.run(command)
st.video(out_path)
os.remove(temp_video_path)
os.remove(out_path)