diff --git a/docs/changelog.md b/docs/changelog.md index 11bca7a7..adf05cb1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,11 @@ +### 0.4.0 April 5, 2023 + +- Added [[#46](https://github.com/roboflow/supervision/discussions/48)]: `Detections.empty` to allow easy creation of empty `Detections` objects. +- Added [[#56](https://github.com/roboflow/supervision/pull/56)]: `Detections.from_roboflow` to allow easy creation of `Detections` objects from Roboflow API inference results. +- Added [[#56](https://github.com/roboflow/supervision/pull/56)]: `plot_images_grid` to allow easy plotting of multiple images on single plot. +- Added [[#56](https://github.com/roboflow/supervision/pull/56)]: initial support for Pascal VOC XML format with `detections_to_voc_xml` method. +- Changed [[#56](https://github.com/roboflow/supervision/pull/56)]: `show_frame_in_notebook` refactored and renamed to `plot_image`. + ### 0.3.2 March 23, 2023 - Changed [[#50](https://github.com/roboflow/supervision/issues/50)]: Allow `Detections.class_id` to be `None`. diff --git a/supervision/detection/core.py b/supervision/detection/core.py index 3e92378c..ed44b453 100644 --- a/supervision/detection/core.py +++ b/supervision/detection/core.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Iterator, Optional, Tuple, Union +from typing import Iterator, Optional, Tuple, Union, List import numpy as np @@ -176,6 +176,31 @@ class Detections: .astype(int), ) + @classmethod + def from_roboflow(cls, roboflow_result: dict, class_list: List[str]) -> Detections: + xyxy = [] + confidence = [] + class_id = [] + + for prediction in roboflow_result["predictions"]: + x = prediction["x"] + y = prediction["y"] + width = prediction["width"] + height = prediction["height"] + x_min = x - width / 2 + y_min = y - height / 2 + x_max = x_min + width + y_max = y_min + height + xyxy.append([x_min, y_min, x_max, y_max]) + class_id.append(class_list.index(prediction["class"])) + confidence.append(prediction["confidence"]) + + return Detections( + xyxy=np.array(xyxy), + confidence=np.array(confidence), + class_id=np.array(class_id).astype(int) + ) + @classmethod def from_coco_annotations(cls, coco_annotation: dict) -> Detections: xyxy, class_id = [], []