KaraSpdrnr's picture
Update app.py
5275e7d verified
import os
import sys
import subprocess
import requests
import gradio as gr
import PIL.Image
import imageio
import numpy
import skimage.transform
from shutil import copyfileobj
from skimage import img_as_ubyte
#Clonar repo si no existe
if not os.path.isdir('first-order-model'):
subprocess.run(['git', 'clone', 'https://github.com/AliaksandrSiarohin/first-order-model'])
sys.path.insert(0, 'first-order-model')
from demo import load_checkpoints, make_animation
#Descargar checkpoint si no existe (En este caso el de caras)
filename = 'vox-cpk.pth.tar'
if not os.path.isfile(filename):
response = requests.get(
'https://github.com/graphemecluster/first-order-model-demo/releases/download/checkpoints/' + filename,
stream=True
)
with open(filename, 'wb') as f:
copyfileobj(response.raw, f)
print('Checkpoint descargado')
#Detectar CPU o GPU (en nuestro caso será cpu, pero nunca se sabe)
import torch
use_cpu = not torch.cuda.is_available()
print(f'Usando: {"CPU" if use_cpu else "GPU"}')
generator, kp_detector = load_checkpoints(
config_path='first-order-model/config/vox-256.yaml',
checkpoint_path=filename,
cpu=use_cpu
)
print('Modelo cargado')
def resize(image, size=(256, 256)):
w, h = image.size
d = min(w, h)
r = ((w-d)//2, (h-d)//2, (w+d)//2, (h+d)//2)
return image.resize(size, resample=PIL.Image.LANCZOS, box=r)
def generate(source_image, driving_video):
img = PIL.Image.fromarray(source_image).convert("RGB")
img = resize(img)
reader = imageio.get_reader(driving_video, mode='I', format='FFMPEG')
fps = reader.get_meta_data()['fps']
driving_frames = [frame for frame in reader]
predictions = make_animation(
skimage.transform.resize(numpy.asarray(img), (256, 256)),
[skimage.transform.resize(f, (256, 256)) for f in driving_frames],
generator,
kp_detector,
relative=True,
adapt_movement_scale=True,
cpu=use_cpu
)
output_path = 'output.mp4'
imageio.mimsave(output_path, [img_as_ubyte(f) for f in predictions], fps=fps)
return output_path
with gr.Blocks() as demo:
gr.Markdown("First Order Motion Model")
gr.Markdown("Anima una foto de cara con el movimiento de un vídeo conductor.")
with gr.Row():
with gr.Column():
input_image = gr.Image(type="numpy", label="Imagen fuente (foto de cara)")
input_video = gr.Video(label="Vídeo conductor")
btn = gr.Button("Generar animación", variant="primary")
with gr.Column():
output_video = gr.Video(label="Resultado")
btn.click(fn=generate, inputs=[input_image, input_video], outputs=output_video)
gr.Examples(
examples=[
["LinusTechTips.jpg", "DameDane.mp4"]
],
inputs=[input_image, input_video],
label="Ejemplo"
)
demo.launch()