| |
| import time |
| from dataclasses import dataclass |
| import numpy as np |
| from ultralytics import YOLO |
|
|
| @dataclass |
| class DetectorConfig: |
| model_path: str = "~/models/yolov8m.pt" |
| person_id: int = 0 |
| conf_thres: float = 0.25 |
|
|
|
|
| def draw_boxes(img, boxes, color=(0, 255, 0), thickness=2): |
| draw_img = img.copy() |
| for box in boxes: |
| x1, y1, x2, y2 = box |
| draw_img = cv2.rectangle(draw_img, (x1, y1), (x2, y2), color, thickness) |
| return draw_img |
|
|
|
|
| class Detector: |
| def __init__(self, config: DetectorConfig = DetectorConfig()): |
| model_path = config.model_path |
| if not model_path.endswith(".pt"): |
| model_path = model_path.split(".")[0] + ".pt" |
| self.model = YOLO(model_path) |
| self.person_id = config.person_id |
| self.conf_thres = config.conf_thres |
|
|
| def __call__(self, img: np.ndarray) -> np.ndarray: |
| |
| |
| return self.detect(img) |
|
|
| def detect(self, img: np.ndarray) -> np.ndarray: |
| |
| start = time.perf_counter() |
| results = self.model(img, conf=self.conf_thres) |
| detections = results[0].boxes.data.cpu().numpy() |
|
|
| |
| person_detections = detections[detections[:, -1] == self.person_id] |
| boxes = person_detections[:, :-2].astype(int) |
|
|
| print(f"Detection inference took: {time.perf_counter() - start:.4f} seconds") |
| return boxes |
|
|
|
|
| if __name__ == "__main__": |
| import cv2 |
|
|
| detector = Detector() |
| img = cv2.imread("../ComfyUI_00074_.png") |
| boxes = detector.detect(img) |
| draw_img = draw_boxes(img, boxes) |
| cv2.imshow("img", draw_img) |
| cv2.waitKey(0) |
|
|