Spaces:
Sleeping
Sleeping
Create object_detection.py
Browse files- services/object_detection.py +54 -0
services/object_detection.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import cv2
|
| 2 |
+
import numpy as np
|
| 3 |
+
from ultralytics import YOLO
|
| 4 |
+
from typing import List, Tuple, Dict, Any
|
| 5 |
+
|
| 6 |
+
# Load YOLOv8 model for general object detection
|
| 7 |
+
model = YOLO("models/yolov8n.pt")
|
| 8 |
+
|
| 9 |
+
def detect_objects(frame: np.ndarray) -> Tuple[List[Dict[str, Any]], np.ndarray]:
|
| 10 |
+
"""
|
| 11 |
+
Detect cars, bikes, humans, dogs, and other objects in the frame using YOLOv8.
|
| 12 |
+
Args:
|
| 13 |
+
frame: Input frame as a numpy array.
|
| 14 |
+
Returns:
|
| 15 |
+
Tuple of (list of detections, annotated frame).
|
| 16 |
+
"""
|
| 17 |
+
# Perform inference
|
| 18 |
+
results = model(frame, conf=0.5) # Detect all classes with confidence > 0.5
|
| 19 |
+
|
| 20 |
+
detections = []
|
| 21 |
+
for i, r in enumerate(results[0].boxes):
|
| 22 |
+
x_min, y_min, x_max, y_max = map(int, r.xyxy[0])
|
| 23 |
+
conf = float(r.conf)
|
| 24 |
+
cls = int(r.cls)
|
| 25 |
+
# Map YOLOv8 class IDs to labels (based on COCO dataset)
|
| 26 |
+
label_map = {
|
| 27 |
+
0: "person", # Human
|
| 28 |
+
1: "bicycle", # Bike (approximation)
|
| 29 |
+
2: "car",
|
| 30 |
+
3: "motorcycle", # Bike
|
| 31 |
+
5: "bus", # Treat as car
|
| 32 |
+
7: "truck", # Treat as car
|
| 33 |
+
16: "dog",
|
| 34 |
+
}
|
| 35 |
+
dtype = label_map.get(cls, "object") # Default to "object" for unmapped classes
|
| 36 |
+
if dtype in ["bicycle", "motorcycle"]:
|
| 37 |
+
dtype = "bike"
|
| 38 |
+
elif dtype in ["bus", "truck"]:
|
| 39 |
+
dtype = "car"
|
| 40 |
+
label = f"{dtype.capitalize()} {i+1}"
|
| 41 |
+
|
| 42 |
+
# Determine severity (not used for objects, but included for consistency)
|
| 43 |
+
area = (x_max - x_min) * (y_max - y_min)
|
| 44 |
+
severity = "Moderate" # Default for objects
|
| 45 |
+
|
| 46 |
+
detections.append({
|
| 47 |
+
"box": [x_min, y_min, x_max, y_max],
|
| 48 |
+
"label": label,
|
| 49 |
+
"type": dtype,
|
| 50 |
+
"confidence": conf,
|
| 51 |
+
"severity": severity
|
| 52 |
+
})
|
| 53 |
+
|
| 54 |
+
return detections, frame
|