Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,455 Bytes
ce2b58f 5567efd 9538100 ce2b58f 8386bf1 9538100 ce2b58f 8386bf1 ce2b58f 9c37b92 ce2b58f cdbafa3 ce2b58f cdbafa3 ce2b58f 4cfdbcf 0bd515d cdbafa3 ce2b58f cdbafa3 e999761 ce2b58f 343283f ce2b58f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import logging
from PIL import Image, ImageDraw
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
import shutil
logger = logging.getLogger(__name__)
shutil.rmtree("models/detection/weights", ignore_errors=True)
class ObjectDetector:
def __init__(self, model_key="yolov8n", device="cpu"):
"""
Initialize the Object Detection model using Ultralytics YOLO registry.
Args:
model_key (str): Model name supported by ultralytics, e.g. 'yolov5n', 'yolov8s', etc.
device (str): 'cpu' or 'cuda'
"""
alias_map = {
"yolov8s": "yolov8s",
"yolov8l": "yolov8l",
"yolov11b": "yolov11b",
}
raw_key = model_key.lower()
resolved_key = alias_map.get(raw_key, raw_key)
self.device = device
self.model = YOLO(resolved_key)
logger.info(f" Ultralytics YOLO model '{resolved_key}' initialized on {device}")
def predict(self, image: Image.Image, conf_threshold=0.25):
"""
Run object detection.
Args:
image (PIL.Image.Image): Input image.
Returns:
List[Dict]: List of detected objects with class name, confidence, and bbox.
"""
logger.info("Running object detection")
results = self.model(image)
detections = []
for r in results:
for box in r.boxes:
detections.append({
"class_name": r.names[int(box.cls)],
"confidence": float(box.conf),
"bbox": box.xyxy[0].tolist()
})
logger.info(f"Detected {len(detections)} objects")
return detections
def draw(self, image: Image.Image, detections, alpha=0.5):
"""
Draw bounding boxes on image.
Args:
image (PIL.Image.Image): Input image.
detections (List[Dict]): Detection results.
alpha (float): Blend strength.
Returns:
PIL.Image.Image: Image with bounding boxes drawn.
"""
overlay = image.copy()
draw = ImageDraw.Draw(overlay)
for det in detections:
bbox = det["bbox"]
label = f'{det["class_name"]} {det["confidence"]:.2f}'
draw.rectangle(bbox, outline="red", width=2)
draw.text((bbox[0], bbox[1]), label, fill="red")
return Image.blend(image, overlay, alpha)
|