Skip to content

Releases: roboflow/supervision

supervision-0.17.1

08 Dec 14:21
bcb26f9
Compare
Choose a tag to compare

πŸš€ Added

  • Support for Python 3.12.

πŸ† Contributors

@onuralpszr (Onuralp SEZER), @SkalskiP (Piotr Skalski)

supervision-0.17.0

06 Dec 15:22
36ab9dc
Compare
Choose a tag to compare

πŸš€ Added

walking-pixelate-corner-optimized.mp4
  • sv.TriangleAnnotator allowing to annotate images and videos with triangle markers. (#652)

  • sv.PolygonAnnotator allowing to annotate images and videos with segmentation mask outline. (#602)

    >>> import supervision as sv
    
    >>> image = ...
    >>> detections = sv.Detections(...)
    
    >>> polygon_annotator = sv.PolygonAnnotator()
    >>> annotated_frame = polygon_annotator.annotate(
    ...     scene=image.copy(),
    ...     detections=detections
    ... )
walking-polygon-optimized.mp4

🌱 Changed

mask_annotator_speed

πŸ› οΈ Fixed

πŸ† Contributors

@onuralpszr (Onuralp SEZER), @hugoles (Hugo Dutra), @karanjakhar (Karan Jakhar), @kim-jeonghyun (Jeonghyun Kim), @fdloopes (
Felipe Lopes), @abhishek7kalra (Abhishek Kalra), @SummitStudiosDev, @xenteros @capjamesg (James Gallagher), @SkalskiP (Piotr Skalski)

supervision-0.16.0

19 Oct 08:26
f34993c
Compare
Choose a tag to compare

πŸš€ Added

supervision-0.16.0-annotators.mp4
>>> import supervision as sv

>>> image = ...
>>> detections = sv.Detections(...)

>>> halo_annotator = sv.HaloAnnotator()
>>> annotated_frame = halo_annotator.annotate(
...     scene=image.copy(),
...     detections=detections
... )

🌱 Changed

  • sv.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. (#482)
  • Annotator argument name from color_map: str to color_lookup: ColorLookup enum to increase type safety. (#465)
  • sv.MaskAnnotator allowing 2x faster annotation. (#426)

πŸ› οΈ Fixed

  • Poetry env definition allowing proper local installation. (#477)
  • sv.ByteTrack to return np.array([], dtype=int) when svDetections is empty. (#430)
  • YOLONAS detection missing predication part added & fixed (#416)
  • SAM detection at Demo Notebook MaskAnnotator(color_map="index") color_map set to index (#416)

πŸ—‘οΈ Deleted

Warning
Deleted sv.Detections.from_yolov8 and sv.Classifications.from_yolov8 as those are now replaced by sv.Detections.from_ultralytics and sv.Classifications.from_ultralytics. (#438)

πŸ† Contributors

@hardikdava (Hardik Dava), @onuralpszr (Onuralp SEZER), @kapter, @keshav278 (Keshav Subramanian), @akashpambhar (Akash Pambhar), @AntonioConsiglio (Antonio Consiglio), @ashishdatta, @mario-dg (Mario da Graca), @ jayaBalaR (JAYABALAMBIKA.R), @abhishek7kalra (Abhishek Kalra), @PankajKrana (Pankaj Kumar Rana), @capjamesg (James Gallagher), @SkalskiP (Piotr Skalski)

supervision-0.15.0

05 Oct 07:54
1bddf26
Compare
Choose a tag to compare

πŸš€ Added

supervision-0.15.0.mp4
>>> import supervision as sv

>>> image = ...
>>> detections = sv.Detections(...)

>>> bounding_box_annotator = sv.BoundingBoxAnnotator()
>>> annotated_frame = bounding_box_annotator.annotate(
...     scene=image.copy(),
...     detections=detections
... )
  • Supervision usage example. You can now learn how to perform traffic flow analysis with Supervision. (#354)
traffic_analysis_result.mov

🌱 Changed

πŸ› οΈ Fixed

πŸ† Contributors

@hardikdava (Hardik Dava), @onuralpszr (Onuralp SEZER), @Killua7362 (Akshay Bhat), @fcakyon (Fatih C. Akyon), @akashAD98 (Akash A Desai), @Rajarshi-Misra (Rajarshi Misra), @capjamesg (James Gallagher), @SkalskiP (Piotr Skalski)

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