# app.py import os import uuid import subprocess from pathlib import Path from typing import Tuple from inference_img import * import gradio as gr # Demo images FRAME1 = Path("demo/frame1.jpg") FRAME2 = Path("demo/frame2.jpg") DEMO = Path("demo/demo.gif") MODEL = Path("train_log/") TMP_PREFIX = "demo/" TARGET_DIR = f"{TMP_PREFIX}output/" EXTENSION = "png" def interpolate_image(img_a_path: str, img_b_path: str) -> Tuple[str, str]: """ 3-step pipeline: 1) inference_img.py --img --exp=4 -> writes frames as /tmp/gradio/output/img%d.png 2) ffmpeg palettegen 3) ffmpeg paletteuse -> final GIF at a unique path Returns: (gif_filepath_for_preview, gif_filepath_for_download) """ # Ensure temp dirs exist os.makedirs(TARGET_DIR, exist_ok=True) # Unique output path per run interpolated_path = f"{TARGET_DIR}{uuid.uuid4()}.{EXTENSION}" palette_path = f"{TMP_PREFIX}palette.png" try: #inference_img(img=[Path(img_a_path), Path(img_b_path)],exp=4) print("ok") subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "image2", "-i", f"{TARGET_DIR}img%d.png", "-vf", "palettegen=stats_mode=single", palette_path ], check=True) # 1) Run interpolation (frames -> TARGET_DIR/img1.png ... imgN.png) #subprocess.run([ # "python3", "inference_img.py", # "--img", str(img_a_path), str(img_b_path), # "--exp", "4" #], check=True) print("ok") # 2) Generate palette subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "image2", "-i", f"{TARGET_DIR}img%d.png", "-vf", "palettegen=stats_mode=single", palette_path ], check=True) # 3) Use palette to produce final GIF #!ffmpeg -r 14 -f image2 -i output/img%d.png -vf "palettegen=stats_mode=single" palette.png subprocess.run([ "ffmpeg", "-y", "-r", "14", "-f", "-i", f"{TARGET_DIR}img%d.png", "palettegen=stats_mode=single", palette_path ], check=True) return interpolated_image, interpolated_path except subprocess.CalledProcessError as e: raise gr.Error(f"Interpolation failed. {e}") # Gradio UI with gr.Blocks(title="RIFE Interpolation") as demo: with gr.Tab("Demo"): gr.Markdown("### Demo: Preloaded images") input_imageA = gr.Image(type="filepath", value=str(FRAME1), label="Image A") input_imageB = gr.Image(type="filepath", value=str(FRAME2), label="Image B") output_image = gr.Image(type="filepath", value=str(DEMO), label="Demo") g_btn = gr.Button("Interpolate") output_image = gr.Image(type="filepath", label="Interpolated GIF") enhance_image_path = gr.Textbox(label="Output path", interactive=False) g_btn.click( fn=interpolate_image, inputs=[input_imageA, input_imageB] ) with gr.Tab("Upload your images"): gr.Markdown("### Upload any two images") input_imageA = gr.Image(type="filepath", label="Image A") input_imageB = gr.Image(type="filepath", label="Image B") user_btn = gr.Button("Interpolate") user_out = gr.Image(type="filepath", value=str(TARGET_DIR), label="Interpolated GIF") user_path = gr.Textbox(label="Output path", value=str(TARGET_DIR), interactive=False) user_btn.click( fn=interpolate_image, inputs=[input_imageA, input_imageB], outputs=[user_out, user_path], ) demo.launch()