Spaces:
Running
Running
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| from ultralytics import YOLO | |
| yolo_model = YOLO("checkpoints/damage_detector.pt") | |
| def get_yolo_damage_boxes(image_path, output_path): | |
| try: | |
| image = Image.open(image_path).convert("RGB") | |
| results = yolo_model.predict( | |
| source=image, | |
| conf=0.05, | |
| imgsz=640, | |
| verbose=False | |
| ) | |
| result = results[0] | |
| boxes = result.boxes | |
| detections = [] | |
| if boxes is not None and len(boxes) > 0: | |
| for box in boxes: | |
| conf = float(box.conf[0]) | |
| cls_id = int(box.cls[0]) | |
| label = yolo_model.names[cls_id] | |
| x1, y1, x2, y2 = map(int, box.xyxy[0]) | |
| detections.append({ | |
| "label": label, | |
| "confidence": round(conf, 4), | |
| "box": [x1, y1, x2, y2] | |
| }) | |
| plotted_bgr = result.plot() | |
| plotted_rgb = plotted_bgr[..., ::-1] | |
| cv2.imwrite(output_path, plotted_rgb) | |
| return { | |
| "detections": detections, | |
| "total_detections": len(detections), | |
| "message": "No damage detected" if len(detections) == 0 else "Detections found" | |
| } | |
| except Exception as e: | |
| raise RuntimeError(f"YOLO failed: {str(e)}") |