object-detection / inference.py
abidlabs's picture
abidlabs HF Staff
Convert to ZeroGPU: swap ONNX Runtime for PyTorch/ultralytics
306ee04
Raw
History Blame Contribute Delete
2.11 kB
import time
import cv2
from ultralytics import YOLO
try:
from demo.object_detection.utils import draw_detections
except (ImportError, ModuleNotFoundError):
from utils import draw_detections
class YOLOv10:
def __init__(self, path):
# Initialize model. `path` may be a local .pt file or an ultralytics
# model name (e.g. "yolov10n.pt"), which is downloaded automatically.
self.model = YOLO(path)
# Kept for backwards compatibility with callers that resize frames
# to the network input before inference.
self.input_width = 640
self.input_height = 640
def __call__(self, image):
return self.detect_objects(image)
def to(self, device):
# Move the underlying torch model to the requested device. On ZeroGPU
# this is called at module level (CUDA emulation) and the real GPU is
# attached when the decorated detection function runs.
self.model.to(device)
return self
def detect_objects(self, image, conf_threshold=0.3):
start = time.perf_counter()
results = self.model.predict(image, conf=conf_threshold, verbose=False)
print(f"Inference time: {(time.perf_counter() - start) * 1000:.2f} ms")
result = results[0]
boxes = result.boxes.xyxy.cpu().numpy()
scores = result.boxes.conf.cpu().numpy()
class_ids = result.boxes.cls.cpu().numpy().astype(int)
return draw_detections(image, boxes, scores, class_ids)
if __name__ == "__main__":
import tempfile
import requests
yolov10_detector = YOLOv10("yolov10s.pt")
with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as f:
f.write(
requests.get(
"https://live.staticflickr.com/13/19041780_d6fd803de0_3k.jpg"
).content
)
f.seek(0)
img = cv2.imread(f.name)
# Detect objects
combined_image = yolov10_detector.detect_objects(img)
# Draw detections
cv2.namedWindow("Output", cv2.WINDOW_NORMAL)
cv2.imshow("Output", combined_image)
cv2.waitKey(0)