SpatialTrackerV2 / app_ui_only.py
abreza's picture
Add Gradio UI demo for video-to-pointcloud renderer with camera movement selection
d95e919
import gradio as gr
import os
import time
from pathlib import Path
# Constants
CAMERA_MOVEMENTS = [
"static",
"move_forward",
"move_backward",
"move_left",
"move_right",
"move_up",
"move_down"
]
def process_video_mock(video_path: str, camera_movement: str, progress=gr.Progress()):
"""Mock processing function - just simulates processing without actual model inference"""
if video_path is None:
return None, "❌ Please upload a video first"
progress(0, desc="Initializing...")
time.sleep(0.5)
progress(0.2, desc="Loading video...")
time.sleep(0.5)
progress(0.4, desc="[MOCK] Estimating depth and camera poses...")
time.sleep(0.5)
progress(0.6, desc="[MOCK] Running 3D tracking...")
time.sleep(0.5)
progress(0.8, desc=f"[MOCK] Generating {camera_movement} camera trajectory...")
time.sleep(0.5)
progress(1.0, desc="Done!")
# Return the input video as output (mock)
return video_path, f"✅ [MOCK] Video processed with '{camera_movement}' camera movement!\n\n⚠️ This is a UI-only demo - no actual processing was performed."
# Create Gradio interface
print("🎨 Creating Gradio interface (UI Only Mode)...")
with gr.Blocks(
theme=gr.themes.Soft(),
title="🎬 Video to Point Cloud Renderer (UI Demo)",
css="""
.gradio-container {
max-width: 900px !important;
margin: auto !important;
}
.warning-box {
background-color: #fff3cd;
border: 1px solid #ffc107;
border-radius: 8px;
padding: 10px;
margin-bottom: 10px;
}
"""
) as demo:
gr.Markdown("""
# 🎬 Video to Point Cloud Renderer (UI Demo)
⚠️ **UI-Only Mode**: This demo shows the interface without loading heavy models.
Upload a video to test the interface. No actual processing will be performed.
**How it works (in full version):**
1. Upload a video
2. Select a camera movement type
3. Click "Generate" to create the rendered video
""")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 📥 Input")
video_input = gr.Video(
label="Upload Video",
format="mp4",
height=300
)
camera_movement = gr.Dropdown(
choices=CAMERA_MOVEMENTS,
value="static",
label="🎥 Camera Movement",
info="Select how the camera should move in the rendered video"
)
generate_btn = gr.Button("🚀 Generate (Mock)", variant="primary", size="lg")
with gr.Column(scale=1):
gr.Markdown("### 📤 Output")
output_video = gr.Video(
label="Rendered Video",
height=300
)
status_text = gr.Markdown("Ready to process (UI Demo Mode)...")
# Event handlers
generate_btn.click(
fn=process_video_mock,
inputs=[video_input, camera_movement],
outputs=[output_video, status_text]
)
# Examples
gr.Markdown("### 📁 Examples")
if os.path.exists("./examples"):
example_videos = [f for f in os.listdir("./examples") if f.endswith(".mp4")][:4]
if example_videos:
gr.Examples(
examples=[[f"./examples/{v}", "move_forward"] for v in example_videos],
inputs=[video_input, camera_movement],
outputs=[output_video, status_text],
fn=process_video_mock,
cache_examples=False
)
# Launch
if __name__ == "__main__":
demo.launch(share=False)