1578 lines
94 KiB
Markdown
1578 lines
94 KiB
Markdown
# Changelog
|
||
|
||
### 0.27.0 <small>Nov 16, 2025</small>
|
||
|
||
- Added [#2008](https://github.com/roboflow/supervision/pull/2008): [`sv.filter_segments_by_distance`](https://supervision.roboflow.com/0.27.0/detection/utils/masks/#supervision.detection.utils.masks.filter_segments_by_distance) to keep the largest connected component and nearby components within an absolute or relative distance threshold. Useful for cleaning segmentation predictions from models such as SAM, SAM2, YOLO segmentation, and RF-DETR segmentation.
|
||
|
||
- Added [#2006](https://github.com/roboflow/supervision/pull/2006): [`sv.xyxy_to_mask`](https://supervision.roboflow.com/0.27.0/detection/utils/converters/#supervision.detection.utils.converters.xyxy_to_mask) to convert bounding boxes into 2D boolean masks, where each mask corresponds to a single box.
|
||
|
||
- Added [#1943](https://github.com/roboflow/supervision/pull/1943): [`sv.tint_image`](https://supervision.roboflow.com/0.27.0/utils/image/#supervision.utils.image.tint_image) to apply a solid color overlay to an image at a given opacity. Works with both NumPy and PIL inputs.
|
||
|
||
- Added [#1943](https://github.com/roboflow/supervision/pull/1943): [`sv.grayscale_image`](https://supervision.roboflow.com/0.27.0/utils/image/#supervision.utils.image.tint_image) to convert an image to 3 channel grayscale for compatibility with color based drawing utilities.
|
||
|
||
- Added [#2014](https://github.com/roboflow/supervision/pull/2014): [`sv.get_image_resolution_wh`](https://supervision.roboflow.com/0.27.0/utils/image/#supervision.utils.image.get_image_resolution_wh) as a unified way to read image width and height from NumPy and PIL inputs.
|
||
|
||
- Added [#1912](https://github.com/roboflow/supervision/pull/1912): [`sv.edit_distance`](https://supervision.roboflow.com/0.27.0/detection/utils/vlms/#supervision.detection.utils.vlms.edit_distance) for Levenshtein distance between two strings. Supports insert, delete, and substitute operations.
|
||
|
||
- Added [#1912](https://github.com/roboflow/supervision/pull/1912): [`sv.fuzzy_match_index`](https://supervision.roboflow.com/0.27.0/detection/utils/vlms/#supervision.detection.utils.vlms.fuzzy_match_index) to find the first close match in a list using edit distance.
|
||
|
||
- Changed [#2015](https://github.com/roboflow/supervision/pull/2015): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.27.0/detection/core/#supervision.detection.core.Detections.from_vlm) and legacy `from_lmm` now support Qwen3 VL via `vlm=sv.VLM.QWEN_3_VL`.
|
||
|
||
- Changed [#1884](https://github.com/roboflow/supervision/pull/1884): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.27.0/detection/core/#supervision.detection.core.Detections.from_vlm) and legacy `from_lmm` now support DeepSeek VL 2 via `vlm=sv.VLM.DEEPSEEK_VL_2`.
|
||
|
||
- Changed [#2015](https://github.com/roboflow/supervision/pull/2015): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.27.0/detection/core/#supervision.detection.core.Detections.from_vlm) now parses Qwen 2.5 VL outputs more robustly and handles incomplete or truncated JSON responses.
|
||
|
||
- Changed [#2014](https://github.com/roboflow/supervision/pull/2014): [`sv.InferenceSlicer`](https://supervision.roboflow.com/0.27.0/detection/tools/inference_slicer/#supervision.detection.tools.inference_slicer.InferenceSlicer) now uses a new offset generation logic that removes redundant tiles and aligns borders cleanly. This reduces the number of processed tiles and shortens inference time without hurting detection quality.
|
||
|
||
- Changed [#2016](https://github.com/roboflow/supervision/pull/2016): [`sv.Detections`](https://supervision.roboflow.com/0.27.0/detection/core/#supervision.detection.core.Detections) now includes a `box_aspect_ratio` property for vectorized aspect ratio computation, useful for filtering detections based on box shape.
|
||
|
||
- Changed [#2001](https://github.com/roboflow/supervision/pull/2001): Significantly improved the performance of [`sv.box_iou_batch`](https://supervision.roboflow.com/0.27.0/detection/utils/iou_and_nms/#supervision.detection.utils.iou_and_nms.box_iou_batch). On internal benchmarks, processing runs approximately 2x to 5x faster.
|
||
|
||
- Changed [#1997](https://github.com/roboflow/supervision/pull/1997): [`sv.process_video`](https://supervision.roboflow.com/0.27.0/utils/video/#supervision.utils.video.process_video) now uses a threaded reader, processor, and writer pipeline. This removes I/O stalls and improves throughput while keeping the callback single threaded and safe for stateful models.
|
||
|
||
- Changed: [`sv.denormalize_boxes`](https://supervision.roboflow.com/0.27.0/detection/utils/boxes/#supervision.detection.utils.boxes.denormalize_boxes) now supports batch conversion of bounding boxes. The function accepts arrays of shape `(N, 4)` and returns a batch of absolute pixel coordinates.
|
||
|
||
- Changed [#1917](https://github.com/roboflow/supervision/pull/1917): [`sv.LabelAnnotator`](https://supervision.roboflow.com/0.27.0/detection/annotators/#supervision.annotators.core.LabelAnnotator) and [`sv.RichLabelAnnotator`](https://supervision.roboflow.com/0.27.0/detection/annotators/#supervision.annotators.core.RichLabelAnnotator) now accept `text_offset=(x, y)` to shift the label relative to `text_position`. Works with smart label position and line wrapping.
|
||
|
||
!!! failure "Removed"
|
||
Removed the deprecated `overlap_ratio_wh` argument from `sv.InferenceSlicer`. Use the pixel based `overlap_wh` argument to control slice overlap.
|
||
|
||
!!! info "Tip"
|
||
Convert your old ratio based overlap to pixel based overlap by multiplying each ratio by the slice dimensions.
|
||
|
||
```python
|
||
# before
|
||
|
||
slice_wh = (640, 640)
|
||
overlap_ratio_wh = (0.25, 0.25)
|
||
|
||
slicer = sv.InferenceSlicer(
|
||
callback=callback,
|
||
slice_wh=slice_wh,
|
||
overlap_ratio_wh=overlap_ratio_wh,
|
||
overlap_filter=sv.OverlapFilter.NON_MAX_SUPPRESSION,
|
||
)
|
||
|
||
# after
|
||
|
||
overlap_wh = (
|
||
int(overlap_ratio_wh[0] * slice_wh[0]),
|
||
int(overlap_ratio_wh[1] * slice_wh[1]),
|
||
)
|
||
|
||
slicer = sv.InferenceSlicer(
|
||
callback=callback,
|
||
slice_wh=slice_wh,
|
||
overlap_wh=overlap_wh,
|
||
overlap_filter=sv.OverlapFilter.NON_MAX_SUPPRESSION,
|
||
)
|
||
```
|
||
|
||
### 0.26.1 <small>Jul 22, 2025</small>
|
||
|
||
- Fixed [1894](https://github.com/roboflow/supervision/pull/1894): Error in [`sv.MeanAveragePrecision`](https://supervision.roboflow.com/0.26.1/metrics/mean_average_precision/#supervision.metrics.mean_average_precision.MeanAveragePrecision) where the area used for size-specific evaluation (small / medium / large) was always zero unless explicitly provided in `sv.Detections.data`.
|
||
|
||
- Fixed [1895](https://github.com/roboflow/supervision/pull/1895): `ID=0` bug in [`sv.MeanAveragePrecision`](https://supervision.roboflow.com/0.26.1/metrics/mean_average_precision/#supervision.metrics.mean_average_precision.MeanAveragePrecision) where objects were getting `0.0` mAP despite perfect IoU matches due to a bug in annotation ID assignment.
|
||
|
||
- Fixed [1898](https://github.com/roboflow/supervision/pull/1898): Issue where [`sv.MeanAveragePrecision`](https://supervision.roboflow.com/0.26.1/metrics/mean_average_precision/#supervision.metrics.mean_average_precision.MeanAveragePrecision) could return negative values when certain object size categories have no data.
|
||
|
||
- Fixed [1901](https://github.com/roboflow/supervision/pull/1901): `match_metric` support for [`sv.Detections.with_nms`](https://supervision.roboflow.com/0.26.1/metrics/mean_average_precision/#supervision.detection.core.Detections.with_nms).
|
||
|
||
- Fixed [1906](https://github.com/roboflow/supervision/pull/1906): `border_thickness` parameter usage for [`sv.PercentageBarAnnotator`](https://supervision.roboflow.com/0.26.1/metrics/mean_average_precision/#supervision.annotators.core.PercentageBarAnnotator).
|
||
|
||
### 0.26.0 <small>Jul 16, 2025</small>
|
||
|
||
!!! failure "Removed"
|
||
`supervision-0.26.0` drops `python3.8` support and upgrade all codes to `python3.9` syntax style.
|
||
|
||
!!! info "Tip"
|
||
Supervision’s documentation theme now has a fresh look that is consistent with the documentations of all Roboflow open-source projects. ([#1858](https://github.com/roboflow/supervision/pull/1858))
|
||
|
||
- Added [#1774](https://github.com/roboflow/supervision/pull/1774): Support for the IOS (Intersection over Smallest) overlap metric that measures how much of the smaller object is covered by the larger one in [`sv.Detections.with_nms`](https://supervision.roboflow.com/0.26.0/detection/core/#supervision.detection.core.Detections.with_nms), [`sv.Detections.with_nmm`](https://supervision.roboflow.com/0.26.0/detection/core/#supervision.detection.core.Detections.with_nmm), [`sv.box_iou_batch`](https://supervision.roboflow.com/0.26.0/detection/utils/iou_and_nms/#supervision.detection.utils.iou_and_nms.box_iou_batch), and [`sv.mask_iou_batch`](https://supervision.roboflow.com/0.26.0/detection/utils/iou_and_nms/#supervision.detection.utils.iou_and_nms.mask_iou_batch).
|
||
|
||
```python
|
||
import numpy as np
|
||
import supervision as sv
|
||
|
||
boxes_true = np.array([
|
||
[100, 100, 200, 200],
|
||
[300, 300, 400, 400]
|
||
])
|
||
boxes_detection = np.array([
|
||
[150, 150, 250, 250],
|
||
[320, 320, 420, 420]
|
||
])
|
||
|
||
sv.box_iou_batch(
|
||
boxes_true=boxes_true,
|
||
boxes_detection=boxes_detection,
|
||
overlap_metric=sv.OverlapMetric.IOU
|
||
)
|
||
|
||
# array([[0.14285714, 0. ],
|
||
# [0. , 0.47058824]])
|
||
|
||
sv.box_iou_batch(
|
||
boxes_true=boxes_true,
|
||
boxes_detection=boxes_detection,
|
||
overlap_metric=sv.OverlapMetric.IOS
|
||
)
|
||
|
||
# array([[0.25, 0. ],
|
||
# [0. , 0.64]])
|
||
```
|
||
|
||
- Added [#1874](https://github.com/roboflow/supervision/pull/1874): [`sv.box_iou`](https://supervision.roboflow.com/0.26.0/detection/utils/iou_and_nms/#supervision.detection.utils.iou_and_nms.box_iou) that efficiently computes the Intersection over Union (IoU) between two individual bounding boxes.
|
||
|
||
- Added [#1816](https://github.com/roboflow/supervision/pull/1816): Support for frame limitations and progress bar in [`sv.process_video`](https://supervision.roboflow.com/0.26.0/utils/video/#supervision.utils.video.process_video).
|
||
|
||
- Added [#1788](https://github.com/roboflow/supervision/pull/1788): Support for creating [`sv.KeyPoints`](https://supervision.roboflow.com/0.26.0/keypoint/core/#supervision.keypoint.core.KeyPoints) objects from [ViTPose](https://huggingface.co/docs/transformers/en/model_doc/vitpose) and [ViTPose++](https://huggingface.co/docs/transformers/en/model_doc/vitpose#vitpose-models) inference results via [`sv.KeyPoints.from_transformers`](https://supervision.roboflow.com/0.26.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_transformers).
|
||
|
||
- Added [#1823](https://github.com/roboflow/supervision/pull/1823): [`sv.xyxy_to_xcycarh`](https://supervision.roboflow.com/0.26.0/detection/utils/converters/#supervision.detection.utils.converters.xyxy_to_xcycarh) function to convert bounding box coordinates from `(x_min, y_min, x_max, y_max)` into measurement space to format `(center x, center y, aspect ratio, height)`, where the aspect ratio is `width / height`.
|
||
|
||
- Added [#1788](https://github.com/roboflow/supervision/pull/1788): [`sv.xyxy_to_xywh`](https://supervision.roboflow.com/0.26.0/detection/utils/converters/#supervision.detection.utils.converters.xyxy_to_xywh) function to convert bounding box coordinates from `(x_min, y_min, x_max, y_max)` format to `(x, y, width, height)` format.
|
||
|
||
- Changed [#1820](https://github.com/roboflow/supervision/pull/1820): [`sv.LabelAnnotator`](https://supervision.roboflow.com/0.26.0/detection/annotators/#supervision.annotators.core.LabelAnnotator) now supports the `smart_position` parameter to automatically keep labels within frame boundaries, and the `max_line_length` parameter to control text wrapping for long or multi-line labels.
|
||
|
||
- Changed [#1825](https://github.com/roboflow/supervision/pull/1825): [`sv.LabelAnnotator`](https://supervision.roboflow.com/0.26.0/detection/annotators/#supervision.annotators.core.LabelAnnotator) now supports non-string labels.
|
||
|
||
- Changed [#1792](https://github.com/roboflow/supervision/pull/1792): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.26.0/detection/core/#supervision.detection.core.Detections.from_vlm) now supports parsing bounding boxes and segmentation masks from responses generated by [Google Gemini models](https://ai.google.dev/gemini-api/docs/vision).
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
gemini_response_text = """```json
|
||
[
|
||
{"box_2d": [543, 40, 728, 200], "label": "cat", "id": 1},
|
||
{"box_2d": [653, 352, 820, 522], "label": "dog", "id": 2}
|
||
]
|
||
```"""
|
||
|
||
detections = sv.Detections.from_vlm(
|
||
sv.VLM.GOOGLE_GEMINI_2_5,
|
||
gemini_response_text,
|
||
resolution_wh=(1000, 1000),
|
||
classes=['cat', 'dog'],
|
||
)
|
||
|
||
detections.xyxy
|
||
# array([[543., 40., 728., 200.], [653., 352., 820., 522.]])
|
||
|
||
detections.data
|
||
# {'class_name': array(['cat', 'dog'], dtype='<U26')}
|
||
|
||
detections.class_id
|
||
# array([0, 1])
|
||
```
|
||
|
||
- Changed [#1878](https://github.com/roboflow/supervision/pull/1878): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.26.0/detection/core/#supervision.detection.core.Detections.from_vlm) now supports parsing bounding boxes from responses generated by [Moondream](https://github.com/vikhyat/moondream).
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
moondream_result = {
|
||
'objects': [
|
||
{
|
||
'x_min': 0.5704046934843063,
|
||
'y_min': 0.20069346576929092,
|
||
'x_max': 0.7049859315156937,
|
||
'y_max': 0.3012596592307091
|
||
},
|
||
{
|
||
'x_min': 0.6210969910025597,
|
||
'y_min': 0.3300672620534897,
|
||
'x_max': 0.8417936339974403,
|
||
'y_max': 0.4961046129465103
|
||
}
|
||
]
|
||
}
|
||
|
||
detections = sv.Detections.from_vlm(
|
||
sv.VLM.MOONDREAM,
|
||
moondream_result,
|
||
resolution_wh=(1000, 1000),
|
||
)
|
||
|
||
detections.xyxy
|
||
# array([[1752.28, 818.82, 2165.72, 1229.14],
|
||
# [1908.01, 1346.67, 2585.99, 2024.11]])
|
||
```
|
||
|
||
- Changed [#1709](https://github.com/roboflow/supervision/pull/1709): [`sv.Detections.from_vlm`](https://supervision.roboflow.com/0.26.0/detection/core/#supervision.detection.core.Detections.from_vlm) now supports parsing bounding boxes from responses generated by [Qwen-2.5 VL](https://github.com/QwenLM/Qwen2.5-VL).
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
qwen_2_5_vl_result = """```json
|
||
[
|
||
{"bbox_2d": [139, 768, 315, 954], "label": "cat"},
|
||
{"bbox_2d": [366, 679, 536, 849], "label": "dog"}
|
||
]
|
||
```"""
|
||
|
||
detections = sv.Detections.from_vlm(
|
||
sv.VLM.QWEN_2_5_VL,
|
||
qwen_2_5_vl_result,
|
||
input_wh=(1000, 1000),
|
||
resolution_wh=(1000, 1000),
|
||
classes=['cat', 'dog'],
|
||
)
|
||
|
||
detections.xyxy
|
||
# array([[139., 768., 315., 954.], [366., 679., 536., 849.]])
|
||
|
||
detections.class_id
|
||
# array([0, 1])
|
||
|
||
detections.data
|
||
# {'class_name': array(['cat', 'dog'], dtype='<U10')}
|
||
|
||
detections.class_id
|
||
# array([0, 1])
|
||
```
|
||
|
||
- Changed [#1786](https://github.com/roboflow/supervision/pull/1786): Significantly improved the speed of HSV color mapping in [`sv.HeatMapAnnotator`](https://supervision.roboflow.com/0.26.0/detection/annotators/#supervision.annotators.core.HeatMapAnnotator), achieving approximately 28x faster performance on 1920x1080 frames.
|
||
|
||
- Fixed [#1834](https://github.com/roboflow/supervision/pull/1834): Supervision’s [`sv.MeanAveragePrecision`](https://supervision.roboflow.com/0.26.0/metrics/mean_average_precision/#supervision.metrics.mean_average_precision.MeanAveragePrecision) is now fully aligned with [pycocotools](https://github.com/ppwwyyxx/cocoapi), the official COCO evaluation tool, ensuring accurate and standardized metrics. This update enabled us to launch a new version of the [Computer Vision Model Leaderboard](https://leaderboard.roboflow.com/).
|
||
|
||
```python
|
||
import supervision as sv
|
||
from supervision.metrics import MeanAveragePrecision
|
||
|
||
predictions = sv.Detections(...)
|
||
targets = sv.Detections(...)
|
||
|
||
map_metric = MeanAveragePrecision()
|
||
map_metric.update(predictions, targets).compute()
|
||
|
||
# Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.464
|
||
# Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.637
|
||
# Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.203
|
||
# Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.284
|
||
# Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.497
|
||
# Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.629
|
||
```
|
||
|
||
- Fixed [#1767](https://github.com/roboflow/supervision/pull/1767): Fixed losing `sv.Detections.data` when detections filtering.
|
||
|
||
### 0.25.0 <small>Nov 12, 2024</small>
|
||
|
||
- No removals or deprecations in this release!
|
||
|
||
- Essential update to the [`LineZone`](https://supervision.roboflow.com/0.25.0/detection/tools/line_zone/): when computing line crossings, detections that jitter might be counted twice (or more). This can now be solved with the `minimum_crossing_threshold` argument. If you set it to `2` or more, extra frames will be used to confirm the crossing, improving the accuracy significantly. ([#1540](https://github.com/roboflow/supervision/pull/1540))
|
||
|
||
- It is now possible to track objects detected as [`KeyPoints`](https://supervision.roboflow.com/0.25.0/keypoint/core/#supervision.keypoint.core.KeyPoints). See the complete step-by-step guide in the [Object Tracking Guide](https://supervision.roboflow.com/latest/how_to/track_objects/#keypoints). ([#1658](https://github.com/roboflow/supervision/pull/1658))
|
||
|
||
```python
|
||
import numpy as np
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
model = YOLO("yolov8m-pose.pt")
|
||
tracker = sv.ByteTrack()
|
||
trace_annotator = sv.TraceAnnotator()
|
||
|
||
def callback(frame: np.ndarray, _: int) -> np.ndarray:
|
||
results = model(frame)[0]
|
||
key_points = sv.KeyPoints.from_ultralytics(results)
|
||
|
||
detections = key_points.as_detections()
|
||
detections = tracker.update_with_detections(detections)
|
||
|
||
annotated_image = trace_annotator.annotate(frame.copy(), detections)
|
||
return annotated_image
|
||
|
||
sv.process_video(
|
||
source_path="input_video.mp4",
|
||
target_path="output_video.mp4",
|
||
callback=callback
|
||
)
|
||
```
|
||
|
||
- Added `is_empty` method to [`KeyPoints`](https://supervision.roboflow.com/0.25.0/keypoint/core/#supervision.keypoint.core.KeyPoints) to check if there are any keypoints in the object. ([#1658](https://github.com/roboflow/supervision/pull/1658))
|
||
|
||
- Added `as_detections` method to [`KeyPoints`](https://supervision.roboflow.com/0.25.0/keypoint/core/#supervision.keypoint.core.KeyPoints) that converts `KeyPoints` to `Detections`. ([#1658](https://github.com/roboflow/supervision/pull/1658))
|
||
|
||
- Added a new video to `supervision[assets]`. ([#1657](https://github.com/roboflow/supervision/pull/1657))
|
||
|
||
```python
|
||
from supervision.assets import download_assets, VideoAssets
|
||
|
||
path_to_video = download_assets(VideoAssets.SKIING)
|
||
```
|
||
|
||
- Supervision can now be used with [`Python 3.13`](https://docs.python.org/3/whatsnew/3.13.html). The most renowned update is the ability to run Python [without Global Interpreter Lock (GIL)](https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-free-threaded-cpython). We expect support for this among our dependencies to be inconsistent, but if you do attempt it - let us know the results! ([#1595](https://github.com/roboflow/supervision/pull/1595))
|
||
|
||
- Added [`Mean Average Recall`](https://supervision.roboflow.com/latest/metrics/mean_average_recall/) mAR metric, which returns a recall score, averaged over IoU thresholds, detected object classes, and limits imposed on maximum considered detections. ([#1661](https://github.com/roboflow/supervision/pull/1661))
|
||
|
||
```python
|
||
import supervision as sv
|
||
from supervision.metrics import MeanAverageRecall
|
||
|
||
predictions = sv.Detections(...)
|
||
targets = sv.Detections(...)
|
||
|
||
map_metric = MeanAverageRecall()
|
||
map_result = map_metric.update(predictions, targets).compute()
|
||
|
||
map_result.plot()
|
||
```
|
||
|
||
- Added [`Precision`](https://supervision.roboflow.com/latest/metrics/precision/) and [`Recall`](https://supervision.roboflow.com/latest/metrics/recall/) metrics, providing a baseline for comparing model outputs to ground truth or another model ([#1609](https://github.com/roboflow/supervision/pull/1609))
|
||
|
||
```python
|
||
import supervision as sv
|
||
from supervision.metrics import Recall
|
||
|
||
predictions = sv.Detections(...)
|
||
targets = sv.Detections(...)
|
||
|
||
recall_metric = Recall()
|
||
recall_result = recall_metric.update(predictions, targets).compute()
|
||
|
||
recall_result.plot()
|
||
```
|
||
|
||
- All Metrics now support Oriented Bounding Boxes (OBB) ([#1593](https://github.com/roboflow/supervision/pull/1593))
|
||
|
||
```python
|
||
import supervision as sv
|
||
from supervision.metrics import F1_Score
|
||
|
||
predictions = sv.Detections(...)
|
||
targets = sv.Detections(...)
|
||
|
||
f1_metric = MeanAverageRecall(metric_target=sv.MetricTarget.ORIENTED_BOUNDING_BOXES)
|
||
f1_result = f1_metric.update(predictions, targets).compute()
|
||
```
|
||
|
||
- Introducing Smart Labels! When `smart_position` is set for [`LabelAnnotator`](https://supervision.roboflow.com/0.25.0/detection/annotators/#supervision.annotators.core.LabelAnnotator), [`RichLabelAnnotator`](https://supervision.roboflow.com/0.25.0/detection/annotators/#supervision.annotators.core.RichLabelAnnotator) or [`VertexLabelAnnotator`](https://supervision.roboflow.com/0.25.0/detection/annotators/#supervision.annotators.core.RichLabelAnnotator), the labels will move around to avoid overlapping others. ([#1625](https://github.com/roboflow/supervision/pull/1625))
|
||
|
||
```python
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
image = cv2.imread("image.jpg")
|
||
|
||
label_annotator = sv.LabelAnnotator(smart_position=True)
|
||
|
||
model = YOLO("yolo11m.pt")
|
||
results = model(image)[0]
|
||
detections = sv.Detections.from_ultralytics(results)
|
||
|
||
annotated_frame = label_annotator.annotate(first_frame.copy(), detections)
|
||
sv.plot_image(annotated_frame)
|
||
```
|
||
|
||
- Added the `metadata` variable to [`Detections`](https://supervision.roboflow.com/0.25.0/detection/core/#supervision.detection.core.Detections). It allows you to store custom data per-image, rather than per-detected-object as was possible with `data` variable. For example, `metadata` could be used to store the source video path, camera model or camera parameters. ([#1589](https://github.com/roboflow/supervision/pull/1589))
|
||
|
||
```python
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
model = YOLO("yolov8m")
|
||
|
||
result = model("image.png")[0]
|
||
detections = sv.Detections.from_ultralytics(result)
|
||
|
||
# Items in `data` must match length of detections
|
||
object_ids = [num for num in range(len(detections))]
|
||
detections.data["object_number"] = object_ids
|
||
|
||
# Items in `metadata` can be of any length.
|
||
detections.metadata["camera_model"] = "Luxonis OAK-D"
|
||
```
|
||
|
||
- Added a `py.typed` type hints metafile. It should provide a stronger signal to type annotators and IDEs that type support is available. ([#1586](https://github.com/roboflow/supervision/pull/1586))
|
||
|
||
- `ByteTrack` no longer requires `detections` to have a `class_id` ([#1637](https://github.com/roboflow/supervision/pull/1637))
|
||
- `draw_line`, `draw_rectangle`, `draw_filled_rectangle`, `draw_polygon`, `draw_filled_polygon` and `PolygonZoneAnnotator` now comes with a default color ([#1591](https://github.com/roboflow/supervision/pull/1591))
|
||
- Dataset classes are treated as case-sensitive when merging multiple datasets. ([#1643](https://github.com/roboflow/supervision/pull/1643))
|
||
- Expanded [metrics documentation](https://supervision.roboflow.com/0.25.0/metrics/f1_score/) with example plots and printed results ([#1660](https://github.com/roboflow/supervision/pull/1660))
|
||
- Added usage example for polygon zone ([#1608](https://github.com/roboflow/supervision/pull/1608))
|
||
- Small improvements to error handling in polygons: ([#1602](https://github.com/roboflow/supervision/pull/1602))
|
||
|
||
- Updated [`ByteTrack`](https://supervision.roboflow.com/0.25.0/trackers/#supervision.tracker.byte_tracker.core.ByteTrack), removing shared variables. Previously, multiple instances of `ByteTrack` would share some date, requiring liberal use of `tracker.reset()`. ([#1603](https://github.com/roboflow/supervision/pull/1603)), ([#1528](https://github.com/roboflow/supervision/pull/1528))
|
||
- Fixed a bug where `class_agnostic` setting in `MeanAveragePrecision` would not work. ([#1577](https://github.com/roboflow/supervision/pull/1577)) hacktoberfest
|
||
- Removed welcome workflow from our CI system. ([#1596](https://github.com/roboflow/supervision/pull/1596))
|
||
|
||
- Large refactor of `ByteTrack`: STrack moved to separate class, removed superfluous `BaseTrack` class, removed unused variables ([#1603](https://github.com/roboflow/supervision/pull/1603))
|
||
- Large refactor of `RichLabelAnnotator`, matching its contents with `LabelAnnotator`. ([#1625](https://github.com/roboflow/supervision/pull/1625))
|
||
|
||
### 0.24.0 <small>Oct 4, 2024</small>
|
||
|
||
- Added [F1 score](https://supervision.roboflow.com/0.24.0/metrics/f1_score/#supervision.metrics.f1_score.F1Score) as a new metric for detection and segmentation. [#1521](https://github.com/roboflow/supervision/pull/1521)
|
||
|
||
```python
|
||
import supervision as sv
|
||
from supervision.metrics import F1Score
|
||
|
||
predictions = sv.Detections(...)
|
||
targets = sv.Detections(...)
|
||
|
||
f1_metric = F1Score()
|
||
f1_result = f1_metric.update(predictions, targets).compute()
|
||
|
||
print(f1_result)
|
||
print(f1_result.f1_50)
|
||
print(f1_result.small_objects.f1_50)
|
||
```
|
||
|
||
- Added new cookbook: [Small Object Detection with SAHI](https://supervision.roboflow.com/0.24.0/notebooks/small-object-detection-with-sahi/). This cookbook provides a detailed guide on using [`InferenceSlicer`](https://supervision.roboflow.com/0.24.0/detection/tools/inference_slicer/) for small object detection. [#1483](https://github.com/roboflow/supervision/pull/1483)
|
||
|
||
- Added an [Embedded Workflow](https://roboflow.com/workflows), which allows you to [preview annotators](https://supervision.roboflow.com/0.24.0/detection/annotators/). [#1533](https://github.com/roboflow/supervision/pull/1533)
|
||
|
||
- Enhanced [`LineZoneAnnotator`](https://supervision.roboflow.com/0.24.0/detection/tools/line_zone/#supervision.detection.line_zone.LineZoneAnnotator), allowing the labels to align with the line, even when it's not horizontal. Also, you can now disable text background, and choose to draw labels off-center which minimizes overlaps for multiple [`LineZone`](https://supervision.roboflow.com/0.24.0/detection/tools/line_zone/#supervision.detection.line_zone.LineZone) labels. [#854](https://github.com/roboflow/supervision/pull/854)
|
||
|
||
```python
|
||
import supervision as sv
|
||
import cv2
|
||
|
||
image = cv2.imread("<SOURCE_IMAGE_PATH>")
|
||
|
||
line_zone = sv.LineZone(
|
||
start=sv.Point(0, 100),
|
||
end=sv.Point(50, 200)
|
||
)
|
||
line_zone_annotator = sv.LineZoneAnnotator(
|
||
text_orient_to_line=True,
|
||
display_text_box=False,
|
||
text_centered=False
|
||
)
|
||
|
||
annotated_frame = line_zone_annotator.annotate(
|
||
frame=image.copy(), line_counter=line_zone
|
||
)
|
||
|
||
sv.plot_image(frame)
|
||
```
|
||
|
||
- Added per-class counting capabilities to [`LineZone`](https://supervision.roboflow.com/0.24.0/detection/tools/line_zone/#supervision.detection.line_zone.LineZone) and introduced [`LineZoneAnnotatorMulticlass`](https://supervision.roboflow.com/0.24.0/detection/tools/line_zone/#supervision.detection.line_zone.LineZoneAnnotatorMulticlass) for visualizing the counts per class. This feature allows tracking of individual classes crossing a line, enhancing the flexibility of use cases like traffic monitoring or crowd analysis. [#1555](https://github.com/roboflow/supervision/pull/1555)
|
||
|
||
```python
|
||
import supervision as sv
|
||
import cv2
|
||
|
||
image = cv2.imread("<SOURCE_IMAGE_PATH>")
|
||
|
||
line_zone = sv.LineZone(
|
||
start=sv.Point(0, 100),
|
||
end=sv.Point(50, 200)
|
||
)
|
||
line_zone_annotator = sv.LineZoneAnnotatorMulticlass()
|
||
|
||
frame = line_zone_annotator.annotate(
|
||
frame=frame, line_zones=[line_zone]
|
||
)
|
||
|
||
sv.plot_image(frame)
|
||
```
|
||
|
||
- Added [`from_easyocr`](https://supervision.roboflow.com/0.24.0/detection/core/#supervision.detection.core.Detections.from_easyocr), allowing integration of OCR results into the supervision framework. [EasyOCR](https://github.com/JaidedAI/EasyOCR) is an open-source optical character recognition (OCR) library that can read text from images. [#1515](https://github.com/roboflow/supervision/pull/1515)
|
||
|
||
```python
|
||
import supervision as sv
|
||
import easyocr
|
||
import cv2
|
||
|
||
image = cv2.imread("<SOURCE_IMAGE_PATH>")
|
||
|
||
reader = easyocr.Reader(["en"])
|
||
result = reader.readtext("<SOURCE_IMAGE_PATH>", paragraph=True)
|
||
detections = sv.Detections.from_easyocr(result)
|
||
|
||
box_annotator = sv.BoxAnnotator(color_lookup=sv.ColorLookup.INDEX)
|
||
label_annotator = sv.LabelAnnotator(color_lookup=sv.ColorLookup.INDEX)
|
||
|
||
annotated_image = image.copy()
|
||
annotated_image = box_annotator.annotate(scene=annotated_image, detections=detections)
|
||
annotated_image = label_annotator.annotate(scene=annotated_image, detections=detections)
|
||
|
||
sv.plot_image(annotated_image)
|
||
```
|
||
|
||
- Added [`oriented_box_iou_batch`](https://supervision.roboflow.com/0.24.0/detection/utils/#supervision.detection.utils.oriented_box_iou_batch) function to `detection.utils`. This function computes Intersection over Union (IoU) for oriented or rotated bounding boxes (OBB). [#1502](https://github.com/roboflow/supervision/pull/1502)
|
||
|
||
```python
|
||
import numpy as np
|
||
|
||
boxes_true = np.array([[[1, 0], [0, 1], [3, 4], [4, 3]]])
|
||
boxes_detection = np.array([[[1, 1], [2, 0], [4, 2], [3, 3]]])
|
||
ious = sv.oriented_box_iou_batch(boxes_true, boxes_detection)
|
||
print("IoU between true and detected boxes:", ious)
|
||
```
|
||
|
||
- Extended [`PolygonZoneAnnotator`](https://supervision.roboflow.com/0.24.0/detection/tools/polygon_zone/#supervision.detection.tools.polygon_zone.PolygonZoneAnnotator) to allow setting opacity when drawing zones, providing enhanced visualization by filling the zone with adjustable transparency. [#1527](https://github.com/roboflow/supervision/pull/1527)
|
||
|
||
```python
|
||
import cv2
|
||
from ncnn.model_zoo import get_model
|
||
import supervision as sv
|
||
|
||
image = cv2.imread("<SOURCE_IMAGE_PATH>")
|
||
model = get_model(
|
||
"yolov8s",
|
||
target_size=640,
|
||
prob_threshold=0.5,
|
||
nms_threshold=0.45,
|
||
num_threads=4,
|
||
use_gpu=True,
|
||
)
|
||
result = model(image)
|
||
detections = sv.Detections.from_ncnn(result)
|
||
```
|
||
|
||
!!! failure "Removed"
|
||
|
||
The `frame_resolution_wh` parameter in [`PolygonZone`](https://supervision.roboflow.com/0.24.0/detection/tools/polygon_zone/#supervision.detection.tools.polygon_zone.PolygonZone) has been removed.
|
||
|
||
!!! failure "Removed"
|
||
|
||
Supervision installation methods `"headless"` and `"desktop"` were removed, as they are no longer needed. `pip install supervision[headless]` will install the base library and harmlessly warn of non-existent extras.
|
||
|
||
- Supervision now depends on `opencv-python` rather than `opencv-python-headless`. [#1530](https://github.com/roboflow/supervision/pull/1530)
|
||
|
||
- Fixed the COCO 101 point Average Precision algorithm to correctly interpolate precision, providing a more precise calculation of average precision without averaging out intermediate values. [#1500](https://github.com/roboflow/supervision/pull/1500)
|
||
|
||
- Resolved miscellaneous issues highlighted when building documentation. This mostly includes whitespace adjustments and type inconsistencies. Updated documentation for clarity and fixed formatting issues. Added explicit version for `mkdocstrings-python`. [#1549](https://github.com/roboflow/supervision/pull/1549)
|
||
|
||
- Enabled and fixed Ruff rules for code formatting, including changes like avoiding unnecessary iterable allocations and using Optional for default mutable arguments. [#1526](https://github.com/roboflow/supervision/pull/1526)
|
||
|
||
### 0.23.0 <small>Aug 28, 2024</small>
|
||
|
||
- Added [#930](https://github.com/roboflow/supervision/pull/930): `IconAnnotator`, a [new annotator](https://supervision.roboflow.com/0.23.0/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 = <SOURCE_IMAGE_PATH>
|
||
icon_dog = <DOG_PNG_PATH>
|
||
icon_cat = <CAT_PNG_PATH>
|
||
|
||
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_name"]:
|
||
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`](https://supervision.roboflow.com/0.23.0/detection/annotators/#supervision.annotators.core.BackgroundColorAnnotator), that draws an overlay on the background images of the detections.
|
||
|
||
```python
|
||
import supervision as sv
|
||
from inference import get_model
|
||
|
||
image = <SOURCE_IMAGE_PATH>
|
||
|
||
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`](https://supervision.roboflow.com/0.23.0/detection/core/#supervision.detection.core.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(<SOURCE_IMAGE_PATH>)
|
||
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`](https://supervision.roboflow.com/0.23.0/detection/core/#supervision.detection.core.Detections.from_ultralytics). [SAM2](https://sam2.metademolab.com/) was released during this update, and is already supported via [`sv.Detections.from_sam`](https://supervision.roboflow.com/0.23.0/detection/core/#supervision.detection.core.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`](https://supervision.roboflow.com/0.23.0/detection/annotators/#supervision.annotators.core.TriangleAnnotator) and [`DotAnnotator`](https://supervision.roboflow.com/0.23.0/detection/annotators/#supervision.annotators.core.DotAnnotator).
|
||
|
||
- Added [#1409](https://github.com/roboflow/supervision/pull/1409): `text_color` option for [`VertexLabelAnnotator`](https://supervision.roboflow.com/0.23.0/keypoint/annotators/#supervision.keypoint.annotators.VertexLabelAnnotator) keypoint annotator.
|
||
|
||
- Changed [#1434](https://github.com/roboflow/supervision/pull/1434): [`InferenceSlicer`](https://supervision.roboflow.com/0.23.0/detection/tools/inference_slicer/) now features an `overlap_wh` parameter, making it easier to compute slice sizes when handling overlapping slices.
|
||
|
||
- Fixed [#1448](https://github.com/roboflow/supervision/pull/1448): Various annotator type issues have been resolved, supporting expanded error handling.
|
||
|
||
- Fixed [#1348](https://github.com/roboflow/supervision/pull/1348): Introduced a new method for [seeking to a specific video frame](https://supervision.roboflow.com/0.23.0/utils/video/#supervision.utils.video.get_video_frames_generator), 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=<SOURCE_VIDEO_PATH>,
|
||
start=60,
|
||
iterative_seek=True
|
||
):
|
||
...
|
||
```
|
||
|
||
- Fixed [#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 <small>Jul 12, 2024</small>
|
||
|
||
- Added [#1326](https://github.com/roboflow/supervision/pull/1326): [`sv.DetectionsDataset`](https://supervision.roboflow.com/0.22.0/datasets/core/#supervision.dataset.core.DetectionDataset) and [`sv.ClassificationDataset`](https://supervision.roboflow.com/0.22.0/datasets/core/#supervision.dataset.core.ClassificationDataset) allowing to load the images into memory only when necessary (lazy loading).
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
Constructing `DetectionDataset` with parameter `images` as `Dict[str, np.ndarray]` is deprecated and will be removed in `supervision-0.26.0`. Please pass a list of paths `List[str]` instead.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
The `DetectionDataset.images` property is deprecated and 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.
|
||
|
||
```python
|
||
import roboflow
|
||
from roboflow import Roboflow
|
||
import supervision as sv
|
||
|
||
roboflow.login()
|
||
rf = Roboflow()
|
||
|
||
project = rf.workspace(<WORKSPACE_ID>).project(<PROJECT_ID>)
|
||
dataset = project.version(<PROJECT_VERSION>).download("coco")
|
||
|
||
ds_train = sv.DetectionDataset.from_coco(
|
||
images_directory_path=f"{dataset.location}/train",
|
||
annotations_path=f"{dataset.location}/train/_annotations.coco.json",
|
||
)
|
||
|
||
path, image, annotation = ds_train[0]
|
||
# loads image on demand
|
||
|
||
for path, image, annotation in ds_train:
|
||
# loads image on demand
|
||
```
|
||
|
||
- Added [#1296](https://github.com/roboflow/supervision/pull/1296): [`sv.Detections.from_lmm`](https://supervision.roboflow.com/0.22.0/detection/core/#supervision.detection.core.Detections.from_lmm) now supports parsing results from the [Florence 2](https://huggingface.co/microsoft/Florence-2-large) model, extending the capability to handle outputs from this Large Multimodal Model (LMM). This includes detailed object detection, OCR with region proposals, segmentation, and more. Find out more in our [Colab notebook](https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/how-to-finetune-florence-2-on-detection-dataset.ipynb).
|
||
|
||
- Added [#1232](https://github.com/roboflow/supervision/pull/1232) to support keypoint detection with Mediapipe. Both [legacy](https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/pose_landmarker/python/%5BMediaPipe_Python_Tasks%5D_Pose_Landmarker.ipynb) and [modern](https://ai.google.dev/edge/mediapipe/solutions/vision/pose_landmarker/python) pipelines are supported. See [`sv.KeyPoints.from_mediapipe`](https://supervision.roboflow.com/0.22.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_mediapipe) for more.
|
||
|
||
- Added [#1316](https://github.com/roboflow/supervision/pull/1316): [`sv.KeyPoints.from_mediapipe`](https://supervision.roboflow.com/0.22.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_mediapipe) extended to support FaceMesh from Mediapipe. This enhancement allows for processing both face landmarks from `FaceLandmarker`, and legacy results from `FaceMesh`.
|
||
|
||
- Added [#1310](https://github.com/roboflow/supervision/pull/1310): [`sv.KeyPoints.from_detectron2`](https://supervision.roboflow.com/0.22.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_detectron2) is a new `KeyPoints` method, adding support for extracting keypoints from the popular [Detectron 2](https://github.com/facebookresearch/detectron2) platform.
|
||
|
||
- Added [#1300](https://github.com/roboflow/supervision/pull/1300): [`sv.Detections.from_detectron2`](https://supervision.roboflow.com/0.22.0/detection/core/#supervision.detection.core.Detections.from_detectron2) now supports segmentation models detectron2. The resulting masks can be used with [`sv.MaskAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.MaskAnnotator) for displaying annotations.
|
||
|
||
```python
|
||
import supervision as sv
|
||
from detectron2 import model_zoo
|
||
from detectron2.engine import DefaultPredictor
|
||
from detectron2.config import get_cfg
|
||
import cv2
|
||
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
cfg = get_cfg()
|
||
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
|
||
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
|
||
predictor = DefaultPredictor(cfg)
|
||
|
||
result = predictor(image)
|
||
detections = sv.Detections.from_detectron2(result)
|
||
|
||
mask_annotator = sv.MaskAnnotator()
|
||
annotated_frame = mask_annotator.annotate(scene=image.copy(), detections=detections)
|
||
```
|
||
|
||
- Added [#1277](https://github.com/roboflow/supervision/pull/1277): if you provide a font that supports symbols of a language, [`sv.RichLabelAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.LabelAnnotator.annotate) will draw them on your images.
|
||
- Various other annotators have been revised to ensure proper in-place functionality when used with `numpy` arrays. Additionally, we fixed a bug where `sv.ColorAnnotator` was filling boxes with solid color when used in-place.
|
||
|
||
```python
|
||
import cv2
|
||
import supervision as sv
|
||
import
|
||
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
|
||
model = get_model(model_id="yolov8n-640")
|
||
results = model.infer(image)[0]
|
||
detections = sv.Detections.from_inference(results)
|
||
|
||
rich_label_annotator = sv.RichLabelAnnotator(font_path=<TTF_FONT_PATH>)
|
||
annotated_image = rich_label_annotator.annotate(scene=image.copy(), detections=detections)
|
||
```
|
||
|
||
- Added [#1227](https://github.com/roboflow/supervision/pull/1227): Added support for loading Oriented Bounding Boxes dataset in YOLO format.
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
train_ds = sv.DetectionDataset.from_yolo(
|
||
images_directory_path="/content/dataset/train/images",
|
||
annotations_directory_path="/content/dataset/train/labels",
|
||
data_yaml_path="/content/dataset/data.yaml",
|
||
is_obb=True,
|
||
)
|
||
|
||
_, image, detections in train_ds[0]
|
||
|
||
obb_annotator = OrientedBoxAnnotator()
|
||
annotated_image = obb_annotator.annotate(scene=image.copy(), detections=detections)
|
||
```
|
||
|
||
- Fixed [#1312](https://github.com/roboflow/supervision/pull/1312): Fixed [`CropAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.TraceAnnotator.annotate).
|
||
|
||
!!! failure "Removed"
|
||
|
||
`BoxAnnotator` was removed, however `BoundingBoxAnnotator` has been renamed to `BoxAnnotator`. Use a combination of [`BoxAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.BoxAnnotator) and [`LabelAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.LabelAnnotator) to simulate old `BoundingBox` behavior.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
The name `BoundingBoxAnnotator` has been deprecated and will be removed in `supervision-0.26.0`. It has been renamed to [`BoxAnnotator`](https://supervision.roboflow.com/0.22.0/detection/annotators/#supervision.annotators.core.BoxAnnotator).
|
||
|
||
- Added [#975](https://github.com/roboflow/supervision/pull/975) 📝 New Cookbooks: serialize detections into [json](https://github.com/roboflow/supervision/blob/de896189b83a1f9434c0a37dd9192ee00d2a1283/docs/notebooks/serialise-detections-to-json.ipynb) and [csv](https://github.com/roboflow/supervision/blob/de896189b83a1f9434c0a37dd9192ee00d2a1283/docs/notebooks/serialise-detections-to-csv.ipynb).
|
||
|
||
- Added [#1290](https://github.com/roboflow/supervision/pull/1290): Mostly an internal change, our file utility function now support both `str` and `pathlib` paths.
|
||
|
||
- Added [#1340](https://github.com/roboflow/supervision/pull/1340): Two new methods for converting between bounding box formats - [`xywh_to_xyxy`](https://supervision.roboflow.com/0.22.0/detection/utils/#supervision.detection.utils.xywh_to_xyxy) and [`xcycwh_to_xyxy`](https://supervision.roboflow.com/0.22.0/detection/utils/#supervision.detection.utils.xcycwh_to_xyxy)
|
||
|
||
!!! failure "Removed"
|
||
|
||
`from_roboflow` method has been removed due to deprecation. Use [from_inference](https://supervision.roboflow.com/0.22.0/detection/core/#supervision.detection.core.Detections.from_inference) instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`Color.white()` has been removed due to deprecation. Use `color.WHITE` instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`Color.black()` has been removed due to deprecation. Use `color.BLACK` instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`Color.red()` has been removed due to deprecation. Use `color.RED` instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`Color.green()` has been removed due to deprecation. Use `color.GREEN` instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`Color.blue()` has been removed due to deprecation. Use `color.BLUE` instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`ColorPalette.default()` has been removed due to deprecation. Use [ColorPalette.DEFAULT](https://supervision.roboflow.com/0.22.0/utils/draw/#supervision.draw.color.ColorPalette.DEFAULT) instead.
|
||
|
||
!!! failure "Removed"
|
||
|
||
`FPSMonitor.__call__` has been removed due to deprecation. Use the attribute [FPSMonitor.fps](https://supervision.roboflow.com/0.22.0/utils/video/#supervision.utils.video.FPSMonitor.fps) instead.
|
||
|
||
### 0.21.0 <small>Jun 5, 2024</small>
|
||
|
||
- Added [#500](https://github.com/roboflow/supervision/pull/500): [`sv.Detections.with_nmm`](https://supervision.roboflow.com/0.21.0/detection/core/#supervision.detection.core.Detections.with_nmm) to perform non-maximum merging on the current set of object detections.
|
||
|
||
- Added [#1221](https://github.com/roboflow/supervision/pull/1221): [`sv.Detections.from_lmm`](https://supervision.roboflow.com/0.21.0/detection/core/#supervision.detection.core.Detections.from_lmm) allowing to parse Large Multimodal Model (LMM) text result into [`sv.Detections`](https://supervision.roboflow.com/0.21.0/detection/core/) object. For now `from_lmm` supports only [PaliGemma](https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/how-to-finetune-paligemma-on-detection-dataset.ipynb) result parsing.
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
paligemma_result = "<loc0256><loc0256><loc0768><loc0768> cat"
|
||
detections = sv.Detections.from_lmm(
|
||
sv.LMM.PALIGEMMA,
|
||
paligemma_result,
|
||
resolution_wh=(1000, 1000),
|
||
classes=["cat", "dog"],
|
||
)
|
||
detections.xyxy
|
||
# array([[250., 250., 750., 750.]])
|
||
|
||
detections.class_id
|
||
# array([0])
|
||
```
|
||
|
||
- Added [#1236](https://github.com/roboflow/supervision/pull/1236): [`sv.VertexLabelAnnotator`](https://supervision.roboflow.com/0.21.0/keypoint/annotators/#supervision.keypoint.annotators.EdgeAnnotator.annotate) allowing to annotate every vertex of a keypoint skeleton with custom text and color.
|
||
|
||
```python
|
||
import supervision as sv
|
||
|
||
image = ...
|
||
key_points = sv.KeyPoints(...)
|
||
|
||
edge_annotator = sv.EdgeAnnotator(
|
||
color=sv.Color.GREEN,
|
||
thickness=5
|
||
)
|
||
annotated_frame = edge_annotator.annotate(
|
||
scene=image.copy(),
|
||
key_points=key_points
|
||
)
|
||
```
|
||
|
||
- Added [#1147](https://github.com/roboflow/supervision/pull/1147): [`sv.KeyPoints.from_inference`](https://supervision.roboflow.com/0.21.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_inference) allowing to create [`sv.KeyPoints`](https://supervision.roboflow.com/0.21.0/keypoint/core/#supervision.keypoint.core.KeyPoints) from [Inference](https://github.com/roboflow/inference) result.
|
||
|
||
- Added [#1138](https://github.com/roboflow/supervision/pull/1138): [`sv.KeyPoints.from_yolo_nas`](https://supervision.roboflow.com/0.21.0/keypoint/core/#supervision.keypoint.core.KeyPoints.from_yolo_nas) allowing to create [`sv.KeyPoints`](https://supervision.roboflow.com/0.21.0/keypoint/core/#supervision.keypoint.core.KeyPoints) from [YOLO-NAS](https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md) result.
|
||
|
||
- Added [#1163](https://github.com/roboflow/supervision/pull/1163): [`sv.mask_to_rle`](https://supervision.roboflow.com/0.21.0/datasets/utils/#supervision.dataset.utils.rle_to_mask) and [`sv.rle_to_mask`](https://supervision.roboflow.com/0.21.0/datasets/utils/#supervision.dataset.utils.rle_to_mask) allowing for easy conversion between mask and rle formats.
|
||
|
||
- Changed [#1236](https://github.com/roboflow/supervision/pull/1236): [`sv.InferenceSlicer`](https://supervision.roboflow.com/0.21.0/detection/tools/inference_slicer/) allowing to select overlap filtering strategy (`NONE`, `NON_MAX_SUPPRESSION` and `NON_MAX_MERGE`).
|
||
|
||
- Changed [#1178](https://github.com/roboflow/supervision/pull/1178): [`sv.InferenceSlicer`](https://supervision.roboflow.com/0.21.0/detection/tools/inference_slicer/) adding instance segmentation model support.
|
||
|
||
```python
|
||
import cv2
|
||
import numpy as np
|
||
import supervision as sv
|
||
from inference import get_model
|
||
|
||
model = get_model(model_id="yolov8x-seg-640")
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
|
||
def callback(image_slice: np.ndarray) -> sv.Detections:
|
||
results = model.infer(image_slice)[0]
|
||
return sv.Detections.from_inference(results)
|
||
|
||
slicer = sv.InferenceSlicer(callback = callback)
|
||
detections = slicer(image)
|
||
|
||
mask_annotator = sv.MaskAnnotator()
|
||
label_annotator = sv.LabelAnnotator()
|
||
|
||
annotated_image = mask_annotator.annotate(
|
||
scene=image, detections=detections)
|
||
annotated_image = label_annotator.annotate(
|
||
scene=annotated_image, detections=detections)
|
||
```
|
||
|
||
- Changed [#1228](https://github.com/roboflow/supervision/pull/1228): [`sv.LineZone`](https://supervision.roboflow.com/0.21.0/detection/tools/line_zone/) making it 10-20 times faster, depending on the use case.
|
||
|
||
- Changed [#1163](https://github.com/roboflow/supervision/pull/1163): [`sv.DetectionDataset.from_coco`](https://supervision.roboflow.com/0.21.0/datasets/core/#supervision.dataset.core.DetectionDataset.from_coco) and [`sv.DetectionDataset.as_coco`](https://supervision.roboflow.com/0.21.0/datasets/core/#supervision.dataset.core.DetectionDataset.as_coco) adding support for run-length encoding (RLE) mask format.
|
||
|
||
### 0.20.0 <small>April 24, 2024</small>
|
||
|
||
- Added [#1128](https://github.com/roboflow/supervision/pull/1128): [`sv.KeyPoints`](https://supervision.roboflow.com/0.20.0/keypoint/core/#supervision.keypoint.core.KeyPoints) to provide initial support for pose estimation and broader keypoint detection models.
|
||
|
||
- Added [#1128](https://github.com/roboflow/supervision/pull/1128): [`sv.EdgeAnnotator`](https://supervision.roboflow.com/0.20.0/keypoint/annotators/#supervision.keypoint.annotators.EdgeAnnotator) and [`sv.VertexAnnotator`](https://supervision.roboflow.com/0.20.0/keypoint/annotators/#supervision.keypoint.annotators.VertexAnnotator) to enable rendering of results from keypoint detection models.
|
||
|
||
```python
|
||
import cv2
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
model = YOLO('yolov8l-pose')
|
||
|
||
result = model(image, verbose=False)[0]
|
||
keypoints = sv.KeyPoints.from_ultralytics(result)
|
||
|
||
edge_annotators = sv.EdgeAnnotator(color=sv.Color.GREEN, thickness=5)
|
||
annotated_image = edge_annotators.annotate(image.copy(), keypoints)
|
||
```
|
||
|
||
- Changed [#1037](https://github.com/roboflow/supervision/pull/1037): [`sv.LabelAnnotator`](https://supervision.roboflow.com/latest/detection/annotators/#supervision.annotators.core.LabelAnnotator) by adding an additional `corner_radius` argument that allows for rounding the corners of the bounding box.
|
||
|
||
- Changed [#1109](https://github.com/roboflow/supervision/pull/1109): [`sv.PolygonZone`](https://supervision.roboflow.com/0.20.0/detection/tools/polygon_zone/#supervision.detection.tools.polygon_zone.PolygonZone) such that the `frame_resolution_wh` argument is no longer required to initialize `sv.PolygonZone`.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
The `frame_resolution_wh` parameter in `sv.PolygonZone` is deprecated and will be removed in `supervision-0.24.0`.
|
||
|
||
- Changed [#1084](https://github.com/roboflow/supervision/pull/1084): [`sv.get_polygon_center`](https://supervision.roboflow.com/0.20.0/utils/geometry/#supervision.geometry.core.utils.get_polygon_center) to calculate a more accurate polygon centroid.
|
||
|
||
- Changed [#1069](https://github.com/roboflow/supervision/pull/1069): [`sv.Detections.from_transformers`](https://supervision.roboflow.com/0.20.0/detection/core/#supervision.detection.core.Detections.from_transformers) by adding support for Transformers segmentation models and extract class names values.
|
||
|
||
```python
|
||
import torch
|
||
import supervision as sv
|
||
from PIL import Image
|
||
from transformers import DetrImageProcessor, DetrForSegmentation
|
||
|
||
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50-panoptic")
|
||
model = DetrForSegmentation.from_pretrained("facebook/detr-resnet-50-panoptic")
|
||
|
||
image = Image.open(<SOURCE_IMAGE_PATH>)
|
||
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_segmentation(
|
||
outputs=outputs, target_sizes=target_size)[0]
|
||
detections = sv.Detections.from_transformers(results, id2label=model.config.id2label)
|
||
|
||
mask_annotator = sv.MaskAnnotator()
|
||
label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)
|
||
|
||
annotated_image = mask_annotator.annotate(
|
||
scene=image, detections=detections)
|
||
annotated_image = label_annotator.annotate(
|
||
scene=annotated_image, detections=detections)
|
||
```
|
||
|
||
- Fixed [#787](https://github.com/roboflow/supervision/pull/787): [`sv.ByteTrack.update_with_detections`](https://supervision.roboflow.com/0.20.0/trackers/#supervision.tracker.byte_tracker.core.ByteTrack.update_with_detections) which was removing segmentation masks while tracking. Now, `ByteTrack` can be used alongside segmentation models.
|
||
|
||
### 0.19.0 <small>March 15, 2024</small>
|
||
|
||
- Added [#818](https://github.com/roboflow/supervision/pull/818): [`sv.CSVSink`](https://supervision.roboflow.com/0.19.0/detection/tools/save_detections/#supervision.detection.tools.csv_sink.CSVSink) allowing for the straightforward saving of image, video, or stream inference results in a `.csv` file.
|
||
|
||
```python
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
model = YOLO(<SOURCE_MODEL_PATH>)
|
||
csv_sink = sv.CSVSink(<RESULT_CSV_FILE_PATH>)
|
||
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
|
||
|
||
with csv_sink:
|
||
for frame in frames_generator:
|
||
result = model(frame)[0]
|
||
detections = sv.Detections.from_ultralytics(result)
|
||
csv_sink.append(detections, custom_data={<CUSTOM_LABEL>:<CUSTOM_DATA>})
|
||
```
|
||
|
||
- Added [#819](https://github.com/roboflow/supervision/pull/819): [`sv.JSONSink`](https://supervision.roboflow.com/0.19.0/detection/tools/save_detections/#supervision.detection.tools.csv_sink.JSONSink) allowing for the straightforward saving of image, video, or stream inference results in a `.json` file.
|
||
|
||
```python
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
model = YOLO(<SOURCE_MODEL_PATH>)
|
||
json_sink = sv.JSONSink(<RESULT_JSON_FILE_PATH>)
|
||
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
|
||
|
||
with json_sink:
|
||
for frame in frames_generator:
|
||
result = model(frame)[0]
|
||
detections = sv.Detections.from_ultralytics(result)
|
||
json_sink.append(detections, custom_data={<CUSTOM_LABEL>:<CUSTOM_DATA>})
|
||
```
|
||
|
||
- Added [#847](https://github.com/roboflow/supervision/pull/847): [`sv.mask_iou_batch`](https://supervision.roboflow.com/0.19.0/detection/utils/#supervision.detection.utils.mask_iou_batch) allowing to compute Intersection over Union (IoU) of two sets of masks.
|
||
|
||
- Added [#847](https://github.com/roboflow/supervision/pull/847): [`sv.mask_non_max_suppression`](https://supervision.roboflow.com/0.19.0/detection/utils/#supervision.detection.utils.mask_non_max_suppression) allowing to perform Non-Maximum Suppression (NMS) on segmentation predictions.
|
||
|
||
- Added [#888](https://github.com/roboflow/supervision/pull/888): [`sv.CropAnnotator`](https://supervision.roboflow.com/0.19.0/annotators/#supervision.annotators.core.CropAnnotator) allowing users to annotate the scene with scaled-up crops of detections.
|
||
|
||
```python
|
||
import cv2
|
||
import supervision as sv
|
||
from inference import get_model
|
||
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
model = get_model(model_id="yolov8n-640")
|
||
|
||
result = model.infer(image)[0]
|
||
detections = sv.Detections.from_inference(result)
|
||
|
||
crop_annotator = sv.CropAnnotator()
|
||
annotated_frame = crop_annotator.annotate(
|
||
scene=image.copy(),
|
||
detections=detections
|
||
)
|
||
```
|
||
|
||
- Changed [#827](https://github.com/roboflow/supervision/pull/827): [`sv.ByteTrack.reset`](https://supervision.roboflow.com/0.19.0/trackers/#supervision.tracker.ByteTrack.reset) allowing users to clear trackers state, enabling the processing of multiple video files in sequence.
|
||
|
||
- Changed [#802](https://github.com/roboflow/supervision/pull/802): [`sv.LineZoneAnnotator`](https://supervision.roboflow.com/0.19.0/detection/tools/line_zone/#supervision.detection.line_zone.LineZone) allowing to hide in/out count using `display_in_count` and `display_out_count` properties.
|
||
|
||
- Changed [#787](https://github.com/roboflow/supervision/pull/787): [`sv.ByteTrack`](https://supervision.roboflow.com/0.19.0/trackers/#supervision.tracker.ByteTrack) input arguments and docstrings updated to improve readability and ease of use.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
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`](https://supervision.roboflow.com/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.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
The `triggering_position ` parameter in `sv.PolygonZone` is deprecated and will be removed in `supervision-0.23.0`. Use `triggering_anchors` instead.
|
||
|
||
- Changed [#875](https://github.com/roboflow/supervision/pull/875): annotators adding support for Pillow images. All supervision Annotators can now accept an image as either a numpy array or a Pillow Image. They automatically detect its type, draw annotations, and return the output in the same format as the input.
|
||
|
||
- Fixed [#944](https://github.com/roboflow/supervision/pull/944): [`sv.DetectionsSmoother`](https://supervision.roboflow.com/0.19.0/detection/tools/smoother/#supervision.detection.tools.smoother.DetectionsSmoother) removing `tracking_id` from `sv.Detections`.
|
||
|
||
### 0.18.0 <small>January 25, 2024</small>
|
||
|
||
- Added [#720](https://github.com/roboflow/supervision/pull/720): [`sv.PercentageBarAnnotator`](https://supervision.roboflow.com/0.18.0/annotators/#percentagebarannotator) allowing to annotate images and videos with percentage values representing confidence or other custom property.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> image = ...
|
||
>>> detections = sv.Detections(...)
|
||
|
||
>>> percentage_bar_annotator = sv.PercentageBarAnnotator()
|
||
>>> annotated_frame = percentage_bar_annotator.annotate(
|
||
... scene=image.copy(),
|
||
... detections=detections
|
||
... )
|
||
```
|
||
|
||
- Added [#702](https://github.com/roboflow/supervision/pull/702): [`sv.RoundBoxAnnotator`](https://supervision.roboflow.com/0.18.0/annotators/#roundboxannotator) allowing to annotate images and videos with rounded corners bounding boxes.
|
||
|
||
- Added [#770](https://github.com/roboflow/supervision/pull/770): [`sv.OrientedBoxAnnotator`](https://supervision.roboflow.com/0.18.0/annotators/#orientedboxannotator) allowing to annotate images and videos with OBB (Oriented Bounding Boxes).
|
||
|
||
```python
|
||
import cv2
|
||
import supervision as sv
|
||
from ultralytics import YOLO
|
||
|
||
image = cv2.imread(<SOURCE_IMAGE_PATH>)
|
||
model = YOLO("yolov8n-obb.pt")
|
||
|
||
result = model(image)[0]
|
||
detections = sv.Detections.from_ultralytics(result)
|
||
|
||
oriented_box_annotator = sv.OrientedBoxAnnotator()
|
||
annotated_frame = oriented_box_annotator.annotate(
|
||
scene=image.copy(),
|
||
detections=detections
|
||
)
|
||
```
|
||
|
||
- Added [#696](https://github.com/roboflow/supervision/pull/696): [`sv.DetectionsSmoother`](https://supervision.roboflow.com/0.18.0/detection/tools/smoother/#detection-smoother) allowing for smoothing detections over multiple frames in video tracking.
|
||
|
||
- Added [#769](https://github.com/roboflow/supervision/pull/769): [`sv.ColorPalette.from_matplotlib`](https://supervision.roboflow.com/0.18.0/draw/color/#supervision.draw.color.ColorPalette.from_matplotlib) allowing users to create a `sv.ColorPalette` instance from a Matplotlib color palette.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> sv.ColorPalette.from_matplotlib('viridis', 5)
|
||
ColorPalette(colors=[Color(r=68, g=1, b=84), Color(r=59, g=82, b=139), ...])
|
||
```
|
||
|
||
- Changed [#770](https://github.com/roboflow/supervision/pull/770): [`sv.Detections.from_ultralytics`](https://supervision.roboflow.com/0.18.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) adding support for OBB (Oriented Bounding Boxes).
|
||
|
||
- Changed [#735](https://github.com/roboflow/supervision/pull/735): [`sv.LineZone`](https://supervision.roboflow.com/0.18.0/detection/tools/line_zone/#linezone) to now accept a list of specific box anchors that must cross the line for a detection to be counted. This update marks a significant improvement from the previous requirement, where all four box corners were necessary. Users can now specify a single anchor, such as `sv.Position.BOTTOM_CENTER`, or any other combination of anchors defined as `List[sv.Position]`.
|
||
|
||
- Changed [#756](https://github.com/roboflow/supervision/pull/756): [`sv.Color`](https://supervision.roboflow.com/0.18.0/draw/color/#color)'s and [`sv.ColorPalette`](https://supervision.roboflow.com/0.18.0/draw/color/#colorpalette)'s method of accessing predefined colors, transitioning from a function-based approach (`sv.Color.red()`) to a more intuitive and conventional property-based method (`sv.Color.RED`).
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
`sv.ColorPalette.default()` is deprecated and will be removed in `supervision-0.22.0`. Use `sv.ColorPalette.DEFAULT` instead.
|
||
|
||
- Changed [#769](https://github.com/roboflow/supervision/pull/769): [`sv.ColorPalette.DEFAULT`](https://supervision.roboflow.com/0.18.0/draw/color/#colorpalette) value, giving users a more extensive set of annotation colors.
|
||
|
||
- Changed [#677](https://github.com/roboflow/supervision/pull/677): `sv.Detections.from_roboflow` to [`sv.Detections.from_inference`](https://supervision.roboflow.com/0.18.0/detection/core/#supervision.detection.core.Detections.from_inference) streamlining its functionality to be compatible with both the both [inference](https://github.com/roboflow/inference) pip package and the Robloflow [hosted API](https://docs.roboflow.com/deploy/hosted-api).
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
`Detections.from_roboflow()` is deprecated and will be removed in `supervision-0.22.0`. Use `Detections.from_inference` instead.
|
||
|
||
- Fixed [#735](https://github.com/roboflow/supervision/pull/735): [`sv.LineZone`](https://supervision.roboflow.com/0.18.0/detection/tools/line_zone/#linezone) functionality to accurately update the counter when an object crosses a line from any direction, including from the side. This enhancement enables more precise tracking and analytics, such as calculating individual in/out counts for each lane on the road.
|
||
|
||
### 0.17.0 <small>December 06, 2023</small>
|
||
|
||
- Added [#633](https://github.com/roboflow/supervision/pull/633): [`sv.PixelateAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.PixelateAnnotator) allowing to pixelate objects on images and videos.
|
||
|
||
- Added [#652](https://github.com/roboflow/supervision/pull/652): [`sv.TriangleAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.TriangleAnnotator) allowing to annotate images and videos with triangle markers.
|
||
|
||
- Added [#602](https://github.com/roboflow/supervision/pull/602): [`sv.PolygonAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.PolygonAnnotator) allowing to annotate images and videos with segmentation mask outline.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> image = ...
|
||
>>> detections = sv.Detections(...)
|
||
|
||
>>> polygon_annotator = sv.PolygonAnnotator()
|
||
>>> annotated_frame = polygon_annotator.annotate(
|
||
... scene=image.copy(),
|
||
... detections=detections
|
||
... )
|
||
```
|
||
|
||
- Added [#476](https://github.com/roboflow/supervision/pull/476): [`sv.assets`](https://supervision.roboflow.com/0.18.0/assets/) allowing download of video files that you can use in your demos.
|
||
|
||
```python
|
||
>>> from supervision.assets import download_assets, VideoAssets
|
||
>>> download_assets(VideoAssets.VEHICLES)
|
||
"vehicles.mp4"
|
||
```
|
||
|
||
- Added [#605](https://github.com/roboflow/supervision/pull/605): [`Position.CENTER_OF_MASS`](https://supervision.roboflow.com/0.17.0/geometry/core/#position) allowing to place labels in center of mass of segmentation masks.
|
||
|
||
- Added [#651](https://github.com/roboflow/supervision/pull/651): [`sv.scale_boxes`](https://supervision.roboflow.com/0.17.0/detection/utils/#supervision.detection.utils.scale_boxes) allowing to scale [`sv.Detections.xyxy`](https://supervision.roboflow.com/0.17.0/detection/core/#supervision.detection.core.Detections) values.
|
||
|
||
- Added [#637](https://github.com/roboflow/supervision/pull/637): [`sv.calculate_dynamic_text_scale`](https://supervision.roboflow.com/0.17.0/draw/utils/#supervision.draw.utils.calculate_dynamic_text_scale) and [`sv.calculate_dynamic_line_thickness`](https://supervision.roboflow.com/0.17.0/draw/utils/#supervision.draw.utils.calculate_dynamic_line_thickness) allowing text scale and line thickness to match image resolution.
|
||
|
||
- Added [#620](https://github.com/roboflow/supervision/pull/620): [`sv.Color.as_hex`](https://supervision.roboflow.com/0.17.0/draw/color/#supervision.draw.color.Color.as_hex) allowing to extract color value in HEX format.
|
||
|
||
- Added [#572](https://github.com/roboflow/supervision/pull/572): [`sv.Classifications.from_timm`](https://supervision.roboflow.com/0.17.0/classification/core/#supervision.classification.core.Classifications.from_timm) allowing to load classification result from [timm](https://huggingface.co/docs/hub/timm) models.
|
||
|
||
- Added [#478](https://github.com/roboflow/supervision/pull/478): [`sv.Classifications.from_clip`](https://supervision.roboflow.com/0.17.0/classification/core/#supervision.classification.core.Classifications.from_clip) allowing to load classification result from [clip](https://github.com/openai/clip) model.
|
||
|
||
- Added [#571](https://github.com/roboflow/supervision/pull/571): [`sv.Detections.from_azure_analyze_image`](https://supervision.roboflow.com/0.17.0/detection/core/#supervision.detection.core.Detections.from_azure_analyze_image) allowing to load detection results from [Azure Image Analysis](https://learn.microsoft.com/en-us/azure/ai-services/computer-vision/concept-object-detection-40).
|
||
|
||
- Changed [#646](https://github.com/roboflow/supervision/pull/646): `sv.BoxMaskAnnotator` renaming it to [`sv.ColorAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.ColorAnnotator).
|
||
|
||
- Changed [#606](https://github.com/roboflow/supervision/pull/606): [`sv.MaskAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.MaskAnnotator) to make it **5x faster**.
|
||
|
||
- Fixed [#584](https://github.com/roboflow/supervision/pull/584): [`sv.DetectionDataset.from_yolo`](https://supervision.roboflow.com/0.17.0/datasets/#supervision.dataset.core.DetectionDataset.from_yolo) to ignore empty lines in annotation files.
|
||
|
||
- Fixed [#555](https://github.com/roboflow/supervision/pull/555): [`sv.BlurAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.BlurAnnotator) to trim negative coordinates before bluring detections.
|
||
|
||
- Fixed [#511](https://github.com/roboflow/supervision/pull/511): [`sv.TraceAnnotator`](https://supervision.roboflow.com/0.17.0/annotators/#supervision.annotators.core.TraceAnnotator) to respect trace position.
|
||
|
||
### 0.16.0 <small>October 19, 2023</small>
|
||
|
||
- Added [#422](https://github.com/roboflow/supervision/pull/422): [`sv.BoxMaskAnnotator`](https://supervision.roboflow.com/0.16.0/annotators/#supervision.annotators.core.BoxMaskAnnotator) allowing to annotate images and videos with mox masks.
|
||
|
||
- Added [#433](https://github.com/roboflow/supervision/pull/433): [`sv.HaloAnnotator`](https://supervision.roboflow.com/0.16.0/annotators/#supervision.annotators.core.HaloAnnotator) allowing to annotate images and videos with halo effect.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> image = ...
|
||
>>> detections = sv.Detections(...)
|
||
|
||
>>> halo_annotator = sv.HaloAnnotator()
|
||
>>> annotated_frame = halo_annotator.annotate(
|
||
... scene=image.copy(),
|
||
... detections=detections
|
||
... )
|
||
```
|
||
|
||
- Added [#466](https://github.com/roboflow/supervision/pull/466): [`sv.HeatMapAnnotator`](https://supervision.roboflow.com/0.16.0/annotators/#supervision.annotators.core.HeatMapAnnotator) allowing to annotate videos with heat maps.
|
||
|
||
- Added [#492](https://github.com/roboflow/supervision/pull/492): [`sv.DotAnnotator`](https://supervision.roboflow.com/0.16.0/annotators/#supervision.annotators.core.DotAnnotator) allowing to annotate images and videos with dots.
|
||
|
||
- Added [#449](https://github.com/roboflow/supervision/pull/449): [`sv.draw_image`](https://supervision.roboflow.com/0.16.0/draw/utils/#supervision.draw.utils.draw_image) allowing to draw an image onto a given scene with specified opacity and dimensions.
|
||
|
||
- Added [#280](https://github.com/roboflow/supervision/pull/280): [`sv.FPSMonitor`](https://supervision.roboflow.com/0.16.0/utils/video/#supervision.utils.video.FPSMonitor) for monitoring frames per second (FPS) to benchmark latency.
|
||
|
||
- Added [#454](https://github.com/roboflow/supervision/pull/454): 🤗 Hugging Face Annotators [space](https://huggingface.co/spaces/Roboflow/Annotators).
|
||
|
||
- Changed [#482](https://github.com/roboflow/supervision/pull/482): [`sv.LineZone.trigger`](https://supervision.roboflow.com/0.16.0/detection/tools/line_zone/#supervision.detection.line_counter.LineZone.trigger) now return `Tuple[np.ndarray, np.ndarray]`. The first array indicates which detections have crossed the line from outside to inside. The second array indicates which detections have crossed the line from inside to outside.
|
||
|
||
- Changed [#465](https://github.com/roboflow/supervision/pull/465): Annotator argument name from `color_map: str` to `color_lookup: ColorLookup` enum to increase type safety.
|
||
|
||
- Changed [#426](https://github.com/roboflow/supervision/pull/426): [`sv.MaskAnnotator`](https://supervision.roboflow.com/0.16.0/annotators/#supervision.annotators.core.MaskAnnotator) allowing 2x faster annotation.
|
||
|
||
- Fixed [#477](https://github.com/roboflow/supervision/pull/477): Poetry env definition allowing proper local installation.
|
||
|
||
- Fixed [#430](https://github.com/roboflow/supervision/pull/430): [`sv.ByteTrack`](https://supervision.roboflow.com/0.16.0/trackers/#supervision.tracker.byte_tracker.core.ByteTrack) to return `np.array([], dtype=int)` when `svDetections` is empty.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
`sv.Detections.from_yolov8` and `sv.Classifications.from_yolov8` as those are now replaced by [`sv.Detections.from_ultralytics`](https://supervision.roboflow.com/0.16.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) and [`sv.Classifications.from_ultralytics`](https://supervision.roboflow.com/0.16.0/classification/core/#supervision.classification.core.Classifications.from_ultralytics).
|
||
|
||
### 0.15.0 <small>October 5, 2023</small>
|
||
|
||
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.BoundingBoxAnnotator) allowing to annotate images and videos with bounding boxes.
|
||
|
||
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoxCornerAnnotator `](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.BoxCornerAnnotator) allowing to annotate images and videos with just bounding box corners.
|
||
|
||
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.MaskAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.MaskAnnotator) allowing to annotate images and videos with segmentation masks.
|
||
|
||
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.EllipseAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.EllipseAnnotator) allowing to annotate images and videos with ellipses (sports game style).
|
||
|
||
- Added [#386](https://github.com/roboflow/supervision/pull/386): [`sv.CircleAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.CircleAnnotator) allowing to annotate images and videos with circles.
|
||
|
||
- Added [#354](https://github.com/roboflow/supervision/pull/354): [`sv.TraceAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.TraceAnnotator) allowing to draw path of moving objects on videos.
|
||
|
||
- Added [#405](https://github.com/roboflow/supervision/pull/405): [`sv.BlurAnnotator`](https://supervision.roboflow.com/0.15.0/annotators/#supervision.annotators.core.BlurAnnotator) allowing to blur objects on images and videos.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> image = ...
|
||
>>> detections = sv.Detections(...)
|
||
|
||
>>> bounding_box_annotator = sv.BoundingBoxAnnotator()
|
||
>>> annotated_frame = bounding_box_annotator.annotate(
|
||
... scene=image.copy(),
|
||
... detections=detections
|
||
... )
|
||
```
|
||
|
||
- Added [#354](https://github.com/roboflow/supervision/pull/354): Supervision usage [example](https://github.com/roboflow/supervision/tree/develop/examples/traffic_analysis). You can now learn how to perform traffic flow analysis with Supervision.
|
||
|
||
- Changed [#399](https://github.com/roboflow/supervision/pull/399): [`sv.Detections.from_roboflow`](https://supervision.roboflow.com/0.15.0/detection/core/#supervision.detection.core.Detections.from_roboflow) now does not require `class_list` to be specified. The `class_id` value can be extracted directly from the [inference](https://github.com/roboflow/inference) response.
|
||
|
||
- Changed [#381](https://github.com/roboflow/supervision/pull/381): [`sv.VideoSink`](https://supervision.roboflow.com/0.15.0/utils/video/#videosink) now allows to customize the output codec.
|
||
|
||
- Changed [#361](https://github.com/roboflow/supervision/pull/361): [`sv.InferenceSlicer`](https://supervision.roboflow.com/0.15.0/detection/tools/inference_slicer/#supervision.detection.tools.inference_slicer.InferenceSlicer) can now operate in multithreading mode.
|
||
|
||
- Fixed [#348](https://github.com/roboflow/supervision/pull/348): [`sv.Detections.from_deepsparse`](https://supervision.roboflow.com/0.15.0/detection/core/#supervision.detection.core.Detections.from_deepsparse) to allow processing empty [deepsparse](https://github.com/neuralmagic/deepsparse) result object.
|
||
|
||
### 0.14.0 <small>August 31, 2023</small>
|
||
|
||
- Added [#282](https://github.com/roboflow/supervision/pull/282): support for SAHI inference technique with [`sv.InferenceSlicer`](https://supervision.roboflow.com/0.14.0/detection/tools/inference_slicer).
|
||
|
||
```python
|
||
>>> import cv2
|
||
>>> import supervision as sv
|
||
>>> from ultralytics import YOLO
|
||
|
||
>>> image = cv2.imread(SOURCE_IMAGE_PATH)
|
||
>>> model = YOLO(...)
|
||
|
||
>>> def callback(image_slice: np.ndarray) -> sv.Detections:
|
||
... result = model(image_slice)[0]
|
||
... return sv.Detections.from_ultralytics(result)
|
||
|
||
>>> slicer = sv.InferenceSlicer(callback = callback)
|
||
|
||
>>> detections = slicer(image)
|
||
```
|
||
|
||
- Added [#297](https://github.com/roboflow/supervision/pull/297): [`Detections.from_deepsparse`](https://supervision.roboflow.com/0.14.0/detection/core/#supervision.detection.core.Detections.from_deepsparse) to enable seamless integration with [DeepSparse](https://github.com/neuralmagic/deepsparse) framework.
|
||
|
||
- Added [#281](https://github.com/roboflow/supervision/pull/281): [`sv.Classifications.from_ultralytics`](https://supervision.roboflow.com/0.14.0/classification/core/#supervision.classification.core.Classifications.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use supervision with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
[sv.Detections.from_yolov8](https://supervision.roboflow.com/0.14.0/detection/core/#supervision.detection.core.Detections.from_yolov8) and [sv.Classifications.from_yolov8](https://supervision.roboflow.com/0.14.0/classification/core/#supervision.classification.core.Classifications.from_yolov8) are now deprecated and will be removed with `supervision-0.16.0` release.
|
||
|
||
- Added [#341](https://github.com/roboflow/supervision/pull/341): First supervision usage example script showing how to detect and track objects on video using YOLOv8 + Supervision.
|
||
|
||
- Changed [#296](https://github.com/roboflow/supervision/pull/296): [`sv.ClassificationDataset`](https://supervision.roboflow.com/0.14.0/dataset/core/#supervision.dataset.core.ClassificationDataset) and [`sv.DetectionDataset`](https://supervision.roboflow.com/0.14.0/dataset/core/#supervision.dataset.core.DetectionDataset) now use image path (not image name) as dataset keys.
|
||
|
||
- Fixed [#300](https://github.com/roboflow/supervision/pull/300): [`Detections.from_roboflow`](https://supervision.roboflow.com/0.14.0/detection/core/#supervision.detection.core.Detections.from_roboflow) to filter out polygons with less than 3 points.
|
||
|
||
### 0.13.0 <small>August 8, 2023</small>
|
||
|
||
- Added [#236](https://github.com/roboflow/supervision/pull/236): support for mean average precision (mAP) for object detection models with [`sv.MeanAveragePrecision`](https://supervision.roboflow.com/0.13.0/metrics/detection/#meanaverageprecision).
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
>>> from ultralytics import YOLO
|
||
|
||
>>> dataset = sv.DetectionDataset.from_yolo(...)
|
||
|
||
>>> model = YOLO(...)
|
||
>>> def callback(image: np.ndarray) -> sv.Detections:
|
||
... result = model(image)[0]
|
||
... return sv.Detections.from_yolov8(result)
|
||
|
||
>>> mean_average_precision = sv.MeanAveragePrecision.benchmark(
|
||
... dataset = dataset,
|
||
... callback = callback
|
||
... )
|
||
|
||
>>> mean_average_precision.map50_95
|
||
0.433
|
||
```
|
||
|
||
- Added [#256](https://github.com/roboflow/supervision/pull/256): support for ByteTrack for object tracking with [`sv.ByteTrack`](https://supervision.roboflow.com/0.13.0/tracker/core/#bytetrack).
|
||
|
||
- Added [#222](https://github.com/roboflow/supervision/pull/222): [`sv.Detections.from_ultralytics`](https://supervision.roboflow.com/0.13.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use `supervision` with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
|
||
|
||
!!! failure "Deprecated"
|
||
|
||
[`sv.Detections.from_yolov8`](https://supervision.roboflow.com/0.13.0/detection/core/#supervision.detection.core.Detections.from_yolov8) is now deprecated and will be removed with `supervision-0.15.0` release.
|
||
|
||
- Added [#191](https://github.com/roboflow/supervision/pull/191): [`sv.Detections.from_paddledet`](https://supervision.roboflow.com/0.13.0/detection/core/#supervision.detection.core.Detections.from_paddledet) to enable seamless integration with [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) framework.
|
||
|
||
- Added [#245](https://github.com/roboflow/supervision/pull/245): support for loading PASCAL VOC segmentation datasets with [`sv.DetectionDataset.`](https://supervision.roboflow.com/0.13.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_pascal_voc).
|
||
|
||
### 0.12.0 <small>July 24, 2023</small>
|
||
|
||
!!! failure "Python 3.7. Support Terminated"
|
||
|
||
With the `supervision-0.12.0` release, we are terminating official support for Python 3.7.
|
||
|
||
- Added [#177](https://github.com/roboflow/supervision/pull/177): initial support for object detection model benchmarking with [`sv.ConfusionMatrix`](https://supervision.roboflow.com/0.12.0/metrics/detection/#confusionmatrix).
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
>>> from ultralytics import YOLO
|
||
|
||
>>> dataset = sv.DetectionDataset.from_yolo(...)
|
||
|
||
>>> model = YOLO(...)
|
||
>>> def callback(image: np.ndarray) -> sv.Detections:
|
||
... result = model(image)[0]
|
||
... return sv.Detections.from_yolov8(result)
|
||
|
||
>>> confusion_matrix = sv.ConfusionMatrix.benchmark(
|
||
... dataset = dataset,
|
||
... callback = callback
|
||
... )
|
||
|
||
>>> confusion_matrix.matrix
|
||
array([
|
||
[0., 0., 0., 0.],
|
||
[0., 1., 0., 1.],
|
||
[0., 1., 1., 0.],
|
||
[1., 1., 0., 0.]
|
||
])
|
||
```
|
||
|
||
- Added [#173](https://github.com/roboflow/supervision/pull/173): [`Detections.from_mmdetection`](https://supervision.roboflow.com/0.12.0/detection/core/#supervision.detection.core.Detections.from_mmdetection) to enable seamless integration with [MMDetection](https://github.com/open-mmlab/mmdetection) framework.
|
||
|
||
- Added [#130](https://github.com/roboflow/supervision/issues/130): ability to [install](https://supervision.roboflow.com/) package in `headless` or `desktop` mode.
|
||
|
||
- Changed [#180](https://github.com/roboflow/supervision/pull/180): packing method from `setup.py` to `pyproject.toml`.
|
||
|
||
- Fixed [#188](https://github.com/roboflow/supervision/issues/188): [`sv.DetectionDataset.from_cooc`](https://supervision.roboflow.com/0.12.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) can't be loaded when there are images without annotations.
|
||
|
||
- Fixed [#226](https://github.com/roboflow/supervision/issues/226): [`sv.DetectionDataset.from_yolo`](https://supervision.roboflow.com/0.12.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_yolo) can't load background instances.
|
||
|
||
### 0.11.1 <small>June 29, 2023</small>
|
||
|
||
- Fixed [#165](https://github.com/roboflow/supervision/pull/165): [`as_folder_structure`](https://supervision.roboflow.com/0.11.1/dataset/core/#supervision.dataset.core.ClassificationDataset.as_folder_structure) fails to save [`sv.ClassificationDataset`](https://supervision.roboflow.com/0.11.1/dataset/core/#classificationdataset) when it is result of inference.
|
||
|
||
### 0.11.0 <small>June 28, 2023</small>
|
||
|
||
- Added [#150](https://github.com/roboflow/supervision/pull/150): ability to load and save [`sv.DetectionDataset`](https://supervision.roboflow.com/0.11.0/dataset/core/#detectiondataset) in COCO format using [`as_coco`](https://supervision.roboflow.com/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.as_coco) and [`from_coco`](https://supervision.roboflow.com/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) methods.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> ds = sv.DetectionDataset.from_coco(
|
||
... images_directory_path='...',
|
||
... annotations_path='...'
|
||
... )
|
||
|
||
>>> ds.as_coco(
|
||
... images_directory_path='...',
|
||
... annotations_path='...'
|
||
... )
|
||
```
|
||
|
||
- Added [#158](https://github.com/roboflow/supervision/pull/158): ability to merge multiple [`sv.DetectionDataset`](https://supervision.roboflow.com/0.11.0/dataset/core/#detectiondataset) together using [`merge`](https://supervision.roboflow.com/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.merge) method.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> ds_1 = sv.DetectionDataset(...)
|
||
>>> len(ds_1)
|
||
100
|
||
>>> ds_1.classes
|
||
['dog', 'person']
|
||
|
||
>>> ds_2 = sv.DetectionDataset(...)
|
||
>>> len(ds_2)
|
||
200
|
||
>>> ds_2.classes
|
||
['cat']
|
||
|
||
>>> ds_merged = sv.DetectionDataset.merge([ds_1, ds_2])
|
||
>>> len(ds_merged)
|
||
300
|
||
>>> ds_merged.classes
|
||
['cat', 'dog', 'person']
|
||
```
|
||
|
||
- Added [#162](https://github.com/roboflow/supervision/pull/162): additional `start` and `end` arguments to [`sv.get_video_frames_generator`](https://supervision.roboflow.com/0.11.0/utils/video/#get_video_frames_generator) allowing to generate frames only for a selected part of the video.
|
||
|
||
- Fixed [#157](https://github.com/roboflow/supervision/pull/157): incorrect loading of YOLO dataset class names from `data.yaml`.
|
||
|
||
### 0.10.0 <small>June 14, 2023</small>
|
||
|
||
- Added [#125](https://github.com/roboflow/supervision/pull/125): ability to load and save [`sv.ClassificationDataset`](https://supervision.roboflow.com/0.10.0/dataset/core/#classificationdataset) in a folder structure format.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> cs = sv.ClassificationDataset.from_folder_structure(
|
||
... root_directory_path='...'
|
||
... )
|
||
|
||
>>> cs.as_folder_structure(
|
||
... root_directory_path='...'
|
||
... )
|
||
```
|
||
|
||
- Added [#125](https://github.com/roboflow/supervision/pull/125): support for [`sv.ClassificationDataset.split`](https://supervision.roboflow.com/0.10.0/dataset/core/#supervision.dataset.core.ClassificationDataset.split) allowing to divide `sv.ClassificationDataset` into two parts.
|
||
|
||
- Added [#110](https://github.com/roboflow/supervision/pull/110): ability to extract masks from Roboflow API results using [`sv.Detections.from_roboflow`](https://supervision.roboflow.com/0.10.0/detection/core/#supervision.detection.core.Detections.from_roboflow).
|
||
|
||
- Added [commit hash](https://github.com/roboflow/supervision/commit/d000292eb2f2342544e0947b65528082e60fb8d6): Supervision Quickstart [notebook](https://colab.research.google.com/github/roboflow/supervision/blob/main/demo.ipynb) where you can learn more about Detection, Dataset and Video APIs.
|
||
|
||
- Changed [#135](https://github.com/roboflow/supervision/pull/135): `sv.get_video_frames_generator` documentation to better describe actual behavior.
|
||
|
||
### 0.9.0 <small>June 7, 2023</small>
|
||
|
||
- Added [#118](https://github.com/roboflow/supervision/pull/118): ability to select [`sv.Detections`](https://supervision.roboflow.com/0.9.0/detection/core/#supervision.detection.core.Detections.__getitem__) by index, list of indexes or slice. Here is an example illustrating the new selection methods.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> detections = sv.Detections(...)
|
||
>>> len(detections[0])
|
||
1
|
||
>>> len(detections[[0, 1]])
|
||
2
|
||
>>> len(detections[0:2])
|
||
2
|
||
```
|
||
|
||
- Added [#101](https://github.com/roboflow/supervision/pull/101): ability to extract masks from YOLOv8 result using [`sv.Detections.from_yolov8`](https://supervision.roboflow.com/0.8.0/detection/core/#supervision.detection.core.Detections.from_yolov8). Here is an example illustrating how to extract boolean masks from the result of the YOLOv8 model inference.
|
||
|
||
- Added [#122](https://github.com/roboflow/supervision/pull/122): ability to crop image using [`sv.crop`](https://supervision.roboflow.com/0.9.0/utils/image/#crop). Here is an example showing how to get a separate crop for each detection in `sv.Detections`.
|
||
|
||
- Added [#120](https://github.com/roboflow/supervision/pull/120): ability to conveniently save multiple images into directory using [`sv.ImageSink`](https://supervision.roboflow.com/0.9.0/utils/image/#imagesink). Here is an example showing how to save every tenth video frame as a separate image.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> with sv.ImageSink(target_dir_path='target/directory/path') as sink:
|
||
... for image in sv.get_video_frames_generator(source_path='source_video.mp4', stride=10):
|
||
... sink.save_image(image=image)
|
||
```
|
||
|
||
- Fixed [#106](https://github.com/roboflow/supervision/issues/106): inconvenient handling of [`sv.PolygonZone`](https://supervision.roboflow.com/0.8.0/detection/tools/polygon_zone/#polygonzone) coordinates. Now `sv.PolygonZone` accepts coordinates in the form of `[[x1, y1], [x2, y2], ...]` that can be both integers and floats.
|
||
|
||
### 0.8.0 <small>May 17, 2023</small>
|
||
|
||
- Added [#100](https://github.com/roboflow/supervision/pull/100): support for dataset inheritance. The current `Dataset` got renamed to `DetectionDataset`. Now [`DetectionDataset`](https://supervision.roboflow.com/0.8.0/dataset/core/#detectiondataset) inherits from `BaseDataset`. This change was made to enforce the future consistency of APIs of different types of computer vision datasets.
|
||
- Added [#100](https://github.com/roboflow/supervision/pull/100): ability to save datasets in YOLO format using [`DetectionDataset.as_yolo`](https://supervision.roboflow.com/0.8.0/dataset/core/#supervision.dataset.core.DetectionDataset.as_yolo).
|
||
|
||
```python
|
||
>>> import roboflow
|
||
>>> from roboflow import Roboflow
|
||
>>> import supervision as sv
|
||
|
||
>>> roboflow.login()
|
||
|
||
>>> rf = Roboflow()
|
||
|
||
>>> project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID)
|
||
>>> dataset = project.version(PROJECT_VERSION).download("yolov5")
|
||
|
||
>>> ds = sv.DetectionDataset.from_yolo(
|
||
... images_directory_path=f"{dataset.location}/train/images",
|
||
... annotations_directory_path=f"{dataset.location}/train/labels",
|
||
... data_yaml_path=f"{dataset.location}/data.yaml"
|
||
... )
|
||
|
||
>>> ds.classes
|
||
['dog', 'person']
|
||
```
|
||
|
||
- Added [#103](https://github.com/roboflow/supervision/pull/103): support for [`DetectionDataset.split`](https://supervision.roboflow.com/0.8.0/dataset/core/#supervision.dataset.core.DetectionDataset.split) allowing to divide `DetectionDataset` into two parts.
|
||
|
||
```python
|
||
>>> import supervision as sv
|
||
|
||
>>> ds = sv.DetectionDataset(...)
|
||
>>> train_ds, test_ds = ds.split(split_ratio=0.7, random_state=42, shuffle=True)
|
||
|
||
>>> len(train_ds), len(test_ds)
|
||
(700, 300)
|
||
```
|
||
|
||
- Changed [#100](https://github.com/roboflow/supervision/pull/100): default value of `approximation_percentage` parameter from `0.75` to `0.0` in `DetectionDataset.as_yolo` and `DetectionDataset.as_pascal_voc`.
|
||
|
||
### 0.7.0 <small>May 11, 2023</small>
|
||
|
||
- Added [#91](https://github.com/roboflow/supervision/pull/91): `Detections.from_yolo_nas` to enable seamless integration with [YOLO-NAS](https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md) model.
|
||
- Added [#86](https://github.com/roboflow/supervision/pull/86): ability to load datasets in YOLO format using `Dataset.from_yolo`.
|
||
- Added [#84](https://github.com/roboflow/supervision/pull/84): `Detections.merge` to merge multiple `Detections` objects together.
|
||
- Fixed [#81](https://github.com/roboflow/supervision/pull/81): `LineZoneAnnotator.annotate` does not return annotated frame.
|
||
- Changed [#44](https://github.com/roboflow/supervision/pull/44): `LineZoneAnnotator.annotate` to allow for custom text for the in and out tags.
|
||
|
||
### 0.6.0 <small>April 19, 2023</small>
|
||
|
||
- Added [#71](https://github.com/roboflow/supervision/pull/71): initial `Dataset` support and ability to save `Detections` in Pascal VOC XML format.
|
||
- Added [#71](https://github.com/roboflow/supervision/pull/71): new `mask_to_polygons`, `filter_polygons_by_area`, `polygon_to_xyxy` and `approximate_polygon` utilities.
|
||
- Added [#72](https://github.com/roboflow/supervision/pull/72): ability to load Pascal VOC XML **object detections** dataset as `Dataset`.
|
||
- Changed [#70](https://github.com/roboflow/supervision/pull/70): order of `Detections` attributes to make it consistent with order of objects in `__iter__` tuple.
|
||
- Changed [#71](https://github.com/roboflow/supervision/pull/71): `generate_2d_mask` to `polygon_to_mask`.
|
||
|
||
### 0.5.2 <small>April 13, 2023</small>
|
||
|
||
- Fixed [#63](https://github.com/roboflow/supervision/pull/63): `LineZone.trigger` function expects 4 values instead of 5.
|
||
|
||
### 0.5.1 <small>April 12, 2023</small>
|
||
|
||
- Fixed `Detections.__getitem__` method did not return mask for selected item.
|
||
- Fixed `Detections.area` crashed for mask detections.
|
||
|
||
### 0.5.0 <small>April 10, 2023</small>
|
||
|
||
- Added [#58](https://github.com/roboflow/supervision/pull/58): `Detections.mask` to enable segmentation support.
|
||
- Added [#58](https://github.com/roboflow/supervision/pull/58): `MaskAnnotator` to allow easy `Detections.mask` annotation.
|
||
- Added [#58](https://github.com/roboflow/supervision/pull/58): `Detections.from_sam` to enable native Segment Anything Model (SAM) support.
|
||
- Changed [#58](https://github.com/roboflow/supervision/pull/58): `Detections.area` behaviour to work not only with boxes but also with masks.
|
||
|
||
### 0.4.0 <small>April 5, 2023</small>
|
||
|
||
- 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 <small>March 23, 2023</small>
|
||
|
||
- Changed [#50](https://github.com/roboflow/supervision/issues/50): Allow `Detections.class_id` to be `None`.
|
||
|
||
### 0.3.1 <small>March 6, 2023</small>
|
||
|
||
- Fixed [#41](https://github.com/roboflow/supervision/issues/41): `PolygonZone` throws an exception when the object touches the bottom edge of the image.
|
||
- Fixed [#42](https://github.com/roboflow/supervision/issues/42): `Detections.wth_nms` method throws an exception when `Detections` is empty.
|
||
- Changed [#36](https://github.com/roboflow/supervision/pull/36): `Detections.wth_nms` support class agnostic and non-class agnostic case.
|
||
|
||
### 0.3.0 <small>March 6, 2023</small>
|
||
|
||
- Changed: Allow `Detections.confidence` to be `None`.
|
||
- Added: `Detections.from_transformers` and `Detections.from_detectron2` to enable seamless integration with Transformers and Detectron2 models.
|
||
- Added: `Detections.area` to dynamically calculate bounding box area.
|
||
- Added: `Detections.wth_nms` to filter out double detections with NMS. Initial - only class agnostic - implementation.
|
||
|
||
### 0.2.0 <small>February 2, 2023</small>
|
||
|
||
- Added: Advanced `Detections` filtering with pandas-like API.
|
||
- Added: `Detections.from_yolov5` and `Detections.from_yolov8` to enable seamless integration with YOLOv5 and YOLOv8 models.
|
||
|
||
### 0.1.0 <small>January 19, 2023</small>
|
||
|
||
Say hello to Supervision 👋
|