Skip to content

Releases: roboflow/supervision

supervision-0.14.0

31 Aug 13:23
f82f0fa
Compare
Choose a tag to compare

πŸš€ Added

>>> import cv2
>>> import supervision as sv
>>> import numpy as np
>>> 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)
inference-slicer.mov
detect-and-track-objects-on-video.mov

🌱 Changed

πŸ› οΈ Fixed

πŸ† Contributors

@hardikdava (Hardik Dava), @onuralpszr (Onuralp SEZER), @mayankagarwals (Mayank Agarwal), @rizavelioglu (Riza Velioglu), @arjun-234 (Arjun D.), @mwitiderrick (Derrick Mwiti), @ShubhamKanitkar32, @gasparitiago (Tiago De Gaspari), @capjamesg (James Gallagher), @SkalskiP (Piotr Skalski)

supervision-0.13.0

08 Aug 09:17
4f79d29
Compare
Choose a tag to compare

πŸš€ Added

>>> 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
>>> import supervision as sv
>>> from ultralytics import YOLO

>>> model = YOLO(...)
>>> byte_tracker = sv.ByteTrack()
>>> annotator = sv.BoxAnnotator()

>>> def callback(frame: np.ndarray, index: int) -> np.ndarray:
...     results = model(frame)[0]
...     detections = sv.Detections.from_yolov8(results)
...     detections = byte_tracker.update_from_detections(detections=detections)
...     labels = [
...         f"#{tracker_id} {model.model.names[class_id]} {confidence:0.2f}"
...         for _, _, confidence, class_id, tracker_id
...         in detections
...     ]
...     return annotator.annotate(scene=frame.copy(), detections=detections, labels=labels)

>>> sv.process_video(
...     source_path='...',
...     target_path='...',
...     callback=callback
... )
byte_track_result_small.mp4

πŸ† Contributors

@hardikdava (Hardik Dava), @kirilllzaitsev (Kirill Zaitsev), @onuralpszr (Onuralp SEZER), @dbroboflow, @mayankagarwals (Mayank Agarwal), @danigarciaoca (Daniel M. GarcΓ­a-OcaΓ±a), @capjamesg (James Gallagher), @SkalskiP (Piotr Skalski)

supervision-0.12.0

24 Jul 07:59
800e39d
Compare
Choose a tag to compare

Warning
With the supervision-0.12.0 release, we are terminating official support for Python 3.7. (#179)

πŸš€ Added

>>> 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.]
])

Snap (51)

