Changelog
0.18.0 January 25, 2024¶
- Added #633:
sv.PercentageBarAnnotator
allowing to annotate images and videos with percentage values representing confidence or other custom property.
>>> 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:
sv.RoundBoxAnnotator
allowing to annotate images and videos with rounded corners bounding boxes. -
Added #770:
sv.OrientedBoxAnnotator
allowing to annotate images and videos with OBB (Oriented Bounding Boxes).
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:
sv.DetectionsSmoother
allowing for smoothing detections over multiple frames in video tracking. -
Added #769:
sv.ColorPalette.from_matplotlib
allowing users to create asv.ColorPalette
instance from a Matplotlib color palette.
>>> 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:
sv.Detections.from_ultralytics
adding support for OBB (Oriented Bounding Boxes). -
Changed #735:
sv.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 assv.Position.BOTTOM_CENTER
, or any other combination of anchors defined asList[sv.Position]
. -
Changed #756:
sv.Color
's andsv.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
).
Warning
sv.ColorPalette.default()
is deprecated and will be removed in supervision-0.21.0
. Use sv.ColorPalette.DEFAULT
instead.
-
Changed #769:
sv.ColorPalette.DEFAULT
value, giving users a more extensive set of annotation colors. -
Changed #677:
sv.Detections.from_roboflow
tosv.Detections.from_inference
streamlining its functionality to be compatible with both the both inference pip package and the Robloflow hosted API.
Warning
Detections.from_roboflow()
is deprecated and will be removed in supervision-0.21.0
. Use Detections.from_inference
instead.
- Fixed #735:
sv.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 December 06, 2023¶
-
Added #633:
sv.PixelateAnnotator
allowing to pixelate objects on images and videos. -
Added #652:
sv.TriangleAnnotator
allowing to annotate images and videos with triangle markers. -
Added #602:
sv.PolygonAnnotator
allowing to annotate images and videos with segmentation mask outline.
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> polygon_annotator = sv.PolygonAnnotator()
>>> annotated_frame = polygon_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
>>> from supervision.assets import download_assets, VideoAssets
>>> download_assets(VideoAssets.VEHICLES)
"vehicles.mp4"
-
Added #605:
Position.CENTER_OF_MASS
allowing to place labels in center of mass of segmentation masks. -
Added #651:
sv.scale_boxes
allowing to scalesv.Detections.xyxy
values. -
Added #637:
sv.calculate_dynamic_text_scale
andsv.calculate_dynamic_line_thickness
allowing text scale and line thickness to match image resolution. -
Added #620:
sv.Color.as_hex
allowing to extract color value in HEX format. -
Added #572:
sv.Classifications.from_timm
allowing to load classification result from timm models. -
Added #478:
sv.Classifications.from_clip
allowing to load classification result from clip model. -
Added #571:
sv.Detections.from_azure_analyze_image
allowing to load detection results from Azure Image Analysis. -
Changed #646:
sv.BoxMaskAnnotator
renaming it tosv.ColorAnnotator
. -
Changed #606:
sv.MaskAnnotator
to make it 5x faster. -
Fixed #584:
sv.DetectionDataset.from_yolo
to ignore empty lines in annotation files. -
Fixed #555:
sv.BlurAnnotator
to trim negative coordinates before bluring detections. -
Fixed #511:
sv.TraceAnnotator
to respect trace position.
0.16.0 October 19, 2023¶
-
Added #422:
sv.BoxMaskAnnotator
allowing to annotate images and videos with mox masks. -
Added #433:
sv.HaloAnnotator
allowing to annotate images and videos with halo effect.
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> halo_annotator = sv.HaloAnnotator()
>>> annotated_frame = halo_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
-
Added #466:
sv.HeatMapAnnotator
allowing to annotate videos with heat maps. -
Added #492:
sv.DotAnnotator
allowing to annotate images and videos with dots. -
Added #449:
sv.draw_image
allowing to draw an image onto a given scene with specified opacity and dimensions. -
Added #280:
sv.FPSMonitor
for monitoring frames per second (FPS) to benchmark latency. -
Changed #482:
sv.LineZone.tigger
now returnTuple[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: Annotator argument name from
color_map: str
tocolor_lookup: ColorLookup
enum to increase type safety. -
Changed #426:
sv.MaskAnnotator
allowing 2x faster annotation. -
Fixed #477: Poetry env definition allowing proper local installation.
-
Fixed #430:
sv.ByteTrack
to returnnp.array([], dtype=int)
whensvDetections
is empty.
Warning
sv.Detections.from_yolov8
and sv.Classifications.from_yolov8
as those are now replaced by sv.Detections.from_ultralytics
and sv.Classifications.from_ultralytics
.
0.15.0 October 5, 2023¶
-
Added #170:
sv.BoundingBoxAnnotator
allowing to annotate images and videos with bounding boxes. -
Added #170:
sv.BoxCornerAnnotator
allowing to annotate images and videos with just bounding box corners. -
Added #170:
sv.MaskAnnotator
allowing to annotate images and videos with segmentation masks. -
Added #170:
sv.EllipseAnnotator
allowing to annotate images and videos with ellipses (sports game style). -
Added #386:
sv.CircleAnnotator
allowing to annotate images and videos with circles. -
Added #354:
sv.TraceAnnotator
allowing to draw path of moving objects on videos. -
Added #405:
sv.BlurAnnotator
allowing to blur objects on images and videos.
>>> 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: Supervision usage example. You can now learn how to perform traffic flow analysis with Supervision.
-
Changed #399:
sv.Detections.from_roboflow
now does not requireclass_list
to be specified. Theclass_id
value can be extracted directly from the inference response. -
Changed #381:
sv.VideoSink
now allows to customize the output codec. -
Changed #361:
sv.InferenceSlicer
can now operate in multithreading mode. -
Fixed #348:
sv.Detections.from_deepsparse
to allow processing empty deepsparse result object.
0.14.0 August 31, 2023¶
- Added #282: support for SAHI inference technique with
sv.InferenceSlicer
.
>>> 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:
Detections.from_deepsparse
to enable seamless integration with DeepSparse framework. -
Added #281:
sv.Classifications.from_ultralytics
to enable seamless integration with Ultralytics framework. This will enable you to use supervision with all models that Ultralytics supports.
Warning
sv.Detections.from_yolov8 and sv.Classifications.from_yolov8 are now deprecated and will be removed with supervision-0.16.0 release.
-
Added #341: First supervision usage example script showing how to detect and track objects on video using YOLOv8 + Supervision.
-
Changed #296:
sv.ClassificationDataset
andsv.DetectionDataset
now use image path (not image name) as dataset keys. -
Fixed #300:
Detections.from_roboflow
to filter out polygons with less than 3 points.
0.13.0 August 8, 2023¶
- Added #236: support for mean average precision (mAP) for object detection models with
sv.MeanAveragePrecision
.
>>> 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: support for ByteTrack for object tracking with
sv.ByteTrack
. -
Added #222:
sv.Detections.from_ultralytics
to enable seamless integration with Ultralytics framework. This will enable you to usesupervision
with all models that Ultralytics supports.
Warning
sv.Detections.from_yolov8
is now deprecated and will be removed with supervision-0.15.0
release.
-
Added #191:
sv.Detections.from_paddledet
to enable seamless integration with PaddleDetection framework. -
Added #245: support for loading PASCAL VOC segmentation datasets with
sv.DetectionDataset.
.
0.12.0 July 24, 2023¶
Warning
With the supervision-0.12.0
release, we are terminating official support for Python 3.7.
- Added #177: initial support for object detection model benchmarking with
sv.ConfusionMatrix
.
>>> 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:
Detections.from_mmdetection
to enable seamless integration with MMDetection framework. -
Added #130: ability to install package in
headless
ordesktop
mode. -
Changed #180: packing method from
setup.py
topyproject.toml
. -
Fixed #188:
sv.DetectionDataset.from_cooc
can't be loaded when there are images without annotations. -
Fixed #226:
sv.DetectionDataset.from_yolo
can't load background instances.
0.11.1 June 29, 2023¶
- Fix #165:
as_folder_structure
fails to savesv.ClassificationDataset
when it is result of inference.
0.11.0 June 28, 2023¶
- Added #150: ability to load and save
sv.DetectionDataset
in COCO format usingas_coco
andfrom_coco
methods.
>>> import supervision as sv
>>> ds = sv.DetectionDataset.from_coco(
... images_directory_path='...',
... annotations_path='...'
... )
>>> ds.as_coco(
... images_directory_path='...',
... annotations_path='...'
... )
- Added #158: ability to marge multiple
sv.DetectionDataset
together usingmerge
method.
>>> 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: additional
start
andend
arguments tosv.get_video_frames_generator
allowing to generate frames only for a selected part of the video. -
Fix #157: incorrect loading of YOLO dataset class names from
data.yaml
.
0.10.0 June 14, 2023¶
- Added #125: ability to load and save
sv.ClassificationDataset
in a folder structure format.
>>> import supervision as sv
>>> cs = sv.ClassificationDataset.from_folder_structure(
... root_directory_path='...'
... )
>>> cs.as_folder_structure(
... root_directory_path='...'
... )
-
Added #125: support for
sv.ClassificationDataset.split
allowing to dividesv.ClassificationDataset
into two parts. -
Added #110: ability to extract masks from Roboflow API results using
sv.Detections.from_roboflow
. -
Added commit hash: Supervision Quickstart notebook where you can learn more about Detection, Dataset and Video APIs.
-
Changed #135:
sv.get_video_frames_generator
documentation to better describe actual behavior.
0.9.0 June 7, 2023¶
- Added #118: ability to select
sv.Detections
by index, list of indexes or slice. Here is an example illustrating the new selection methods.
>>> import supervision as sv
>>> detections = sv.Detections(...)
>>> len(detections[0])
1
>>> len(detections[[0, 1]])
2
>>> len(detections[0:2])
2
-
Added #101: ability to extract masks from YOLOv8 result using
sv.Detections.from_yolov8
. Here is an example illustrating how to extract boolean masks from the result of the YOLOv8 model inference. -
Added #122: ability to crop image using
sv.crop
. Here is an example showing how to get a separate crop for each detection insv.Detections
. -
Added #120: ability to conveniently save multiple images into directory using
sv.ImageSink
. Here is an example showing how to save every tenth video frame as a separate image.
>>> 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: inconvenient handling of
sv.PolygonZone
coordinates. Nowsv.PolygonZone
accepts coordinates in the form of[[x1, y1], [x2, y2], ...]
that can be both integers and floats.
0.8.0 May 17, 2023¶
- Added #100: support for dataset inheritance. The current
Dataset
got renamed toDetectionDataset
. NowDetectionDataset
inherits fromBaseDataset
. This change was made to enforce the future consistency of APIs of different types of computer vision datasets. - Added #100: ability to save datasets in YOLO format using
DetectionDataset.as_yolo
.
>>> 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 #102: support for
DetectionDataset.split
allowing to divideDetectionDataset
into two parts.
>>> 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: default value of
approximation_percentage
parameter from0.75
to0.0
inDetectionDataset.as_yolo
andDetectionDataset.as_pascal_voc
.
0.7.0 May 11, 2023¶
- Added #91:
Detections.from_yolo_nas
to enable seamless integration with YOLO-NAS model. - Added #86: ability to load datasets in YOLO format using
Dataset.from_yolo
. - Added #84:
Detections.merge
to merge multipleDetections
objects together. - Fixed #81:
LineZoneAnnotator.annotate
does not return annotated frame. - Changed #44:
LineZoneAnnotator.annotate
to allow for custom text for the in and out tags.
0.6.0 April 19, 2023¶
- Added #71: initial
Dataset
support and ability to saveDetections
in Pascal VOC XML format. - Added #71: new
mask_to_polygons
,filter_polygons_by_area
,polygon_to_xyxy
andapproximate_polygon
utilities. - Added #72: ability to load Pascal VOC XML object detections dataset as
Dataset
. - Changed #70: order of
Detections
attributes to make it consistent with order of objects in__iter__
tuple. - Changed #71:
generate_2d_mask
topolygon_to_mask
.
0.5.2 April 13, 2023¶
- Fixed #63:
LineZone.trigger
function expects 4 values instead of 5.
0.5.1 April 12, 2023¶
- Fixed
Detections.__getitem__
method did not return mask for selected item. - Fixed
Detections.area
crashed for mask detections.
0.5.0 April 10, 2023¶
- Added #58:
Detections.mask
to enable segmentation support. - Added #58:
MaskAnnotator
to allow easyDetections.mask
annotation. - Added #58:
Detections.from_sam
to enable native Segment Anything Model (SAM) support. - Changed #58:
Detections.area
behaviour to work not only with boxes but also with masks.
0.4.0 April 5, 2023¶
- Added #46:
Detections.empty
to allow easy creation of emptyDetections
objects. - Added #56:
Detections.from_roboflow
to allow easy creation ofDetections
objects from Roboflow API inference results. - Added #56:
plot_images_grid
to allow easy plotting of multiple images on single plot. - Added #56: initial support for Pascal VOC XML format with
detections_to_voc_xml
method. - Changed #56:
show_frame_in_notebook
refactored and renamed toplot_image
.
0.3.2 March 23, 2023¶
- Changed #50: Allow
Detections.class_id
to beNone
.
0.3.1 March 6, 2023¶
- Fixed #41:
PolygonZone
throws an exception when the object touches the bottom edge of the image. - Fixed #42:
Detections.wth_nms
method throws an exception whenDetections
is empty. - Changed #36:
Detections.wth_nms
support class agnostic and non-class agnostic case.
0.3.0 March 6, 2023¶
- Changed: Allow
Detections.confidence
to beNone
. - Added:
Detections.from_transformers
andDetections.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 February 2, 2023¶
- Added: Advanced
Detections
filtering with pandas-like API. - Added:
Detections.from_yolov5
andDetections.from_yolov8
to enable seamless integration with YOLOv5 and YOLOv8 models.
0.1.0 January 19, 2023¶
Say hello to Supervision 👋