import os from pathlib import Path import subprocess import gradio as gr from PIL import Image import io # Fixed input paths and output location FRAME1_PATH = "demo/frame1.png" FRAME2_PATH = "demo/frame2.png" TARGET_DIR = "output/" #TARGET_DIR = "/home/user/app/output/" OUTPUT_GIF = "output/output.gif" PALETTE_FULL_PATH = "/demo/palette.png" def generate_demo_gif(exp=2, progress=gr.Progress(track_tqdm=True)): progress(0.1, desc="Starting inference...") # Delete old output if exists try: os.remove(OUTPUT_GIF) except FileNotFoundError: pass # Build and run command cmd = [ "python", "inference_img.py", "--img", FRAME1_PATH, FRAME2_PATH, "--exp", str(exp), "--model", "train_log/" ] print("Running:", " ".join(cmd)) result = subprocess.run(cmd, capture_output=True, text=True) print("STDOUT:", result.stdout) print("STDERR:", result.stderr) print("Exists?", os.path.exists("output/img0.png")) # ⬅️ Add it here # Generate palette subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "image2", "-i", f"{TARGET_DIR}img%d.png", "-vf", "palettegen=stats_mode=single", PALETTE_PNG ], check=True) #!ffmpeg -r 14 -f image2 -i output/img%d.png -vf "palettegen=stats_mode=single" /content/demo/palette.png # Step 2: Generate GIF using palette subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "image2", "-i", f"{TARGET_DIR}img%d.png", "-i", PALETTE_PNG, "-lavfi", "paletteuse", OUTPUT_GIF ], check=True) #!ffmpeg -r 14 -f image2 -i output/img%d.png -i palette.png -lavfi "paletteuse" output/retro.gif subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "image2", "-i", f"{TARGET_DIR}img%d.png", "-i", PALETTE_PNG, "-lavfi", "paletteuse", OUTPUT_GIF ], check=True) # UI setup with gr.Blocks() as demo_ui: gr.Markdown("## 🎞️ Demo GIF Generator — Interpolate Two Frames") with gr.Row(): gr.Image(value=FRAME1_PATH, label="Frame 1", interactive=False) gr.Image(value=FRAME2_PATH, label="Frame 2", interactive=False) exp = gr.Slider(1, 4, value=2, step=1, label="Interpolation Exponent") run_btn = gr.Button("Generate GIF") out_gif = gr.Image(label="Output GIF") status = gr.Markdown() run_btn.click(fn=generate_demo_gif, inputs=[exp], outputs=[out_gif, status]) # Launch the app demo_ui.launch(ssr_mode=False)