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() | |