Spaces:
Sleeping
Sleeping
import os | |
import cv2 as cv | |
import supervision as sv | |
from ultralytics import YOLO | |
PROJECT_DIR = os.path.dirname(os.path.dirname(r"C:\Users\sardo\Documents\DS\PyCharm\cradle\traffic_laws\data\test\images")) | |
IMAGE_FILE = "data/images/frame3922.jpg" | |
MODEL_PATH = "models/best.pt" | |
DISPLAY_SIZE = (800, 600) | |
# necessary for counting | |
# LINE_START = sv.Point(320, 0) | |
# LINE_END = sv.Point(320, 480) | |
def tracking_objects(model_path, source_path, show=False, conf=0.2, iou=0.1, stream=True): | |
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' | |
yolo_model = YOLO(model_path) | |
results = yolo_model.track( | |
source=source_path, | |
show=show, | |
conf=conf, | |
iou=iou, | |
stream=stream, | |
agnostic_nms=True) | |
return results, yolo_model | |
def tracking_video_process(video_path, model_path): | |
tracking_results, yolo_model = tracking_objects(model_path, video_path) | |
box_annotator = sv.BoxAnnotator(thickness=2, text_thickness=1, text_scale=0.5) | |
for result in tracking_results: | |
image = result.orig_img | |
detections = sv.Detections.from_yolov8(result) | |
if result.boxes.id is not None: | |
detections.tracker_id = result.boxes.id.cpu().numpy().astype(int) | |
print(detections.tracker_id) | |
# detections = detections[(detections.class_id != 60) & (detections.class_id != 0)] | |
labels = [ | |
f"{tracker_id} {yolo_model.model.names[class_id]} {confidence:0.2f}" | |
for _, confidence, class_id, tracker_id | |
in detections | |
] | |
print(labels) | |
image = box_annotator.annotate( | |
scene=image, | |
detections=detections, | |
labels=labels | |
) | |
image = cv.resize(image, DISPLAY_SIZE) | |
cv.imshow("Tracking Video", image) | |
if cv.waitKey(1) & 0xFF == ord("q"): | |
break | |
# cv.waitKey(0) | |
# cv.destroyAllWindows() | |
def tracking_images_process(images_path, model_path): | |
# Loop through all files in directory | |
for img_file in os.listdir(images_path): | |
image_file_path = os.path.join(images_path, img_file) | |
# get image from file path | |
if os.path.isfile(image_file_path) and os.stat(image_file_path).st_size <= 0: | |
print(f"{image_file_path} is empty or does not exist.") | |
return None | |
tracking_results, yolo_model = tracking_objects(model_path, image_file_path) | |
# line_counter = sv.LineZone(start=LINE_START, end=LINE_END) | |
# line_annotator = sv.LineZoneAnnotator(thickness=2, text_thickness=1, text_scale=0.5) | |
box_annotator = sv.BoxAnnotator(thickness=2, text_thickness=1, text_scale=0.5) | |
for result in tracking_results: | |
image = result.orig_img | |
detections = sv.Detections.from_yolov8(result) | |
if result.boxes.id is not None: | |
detections.tracker_id = result.boxes.id.cpu().numpy().astype(int) | |
print(detections.tracker_id) | |
# detections = detections[(detections.class_id != 60) & (detections.class_id != 0)] | |
labels = [ | |
f"{tracker_id} {yolo_model.model.names[class_id]} {confidence:0.2f}" | |
for _, confidence, class_id, tracker_id | |
in detections | |
] | |
print(labels) | |
image = box_annotator.annotate( | |
scene=image, | |
detections=detections, | |
labels=labels | |
) | |
image = cv.resize(image, DISPLAY_SIZE) | |
cv.imshow("Image with tracking", image) | |
cv.waitKey(0) | |
cv.destroyAllWindows() | |
def main(): | |
# model and video path | |
model_path = os.path.join(PROJECT_DIR, MODEL_PATH) | |
image_path = os.path.join(PROJECT_DIR, IMAGE_FILE) | |
video_path = os.path.join(PROJECT_DIR, "data", "video", "vid_39_1284-2_3881.mp4") | |
# display tracking from video | |
# tracking_video_process(video_path, model_path) | |
# display tracking from images | |
tracking_images_process(image_path, model_path) | |
if __name__ == "__main__": | |
main() | |