3DZoomVideo / app.py
talalif's picture
Update app.py
8d70672 verified
import os
import torch
import subprocess
import spaces
import gradio as gr
from PIL import Image
import numpy as np
from moviepy.editor import VideoFileClip
os.environ['CUDA_HOME'] = "/usr/local/lib/python3.10/site-packages/nvidia/cuda_runtime/include"
os.environ['PATH'] = '/usr/local/lib/python3.10/site-packages/nvidia/cuda_nvrtc/lib:' + os.environ.get('PATH', '')
os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib/python3.10/site-packages/nvidia/cuda_nvrtc/lib:' + os.environ.get('LD_LIBRARY_PATH', '')
os.environ['PATH'] = '/usr/local/lib/python3.10/site-packages/nvidia/cuda_runtime/include:' + os.environ.get('PATH', '')
os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib/python3.10/site-packages/nvidia/cuda_runtime/include:' + os.environ.get('LD_LIBRARY_PATH', '')
print(os.environ['PATH'])
print(os.environ['LD_LIBRARY_PATH'])
subprocess.run(["git", "clone", "https://github.com/sniklaus/3d-ken-burns.git"])
subprocess.run(["mv", "./network-disparity.pytorch", "./3d-ken-burns/models/disparity-estimation.pytorch"])
subprocess.run(["mv", "./network-refinement.pytorch", "./3d-ken-burns/models/disparity-refinement.pytorch"])
subprocess.run(["mv", "./network-inpainting.pytorch", "./3d-ken-burns/models/pointcloud-inpainting.pytorch"])
subprocess.run(["cp", "./3d-ken-burns/autozoom.py", "./3d-ken-burns/autozoom-original.py"])
def update_parameters(fltShift=100, fltZoom=1.25, steps1=0.0, steps2=1.0, frames=240, fps=30):
with open ('./3d-ken-burns/autozoom-original.py','r') as azo:
script = azo.read()
script = script.replace("'fltShift': 100.0",f"'fltShift': {fltShift}")
script = script.replace("'fltZoom': 1.25",f"'fltZoom': {fltZoom}")
script = script.replace("'fltSteps': numpy.linspace(0.0, 1.0, 75).tolist(),",f"'fltSteps': numpy.linspace({steps1}, {steps2}, {frames}).tolist(),")
script = script.replace(", fps=25)",f", fps={fps})")
with open ('./3d-ken-burns/autozoom.py','w') as az:
az.write(script)
az.truncate()
az.seek(0)
@spaces.GPU
def generate_video(image):
subprocess.run(["nvidia-smi"])
subprocess.run(["ls","-al","/tmp"])
image = Image.fromarray(image)
image.save("/tmp/img.png")
os.chdir("./3d-ken-burns")
subprocess.run(["python", "autozoom.py", "--in", "/tmp/img.png", "--out", "/tmp/autozoom.mp4"])
os.chdir("..")
subprocess.run(["ls","-al","/tmp"])
return "/tmp/autozoom.mp4"
def get_video(image,fltShift=100, fltZoom=1.25, steps1=0.0, steps2=1.0, frames=240, fps=30):
update_parameters(fltShift, fltZoom, steps1, steps2, frames, fps)
video_path = generate_video(image)
clip = VideoFileClip("/tmp/autozoom.mp4")
duration = clip.duration / 2
clip = clip.subclip(0, duration)
clip.write_videofile("/tmp/final.mp4")
return "/tmp/final.mp4"
with gr.Blocks() as demo:
gr.Markdown("""# 3D Zoom Video Generator!""")
image = gr.Image()
fltShift = gr.Slider(0, 1000, value=100, step=1, label="Flat Shift")
fltZoom = gr.Slider(0.0, 5.0, value=1.25, step=0.1,label="Flat Zoom")
steps1 = gr.Slider(0.0, 5.0, value=0.0, step=0.1, label="Steps1")
steps2 = gr.Slider(0.0, 5.0, value=1.0, step=0.1, label="Steps2")
frames = gr.Slider(50, 10000, value=240, step=1, label="Frames")
fps = gr.Slider(10, 60, value=30, step=1, label="Frames per Second")
submit_image = gr.Button(value="Generate Video")
video = gr.Video()
submit_image.click(fn=get_video,inputs=[image,fltShift,fltZoom,steps1,steps2,frames,fps],outputs=video)
demo.launch(show_error=True)