🌱 Changed

  • Packing method from setup.py to pyproject.toml. (#180)

πŸ› οΈ Fixed

πŸ† Contributors

@kirilllzaitsev @hardikdava @onuralpszr @Ucag @SkalskiP @capjamesg

supervision-0.11.1

29 Jun 13:10
Compare
Choose a tag to compare

πŸ› οΈ Fixed

πŸ† Contributors

@capjamesg @SkalskiP

supervision-0.11.0

28 Jun 21:03
Compare
Choose a tag to compare

πŸš€ Added

>>> import supervision as sv

>>> ds = sv.DetectionDataset.from_coco(
...     images_directory_path='...',
...     annotations_path='...'
... )

>>> ds.as_coco(
...     images_directory_path='...',
...     annotations_path='...'
... )
>>> 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']

Snap (47)

πŸ› οΈ Fixed

  • Incorrect loading of YOLO dataset class names from data.yaml. (#157)

πŸ† Contributors

@SkalskiP @hardikdava

supervision-0.10.0

14 Jun 14:52
9cff624
Compare
Choose a tag to compare

πŸš€ Added

>>> import supervision as sv

>>> cs = sv.ClassificationDataset.from_folder_structure(
...     root_directory_path='...'
... )

>>> cs.as_folder_structure(
...     root_directory_path='...'
... )
>>> import supervision as sv

>>> cs = sv.ClassificationDataset(...)
>>> train_cs, test_cs = cs.split(split_ratio=0.7, random_state=42, shuffle=True)

>>> len(train_cs), len(test_cs)
(700, 300)

Screenshot 2023-06-14 at 15 33 27

🌱 Changed

  • sv.get_video_frames_generator documentation to better describe actual behavior. (#135)

Snap (45)

πŸ† Contributors

@capjamesg @dankresio @SkalskiP

supervision-0.9.0

07 Jun 11:17
Compare
Choose a tag to compare

πŸš€ Added

  • Ability to select sv.Detections by index, list of indexes or slice. Here is an example illustrating the new selection methods. (#118)
>>> import supervision as sv

>>> detections = sv.Detections(...)
>>> len(detections[0])
1
>>> len(detections[[0, 1]])
2
>>> len(detections[0:2])
2

supervision-0_9_0-Snap (4)

  • Ability to extract masks from YOLOv8 results using sv.Detections.from_yolov8. Here is an example illustrating how to extract boolean masks from the result of the YOLOv8 model inference. (#101)
>>> import cv2
>>> from ultralytics import YOLO
>>> import supervision as sv

>>> image = cv2.imread(...)
>>> image.shape
(640, 640, 3)

>>> model = YOLO('yolov8s-seg.pt')
>>> result = model(image)[0]
>>> detections = sv.Detections.from_yolov8(result)
>>> detections.mask.shape
(2, 640, 640)
  • Ability to crop the image using sv.crop. Here is an example showing how to get a separate crop for each detection in sv.Detections. (#122)
>>> import cv2
>>> import supervision as sv

>>> image = cv2.imread(...)
>>> detections = sv.Detections(...)
>>> len(detections)
2
>>> crops = [
...     sv.crop(image=image, xyxy=xyxy) 
...     for xyxy 
...     in detections.xyxy
... ]
>>> len(crops)
2
  • Ability to conveniently save multiple images into directory using sv.ImageSink. An example shows how to save every tenth video frame as a separate image. (#120)
>>> 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

  • Inconvenient handling of sv.PolygonZone coordinates. Now sv.PolygonZone accepts coordinates in the form of [[x1, y1], [x2, y2], ...] that can be both integers and floats. (#106)

πŸ† Contributors

@SkalskiP @lomnes-atlast-food @hardikdava

supervision-0.8.0

17 May 19:28
Compare
Choose a tag to compare

πŸš€ Added

  • Support for dataset inheritance. The current Dataset got renamed to DetectionDataset. Now DetectionDataset inherits from BaseDataset. This change was made to enforce the future consistency of APIs of different types of computer vision datasets. (#100)
  • Ability to save datasets in YOLO format using DetectionDataset.as_yolo. (#100)
>>> import supervision as sv

>>> ds = sv.DetectionDataset(...)
>>> ds.as_yolo(
...     images_directory_path='...',
...     annotations_directory_path='...',
...     data_yaml_path='...'
... )
>>> 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

  • Default value of approximation_percentage parameter from 0.75 to 0.0 in DetectionDataset.as_yolo and DetectionDataset.as_pascal_voc. (#100)

1

πŸ† Contributors

supervision-0.7.0

10 May 22:43
Compare
Choose a tag to compare

πŸš€ Added

  • Detections.from_yolo_nas to enable seamless integration with YOLO-NAS model. (#91)
  • Ability to load datasets in YOLO format using Dataset.from_yolo. (#86)
  • Detections.merge to merge multiple Detections objects together. (#84)

🌱 Changed

  • LineZoneAnnotator.annotate to allow for the custom text for the in and out tags. (#44)

πŸ› οΈ Fixed

  • LineZoneAnnotator.annotate does not return annotated frame. (#81)

πŸ† Contributors

supervision-0.6.0

19 Apr 21:08
2945013
Compare
Choose a tag to compare

πŸš€ Added

  • Initial Dataset support and ability to save Detections in Pascal VOC XML format. (#71)
  • New mask_to_polygons, filter_polygons_by_area, polygon_to_xyxy and approximate_polygon utilities. (#71)
  • Ability to load Pascal VOC XML object detections dataset as Dataset. (#72)

🌱 Changed

  • order of Detections attributes to make it consistent with order of objects in __iter__ tuple. (#70)
  • generate_2d_mask to polygon_to_mask. (#71)

πŸ† Contributors