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