Spaces:
Paused
Paused
| import gradio as gr | |
| print("[STARTUP] Imports completed (gradio, ultralytics, PIL loaded)", flush=True) | |
| from ultralytics import YOLO | |
| from PIL import Image | |
| print("[STARTUP] Loading YOLO model from best.pt ...", flush=True) | |
| model = YOLO("best.pt") | |
| print("[STARTUP] Model loaded successfully.", flush=True) | |
| print(f"[STARTUP] Model classes: {model.names}", flush=True) | |
| def detect_damage(input_image: Image.Image): | |
| print("[REQUEST] Received new image for detection", flush=True) | |
| if input_image is None: | |
| return None, "No image provided." | |
| results = model.predict( | |
| source=input_image, | |
| imgsz=640, | |
| conf=0.4, | |
| iou=0.45, | |
| ) | |
| result = results[0] | |
| result_image = Image.fromarray(result.plot()[:, :, ::-1]) | |
| detections = result.boxes | |
| if detections is None or len(detections) == 0: | |
| summary = "No damage detected." | |
| else: | |
| lines = [f"Found {len(detections)} detection(s):"] | |
| for box in detections: | |
| class_id = int(box.cls[0]) | |
| confidence = float(box.conf[0]) | |
| class_name = model.names[class_id] | |
| lines.append(f"- {class_name} (confidence: {confidence:.2f})") | |
| summary = "\n".join(lines) | |
| return result_image, summary | |
| demo = gr.Interface( | |
| fn=detect_damage, | |
| inputs=gr.Image(type="pil", label="Upload an image"), | |
| outputs=[ | |
| gr.Image(type="pil", label="Detection result"), | |
| gr.Textbox(label="Summary"), | |
| ], | |
| title="Structural Damage Detection (Crack / Spalling / Pothole)", | |
| description="Upload an image of a road or concrete structure to detect cracks, spalling, and potholes using a YOLOv8 model.", | |
| ) | |
| print("[STARTUP] Calling demo.launch() now ...", flush=True) | |
| if __name__ == "__main__": | |
| demo.launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False) |