Spaces:
Runtime error
Runtime error
| import os | |
| from typing import List, Optional, Union | |
| import numpy as np | |
| import torch | |
| from norfair import Detection | |
| class YOLO: | |
| def __init__(self, model_path: str, device: Optional[str] = None): | |
| if device is not None and "cuda" in device and not torch.cuda.is_available(): | |
| raise Exception("Selected device='cuda', but cuda is not available to Pytorch.") | |
| # automatically set device if its None | |
| elif device is None: | |
| device = "cuda:0" if torch.cuda.is_available() else "cpu" | |
| if not os.path.exists(model_path): | |
| os.system( | |
| f"wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/{os.path.basename(model_path)} -O {model_path}" | |
| ) | |
| # load model | |
| try: | |
| self.model = torch.hub.load("WongKinYiu/yolov7", "custom", model_path) | |
| except: | |
| raise Exception("Failed to load model from {}".format(model_path)) | |
| def __call__( | |
| self, | |
| img: Union[str, np.ndarray], | |
| conf_threshold: float = 0.25, | |
| iou_threshold: float = 0.45, | |
| image_size: int = 720, | |
| classes: Optional[List[int]] = None, | |
| ) -> torch.tensor: | |
| self.model.conf = conf_threshold | |
| self.model.iou = iou_threshold | |
| if classes is not None: | |
| self.model.classes = classes | |
| detections = self.model(img, size=image_size) | |
| return detections | |
| def yolo_detections_to_norfair_detections( | |
| yolo_detections: torch.tensor, track_points: str = "centroid" # bbox or centroid | |
| ) -> List[Detection]: | |
| """convert detections_as_xywh to norfair detections""" | |
| norfair_detections: List[Detection] = [] | |
| if track_points == "centroid": | |
| detections_as_xywh = yolo_detections.xywh[0] | |
| for detection_as_xywh in detections_as_xywh: | |
| centroid = np.array( | |
| [ | |
| [detection_as_xywh[0].item(), detection_as_xywh[1].item()], | |
| [detection_as_xywh[0].item(), detection_as_xywh[1].item()], | |
| ] | |
| ) | |
| scores = np.array([detection_as_xywh[4].item(), detection_as_xywh[4].item()]) | |
| norfair_detections.append(Detection(points=centroid, scores=scores)) | |
| elif track_points == "bbox": | |
| detections_as_xyxy = yolo_detections.xyxy[0] | |
| for detection_as_xyxy in detections_as_xyxy: | |
| bbox = np.array( | |
| [ | |
| [detection_as_xyxy[0].item(), detection_as_xyxy[1].item()], | |
| [detection_as_xyxy[2].item(), detection_as_xyxy[3].item()], | |
| ] | |
| ) | |
| scores = np.array([detection_as_xyxy[4].item(), detection_as_xyxy[4].item()]) | |
| norfair_detections.append(Detection(points=bbox, scores=scores)) | |
| return norfair_detections | |