| import cv2 | |
| import requests | |
| import base64 | |
| import supervision as sv | |
| import argparse | |
| import os | |
| from typing import List | |
| def parse_arguments() -> argparse.Namespace: | |
| parser = argparse.ArgumentParser( | |
| description="Process image and annotate with detections." | |
| ) | |
| parser.add_argument( | |
| "--image_path", type=str, required=True, help="Path to the image file." | |
| ) | |
| parser.add_argument( | |
| "--class_list", | |
| type=str, | |
| nargs="+", | |
| required=True, | |
| help="List of classes to detect in the image.", | |
| ) | |
| 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 annotate_image( | |
| image_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}" | |
| headers = {"Content-Type": "application/json"} | |
| params = { | |
| "api_key": api_key, | |
| "confidence": confidence, | |
| } | |
| with open(image_path, "rb") as image_file: | |
| encoded_image = base64.b64encode(image_file.read()).decode("utf-8") | |
| image = cv2.imread(image_path) | |
| response = requests.post( | |
| url, headers=headers, params=params, data=encoded_image | |
| ).json() | |
| detections = sv.Detections.from_roboflow(response, class_list=class_list) | |
| box_annotator = sv.BoxAnnotator() | |
| labels = [ | |
| f"{class_list[class_id]} {det_confidence:0.2f}" | |
| for _, _, det_confidence, class_id, _ in detections | |
| ] | |
| annotated_image = box_annotator.annotate( | |
| image, detections=detections, labels=labels | |
| ) | |
| cv2.imshow("Annotated image", annotated_image) | |
| cv2.waitKey(0) | |
| 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.") | |
| annotate_image( | |
| args.image_path, | |
| args.class_list, | |
| args.dataset_id, | |
| args.version_id, | |
| args.confidence, | |
| API_KEY, | |
| ) | |