EPiC-fps / gradio_app.py
Muhammad Taqi Raza
absolute paths
35ab635
raw
history blame
3.36 kB
import os
import subprocess
from datetime import datetime
from pathlib import Path
import gradio as gr
# -----------------------------
# Setup paths and env
# -----------------------------
HF_HOME = "/app/hf_cache"
os.environ["HF_HOME"] = HF_HOME
os.environ["TRANSFORMERS_CACHE"] = HF_HOME
os.makedirs(HF_HOME, exist_ok=True)
PRETRAINED_DIR = "/app/pretrained"
os.makedirs(PRETRAINED_DIR, exist_ok=True)
# -----------------------------
# Step 1: Optional Model Download
# -----------------------------
def download_models():
expected_model = os.path.join(PRETRAINED_DIR, "RAFT/raft-things.pth")
if not Path(expected_model).exists():
print("βš™οΈ Downloading pretrained models...")
try:
subprocess.check_call(["bash", "download/download_models.sh"])
print("βœ… Models downloaded.")
except subprocess.CalledProcessError as e:
print(f"❌ Model download failed: {e}")
else:
print("βœ… Pretrained models already exist.")
download_models()
# -----------------------------
# Step 2: Inference Logic
# -----------------------------
def run_epic_inference(video_path, caption, motion_type):
temp_input_path = "/app/temp_input.mp4"
output_dir = f"/app/output_{motion_type}"
traj_name = motion_type
traj_txt = f"/app/inference/v2v_data/test/trajs/{traj_name}.txt"
# Save uploaded video
if video_path:
os.system(f"cp '{video_path}' {temp_input_path}")
command = [
"python",
"/app/inference/v2v_data/inference.py",
"--video_path",
temp_input_path,
"--stride",
"1",
"--out_dir",
output_dir,
"--radius_scale",
"1",
"--camera",
"traj",
"--mask",
"--target_pose", "0", "30", "-0.6", "0", "0",
"--traj_txt",
traj_txt,
"--save_name",
f"amalfi-coast_traj_{traj_name}",
"--mode",
"gradual",
"--out_dir",
output_dir,
]
# Run inference command
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
logs = result.stdout
except subprocess.CalledProcessError as e:
logs = f"❌ Inference failed:\n{e.stderr}"
return logs, None
# Locate the output video
output_video = Path(output_dir) / f"amalfi-coast_traj_{traj_name}.mp4"
if output_video.exists():
return logs, str(output_video)
else:
return f"Inference succeeded but no output video found in {output_dir}", None
# -----------------------------
# Step 3: Create Gradio UI
# -----------------------------
demo = gr.Interface(
fn=run_epic_inference,
inputs=[
gr.Video(label="Upload Video (MP4)"),
gr.Textbox(label="Caption", placeholder="e.g., Amalfi coast with boats"),
gr.Dropdown(
choices=["zoom_in", "rotate", "orbit", "pan", "loop1"],
label="Camera Motion Type",
value="zoom_in",
),
],
outputs=[gr.Textbox(label="Inference Logs"), gr.Video(label="Generated Video")],
title="🎬 EPiC: Efficient Video Camera Control",
description="Upload a video, describe the scene, and apply cinematic camera motion using pretrained EPiC models.",
)
# -----------------------------
# Step 4: Launch App
# -----------------------------
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)