Spaces:
Sleeping
Sleeping
| from ultralytics import YOLO | |
| import numpy as np | |
| # Simple in-memory cache keyed by (key, frame_idx) | |
| class CachedDetections: | |
| def __init__(self): | |
| self._m = {} | |
| def get(self, key, i): | |
| return self._m.get((key, i)) | |
| def put(self, key, i, dets): | |
| self._m[(key, i)] = dets | |
| class Detector: | |
| def __init__(self, model_name, conf_thr=0.35, iou_thr=0.5): | |
| self.model = YOLO(model_name) | |
| self.conf_thr = conf_thr | |
| self.iou_thr = iou_thr | |
| def predict(self, frame_bgr): | |
| # Ultralytics expects RGB | |
| results = self.model.predict( | |
| frame_bgr[..., ::-1], conf=self.conf_thr, iou=self.iou_thr, verbose=False | |
| ) | |
| dets = [] | |
| if not results: | |
| return dets | |
| r = results[0] | |
| if r.boxes is None: | |
| return dets | |
| for b in r.boxes: | |
| cls_id = int(b.cls[0]) | |
| conf = float(b.conf[0]) | |
| x1, y1, x2, y2 = map(float, b.xyxy[0].tolist()) | |
| label = r.names.get(cls_id, str(cls_id)) | |
| dets.append((label, conf, (x1, y1, x2, y2))) | |
| return dets | |