#this was in part generated with gemini llm import shutil import zipfile import pathlib import tempfile import gradio as gr import pandas as pd import PIL.Image import huggingface_hub import autogluon.multimodal # --- Model and Path Configuration --- MODEL_REPO_ID = "FaiyazAzam/24679-image-autolguon-predictor" ZIP_FILENAME = "autogluon_image_predictor_dir.zip" CACHE_DIR = pathlib.Path("hf_assets") EXTRACT_DIR = CACHE_DIR / "predictor_native" # --- Model Loading --- def _prepare_predictor_dir() -> str: """Downloads, extracts, and prepares the AutoGluon model directory.""" CACHE_DIR.mkdir(parents=True, exist_ok=True) local_zip = huggingface_hub.hf_hub_download( repo_id=MODEL_REPO_ID, filename=ZIP_FILENAME, repo_type="model", local_dir=str(CACHE_DIR), local_dir_use_symlinks=False, ) if EXTRACT_DIR.exists(): shutil.rmtree(EXTRACT_DIR) EXTRACT_DIR.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(local_zip, "r") as zf: zf.extractall(str(EXTRACT_DIR)) contents = list(EXTRACT_DIR.iterdir()) predictor_root = contents[0] if (len(contents) == 1 and contents[0].is_dir()) else EXTRACT_DIR return str(predictor_root) PREDICTOR_DIR = _prepare_predictor_dir() PREDICTOR = autogluon.multimodal.MultiModalPredictor.load(PREDICTOR_DIR) # --- Class Labels & Prediction Logic --- CLASS_LABELS = {0: "Pen", 1: "Toy"} def do_predict(pil_img: PIL.Image.Image): """ Performs prediction on the input image and returns class probabilities. """ if pil_img is None: return {} with tempfile.TemporaryDirectory() as tmpdir: img_path = pathlib.Path(tmpdir) / "input.png" pil_img.save(img_path) df = pd.DataFrame({"image": [str(img_path)]}) proba_df = PREDICTOR.predict_proba(df) row_series = proba_df.iloc[0] pretty_dict = { CLASS_LABELS[class_idx]: prob for class_idx, prob in row_series.items() if class_idx in CLASS_LABELS } return pretty_dict # --- Gradio User Interface --- EXAMPLES = [ ["https://www.penboutique.com/cdn/shop/articles/IMG_6759.jpg?v=1701974210&width=1920"], ["https://media.officedepot.com/images/f_auto,q_auto,e_sharpen,h_450/products/790761/790761_p_pilot_g_2_retractable_gel_pens/790761"], ["https://i5.walmartimages.com/seo/Disney-Pixar-Toy-Story-True-Talkers-Woody-Figure-with-15-Phrases_8c8c4a17-fb26-4f97-a284-1315c48c18ca.c35d5f2d8b932a490db9bb3f40977220.jpeg"] ] with gr.Blocks() as demo: gr.Markdown("# Pen or Toy?") gr.Markdown( """ This is a simple app that demonstrates how to use an AutoGluon Multimodal predictor in a Gradio Space to classify images. To use, just upload a photo or use one of the examples below. The result will be generated automatically. """ ) with gr.Row(): with gr.Column(): image_in = gr.Image(type="pil", label="Input image", sources=["upload", "webcam"]) with gr.Column(): proba_pretty = gr.Label(num_top_classes=2, label="Class Probabilities") image_in.change(fn=do_predict, inputs=[image_in], outputs=[proba_pretty]) # FIX: Added `fn` and `outputs` to allow example caching to work correctly. gr.Examples( examples=EXAMPLES, inputs=[image_in], outputs=[proba_pretty], fn=do_predict, label="Representative examples", examples_per_page=8, cache_examples=True, ) if __name__ == "__main__": demo.launch()