diff --git a/docs/changelog.md b/docs/changelog.md index b9ceb893..39cf7f36 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,136 @@ +### 0.23.0 Aug 28, 2024 + +- Added [#930](https://github.com/roboflow/supervision/pull/930): `IconAnnotator`, a [new annotator](https://supervision.roboflow.com/latest/detection/annotators/#supervision.annotators.core.IconAnnotator) that allows drawing icons on each detection. Useful if you want to draw a specific icon for each class. + +```python +import supervision as sv +from inference import get_model + +image = +icon_dog = +icon_cat = + +model = get_model(model_id="yolov8n-640") +results = model.infer(image)[0] +detections = sv.Detections.from_inference(results) + +icon_paths = [] +for class_name in detections.data["class_names"]: + if class_name == "dog": + icon_paths.append(icon_dog) + elif class_name == "cat": + icon_paths.append(icon_cat) + else: + icon_paths.append("") + +icon_annotator = sv.IconAnnotator() +annotated_frame = icon_annotator.annotate( + scene=image.copy(), + detections=detections, + icon_path=icon_paths +) +``` + +- Added [#1385](https://github.com/roboflow/supervision/pull/1385): `BackgroundColorAnnotator`, that draws an overlay on the background images of the detections. + +```python +import supervision as sv +from inference import get_model + +image = + +model = get_model(model_id="yolov8n-640") +results = model.infer(image)[0] +detections = sv.Detections.from_inference(results) + +background_overlay_annotator = sv.BackgroundOverlayAnnotator() +annotated_frame = background_overlay_annotator.annotate( + scene=image.copy(), + detections=detections +) +``` + +- Added [#1386](https://github.com/roboflow/supervision/pull/1386): Support for Transformers v5 functions in `sv.Detections.from_transformers`. This includes the `DetrImageProcessor` methods `post_process_object_detection`, `post_process_panoptic_segmentation`, `post_process_semantic_segmentation`, and `post_process_instance_segmentation`. + +```python +import torch +import supervision as sv +from PIL import Image +from transformers import DetrImageProcessor, DetrForObjectDetection + +processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50") +model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50") + +image = Image.open() +inputs = processor(images=image, return_tensors="pt") + +with torch.no_grad(): + outputs = model(**inputs) + +width, height = image.size +target_size = torch.tensor([[height, width]]) +results = processor.post_process_object_detection( + outputs=outputs, target_sizes=target_size)[0] +detections = sv.Detections.from_transformers( + transformers_results=results, + id2label=model.config.id2label) +``` + +- Added [#1354](https://github.com/roboflow/supervision/pull/1354): Ultralytics SAM (Segment Anything Model) support in `sv.Detections.from_ultralytics`. SAM2 was released during this update, and is already supported via `sv.Detections.from_sam`. + +```python +import supervision as sv +from segment_anything import ( + sam_model_registry, + SamAutomaticMaskGenerator +) + +sam_model_reg = sam_model_registry[MODEL_TYPE] +sam = sam_model_reg(checkpoint=CHECKPOINT_PATH).to(device=DEVICE) +mask_generator = SamAutomaticMaskGenerator(sam) +sam_result = mask_generator.generate(IMAGE) +detections = sv.Detections.from_sam(sam_result=sam_result) +``` + +- Added [#1458](https://github.com/roboflow/supervision/pull/1458): `outline_color` options for `TriangleAnnotator` and `DotAnnotator`. + +- Added [#1409](https://github.com/roboflow/supervision/pull/1409): `text_color` option for `VertexLabelAnnotator` keypoint annotator. + +- Changed [#1434](https://github.com/roboflow/supervision/pull/1434): `InferenceSlicer` now features an `overlap_ratio_wh` parameter, making it easier to compute slice sizes when handling overlapping slices. + +- Fix [#1448](https://github.com/roboflow/supervision/pull/1448): Various annotator type issues have been resolved, supporting expanded error handling. + +- Fix [#1348](https://github.com/roboflow/supervision/pull/1348): Introduced a new method for seeking to a specific video frame, addressing cases where traditional seek methods were failing. It can be enabled with `iterative_seek=True`. + +```python +import supervision as sv + +for frame in sv.get_video_frames_generator( + source_path=, + start=60, + iterative_seek=True +): + ... +``` + +- Fix [#1424](https://github.com/roboflow/supervision/pull/1424): `plot_image` function now clearly indicates that the size is in inches. + +!!! failure "Removed" + + The `track_buffer`, `track_thresh`, and `match_thresh` parameters in [`ByteTrack`](trackers.md/#supervision.tracker.byte_tracker.core.ByteTrack) are deprecated and were removed as of `supervision-0.23.0`. Use `lost_track_buffer,` `track_activation_threshold`, and `minimum_matching_threshold` instead. + +!!! failure "Removed" + + The `triggering_position ` parameter in [`sv.PolygonZone`](detection/tools/polygon_zone.md/#supervision.detection.tools.polygon_zone.PolygonZone) was removed as of `supervision-0.23.0`. Use `triggering_anchors ` instead. + +!!! failure "Deprecated" + + `overlap_filter_strategy` in `InferenceSlicer.__init__` is deprecated and will be removed in `supervision-0.27.0`. Use `overlap_strategy` instead. + +!!! failure "Deprecated" + + `overlap_ratio_wh` in `InferenceSlicer.__init__` is deprecated and will be removed in `supervision-0.27.0`. Use `overlap_wh` instead. + ### 0.22.0 Jul 12, 2024 - Added [#1326](https://github.com/roboflow/supervision/pull/1326): [`sv.DetectionsDataset`](https://supervision.roboflow.com/latest/datasets/core/#supervision.dataset.core.DetectionDataset) and [`sv.ClassificationDataset`](https://supervision.roboflow.com/latest/datasets/core/#supervision.dataset.core.ClassificationDataset) allowing to load the images into memory only when necessary (lazy loading). @@ -360,7 +493,7 @@ annotated_frame = crop_annotator.annotate( !!! failure "Deprecated" - The `track_buffer`, `track_thresh`, and `match_thresh` parameters in `sv.ByterTrack` are deprecated and will be removed in `supervision-0.23.0`. Use `lost_track_buffer,` `track_activation_threshold`, and `minimum_matching_threshold` instead. + The `track_buffer`, `track_thresh`, and `match_thresh` parameters in `sv.ByteTrack` are deprecated and will be removed in `supervision-0.23.0`. Use `lost_track_buffer,` `track_activation_threshold`, and `minimum_matching_threshold` instead. - Changed [#910](https://github.com/roboflow/supervision/pull/910): [`sv.PolygonZone`](/0.19.0/detection/tools/polygon_zone/#supervision.detection.tools.polygon_zone.PolygonZone) to now accept a list of specific box anchors that must be in zone for a detection to be counted. diff --git a/docs/deprecated.md b/docs/deprecated.md index 5f9de21d..0d2f456b 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -7,15 +7,24 @@ status: deprecated These features are phased out due to better alternatives or potential issues in future versions. Deprecated functionalities are supported for **five subsequent releases**, providing time for users to transition to updated methods. -- The `track_buffer`, `track_thresh`, and `match_thresh` parameters in [`ByterTrack`](trackers.md/#supervision.tracker.byte_tracker.core.ByteTrack) are deprecated and will be removed in `supervision-0.23.0`. Use `lost_track_buffer,` `track_activation_threshold`, and `minimum_matching_threshold` instead. -- The `triggering_position ` parameter in [`sv.PolygonZone`](detection/tools/polygon_zone.md/#supervision.detection.tools.polygon_zone.PolygonZone) will be removed in `supervision-0.23.0`. Use `triggering_anchors ` instead. - The `frame_resolution_wh ` parameter in [`sv.PolygonZone`](detection/tools/polygon_zone.md/#supervision.detection.tools.polygon_zone.PolygonZone) will be removed in `supervision-0.24.0`. + - Constructing `DetectionDataset` and `ClassificationDataset` with parameter `images` as `Dict[str, np.ndarray]` will be removed in `supervision-0.26.0`. Please pass a list of paths `List[str]` instead. - The `DetectionDataset.images` property will be removed in `supervision-0.26.0`. Please loop over images with `for path, image, annotation in dataset:`, as that does not require loading all images into memory. - `BoundingBoxAnnotator` has been renamed to `BoxAnnotator` after the old implementation of `BoxAnnotator` has been removed. `BoundingBoxAnnotator` will be removed in `supervision-0.26.0`. +- `overlap_filter_strategy` in `InferenceSlicer.__init__` is deprecated and will be removed in `supervision-0.27.0`. Use `overlap_strategy` instead. +- `overlap_ratio_wh` in `InferenceSlicer.__init__` is deprecated and will be removed in `supervision-0.27.0`. Use `overlap_wh` instead. + # Removed +### 0.23.0 + +- The `track_buffer`, `track_thresh`, and `match_thresh` parameters in [`ByteTrack`](trackers.md/#supervision.tracker.byte_tracker.core.ByteTrack) are deprecated and were removed as of `supervision-0.23.0`. Use `lost_track_buffer,` `track_activation_threshold`, and `minimum_matching_threshold` instead. +- The `triggering_position ` parameter in [`sv.PolygonZone`](detection/tools/polygon_zone.md/#supervision.detection.tools.polygon_zone.PolygonZone) was removed as of `supervision-0.23.0`. Use `triggering_anchors ` instead. + +### 0.22.0 + - [`Detections.from_froboflow`](detection/core.md/#supervision.detection.core.Detections.from_roboflow) is removed as of `supervision-0.22.0`. Use [`Detections.from_inference`](detection/core.md/#supervision.detection.core.Detections.from_inference) instead. - The method `Color.white()` was removed as of `supervision-0.22.0`. Use the constant `Color.WHITE` instead. - The method `Color.black()` was removed as of `supervision-0.22.0`. Use the constant `Color.BLACK` instead. diff --git a/examples/heatmap_and_track/script.py b/examples/heatmap_and_track/script.py index a4eb80b9..f2060dbb 100644 --- a/examples/heatmap_and_track/script.py +++ b/examples/heatmap_and_track/script.py @@ -20,9 +20,9 @@ def heatmap_and_track( iou_threshold: float = 0.5, heatmap_alpha: float = 0.5, radius: int = 25, - track_threshold: float = 0.35, + track_activation_threshold: float = 0.35, track_seconds: int = 5, - match_threshold: float = 0.99, + minimum_matching_threshold: float = 0.99, ) -> None: ### instantiate model model = YOLO(source_weights_path) @@ -47,9 +47,9 @@ def heatmap_and_track( ### tracker config byte_tracker = sv.ByteTrack( - track_thresh=track_threshold, - track_buffer=track_seconds * fps, - match_thresh=match_threshold, + track_activation_threshold=track_activation_threshold, + lost_track_buffer=track_seconds * fps, + minimum_matching_threshold=minimum_matching_threshold, frame_rate=fps, ) @@ -175,7 +175,7 @@ if __name__ == "__main__": iou_threshold=args.iou_threshold, heatmap_alpha=args.heatmap_alpha, radius=args.radius, - track_threshold=args.track_threshold, + track_activation_threshold=args.track_threshold, track_seconds=args.track_seconds, - match_threshold=args.match_threshold, + minimum_matching_threshold=args.match_threshold, ) diff --git a/examples/speed_estimation/inference_example.py b/examples/speed_estimation/inference_example.py index 78432dad..14edb886 100644 --- a/examples/speed_estimation/inference_example.py +++ b/examples/speed_estimation/inference_example.py @@ -95,7 +95,7 @@ if __name__ == "__main__": model = get_roboflow_model(model_id=args.model_id, api_key=args.roboflow_api_key) byte_track = sv.ByteTrack( - frame_rate=video_info.fps, track_thresh=args.confidence_threshold + frame_rate=video_info.fps, track_activation_threshold=args.confidence_threshold ) thickness = sv.calculate_optimal_line_thickness( diff --git a/examples/speed_estimation/ultralytics_example.py b/examples/speed_estimation/ultralytics_example.py index 170d918e..63a4c7ea 100644 --- a/examples/speed_estimation/ultralytics_example.py +++ b/examples/speed_estimation/ultralytics_example.py @@ -73,7 +73,7 @@ if __name__ == "__main__": model = YOLO("yolov8x.pt") byte_track = sv.ByteTrack( - frame_rate=video_info.fps, track_thresh=args.confidence_threshold + frame_rate=video_info.fps, track_activation_threshold=args.confidence_threshold ) thickness = sv.calculate_optimal_line_thickness( diff --git a/examples/speed_estimation/yolo_nas_example.py b/examples/speed_estimation/yolo_nas_example.py index f8eb46d5..e3593df7 100644 --- a/examples/speed_estimation/yolo_nas_example.py +++ b/examples/speed_estimation/yolo_nas_example.py @@ -74,7 +74,7 @@ if __name__ == "__main__": model = models.get(Models.YOLO_NAS_L, pretrained_weights="coco") byte_track = sv.ByteTrack( - frame_rate=video_info.fps, track_thresh=args.confidence_threshold + frame_rate=video_info.fps, track_activation_threshold=args.confidence_threshold ) thickness = sv.calculate_optimal_line_thickness( diff --git a/supervision/detection/tools/polygon_zone.py b/supervision/detection/tools/polygon_zone.py index c1e030f9..5f82cfd8 100644 --- a/supervision/detection/tools/polygon_zone.py +++ b/supervision/detection/tools/polygon_zone.py @@ -12,7 +12,7 @@ from supervision.draw.color import Color from supervision.draw.utils import draw_polygon, draw_text from supervision.geometry.core import Position from supervision.geometry.utils import get_polygon_center -from supervision.utils.internal import SupervisionWarnings, deprecated_parameter +from supervision.utils.internal import SupervisionWarnings class PolygonZone: @@ -30,14 +30,6 @@ class PolygonZone: mask (np.ndarray): The 2D bool mask for the polygon zone """ - @deprecated_parameter( - old_parameter="triggering_position", - new_parameter="triggering_anchors", - map_function=lambda x: [x], - warning_message="`{old_parameter}` in `{function_name}` is deprecated and will " - "be remove in `supervision-0.23.0`. Use '{new_parameter}' " - "instead.", - ) def __init__( self, polygon: npt.NDArray[np.int64], diff --git a/supervision/tracker/byte_tracker/core.py b/supervision/tracker/byte_tracker/core.py index 4be3b184..89e1e2f2 100644 --- a/supervision/tracker/byte_tracker/core.py +++ b/supervision/tracker/byte_tracker/core.py @@ -7,7 +7,6 @@ from supervision.detection.utils import box_iou_batch from supervision.tracker.byte_tracker import matching from supervision.tracker.byte_tracker.basetrack import BaseTrack, TrackState from supervision.tracker.byte_tracker.kalman_filter import KalmanFilter -from supervision.utils.internal import deprecated_parameter class STrack(BaseTrack): @@ -215,30 +214,6 @@ class ByteTrack: false detection or double detection, but risks missing shorter tracks. """ # noqa: E501 // docs - @deprecated_parameter( - old_parameter="track_buffer", - new_parameter="lost_track_buffer", - map_function=lambda x: x, - warning_message="`{old_parameter}` in `{function_name}` is deprecated and will " - "be remove in `supervision-0.23.0`. Use '{new_parameter}' " - "instead.", - ) - @deprecated_parameter( - old_parameter="track_thresh", - new_parameter="track_activation_threshold", - map_function=lambda x: x, - warning_message="`{old_parameter}` in `{function_name}` is deprecated and will " - "be remove in `supervision-0.23.0`. Use '{new_parameter}' " - "instead.", - ) - @deprecated_parameter( - old_parameter="match_thresh", - new_parameter="minimum_matching_threshold", - map_function=lambda x: x, - warning_message="`{old_parameter}` in `{function_name}` is deprecated and will " - "be remove in `supervision-0.23.0`. Use '{new_parameter}' " - "instead.", - ) def __init__( self, track_activation_threshold: float = 0.25,