From 5cce8a159934b4c97d390dfdd30bf1c0a54bb4d0 Mon Sep 17 00:00:00 2001 From: LinasKo Date: Mon, 4 Nov 2024 12:23:56 +0200 Subject: [PATCH] Remoe Detections.empty metadata field --- supervision/detection/core.py | 16 ++++++---------- supervision/detection/utils.py | 14 +++++++++++--- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/supervision/detection/core.py b/supervision/detection/core.py index 8e2d06e2..32753a30 100644 --- a/supervision/detection/core.py +++ b/supervision/detection/core.py @@ -965,7 +965,7 @@ class Detections: ) @classmethod - def empty(cls, metadata: Optional[Dict[str, Any]] = None) -> Detections: + def empty(cls) -> Detections: """ Create an empty Detections object with no bounding boxes, confidences, or class IDs. @@ -980,14 +980,10 @@ class Detections: empty_detections = Detections.empty() ``` """ - if metadata is not None and not isinstance(metadata, dict): - raise TypeError("Metadata must be a dictionary.") - return cls( xyxy=np.empty((0, 4), dtype=np.float32), confidence=np.array([], dtype=np.float32), class_id=np.array([], dtype=int), - metadata=metadata if metadata is not None else {}, ) def is_empty(self) -> bool: @@ -996,6 +992,7 @@ class Detections: """ empty_detections = Detections.empty() empty_detections.data = self.data + empty_detections.metadata = self.metadata return self == empty_detections @classmethod @@ -1052,16 +1049,12 @@ class Detections: array([0.1, 0.2, 0.3]) ``` """ - metadata_list = [detections.metadata for detections in detections_list] - detections_list = [ detections for detections in detections_list if not detections.is_empty() ] - metadata = merge_metadata(metadata_list) - if len(detections_list) == 0: - return Detections.empty(metadata=metadata) + return Detections.empty() for detections in detections_list: validate_detections_fields( @@ -1093,6 +1086,9 @@ class Detections: data = merge_data([d.data for d in detections_list]) + metadata_list = [detections.metadata for detections in detections_list] + metadata = merge_metadata(metadata_list) + return cls( xyxy=xyxy, mask=mask, diff --git a/supervision/detection/utils.py b/supervision/detection/utils.py index d80a4dcb..c5990b42 100644 --- a/supervision/detection/utils.py +++ b/supervision/detection/utils.py @@ -820,8 +820,10 @@ def is_metadata_equal(metadata_a: Dict[str, Any], metadata_b: Dict[str, Any]) -> """ return set(metadata_a.keys()) == set(metadata_b.keys()) and all( np.array_equal(metadata_a[key], metadata_b[key]) - if isinstance(metadata_a[key], np.ndarray) - and isinstance(metadata_b[key], np.ndarray) + if ( + isinstance(metadata_a[key], np.ndarray) + and isinstance(metadata_b[key], np.ndarray) + ) else metadata_a[key] == metadata_b[key] for key in metadata_a ) @@ -833,6 +835,9 @@ def merge_data( """ Merges the data payloads of a list of Detections instances. + Warning: Assumes that empty detections were filtered-out before passing data to + this function. + Args: data_list: The data payloads of the Detections instances. Each data payload is a dictionary with the same keys, and the values are either lists or @@ -892,6 +897,9 @@ def merge_metadata(metadata_list: List[Dict[str, Any]]) -> Dict[str, Any]: This function combines the metadata dictionaries. If a key appears in more than one dictionary, the values must be identical for the merge to succeed. + Warning: Assumes that empty detections were filtered-out before passing metadata to + this function. + Args: metadata_list (List[Dict[str, Any]]): A list of metadata dictionaries to merge. @@ -909,7 +917,7 @@ def merge_metadata(metadata_list: List[Dict[str, Any]]) -> Dict[str, Any]: if not all(keys_set == all_keys_sets[0] for keys_set in all_keys_sets): raise ValueError("All metadata dictionaries must have the same keys to merge.") - merged_metadata = {} + merged_metadata: Dict[str, Any] = {} for metadata in metadata_list: for key, value in metadata.items(): if key in merged_metadata: