| import pickle | |
| import cv2 | |
| import requests | |
| import supervision as sv | |
| import argparse | |
| import os | |
| from typing import List | |
| def parse_arguments() -> argparse.Namespace: | |
| parser = argparse.ArgumentParser( | |
| description="Process video and annotate frames with detections." | |
| ) | |
| parser.add_argument( | |
| "--video_path", type=str, required=True, help="Path to the video file." | |
| ) | |
| parser.add_argument( | |
| "--class_list", | |
| type=str, | |
| nargs="+", | |
| required=True, | |
| help="List of classes to detect in the video.", | |
| ) | |
| parser.add_argument( | |
| "--dataset_id", type=str, required=True, help="Dataset ID for the API request." | |
| ) | |
| parser.add_argument( | |
| "--version_id", type=str, required=True, help="Version ID for the API request." | |
| ) | |
| parser.add_argument( | |
| "--confidence", | |
| type=float, | |
| default=0.5, | |
| help="Confidence threshold for the detections.", | |
| ) | |
| return parser.parse_args() | |
| def process_and_annotate_frames( | |
| video_path: str, | |
| class_list: List[str], | |
| dataset_id: str, | |
| version_id: str, | |
| confidence: float, | |
| api_key: str, | |
| ) -> None: | |
| url = f"http://localhost:9001/{dataset_id}/{version_id}?image_type=numpy" | |
| headers = {"Content-Type": "application/json"} | |
| params = { | |
| "api_key": api_key, | |
| "confidence": confidence, | |
| } | |
| box_annotator = sv.BoxAnnotator() | |
| for frame in sv.get_video_frames_generator(source_path=video_path): | |
| numpy_data = pickle.dumps(frame) | |
| response = requests.post( | |
| url, headers=headers, params=params, data=numpy_data | |
| ).json() | |
| detections = sv.Detections.from_roboflow(response, class_list=class_list) | |
| labels = [ | |
| f"{class_list[class_id]} {confidence_value:0.2f}" | |
| for _, _, confidence_value, class_id, _ in detections | |
| ] | |
| annotated_image = box_annotator.annotate( | |
| frame, detections=detections, labels=labels | |
| ) | |
| cv2.imshow("Annotated image", annotated_image) | |
| cv2.waitKey(1) | |
| if __name__ == "__main__": | |
| args = parse_arguments() | |
| API_KEY = os.environ.get("API_KEY") | |
| if not API_KEY: | |
| raise ValueError("API_KEY not found in environment variables.") | |
| process_and_annotate_frames( | |
| args.video_path, | |
| args.class_list, | |
| args.dataset_id, | |
| args.version_id, | |
| args.confidence, | |
| API_KEY, | |
| ) | |