import os os.environ["GRADIO_API_FORCE_3"] = "1" import gradio as gr import sys import json import shutil import gdown import time from PIL import Image from io import BytesIO # ================================== # SETUP # ================================== print("๐ Gradio App Starting...") BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # Paths UPLOAD_DIR = "/tmp/uploads/" JSON_DIR = "/tmp/results/" OUTPUT_DIR = "/tmp/output/" MODEL_DIR = os.path.join(BASE_DIR, "rcnn_model", "scripts") logo_path = os.path.join(BASE_DIR, "public", "logo.png") model_path = os.path.join(OUTPUT_DIR, "model_final.pth") # Google Drive model GOOGLE_DRIVE_FILE_ID = "1yr64AOgaYZPTcQzG6cxG6lWBENHR9qjW" GDRIVE_URL = f"https://drive.google.com/uc?id={GOOGLE_DRIVE_FILE_ID}" # Create folders os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(JSON_DIR, exist_ok=True) os.makedirs(OUTPUT_DIR, exist_ok=True) # Copy logo.png to /tmp logo_src = os.path.join(BASE_DIR, "public", "logo.png") logo_dst = "/tmp/logo.png" # Only copy if not already there if not os.path.exists(logo_dst): shutil.copy(logo_src, logo_dst) # Download model if missing if not os.path.exists(model_path): print("๐ Model file not found! Downloading...") try: gdown.download(GDRIVE_URL, model_path, quiet=False, use_cookies=False) print("โ Model downloaded successfully.") except Exception as e: print(f"โ Failed to download model: {e}") # Import model sys.path.append(MODEL_DIR) from rcnn_model.scripts.rcnn_run import main, write_config cfg = write_config() # ================================== # MAIN PREDICTION FUNCTION # ================================== def predict(uploaded_file_path): print("Inside Predict:" + uploaded_file_path) if uploaded_file_path is None: return None, None, "No file uploaded.", None # Save uploaded file to temp uploaded_path = os.path.join(UPLOAD_DIR, "input_image.png") shutil.copy(uploaded_file_path, uploaded_path) input_filename = "input_image.png" output_json_name = input_filename.replace(".png", "_result.json").replace(".jpg", "_result.json").replace(".jpeg", "_result.json") output_image_name = input_filename.replace(".png", "_result.png").replace(".jpg", "_result.png").replace(".jpeg", "_result.png") output_json_path = os.path.join(JSON_DIR, output_json_name) output_image_path = os.path.join(JSON_DIR, output_image_name) # Run model main(cfg, uploaded_path, output_json_name, output_image_name) # Read outputs result_img = Image.open(output_image_path) if os.path.exists(output_image_path) else None result_json = {} if os.path.exists(output_json_path): with open(output_json_path, "r") as jf: result_json = json.load(jf) # Save JSON to file for download download_json_path = os.path.join(JSON_DIR, "output_for_download.json") with open(download_json_path, "w") as f: json.dump(result_json, f, indent=2) return result_img, json.dumps(result_json, indent=2), None, download_json_path, uploaded_path # ================================== # GRADIO UI # ================================== with gr.Blocks() as demo: # Header with gr.Row(): gr.Markdown( f"""