LVP / utils /detector_utils.py
kiwhansong's picture
add demo
142a1ac
# from: https://github.com/ibaiGorordo/Sapiens-Pytorch-Inference/blob/main/sapiens_inference/detector.py
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:
# input: np.ndarray, shape (H, W, C)
# rgb or bgr?
return self.detect(img)
def detect(self, img: np.ndarray) -> np.ndarray:
# input: np.ndarray, shape (H, W, C) in BGR
start = time.perf_counter()
results = self.model(img, conf=self.conf_thres)
detections = results[0].boxes.data.cpu().numpy() # (x1, y1, x2, y2, conf, cls)
# Filter out only person
person_detections = detections[detections[:, -1] == self.person_id]
boxes = person_detections[:, :-2].astype(int) # (x1, y1, x2, y2)
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)