themalinery's picture
deactivated sharable link
3ff9813
import gradio as gr
import tempfile
import shutil
from pathlib import Path
import sys
# Monkey patch to fix gradio_client schema parsing bug
try:
from gradio_client import utils as client_utils
# Patch the main function that fails when encountering booleans
original_json_schema_to_python_type = client_utils._json_schema_to_python_type
def patched_json_schema_to_python_type(schema, defs=None):
# If schema is a boolean, return a simple dict representation
if isinstance(schema, bool):
return "bool"
return original_json_schema_to_python_type(schema, defs)
client_utils._json_schema_to_python_type = patched_json_schema_to_python_type
except Exception as e:
print(f"Warning: Could not apply monkey patch: {e}")
from src.utils import create_video_from_images, object_detection
def process_video(video_file, labels_text, frame_color):
# Parse labels
text_labels = [label.strip() for label in labels_text.split(',') if label.strip()]
if not text_labels:
return None
# Create config
config = {
'labels': text_labels,
'frame_colour': frame_color
}
# Create temporary directories
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
frames_dir = temp_path / "frames"
frames_dir.mkdir()
output_video = temp_path / "output.mp4"
# Process video to frames
object_detection(str(video_file), str(frames_dir), config)
# Create video from frames
create_video_from_images(str(frames_dir), str(output_video), fps=30)
# Copy to a permanent location for download
results_dir = Path("./results/gradio_outputs")
results_dir.mkdir(parents=True, exist_ok=True)
final_output = results_dir / f"detected_{Path(video_file).stem}.mp4"
shutil.copy(output_video, final_output)
return str(final_output)
# Simple gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Video Object Detection")
with gr.Row():
video_input = gr.File(label="Upload Video", file_types=[".mp4", ".avi", ".mov"])
labels_input = gr.Textbox(label="Labels (comma-separated)", placeholder="cat,dog,person")
color_input = gr.ColorPicker(label="Bounding Box Color", value="#FF0000")
process_btn = gr.Button("Process")
output = gr.File(label="Download")
def process(video, labels, color):
if not video or not labels:
return None
try:
result = process_video(video, labels, color)
return result
except Exception as e:
print(f"Error: {e}")
return None
process_btn.click(process, inputs=[video_input, labels_input, color_input], outputs=output)
if __name__ == "__main__":
demo.launch()