From b912db7a0632ab383e9f0290142cfdeb72586186 Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Wed, 27 Dec 2023 14:13:40 -0600 Subject: [PATCH 01/41] Add Detections Smoother --- docs/detection/smoother.md | 7 ++ supervision/__init__.py | 1 + supervision/detection/smoother.py | 118 ++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 docs/detection/smoother.md create mode 100644 supervision/detection/smoother.py diff --git a/docs/detection/smoother.md b/docs/detection/smoother.md new file mode 100644 index 00000000..ed5523b5 --- /dev/null +++ b/docs/detection/smoother.md @@ -0,0 +1,7 @@ +## Smoother + + + +:::supervision.detection.smoother.Smoother diff --git a/supervision/__init__.py b/supervision/__init__.py index 85b07850..7e34c0f4 100644 --- a/supervision/__init__.py +++ b/supervision/__init__.py @@ -32,6 +32,7 @@ from supervision.dataset.core import ( ) from supervision.detection.annotate import BoxAnnotator from supervision.detection.core import Detections +from supervision.detection.smoother import Smoother from supervision.detection.line_counter import LineZone, LineZoneAnnotator from supervision.detection.tools.inference_slicer import InferenceSlicer from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator diff --git a/supervision/detection/smoother.py b/supervision/detection/smoother.py new file mode 100644 index 00000000..fb810121 --- /dev/null +++ b/supervision/detection/smoother.py @@ -0,0 +1,118 @@ +from collections import defaultdict +import numpy as np +from supervision.detection.core import Detections + +class Smoother: + """ + A class for smoothing out noise in predictions over time by using a Tracker + to track objects over time and averaging out the predictions over the + `length` most recent frames. + + !!! warning + + Smoother utilizes the `tracker_id`. Read + [here](https://supervision.roboflow.com/trackers/) to learn how to plug + tracking into your inference pipeline. + """ + + def __init__( + self, + length: int = 5 + ) -> None: + """ + Args: + length (int): The current count of detected objects within the zone + """ + + self.length = length + + self.current_frame = 0 + self.tracks = NoneDict() + self.track_starts = NoneDict() + self.track_ends = NoneDict() + + def tracker_length(self, tracker_id): + return self.current_frame - self.track_starts[tracker_id] + + def add_frame(self, detections: Detections) -> None: + """ + Adds a new set of predictions to the smoother. Run this with every new + prediction received from the model. + + Args: + detections (Detections): The detections to add to the smoother. + """ + + self.current_frame += 1 + + for detection_idx in range(len(detections)): + tracker_id = detections.tracker_id[detection_idx] + if tracker_id is None: + # skip detections without a tracker id + continue + + if self.tracks[tracker_id] is None: + # initialize a new tracker_id + self.tracks[tracker_id] = [] + self.track_starts[tracker_id] = self.current_frame + + self.tracks[tracker_id].append(detections[detection_idx]) + self.track_ends[tracker_id] = self.current_frame + + for track_id in self.tracks: + track = self.tracks[track_id] + if self.track_ends[track_id] < self.current_frame: + # continue tracking for a few frames after the object has left + # (to prevent flickering in case it comes back) + track.append(None) + + if len(track) > self.length: + # remove the oldest detection from the track it's too long + track.pop(0) + + def get_track(self, track_id): + track = self.tracks[track_id] + if track is None: + return None + + track = [d for d in track if d is not None] + if len(track) == 0: + return None + + ret = track[0] + # set to an average of all the detection boxes + ret.xyxy = np.mean([d.xyxy for d in track], axis=0) + ret.confidence = np.mean([d.confidence for d in track], axis=0) + + return ret + + def get_smoothed_detections(self): + """ + Returns a smoothed set of predictions based on the `length` most recent frames. + + Returns: + detections (Detections): The smoothed detections. + """ + + tracked_detections = [] + for track_id in self.tracks: + track = self.get_track(track_id) + if track is not None: + tracked_detections.append(track) + + return Detections.merge(tracked_detections) + +class NoneDict(defaultdict): + """ + Helper class that returns None instead of raising a KeyError + when a key is not found. + """ + + def __init__(self, *args, **kwargs): + super(NoneDict, self).__init__(None, *args, **kwargs) + + def __getitem__(self, key): + try: + return super(NoneDict, self).__getitem__(key) + except KeyError: + return None \ No newline at end of file From ffdab06376893c42340b8ed5cf85d7c3b883a343 Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Wed, 27 Dec 2023 15:02:02 -0600 Subject: [PATCH 02/41] Update Docs --- mkdocs.yml | 1 + supervision/detection/smoother.py | 48 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index c7c58f9e..4cb23161 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,6 +37,7 @@ nav: - Core: classification/core.md - Detections: - Core: detection/core.md + - Smoother: detection/smoother.md - Utils: detection/utils.md - Tools: - Line Zone: detection/tools/line_zone.md diff --git a/supervision/detection/smoother.py b/supervision/detection/smoother.py index fb810121..5559903d 100644 --- a/supervision/detection/smoother.py +++ b/supervision/detection/smoother.py @@ -8,6 +8,54 @@ class Smoother: to track objects over time and averaging out the predictions over the `length` most recent frames. + + > _On the left are the model's raw predictions, on the right is the output of Smoother._ + + ## Example Usage: + + ```python + import cv2 + # remember to `pip install inference` + from inference import InferencePipeline + import supervision as sv + + box_annotator = sv.BoxAnnotator(color=sv.Color(52, 236, 217)) + byte_tracker = sv.ByteTrack() + + # Initialize the Smoother + smoother = sv.Smoother() + + def render(detections, video_frame): + # Parse the detections + detections = sv.Detections.from_roboflow(detections) + + # Run a tracker to link predictions across frames + detections = byte_tracker.update_with_detections(detections) + + # Record the new frame and get the smoothed predictions + smoother.add_frame(detections) + smoothed_detections = smoother.get_smoothed_detections() + + # Render + image_smoothed = box_annotator.annotate(scene=image.copy(), detections=smoothed_detections) + + # Visualize + cv2.imshow("Prediction", image) + cv2.waitKey(1) + + + pipeline = InferencePipeline.init( + model_id="microsoft-coco/9", # Or put your custom trained model here + # api_key="YOUR_ROBOFLOW_KEY", # Uncomment and fill if you want to access a model that requires auth (or setup a .env file) + video_reference=0, # Webcam; can also be video path or RTSP stream + on_prediction=render + ) + pipeline.start() + pipeline.join() + ``` + !!! warning Smoother utilizes the `tracker_id`. Read From 7f4b27a556cbd604baf2c42a27acf588d39f866e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 21:09:25 +0000 Subject: [PATCH 03/41] =?UTF-8?q?fix(pre=5Fcommit):=20=F0=9F=8E=A8=20auto?= =?UTF-8?q?=20format=20pre-commit=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supervision/__init__.py | 2 +- supervision/detection/smoother.py | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/supervision/__init__.py b/supervision/__init__.py index 7e34c0f4..ef9327df 100644 --- a/supervision/__init__.py +++ b/supervision/__init__.py @@ -32,8 +32,8 @@ from supervision.dataset.core import ( ) from supervision.detection.annotate import BoxAnnotator from supervision.detection.core import Detections -from supervision.detection.smoother import Smoother from supervision.detection.line_counter import LineZone, LineZoneAnnotator +from supervision.detection.smoother import Smoother from supervision.detection.tools.inference_slicer import InferenceSlicer from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator from supervision.detection.utils import ( diff --git a/supervision/detection/smoother.py b/supervision/detection/smoother.py index 5559903d..21c9101b 100644 --- a/supervision/detection/smoother.py +++ b/supervision/detection/smoother.py @@ -1,7 +1,10 @@ from collections import defaultdict + import numpy as np + from supervision.detection.core import Detections + class Smoother: """ A class for smoothing out noise in predictions over time by using a Tracker @@ -33,11 +36,11 @@ class Smoother: # Run a tracker to link predictions across frames detections = byte_tracker.update_with_detections(detections) - + # Record the new frame and get the smoothed predictions smoother.add_frame(detections) smoothed_detections = smoother.get_smoothed_detections() - + # Render image_smoothed = box_annotator.annotate(scene=image.copy(), detections=smoothed_detections) @@ -63,10 +66,7 @@ class Smoother: tracking into your inference pipeline. """ - def __init__( - self, - length: int = 5 - ) -> None: + def __init__(self, length: int = 5) -> None: """ Args: length (int): The current count of detected objects within the zone @@ -103,21 +103,21 @@ class Smoother: # initialize a new tracker_id self.tracks[tracker_id] = [] self.track_starts[tracker_id] = self.current_frame - + self.tracks[tracker_id].append(detections[detection_idx]) self.track_ends[tracker_id] = self.current_frame - + for track_id in self.tracks: track = self.tracks[track_id] if self.track_ends[track_id] < self.current_frame: # continue tracking for a few frames after the object has left # (to prevent flickering in case it comes back) track.append(None) - + if len(track) > self.length: # remove the oldest detection from the track it's too long track.pop(0) - + def get_track(self, track_id): track = self.tracks[track_id] if track is None: @@ -126,12 +126,12 @@ class Smoother: track = [d for d in track if d is not None] if len(track) == 0: return None - + ret = track[0] # set to an average of all the detection boxes ret.xyxy = np.mean([d.xyxy for d in track], axis=0) ret.confidence = np.mean([d.confidence for d in track], axis=0) - + return ret def get_smoothed_detections(self): @@ -147,9 +147,10 @@ class Smoother: track = self.get_track(track_id) if track is not None: tracked_detections.append(track) - + return Detections.merge(tracked_detections) + class NoneDict(defaultdict): """ Helper class that returns None instead of raising a KeyError @@ -163,4 +164,4 @@ class NoneDict(defaultdict): try: return super(NoneDict, self).__getitem__(key) except KeyError: - return None \ No newline at end of file + return None From ca6ba303759dc4b8c50b49fcd110555fcb4cb9e3 Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Wed, 27 Dec 2023 15:15:18 -0600 Subject: [PATCH 04/41] Fix linter errors --- supervision/detection/smoother.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/supervision/detection/smoother.py b/supervision/detection/smoother.py index 5559903d..0d58f6dd 100644 --- a/supervision/detection/smoother.py +++ b/supervision/detection/smoother.py @@ -11,7 +11,8 @@ class Smoother: - > _On the left are the model's raw predictions, on the right is the output of Smoother._ + > _On the left are the model's raw predictions, + > on the right is the output of Smoother._ ## Example Usage: @@ -39,7 +40,10 @@ class Smoother: smoothed_detections = smoother.get_smoothed_detections() # Render - image_smoothed = box_annotator.annotate(scene=image.copy(), detections=smoothed_detections) + image_smoothed = box_annotator.annotate( + scene=image.copy(), + detections=smoothed_detections + ) # Visualize cv2.imshow("Prediction", image) @@ -48,7 +52,8 @@ class Smoother: pipeline = InferencePipeline.init( model_id="microsoft-coco/9", # Or put your custom trained model here - # api_key="YOUR_ROBOFLOW_KEY", # Uncomment and fill if you want to access a model that requires auth (or setup a .env file) + # api_key="YOUR_ROBOFLOW_KEY", # Uncomment and fill if you want to access a + # model that requires auth (or setup a .env file) video_reference=0, # Webcam; can also be video path or RTSP stream on_prediction=render ) From d7420c545ea87938e2fcb68a9b37375186fe02ab Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Wed, 27 Dec 2023 15:17:28 -0600 Subject: [PATCH 05/41] Move video to correct spot in the docs --- docs/detection/smoother.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/detection/smoother.md b/docs/detection/smoother.md index ed5523b5..b55f9ade 100644 --- a/docs/detection/smoother.md +++ b/docs/detection/smoother.md @@ -1,7 +1,3 @@ ## Smoother - - :::supervision.detection.smoother.Smoother From 1d4d7dd4ea1290332dcf3134ce38b998481b0737 Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Thu, 28 Dec 2023 11:42:55 -0600 Subject: [PATCH 06/41] Move into tools directory --- docs/detection/smoother.md | 3 --- docs/detection/tools/smoother.md | 3 +++ mkdocs.yml | 2 +- supervision/__init__.py | 2 +- supervision/detection/{ => tools}/smoother.py | 0 5 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 docs/detection/smoother.md create mode 100644 docs/detection/tools/smoother.md rename supervision/detection/{ => tools}/smoother.py (100%) diff --git a/docs/detection/smoother.md b/docs/detection/smoother.md deleted file mode 100644 index b55f9ade..00000000 --- a/docs/detection/smoother.md +++ /dev/null @@ -1,3 +0,0 @@ -## Smoother - -:::supervision.detection.smoother.Smoother diff --git a/docs/detection/tools/smoother.md b/docs/detection/tools/smoother.md new file mode 100644 index 00000000..f27fe529 --- /dev/null +++ b/docs/detection/tools/smoother.md @@ -0,0 +1,3 @@ +## Detection Smoother + +:::supervision.detection.tools.smoother.Smoother diff --git a/mkdocs.yml b/mkdocs.yml index 4cb23161..f25bc382 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,12 +37,12 @@ nav: - Core: classification/core.md - Detections: - Core: detection/core.md - - Smoother: detection/smoother.md - Utils: detection/utils.md - Tools: - Line Zone: detection/tools/line_zone.md - Polygon Zone: detection/tools/polygon_zone.md - Inference Slicer: detection/tools/inference_slicer.md + - Detection Smoother: detection/tools/smoother.md - Annotators: annotators.md - Trackers: trackers.md - Datasets: datasets.md diff --git a/supervision/__init__.py b/supervision/__init__.py index ef9327df..1922553a 100644 --- a/supervision/__init__.py +++ b/supervision/__init__.py @@ -33,7 +33,7 @@ from supervision.dataset.core import ( from supervision.detection.annotate import BoxAnnotator from supervision.detection.core import Detections from supervision.detection.line_counter import LineZone, LineZoneAnnotator -from supervision.detection.smoother import Smoother +from supervision.detection.tools.smoother import Smoother from supervision.detection.tools.inference_slicer import InferenceSlicer from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator from supervision.detection.utils import ( diff --git a/supervision/detection/smoother.py b/supervision/detection/tools/smoother.py similarity index 100% rename from supervision/detection/smoother.py rename to supervision/detection/tools/smoother.py From 6600d7533ae38b0eaf0e91c87e01a6bcbf712400 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Dec 2023 17:43:54 +0000 Subject: [PATCH 07/41] =?UTF-8?q?fix(pre=5Fcommit):=20=F0=9F=8E=A8=20auto?= =?UTF-8?q?=20format=20pre-commit=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supervision/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supervision/__init__.py b/supervision/__init__.py index 1922553a..1f5b9fcb 100644 --- a/supervision/__init__.py +++ b/supervision/__init__.py @@ -33,9 +33,9 @@ from supervision.dataset.core import ( from supervision.detection.annotate import BoxAnnotator from supervision.detection.core import Detections from supervision.detection.line_counter import LineZone, LineZoneAnnotator -from supervision.detection.tools.smoother import Smoother from supervision.detection.tools.inference_slicer import InferenceSlicer from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator +from supervision.detection.tools.smoother import Smoother from supervision.detection.utils import ( box_iou_batch, calculate_masks_centroids, From 5d1e76fbd01aeea9470f4f002f515ecf0ad209af Mon Sep 17 00:00:00 2001 From: Brad Dwyer Date: Thu, 28 Dec 2023 11:50:06 -0600 Subject: [PATCH 08/41] Update copy based on feedback from James & Piotr --- CONTRIBUTING.md | 2 +- docs/how_to/track_objects.md | 2 +- supervision/annotators/core.py | 8 ++--- supervision/detection/line_counter.py | 2 +- supervision/detection/tools/smoother.py | 42 +++++++++---------------- 5 files changed, 21 insertions(+), 35 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84291639..3b1976e8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,7 +52,7 @@ git push -u origin main ### Pre-commit tool -This project utilizes the [pre-commit](https://pre-commit.com/) tool to maintain code quality and consistency. Before submitting a pull request or making any commits, it is important to run the pre-commit tool to ensure that your changes meet the project's guidelines. +This project uses the [pre-commit](https://pre-commit.com/) tool to maintain code quality and consistency. Before submitting a pull request or making any commits, it is important to run the pre-commit tool to ensure that your changes meet the project's guidelines. Furthermore, we have integrated a pre-commit GitHub Action into our workflow. This means that with every pull request opened, the pre-commit checks will be automatically enforced, streamlining the code review process and ensuring that all contributions adhere to our quality standards. diff --git a/docs/how_to/track_objects.md b/docs/how_to/track_objects.md index ea48b070..282470c0 100644 --- a/docs/how_to/track_objects.md +++ b/docs/how_to/track_objects.md @@ -1,4 +1,4 @@ -Utilize Supervision to elevate your video analysis capabilities by effortlessly +Use Supervision to elevate your video analysis capabilities by effortlessly [tracking](https://supervision.roboflow.com/trackers/) objects identified by various object detection and segmentation models. This guide will walk you through the process of running inference using the [Ultralytics](https://github.com/ultralytics/ultralytics) diff --git a/supervision/annotators/core.py b/supervision/annotators/core.py index fc3cf7f2..1503d80f 100644 --- a/supervision/annotators/core.py +++ b/supervision/annotators/core.py @@ -97,7 +97,7 @@ class MaskAnnotator(BaseAnnotator): !!! warning - This annotator utilizes the `sv.Detections.mask`. + This annotator uses `sv.Detections.mask`. """ def __init__( @@ -180,7 +180,7 @@ class PolygonAnnotator(BaseAnnotator): !!! warning - This annotator utilizes the `sv.Detections.mask`. + This annotator uses `sv.Detections.mask`. """ def __init__( @@ -348,7 +348,7 @@ class HaloAnnotator(BaseAnnotator): !!! warning - This annotator utilizes the `sv.Detections.mask`. + This annotator uses `sv.Detections.mask`. """ def __init__( @@ -1004,7 +1004,7 @@ class TraceAnnotator: !!! warning - This annotator utilizes the `sv.Detections.tracker_id`. Read + This annotator uses the `sv.Detections.tracker_id`. Read [here](https://supervision.roboflow.com/trackers/) to learn how to plug tracking into your inference pipeline. """ diff --git a/supervision/detection/line_counter.py b/supervision/detection/line_counter.py index 851d1d4a..d4bef678 100644 --- a/supervision/detection/line_counter.py +++ b/supervision/detection/line_counter.py @@ -15,7 +15,7 @@ class LineZone: !!! warning - LineZone utilizes the `tracker_id`. Read + LineZone uses the `tracker_id`. Read [here](https://supervision.roboflow.com/trackers/) to learn how to plug tracking into your inference pipeline. diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index 7fd8166a..65d653ff 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -7,9 +7,9 @@ from supervision.detection.core import Detections class Smoother: """ - A class for smoothing out noise in predictions over time by using a Tracker - to track objects over time and averaging out the predictions over the - `length` most recent frames. + Smooth out noise in predictions over time with the `Smoother` class. + This classes uses an existing `Tracker` to track objects over time. + Detections are averaged out over the `length` most recent frames. > _On the left are the model's raw predictions, - > on the right is the output of Smoother._ + > on the right is the output of DetectionsSmoother._ !!! warning @@ -38,7 +38,7 @@ class Smoother: byte_tracker = sv.ByteTrack() # Initialize the Smoother - smoother = sv.Smoother() + smoother = sv.DetectionsSmoother() def render(detections, video_frame): # Parse the detections @@ -129,7 +129,7 @@ class Smoother: return self.get_smoothed_detections() - def get_track(self, track_id: int) -> Optional[dict]: + def get_track(self, track_id: int) -> Optional[Detections]: track = self.tracks.get(track_id, None) if track is None: return None @@ -138,7 +138,7 @@ class Smoother: if len(track) == 0: return None - ret = track[0] + ret = track.copy()[0] ret.xyxy = np.mean([d.xyxy for d in track], axis=0) ret.confidence = np.mean([d.confidence for d in track], axis=0) From 6efd51dfb14c66a9628e81a7b188ef4d1890c297 Mon Sep 17 00:00:00 2001 From: James Gallagher Date: Tue, 23 Jan 2024 12:57:36 +0000 Subject: [PATCH 15/41] respond to feedback --- supervision/detection/tools/smoother.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index 5168693c..d43427bd 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -20,11 +20,11 @@ class DetectionsSmoother: !!! warning - Smoother uses the `tracker_id`. Read + DetectionsSmoother uses the `tracker_id`. Read [here](https://supervision.roboflow.com/trackers/) to learn how to plug tracking into your inference pipeline. - Note: Smoother is intended for use on Detections without a `mask` field. + Note: DetectionsSmoother is intended for use on Detections without a `mask` field. ## Example Usage: From 24ca25ef9439ada02d91e55c642f4b4bf48f1fd0 Mon Sep 17 00:00:00 2001 From: James Gallagher Date: Tue, 23 Jan 2024 13:27:48 +0000 Subject: [PATCH 16/41] fix formatting --- supervision/detection/tools/smoother.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index d43427bd..ad064b18 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -13,7 +13,9 @@ class DetectionsSmoother: Detections are averaged out over the `length` most recent frames. > _On the left are the model's raw predictions, > on the right is the output of DetectionsSmoother._ @@ -21,10 +23,11 @@ class DetectionsSmoother: !!! warning DetectionsSmoother uses the `tracker_id`. Read - [here](https://supervision.roboflow.com/trackers/) to learn how to plug - tracking into your inference pipeline. + [here](https://supervision.roboflow.com/trackers/) to learn + how to plug tracking into your inference pipeline. - Note: DetectionsSmoother is intended for use on Detections without a `mask` field. + Note: DetectionsSmoother is intended for use on Detections + without a `mask` field. ## Example Usage: From 21791c85225b86786fb09699e11767e899c25828 Mon Sep 17 00:00:00 2001 From: James Gallagher Date: Tue, 23 Jan 2024 13:38:15 +0000 Subject: [PATCH 17/41] remove idle trackers --- supervision/detection/tools/smoother.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index ad064b18..ebabb349 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -111,6 +111,8 @@ class DetectionsSmoother: self.current_frame += 1 + used_tracker_ids = {} + for detection_idx in range(len(detections)): tracker_id = detections.tracker_id[detection_idx] if tracker_id is None: @@ -123,6 +125,13 @@ class DetectionsSmoother: self.tracks[tracker_id].append(detections[detection_idx]) self.track_ends[tracker_id] = self.current_frame + used_tracker_ids[tracker_id] = True + + for track_id in list(self.tracks.keys()): + if track_id not in used_tracker_ids: + del self.tracks[track_id] + del self.track_ends[track_id] + for track_id in self.tracks: track = self.tracks[track_id] if self.track_ends[track_id] < self.current_frame: From 626636cfa75605b92f3ee7265ba9992670640b00 Mon Sep 17 00:00:00 2001 From: James Gallagher Date: Tue, 23 Jan 2024 17:10:02 +0000 Subject: [PATCH 18/41] update tracking logic --- supervision/detection/tools/smoother.py | 32 +++++++++++-------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index ebabb349..be44b22d 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -86,7 +86,6 @@ class DetectionsSmoother: self.current_frame = 0 self.tracks = {} - self.track_ends = {} def set_length(self, length: int) -> None: """ @@ -109,35 +108,32 @@ class DetectionsSmoother: detections (Detections): The detections to add to the smoother. """ - self.current_frame += 1 - - used_tracker_ids = {} + already_tracked_ids = set(self.tracks.keys()) for detection_idx in range(len(detections)): tracker_id = detections.tracker_id[detection_idx] if tracker_id is None: - # skip detections without a tracker id continue if self.tracks.get(tracker_id, None) is None: self.tracks[tracker_id] = deque(maxlen=self.length) - self.tracks[tracker_id].append(detections[detection_idx]) - self.track_ends[tracker_id] = self.current_frame - - used_tracker_ids[tracker_id] = True + if tracker_id in already_tracked_ids: + self.tracks[tracker_id].append(detections[detection_idx]) for track_id in list(self.tracks.keys()): - if track_id not in used_tracker_ids: - del self.tracks[track_id] - del self.track_ends[track_id] + if track_id not in detections.tracker_id: + self.tracks[track_id].append(None) - for track_id in self.tracks: - track = self.tracks[track_id] - if self.track_ends[track_id] < self.current_frame: - # continue tracking for a few frames after the object has left - # (to prevent flickering in case it comes back) - track.append(None) + for track_id in list(self.tracks.keys()): + if ( + all([d is None for d in self.tracks[track_id]]) + and len(self.tracks[track_id]) == self.length + ): + del self.tracks[track_id] + print("Removed track", track_id) + + print("Tracks:", self.tracks.keys()) return self.get_smoothed_detections() From fb0500c394e92575943bd58883c5ab4b5b67fdc5 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Tue, 23 Jan 2024 21:17:20 +0300 Subject: [PATCH 19/41] =?UTF-8?q?build(deps):=20=F0=9F=93=A6=20package=20p?= =?UTF-8?q?illow=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- .github/workflows/test-min.yml | 1 - poetry.lock | 2 +- pyproject.toml | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/test-min.yml b/.github/workflows/test-min.yml index 5c9fa7a4..ae4bb14b 100644 --- a/.github/workflows/test-min.yml +++ b/.github/workflows/test-min.yml @@ -38,7 +38,6 @@ jobs: numpy==1.21.2 \ opencv-python==4.5.5.64 \ packaging==23.2 \ - Pillow==10.1.0 \ pluggy==1.3.0 \ pyparsing==3.1.1 \ pytest==7.2.0 \ diff --git a/poetry.lock b/poetry.lock index 835455b2..55a5a79e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3909,4 +3909,4 @@ desktop = ["opencv-python"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "3d59673b11422c0c463ec7b7e20b8a295155d71a6c42ad97f819e9798643b0ef" +content-hash = "62b2479cbd6c46414b4837360ec9f6ccb704eb8ecc3cfba5b34aa0e61c1cdc29" diff --git a/pyproject.toml b/pyproject.toml index 5437ff3c..4f9b02c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,6 @@ scipy = [ ] matplotlib = ">=3.5.0" pyyaml = ">=5.3" -pillow = ">=9.4" opencv-python = { version = ">=4.5.5.64", optional = true } opencv-python-headless = ">=4.5.5.64" requests = { version = ">=2.26.0,<=2.31.0", optional = true } From 047672d45857bc4f14c57e1591640a48c8407489 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 10:48:44 +0300 Subject: [PATCH 20/41] =?UTF-8?q?build(deps):=20=F0=9F=93=A6=20mkdocs-mate?= =?UTF-8?q?rial=20and=20matplotlib=20update=20for=20security?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- poetry.lock | 487 ++++++++++++++++++++++++++++--------------------- pyproject.toml | 5 +- 2 files changed, 278 insertions(+), 214 deletions(-) diff --git a/poetry.lock b/poetry.lock index 55a5a79e..9e1a54c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -672,47 +672,56 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "cryptography" -version = "41.0.7" +version = "42.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, - {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, - {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, - {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"}, + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"}, + {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"}, + {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"}, + {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"}, + {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"}, + {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"}, + {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1254,13 +1263,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.21.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.0-py3-none-any.whl", hash = "sha256:70a09719d375c0a2874571b363c8a24be7df8071b80c9aa76bc4551e7297c63c"}, - {file = "jsonschema-4.21.0.tar.gz", hash = "sha256:3ba18e27f7491ea4a1b22edce00fb820eec968d397feb3f9cb61d5894bb38167"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1419,13 +1428,13 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc [[package]] name = "jupyter-server-terminals" -version = "0.5.1" +version = "0.5.2" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.5.1-py3-none-any.whl", hash = "sha256:5e63e947ddd97bb2832db5ef837a258d9ccd4192cd608c1270850ad947ae5dd7"}, - {file = "jupyter_server_terminals-0.5.1.tar.gz", hash = "sha256:16d3be9cf48be6a1f943f3a6c93c033be259cf4779184c66421709cf63dccfea"}, + {file = "jupyter_server_terminals-0.5.2-py3-none-any.whl", hash = "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80"}, + {file = "jupyter_server_terminals-0.5.2.tar.gz", hash = "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8"}, ] [package.dependencies] @@ -1687,61 +1696,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] @@ -1907,13 +1926,13 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-material" -version = "9.5.4" +version = "9.5.5" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.4-py3-none-any.whl", hash = "sha256:efd7cc8ae03296d728da9bd38f4db8b07ab61f9738a0cbd0dfaf2a15a50e7343"}, - {file = "mkdocs_material-9.5.4.tar.gz", hash = "sha256:3d196ee67fad16b2df1a458d650a8ac1890294eaae368d26cee71bc24ad41c40"}, + {file = "mkdocs_material-9.5.5-py3-none-any.whl", hash = "sha256:ac50b2431a79a3b160fdefbba37c9132485f1a69166aba115ad49fafdbbbc5df"}, + {file = "mkdocs_material-9.5.5.tar.gz", hash = "sha256:4480d9580faf42fed0123d0465502bfc1c0c239ecc9c4d66159cf0459ea1b4ae"}, ] [package.dependencies] @@ -1925,7 +1944,7 @@ markdown = ">=3.2,<4.0" mkdocs = ">=1.5.3,<1.6.0" mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" -pillow = {version = ">=9.4,<10.0", optional = true, markers = "extra == \"imaging\""} +pillow = {version = ">=10.2,<11.0", optional = true, markers = "extra == \"imaging\""} pygments = ">=2.16,<3.0" pymdown-extensions = ">=10.2,<11.0" regex = ">=2022.4" @@ -1933,7 +1952,7 @@ requests = ">=2.26,<3.0" [package.extras] git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] -imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] @@ -2143,13 +2162,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.9" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.9-py3-none-any.whl", hash = "sha256:61ec07ef052e72e3de22045b81b2cc7d71fceb04c568ba0b2e4b2f9f5231bec2"}, - {file = "nest_asyncio-1.5.9.tar.gz", hash = "sha256:d1e1144e9c6e3e6392e0fcf5211cb1c8374b5648a98f1ebe48e5336006b41907"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2284,12 +2303,31 @@ files = [ {file = "opencv_python-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:b983197f97cfa6fcb74e1da1802c7497a6f94ed561aba6980f1f33123f904956"}, ] +[package.dependencies] +numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} + +[[package]] +name = "opencv-python" +version = "4.9.0.80" +description = "Wrapper package for OpenCV python bindings." +optional = true +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.9.0.80.tar.gz", hash = "sha256:1a9f0e6267de3a1a1db0c54213d022c7c8b5b9ca4b580e80bdc58516c922c9e1"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:7e5f7aa4486651a6ebfa8ed4b594b65bd2d2f41beeb4241a3e4b1b85acbbbadb"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:71dfb9555ccccdd77305fc3dcca5897fbf0cf28b297c51ee55e079c065d812a3"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b34a52e9da36dda8c151c6394aed602e4b17fa041df0b9f5b93ae10b0fcca2a"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4088cab82b66a3b37ffc452976b14a3c599269c247895ae9ceb4066d8188a57"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-win32.whl", hash = "sha256:dcf000c36dd1651118a2462257e3a9e76db789a78432e1f303c7bac54f63ef6c"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-win_amd64.whl", hash = "sha256:3f16f08e02b2a2da44259c7cc712e779eff1dd8b55fdb0323e8cab09548086c0"}, +] + [package.dependencies] numpy = [ {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\" and python_version >= \"3.8\""}, {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, {version = ">=1.17.3", markers = "(platform_system != \"Darwin\" and platform_system != \"Linux\") and python_version >= \"3.8\" and python_version < \"3.9\" or platform_system != \"Darwin\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_machine != \"aarch64\" or platform_machine != \"arm64\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_system != \"Linux\" or (platform_machine != \"arm64\" and platform_machine != \"aarch64\") and python_version >= \"3.8\" and python_version < \"3.9\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, ] @@ -2310,25 +2348,44 @@ files = [ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:0a0f1e9f836f7d5bad1dd164694944c8761711cbdf4b36ebbd4815a8ef731079"}, ] +[package.dependencies] +numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} + +[[package]] +name = "opencv-python-headless" +version = "4.9.0.80" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-headless-4.9.0.80.tar.gz", hash = "sha256:71a4cd8cf7c37122901d8e81295db7fb188730e33a0e40039a4e59c1030b0958"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:2ea8a2edc4db87841991b2fbab55fc07b97ecb602e0f47d5d485bd75cee17c1a"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0ee54e27be493e8f7850847edae3128e18b540dac1d7b2e4001b8944e11e1c6"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57ce2865e8fec431c6f97a81e9faaf23fa5be61011d0a75ccf47a3c0d65fa73d"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976656362d68d9f40a5c66f83901430538002465f7db59142784f3893918f3df"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-win32.whl", hash = "sha256:11e3849d83e6651d4e7699aadda9ec7ed7c38957cbbcb99db074f2a2d2de9670"}, + {file = "opencv_python_headless-4.9.0.80-cp37-abi3-win_amd64.whl", hash = "sha256:a8056c2cb37cd65dfcdf4153ca16f7362afcf3a50d600d6bb69c660fc61ee29c"}, +] + [package.dependencies] numpy = [ {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\" and python_version >= \"3.8\""}, {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, {version = ">=1.17.3", markers = "(platform_system != \"Darwin\" and platform_system != \"Linux\") and python_version >= \"3.8\" and python_version < \"3.9\" or platform_system != \"Darwin\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_machine != \"aarch64\" or platform_machine != \"arm64\" and python_version >= \"3.8\" and python_version < \"3.9\" and platform_system != \"Linux\" or (platform_machine != \"arm64\" and platform_machine != \"aarch64\") and python_version >= \"3.8\" and python_version < \"3.9\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, ] [[package]] name = "overrides" -version = "7.4.0" +version = "7.6.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, - {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, + {file = "overrides-7.6.0-py3-none-any.whl", hash = "sha256:c36e6635519ea9c5b043b65c36d4b886aee8bd45b7d4681d2a6df0898df4b654"}, + {file = "overrides-7.6.0.tar.gz", hash = "sha256:01e15bbbf15b766f0675c275baa1878bd1c7dc9bc7b9ee13e677cdba93dc1bd9"}, ] [[package]] @@ -2416,82 +2473,88 @@ files = [ [[package]] name = "pillow" -version = "9.5.0" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pkginfo" @@ -2596,27 +2659,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -3416,45 +3479,45 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" @@ -3909,4 +3972,4 @@ desktop = ["opencv-python"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "62b2479cbd6c46414b4837360ec9f6ccb704eb8ecc3cfba5b34aa0e61c1cdc29" +content-hash = "5e5a6f753fc524c096453bc89bb70514d1a7b4ffda3a9c8ed4938b549d194b3f" diff --git a/pyproject.toml b/pyproject.toml index 4f9b02c8..f6aba471 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ scipy = [ { version = "1.10.0", python = "<3.9" }, { version = "^1.10.0", python = ">=3.9" } ] -matplotlib = ">=3.5.0" +matplotlib = ">=3.6.0" pyyaml = ">=5.3" opencv-python = { version = ">=4.5.5.64", optional = true } opencv-python-headless = ">=4.5.5.64" @@ -46,6 +46,7 @@ tqdm = { version = ">=4.62.3,<=4.66.1", optional = true } defusedxml = "^0.7.1" + [tool.poetry.extras] desktop = ["opencv-python"] assets = ["requests","tqdm"] @@ -64,7 +65,7 @@ tox = "^4.11.4" [tool.poetry.group.docs.dependencies] -mkdocs-material = {extras = ["imaging"], version = "^9.5.4"} +mkdocs-material = {extras = ["imaging"], version = "^9.5.5"} mkdocstrings = {extras = ["python"], version = ">=0.20,<0.25"} From 845c9cc2c238accd79961953c8b8ca391bcc9c44 Mon Sep 17 00:00:00 2001 From: raghav Date: Sat, 20 Jan 2024 14:19:06 +0530 Subject: [PATCH 21/41] docs: '>>>' and '...' are removed and indentation improvements --- docs/annotators.md | 284 ++++++++++++++++++++++----------------------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/docs/annotators.md b/docs/annotators.md index 316f37e0..112ba121 100644 --- a/docs/annotators.md +++ b/docs/annotators.md @@ -5,16 +5,16 @@ comments: true === "BoundingBox" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> bounding_box_annotator = sv.BoundingBoxAnnotator() - >>> annotated_frame = bounding_box_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + bounding_box_annotator = sv.BoundingBoxAnnotator() + annotated_frame = bounding_box_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -26,16 +26,16 @@ comments: true === "RoundBox" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> round_box_annotator = sv.RoundBoxAnnotator() - >>> annotated_frame = round_box_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + round_box_annotator = sv.RoundBoxAnnotator() + annotated_frame = round_box_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -47,16 +47,16 @@ comments: true === "BoxCorner" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> corner_annotator = sv.BoxCornerAnnotator() - >>> annotated_frame = corner_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + corner_annotator = sv.BoxCornerAnnotator() + annotated_frame = corner_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -68,16 +68,16 @@ comments: true === "Color" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> color_annotator = sv.ColorAnnotator() - >>> annotated_frame = color_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + color_annotator = sv.ColorAnnotator() + annotated_frame = color_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -89,16 +89,16 @@ comments: true === "Circle" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> circle_annotator = sv.CircleAnnotator() - >>> annotated_frame = circle_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + circle_annotator = sv.CircleAnnotator() + annotated_frame = circle_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -110,16 +110,16 @@ comments: true === "Dot" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> dot_annotator = sv.DotAnnotator() - >>> annotated_frame = dot_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + dot_annotator = sv.DotAnnotator() + annotated_frame = dot_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -131,16 +131,16 @@ comments: true === "Triangle" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> triangle_annotator = sv.TriangleAnnotator() - >>> annotated_frame = triangle_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + triangle_annotator = sv.TriangleAnnotator() + annotated_frame = triangle_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -152,16 +152,16 @@ comments: true === "Ellipse" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> ellipse_annotator = sv.EllipseAnnotator() - >>> annotated_frame = ellipse_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + ellipse_annotator = sv.EllipseAnnotator() + annotated_frame = ellipse_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -173,16 +173,16 @@ comments: true === "Halo" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> halo_annotator = sv.HaloAnnotator() - >>> annotated_frame = halo_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + halo_annotator = sv.HaloAnnotator() + annotated_frame = halo_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -194,16 +194,16 @@ comments: true === "Mask" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detectio - >>> mask_annotator = sv.MaskAnnotator() - >>> annotated_frame = mask_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + mask_annotator = sv.MaskAnnotator() + annotated_frame = mask_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -215,16 +215,16 @@ comments: true === "Polygon" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> polygon_annotator = sv.PolygonAnnotator() - >>> annotated_frame = polygon_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + polygon_annotator = sv.PolygonAnnotator() + annotated_frame = polygon_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -236,16 +236,16 @@ comments: true === "Label" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) - >>> annotated_frame = label_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) + annotated_frame = label_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -257,16 +257,16 @@ comments: true === "Blur" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> blur_annotator = sv.BlurAnnotator() - >>> annotated_frame = blur_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + blur_annotator = sv.BlurAnnotator() + annotated_frame = blur_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -278,16 +278,16 @@ comments: true === "Pixelate" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = + detections = sv.Detections() - >>> pixelate_annotator = sv.PixelateAnnotator() - >>> annotated_frame = pixelate_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + pixelate_annotator = sv.PixelateAnnotator() + annotated_frame = pixelate_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -299,26 +299,26 @@ comments: true === "Trace" ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> model = YOLO('yolov8x.pt') + model = YOLO('yolov8x.pt') - >>> trace_annotator = sv.TraceAnnotator() + trace_annotator = sv.TraceAnnotator() - >>> video_info = sv.VideoInfo.from_video_path(video_path='...') - >>> frames_generator = get_video_frames_generator(source_path='...') - >>> tracker = sv.ByteTrack() + video_info = sv.VideoInfo.from_video_path(video_path='...') + frames_generator = get_video_frames_generator(source_path='...') + tracker = sv.ByteTrack() - >>> with sv.VideoSink(target_path='...', video_info=video_info) as sink: - ... for frame in frames_generator: - ... result = model(frame)[0] - ... detections = sv.Detections.from_ultralytics(result) - ... detections = tracker.update_with_detections(detections) - ... annotated_frame = trace_annotator.annotate( - ... scene=frame.copy(), - ... detections=detections) - ... sink.write_frame(frame=annotated_frame) + with sv.VideoSink(target_path='...', video_info=video_info) as sink: + for frame in frames_generator: + result = model(frame)[0] + detections = sv.Detections.from_ultralytics(result) + detections = tracker.update_with_detections(detections) + annotated_frame = trace_annotator.annotate( + scene=frame.copy(), + detections=detections) + sink.write_frame(frame=annotated_frame) ```
@@ -330,24 +330,24 @@ comments: true === "HeatMap" ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> model = YOLO('yolov8x.pt') + model = YOLO('yolov8x.pt') - >>> heat_map_annotator = sv.HeatMapAnnotator() + heat_map_annotator = sv.HeatMapAnnotator() - >>> video_info = sv.VideoInfo.from_video_path(video_path='...') - >>> frames_generator = get_video_frames_generator(source_path='...') + video_info = sv.VideoInfo.from_video_path(video_path='...') + frames_generator = get_video_frames_generator(source_path='...') - >>> with sv.VideoSink(target_path='...', video_info=video_info) as sink: - ... for frame in frames_generator: - ... result = model(frame)[0] - ... detections = sv.Detections.from_ultralytics(result) - ... annotated_frame = heat_map_annotator.annotate( - ... scene=frame.copy(), - ... detections=detections) - ... sink.write_frame(frame=annotated_frame) + with sv.VideoSink(target_path='...', video_info=video_info) as sink: + for frame in frames_generator: + result = model(frame)[0] + detections = sv.Detections.from_ultralytics(result) + annotated_frame = heat_map_annotator.annotate( + scene=frame.copy(), + detections=detections) + sink.write_frame(frame=annotated_frame) ```
From d961aa9eb4ad595bff94f5471f82889488e92b62 Mon Sep 17 00:00:00 2001 From: raghav Date: Sun, 21 Jan 2024 12:06:10 +0530 Subject: [PATCH 22/41] docs: example image = ... reverted and added annotators.md --- docs/annotators.md | 56 +++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/annotators.md b/docs/annotators.md index 112ba121..3c2cc95f 100644 --- a/docs/annotators.md +++ b/docs/annotators.md @@ -7,8 +7,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) bounding_box_annotator = sv.BoundingBoxAnnotator() annotated_frame = bounding_box_annotator.annotate( @@ -28,8 +28,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) round_box_annotator = sv.RoundBoxAnnotator() annotated_frame = round_box_annotator.annotate( @@ -49,8 +49,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) corner_annotator = sv.BoxCornerAnnotator() annotated_frame = corner_annotator.annotate( @@ -70,8 +70,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) color_annotator = sv.ColorAnnotator() annotated_frame = color_annotator.annotate( @@ -91,8 +91,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) circle_annotator = sv.CircleAnnotator() annotated_frame = circle_annotator.annotate( @@ -112,8 +112,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) dot_annotator = sv.DotAnnotator() annotated_frame = dot_annotator.annotate( @@ -133,8 +133,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) triangle_annotator = sv.TriangleAnnotator() annotated_frame = triangle_annotator.annotate( @@ -154,8 +154,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) ellipse_annotator = sv.EllipseAnnotator() annotated_frame = ellipse_annotator.annotate( @@ -175,8 +175,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) halo_annotator = sv.HaloAnnotator() annotated_frame = halo_annotator.annotate( @@ -196,8 +196,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detectio + image = ... + detections = sv.Detections(...) mask_annotator = sv.MaskAnnotator() annotated_frame = mask_annotator.annotate( @@ -217,8 +217,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) polygon_annotator = sv.PolygonAnnotator() annotated_frame = polygon_annotator.annotate( @@ -238,8 +238,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) annotated_frame = label_annotator.annotate( @@ -259,8 +259,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) blur_annotator = sv.BlurAnnotator() annotated_frame = blur_annotator.annotate( @@ -280,8 +280,8 @@ comments: true ```python import supervision as sv - image = - detections = sv.Detections() + image = ... + detections = sv.Detections(...) pixelate_annotator = sv.PixelateAnnotator() annotated_frame = pixelate_annotator.annotate( From 8872151d0c98e91b1e4c7cbd766c8b5213ffbf6f Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 12:28:45 +0300 Subject: [PATCH 23/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20core/detection/cor?= =?UTF-8?q?e.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/detection/core.py | 290 +++++++++++++++++----------------- 1 file changed, 143 insertions(+), 147 deletions(-) diff --git a/supervision/detection/core.py b/supervision/detection/core.py index 39e129e1..6ade4bbf 100644 --- a/supervision/detection/core.py +++ b/supervision/detection/core.py @@ -126,14 +126,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> import torch - >>> import supervision as sv + import cv2 + import torch + import supervision as sv - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> model = torch.hub.load('ultralytics/yolov5', 'yolov5s') - >>> result = model(image) - >>> detections = sv.Detections.from_yolov5(result) + image = cv2.imread(SOURCE_IMAGE_PATH) + model = torch.hub.load('ultralytics/yolov5', 'yolov5s') + result = model(image) + detections = sv.Detections.from_yolov5(result) ``` """ yolov5_detections_predictions = yolov5_results.pred[0].cpu().cpu().numpy() @@ -159,14 +159,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> import supervision as sv - >>> from ultralytics import YOLO + import cv2 + import supervision as sv + from ultralytics import YOLO - >>> image = cv2.imread(...) - >>> model = YOLO('yolov8s.pt') - >>> result = model(image)[0] - >>> detections = sv.Detections.from_ultralytics(result) + image = cv2.imread() + model = YOLO('yolov8s.pt') + result = model(image)[0] + detections = sv.Detections.from_ultralytics(result) ``` """ @@ -198,14 +198,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> from super_gradients.training import models - >>> import supervision as sv + import cv2 + from super_gradients.training import models + import supervision as sv - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> model = models.get('yolo_nas_l', pretrained_weights="coco") - >>> result = list(model.predict(image, conf=0.35))[0] - >>> detections = sv.Detections.from_yolo_nas(result) + image = cv2.imread(SOURCE_IMAGE_PATH) + model = models.get('yolo_nas_l', pretrained_weights="coco") + result = list(model.predict(image, conf=0.35))[0] + detections = sv.Detections.from_yolo_nas(result) ``` """ if np.asarray(yolo_nas_results.prediction.bboxes_xyxy).shape[0] == 0: @@ -235,20 +235,16 @@ class Detections: Example: ```python - >>> import tensorflow as tf - >>> import tensorflow_hub as hub - >>> import numpy as np - >>> import cv2 + import tensorflow as tf + import tensorflow_hub as hub + import numpy as np + import cv2 - >>> module_handle = "https://tfhub.dev/tensorflow/centernet/hourglass_512x512_kpts/1" - - >>> model = hub.load(module_handle) - - >>> img = np.array(cv2.imread(SOURCE_IMAGE_PATH)) - - >>> result = model(img) - - >>> detections = sv.Detections.from_tensorflow(result) + module_handle = "https://tfhub.dev/tensorflow/centernet/hourglass_512x512_kpts/1" + model = hub.load(module_handle) + img = np.array(cv2.imread(SOURCE_IMAGE_PATH)) + result = model(img) + detections = sv.Detections.from_tensorflow(result) ``` """ # noqa: E501 // docs @@ -278,15 +274,15 @@ class Detections: Example: ```python - >>> import supervision as sv - >>> from deepsparse import Pipeline + import supervision as sv + from deepsparse import Pipeline - >>> yolo_pipeline = Pipeline.create( - ... task="yolo", - ... model_path = "zoo:cv/detection/yolov5-l/pytorch/ultralytics/coco/pruned80_quant-none" - ... ) - >>> result = yolo_pipeline() - >>> detections = sv.Detections.from_deepsparse(result) + yolo_pipeline = Pipeline.create( + task="yolo", + model_path = "zoo:cv/detection/yolov5-l/pytorch/ultralytics/coco/pruned80_quant-none" + ) + result = yolo_pipeline() + detections = sv.Detections.from_deepsparse(result) ``` """ # noqa: E501 // docs @@ -315,14 +311,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> import supervision as sv - >>> from mmdet.apis import DetInferencer + import cv2 + import supervision as sv + from mmdet.apis import DetInferencer - >>> inferencer = DetInferencer(model_name, checkpoint, device) - >>> mmdet_result = inferencer(SOURCE_IMAGE_PATH, out_dir='./output', - ... return_datasamples=True)["predictions"][0] - >>> detections = sv.Detections.from_mmdetection(mmdet_result) + inferencer = DetInferencer(model_name, checkpoint, device) + mmdet_result = inferencer(SOURCE_IMAGE_PATH, out_dir='./output', + return_datasamples=True)["predictions"][0] + detections = sv.Detections.from_mmdetection(mmdet_result) ``` """ @@ -364,18 +360,18 @@ class Detections: Example: ```python - >>> import cv2 - >>> from detectron2.engine import DefaultPredictor - >>> from detectron2.config import get_cfg - >>> import supervision as sv + import cv2 + from detectron2.engine import DefaultPredictor + from detectron2.config import get_cfg + import supervision as sv - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> cfg = get_cfg() - >>> cfg.merge_from_file("path/to/config.yaml") - >>> cfg.MODEL.WEIGHTS = "path/to/model_weights.pth" - >>> predictor = DefaultPredictor(cfg) - >>> result = predictor(image) - >>> detections = sv.Detections.from_detectron2(result) + image = cv2.imread(SOURCE_IMAGE_PATH) + cfg = get_cfg() + cfg.merge_from_file("path/to/config.yaml") + cfg.MODEL.WEIGHTS = "path/to/model_weights.pth" + predictor = DefaultPredictor(cfg) + result = predictor(image) + detections = sv.Detections.from_detectron2(result) ``` """ @@ -412,14 +408,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> import supervision as sv - >>> from inference.models.utils import get_roboflow_model + import cv2 + import supervision as sv + from inference.models.utils import get_roboflow_model - >>> image = cv2.imread(...) - >>> model = get_roboflow_model(model_id="yolov8s-640") - >>> result = model.infer(image)[0] - >>> detections = sv.Detections.from_inference(result) + image = cv2.imread() + model = get_roboflow_model(model_id="yolov8s-640") + result = model.infer(image)[0] + detections = sv.Detections.from_inference(result) ``` """ with suppress(AttributeError): @@ -461,14 +457,14 @@ class Detections: Example: ```python - >>> import cv2 - >>> import supervision as sv - >>> from inference.models.utils import get_roboflow_model + import cv2 + import supervision as sv + from inference.models.utils import get_roboflow_model - >>> image = cv2.imread(...) - >>> model = get_roboflow_model(model_id="yolov8s-640") - >>> result = model.infer(image)[0] - >>> detections = sv.Detections.from_roboflow(result) + image = cv2.imread() + model = get_roboflow_model(model_id="yolov8s-640") + result = model.infer(image)[0] + detections = sv.Detections.from_roboflow(result) ``` """ return cls.from_inference(roboflow_result) @@ -488,17 +484,17 @@ class Detections: Example: ```python - >>> import supervision as sv - >>> from segment_anything import ( - ... sam_model_registry, - ... SamAutomaticMaskGenerator - ... ) + 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) + 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) ``` """ @@ -535,25 +531,25 @@ class Detections: Example: ```python - >>> import requests - >>> import supervision as sv + import requests + import supervision as sv - >>> image = open(input, "rb").read() + image = open(input, "rb").read() - >>> endpoint = "https://.cognitiveservices.azure.com/" - >>> subscription_key = "..." + endpoint = "https://.cognitiveservices.azure.com/" + subscription_key = "" - >>> headers = { - ... "Content-Type": "application/octet-stream", - ... "Ocp-Apim-Subscription-Key": subscription_key - ... } + headers = { + "Content-Type": "application/octet-stream", + "Ocp-Apim-Subscription-Key": subscription_key + } - >>> response = requests.post(endpoint, - ... headers=self.headers, - ... data=image - ... ).json() + response = requests.post(endpoint, + headers=self.headers, + data=image + ).json() - >>> detections = sv.Detections.from_azure_analyze_image(response) + detections = sv.Detections.from_azure_analyze_image(response) ``` """ if "error" in azure_result: @@ -617,21 +613,21 @@ class Detections: Example: ```python - >>> import supervision as sv - >>> import paddle - >>> from ppdet.engine import Trainer - >>> from ppdet.core.workspace import load_config + import supervision as sv + import paddle + from ppdet.engine import Trainer + from ppdet.core.workspace import load_config - >>> weights = (...) - >>> config = (...) + weights = () + config = () - >>> cfg = load_config(config) - >>> trainer = Trainer(cfg, mode='test') - >>> trainer.load_weights(weights) + cfg = load_config(config) + trainer = Trainer(cfg, mode='test') + trainer.load_weights(weights) - >>> paddledet_result = trainer.predict([images])[0] + paddledet_result = trainer.predict([images])[0] - >>> detections = sv.Detections.from_paddledet(paddledet_result) + detections = sv.Detections.from_paddledet(paddledet_result) ``` """ @@ -655,9 +651,9 @@ class Detections: Example: ```python - >>> from supervision import Detections + from supervision import Detections - >>> empty_detections = Detections.empty() + empty_detections = Detections.empty() ``` """ return cls( @@ -689,29 +685,29 @@ class Detections: import numpy as np import supervision as sv - >>> detections_1 = sv.Detections( - ... xyxy=np.array([[15, 15, 100, 100], [200, 200, 300, 300]]), - ... class_id=np.array([1, 2]), - ... data={'feature_vector': np.array([0.1, 0.2)])} - ... ) + detections_1 = sv.Detections( + xyxy=np.array([[15, 15, 100, 100], [200, 200, 300, 300]]), + class_id=np.array([1, 2]), + data={'feature_vector': np.array([0.1, 0.2)])} + ) - >>> detections_2 = sv.Detections( - ... xyxy=np.array([[30, 30, 120, 120]]), - ... class_id=np.array([1]), - ... data={'feature_vector': [np.array([0.3])]} - ... ) + detections_2 = sv.Detections( + xyxy=np.array([[30, 30, 120, 120]]), + class_id=np.array([1]), + data={'feature_vector': [np.array([0.3])]} + ) - >>> merged_detections = Detections.merge([detections_1, detections_2]) + merged_detections = Detections.merge([detections_1, detections_2]) - >>> merged_detections.xyxy + merged_detections.xyxy array([[ 15, 15, 100, 100], [200, 200, 300, 300], [ 30, 30, 120, 120]]) - >>> merged_detections.class_id + merged_detections.class_id array([1, 2, 1]) - >>> merged_detections.data['feature_vector'] + merged_detections.data['feature_vector'] array([0.1, 0.2, 0.3]) ``` """ @@ -844,17 +840,17 @@ class Detections: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> detections = sv.Detections(...) + detections = sv.Detections() - >>> first_detection = detections[0] - >>> first_10_detections = detections[0:10] - >>> some_detections = detections[[0, 2, 4]] - >>> class_0_detections = detections[detections.class_id == 0] - >>> high_confidence_detections = detections[detections.confidence > 0.5] + first_detection = detections[0] + first_10_detections = detections[0:10] + some_detections = detections[[0, 2, 4]] + class_0_detections = detections[detections.class_id == 0] + high_confidence_detections = detections[detections.confidence > 0.5] - >>> feature_vector = detections['feature_vector'] + feature_vector = detections['feature_vector'] ``` """ if isinstance(index, str): @@ -880,22 +876,22 @@ class Detections: Example: ```python - >>> import cv2 - >>> from ultralytics import YOLO - >>> import supervision as sv + import cv2 + from ultralytics import YOLO + import supervision as sv - >>> model = YOLO('yolov8s.pt') + model = YOLO('yolov8s.pt') - >>> image = cv2.imread(SOURCE_IMAGE_PATH) + image = cv2.imread(SOURCE_IMAGE_PATH) - >>> result = model(image)[0] - >>> detections = sv.Detections.from_ultralytics(result) + result = model(image)[0] + detections = sv.Detections.from_ultralytics(result) - >>> detections['names'] = [ - ... model.model.names[class_id] - ... for class_id - ... in detections.class_id - ... ] + detections['names'] = [ + model.model.names[class_id] + for class_id + in detections.class_id + ] ``` """ if not isinstance(value, (np.ndarray, list)): @@ -915,7 +911,7 @@ class Detections: Returns: np.ndarray: An array of floats containing the area of each detection - in the format of `(area_1, area_2, ..., area_n)`, + in the format of `(area_1, area_2, , area_n)`, where n is the number of detections. """ if self.mask is not None: @@ -930,7 +926,7 @@ class Detections: Returns: np.ndarray: An array of floats containing the area of each bounding - box in the format of `(area_1, area_2, ..., area_n)`, + box in the format of `(area_1, area_2, , area_n)`, where n is the number of detections. """ return (self.xyxy[:, 3] - self.xyxy[:, 1]) * (self.xyxy[:, 2] - self.xyxy[:, 0]) From 7af914bf564a6bb8980918bbc3a8bc5ebeee1b30 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 12:50:23 +0300 Subject: [PATCH 24/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/annota?= =?UTF-8?q?tors/core.py=20docs/annotators.md=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- docs/annotators.md | 34 ++-- supervision/annotators/core.py | 285 ++++++++++++++++----------------- 2 files changed, 159 insertions(+), 160 deletions(-) diff --git a/docs/annotators.md b/docs/annotators.md index 3c2cc95f..75482f50 100644 --- a/docs/annotators.md +++ b/docs/annotators.md @@ -5,16 +5,16 @@ comments: true === "BoundingBox" ```python - import supervision as sv + import supervision as sv - image = ... - detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - bounding_box_annotator = sv.BoundingBoxAnnotator() - annotated_frame = bounding_box_annotator.annotate( + bounding_box_annotator = sv.BoundingBoxAnnotator() + annotated_frame = bounding_box_annotator.annotate( scene=image.copy(), detections=detections - ) + ) ```
@@ -26,16 +26,16 @@ comments: true === "RoundBox" ```python - import supervision as sv + import supervision as sv - image = ... - detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - round_box_annotator = sv.RoundBoxAnnotator() - annotated_frame = round_box_annotator.annotate( - scene=image.copy(), - detections=detections - ) + round_box_annotator = sv.RoundBoxAnnotator() + annotated_frame = round_box_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
@@ -54,9 +54,9 @@ comments: true corner_annotator = sv.BoxCornerAnnotator() annotated_frame = corner_annotator.annotate( - scene=image.copy(), - detections=detections - ) + scene=image.copy(), + detections=detections + ) ```
diff --git a/supervision/annotators/core.py b/supervision/annotators/core.py index 9ae81c95..7960d7ec 100644 --- a/supervision/annotators/core.py +++ b/supervision/annotators/core.py @@ -57,16 +57,16 @@ class BoundingBoxAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> bounding_box_annotator = sv.BoundingBoxAnnotator() - >>> annotated_frame = bounding_box_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + bounding_box_annotator = sv.BoundingBoxAnnotator() + annotated_frame = bounding_box_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![bounding-box-annotator-example](https://media.roboflow.com/ @@ -139,16 +139,16 @@ class MaskAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> mask_annotator = sv.MaskAnnotator() - >>> annotated_frame = mask_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + mask_annotator = sv.MaskAnnotator() + annotated_frame = mask_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![mask-annotator-example](https://media.roboflow.com/ @@ -222,16 +222,16 @@ class PolygonAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> polygon_annotator = sv.PolygonAnnotator() - >>> annotated_frame = polygon_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + polygon_annotator = sv.PolygonAnnotator() + annotated_frame = polygon_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![polygon-annotator-example](https://media.roboflow.com/ @@ -304,16 +304,16 @@ class ColorAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> color_annotator = sv.ColorAnnotator() - >>> annotated_frame = color_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + color_annotator = sv.ColorAnnotator() + annotated_frame = color_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![box-mask-annotator-example](https://media.roboflow.com/ @@ -394,16 +394,16 @@ class HaloAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> halo_annotator = sv.HaloAnnotator() - >>> annotated_frame = halo_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + halo_annotator = sv.HaloAnnotator() + annotated_frame = halo_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![halo-annotator-example](https://media.roboflow.com/ @@ -488,16 +488,16 @@ class EllipseAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> ellipse_annotator = sv.EllipseAnnotator() - >>> annotated_frame = ellipse_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + ellipse_annotator = sv.EllipseAnnotator() + annotated_frame = ellipse_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![ellipse-annotator-example](https://media.roboflow.com/ @@ -575,16 +575,16 @@ class BoxCornerAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> corner_annotator = sv.BoxCornerAnnotator() - >>> annotated_frame = corner_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + corner_annotator = sv.BoxCornerAnnotator() + annotated_frame = corner_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![box-corner-annotator-example](https://media.roboflow.com/ @@ -659,16 +659,16 @@ class CircleAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> circle_annotator = sv.CircleAnnotator() - >>> annotated_frame = circle_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + circle_annotator = sv.CircleAnnotator() + annotated_frame = circle_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` @@ -745,16 +745,16 @@ class DotAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> dot_annotator = sv.DotAnnotator() - >>> annotated_frame = dot_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + dot_annotator = sv.DotAnnotator() + annotated_frame = dot_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![dot-annotator-example](https://media.roboflow.com/ @@ -872,16 +872,16 @@ class LabelAnnotator: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) - >>> annotated_frame = label_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) + annotated_frame = label_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![label-annotator-example](https://media.roboflow.com/ @@ -986,16 +986,16 @@ class BlurAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> blur_annotator = sv.BlurAnnotator() - >>> annotated_frame = circle_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + blur_annotator = sv.BlurAnnotator() + annotated_frame = circle_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![blur-annotator-example](https://media.roboflow.com/ @@ -1071,26 +1071,25 @@ class TraceAnnotator: Example: ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> model = YOLO('yolov8x.pt') + model = YOLO('yolov8x.pt') + trace_annotator = sv.TraceAnnotator() - >>> trace_annotator = sv.TraceAnnotator() + video_info = sv.VideoInfo.from_video_path(video_path='...') + frames_generator = sv.get_video_frames_generator(source_path='...') + tracker = sv.ByteTrack() - >>> video_info = sv.VideoInfo.from_video_path(video_path='...') - >>> frames_generator = sv.get_video_frames_generator(source_path='...') - >>> tracker = sv.ByteTrack() - - >>> with sv.VideoSink(target_path='...', video_info=video_info) as sink: - ... for frame in frames_generator: - ... result = model(frame)[0] - ... detections = sv.Detections.from_ultralytics(result) - ... detections = tracker.update_with_detections(detections) - ... annotated_frame = trace_annotator.annotate( - ... scene=frame.copy(), - ... detections=detections) - ... sink.write_frame(frame=annotated_frame) + with sv.VideoSink(target_path='...', video_info=video_info) as sink: + for frame in frames_generator: + result = model(frame)[0] + detections = sv.Detections.from_ultralytics(result) + detections = tracker.update_with_detections(detections) + annotated_frame = trace_annotator.annotate( + scene=frame.copy(), + detections=detections) + sink.write_frame(frame=annotated_frame) ``` ![trace-annotator-example](https://media.roboflow.com/ @@ -1167,24 +1166,24 @@ class HeatMapAnnotator: Example: ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> model = YOLO('yolov8x.pt') + model = YOLO('yolov8x.pt') - >>> heat_map_annotator = sv.HeatMapAnnotator() + heat_map_annotator = sv.HeatMapAnnotator() - >>> video_info = sv.VideoInfo.from_video_path(video_path='...') - >>> frames_generator = get_video_frames_generator(source_path='...') + video_info = sv.VideoInfo.from_video_path(video_path='...') + frames_generator = get_video_frames_generator(source_path='...') - >>> with sv.VideoSink(target_path='...', video_info=video_info) as sink: - ... for frame in frames_generator: - ... result = model(frame)[0] - ... detections = sv.Detections.from_ultralytics(result) - ... annotated_frame = heat_map_annotator.annotate( - ... scene=frame.copy(), - ... detections=detections) - ... sink.write_frame(frame=annotated_frame) + with sv.VideoSink(target_path='...', video_info=video_info) as sink: + for frame in frames_generator: + result = model(frame)[0] + detections = sv.Detections.from_ultralytics(result) + annotated_frame = heat_map_annotator.annotate( + scene=frame.copy(), + detections=detections) + sink.write_frame(frame=annotated_frame) ``` ![heatmap-annotator-example](https://media.roboflow.com/ @@ -1244,16 +1243,16 @@ class PixelateAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> pixelate_annotator = sv.PixelateAnnotator() - >>> annotated_frame = pixelate_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + pixelate_annotator = sv.PixelateAnnotator() + annotated_frame = pixelate_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![pixelate-annotator-example](https://media.roboflow.com/ @@ -1330,16 +1329,16 @@ class TriangleAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> triangle_annotator = sv.TriangleAnnotator() - >>> annotated_frame = triangle_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + triangle_annotator = sv.TriangleAnnotator() + annotated_frame = triangle_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![triangle-annotator-example](https://media.roboflow.com/ @@ -1423,16 +1422,16 @@ class RoundBoxAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> round_box_annotator = sv.RoundBoxAnnotator() - >>> annotated_frame = round_box_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + round_box_annotator = sv.RoundBoxAnnotator() + annotated_frame = round_box_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![round-box-annotator-example](https://media.roboflow.com/ From 2d1aa3b996762f53e12e5bcf101a58a04cbfe307 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 12:52:34 +0300 Subject: [PATCH 25/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/detect?= =?UTF-8?q?ion/tools/inference=5Fslicer.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- .../detection/tools/inference_slicer.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/supervision/detection/tools/inference_slicer.py b/supervision/detection/tools/inference_slicer.py index 2c0c48a6..7157723f 100644 --- a/supervision/detection/tools/inference_slicer.py +++ b/supervision/detection/tools/inference_slicer.py @@ -77,20 +77,20 @@ class InferenceSlicer: Example: ```python - >>> import cv2 - >>> import supervision as sv - >>> from ultralytics import YOLO + import cv2 + import supervision as sv + from ultralytics import YOLO - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> model = 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) + def callback(image_slice: np.ndarray) -> sv.Detections: + result = model(image_slice)[0] + return sv.Detections.from_ultralytics(result) - >>> slicer = sv.InferenceSlicer(callback = callback) + slicer = sv.InferenceSlicer(callback = callback) - >>> detections = slicer(image) + detections = slicer(image) ``` """ detections_list = [] From f03be21a9fe981b6e5016fd38607f987eeed29ce Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 13:01:55 +0300 Subject: [PATCH 26/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/datase?= =?UTF-8?q?t/core.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/dataset/core.py | 159 ++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 81 deletions(-) diff --git a/supervision/dataset/core.py b/supervision/dataset/core.py index 48043dbb..551e96da 100644 --- a/supervision/dataset/core.py +++ b/supervision/dataset/core.py @@ -118,13 +118,13 @@ class DetectionDataset(BaseDataset): Example: ```python - >>> import supervision as sv + 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) + 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) ``` """ @@ -231,24 +231,24 @@ class DetectionDataset(BaseDataset): Example: ```python - >>> import roboflow - >>> from roboflow import Roboflow - >>> import supervision as sv + import roboflow + from roboflow import Roboflow + import supervision as sv - >>> roboflow.login() + roboflow.login() - >>> rf = Roboflow() + rf = Roboflow() - >>> project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) - >>> dataset = project.version(PROJECT_VERSION).download("voc") + project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) + dataset = project.version(PROJECT_VERSION).download("voc") - >>> ds = sv.DetectionDataset.from_pascal_voc( - ... images_directory_path=f"{dataset.location}/train/images", - ... annotations_directory_path=f"{dataset.location}/train/labels" - ... ) + ds = sv.DetectionDataset.from_pascal_voc( + images_directory_path=f"{dataset.location}/train/images", + annotations_directory_path=f"{dataset.location}/train/labels" + ) - >>> ds.classes - ['dog', 'person'] + ds.classes + # ['dog', 'person'] ``` """ @@ -288,25 +288,24 @@ class DetectionDataset(BaseDataset): Example: ```python - >>> import roboflow - >>> from roboflow import Roboflow - >>> import supervision as sv + import roboflow + from roboflow import Roboflow + import supervision as sv - >>> roboflow.login() + roboflow.login() + rf = Roboflow() - >>> rf = Roboflow() + project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) + dataset = project.version(PROJECT_VERSION).download("yolov5") - >>> 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 = 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'] + ds.classes + # ['dog', 'person'] ``` """ classes, images, annotations = load_yolo_annotations( @@ -394,24 +393,23 @@ class DetectionDataset(BaseDataset): Example: ```python - >>> import roboflow - >>> from roboflow import Roboflow - >>> import supervision as sv + import roboflow + from roboflow import Roboflow + import supervision as sv - >>> roboflow.login() + roboflow.login() + rf = Roboflow() - >>> rf = Roboflow() + project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) + dataset = project.version(PROJECT_VERSION).download("coco") - >>> project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) - >>> dataset = project.version(PROJECT_VERSION).download("coco") + ds = sv.DetectionDataset.from_coco( + images_directory_path=f"{dataset.location}/train", + annotations_path=f"{dataset.location}/train/_annotations.coco.json", + ) - >>> ds = sv.DetectionDataset.from_coco( - ... images_directory_path=f"{dataset.location}/train", - ... annotations_path=f"{dataset.location}/train/_annotations.coco.json", - ... ) - - >>> ds.classes - ['dog', 'person'] + ds.classes + # ['dog', 'person'] ``` """ classes, images, annotations = load_coco_annotations( @@ -486,25 +484,25 @@ class DetectionDataset(BaseDataset): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> ds_1 = sv.DetectionDataset(...) - >>> len(ds_1) - 100 - >>> ds_1.classes - ['dog', 'person'] + 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_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'] + ds_merged = sv.DetectionDataset.merge([ds_1, ds_2]) + len(ds_merged) + # 300 + ds_merged.classes + # ['cat', 'dog', 'person'] ``` """ merged_images, merged_annotations = {}, {} @@ -571,13 +569,13 @@ class ClassificationDataset(BaseDataset): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> cd = sv.ClassificationDataset(...) - >>> train_cd,test_cd = cd.split(split_ratio=0.7, - ... random_state=42,shuffle=True) - >>> len(train_cd), len(test_cd) - (700, 300) + cd = sv.ClassificationDataset(...) + train_cd,test_cd = cd.split(split_ratio=0.7, + random_state=42,shuffle=True) + len(train_cd), len(test_cd) + # (700, 300) ``` """ image_names = list(self.images.keys()) @@ -639,20 +637,19 @@ class ClassificationDataset(BaseDataset): Example: ```python - >>> import roboflow - >>> from roboflow import Roboflow - >>> import supervision as sv + import roboflow + from roboflow import Roboflow + import supervision as sv - >>> roboflow.login() + roboflow.login() + rf = Roboflow() - >>> rf = Roboflow() + project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) + dataset = project.version(PROJECT_VERSION).download("folder") - >>> project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID) - >>> dataset = project.version(PROJECT_VERSION).download("folder") - - >>> cd = sv.ClassificationDataset.from_folder_structure( - ... root_directory_path=f"{dataset.location}/train" - ... ) + cd = sv.ClassificationDataset.from_folder_structure( + root_directory_path=f"{dataset.location}/train" + ) ``` """ classes = os.listdir(root_directory_path) From 4df21ded6a96135afd21f58e9ee6c55f092da2f2 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 13:03:34 +0300 Subject: [PATCH 27/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/detect?= =?UTF-8?q?ion/annotate.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/detection/annotate.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/supervision/detection/annotate.py b/supervision/detection/annotate.py index 1ab1bdc2..b891b55e 100644 --- a/supervision/detection/annotate.py +++ b/supervision/detection/annotate.py @@ -63,23 +63,22 @@ class BoxAnnotator: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> classes = ['person', ...] - >>> image = ... - >>> detections = sv.Detections(...) + classes = ['person', ...] + image = ... + detections = sv.Detections(...) - >>> box_annotator = sv.BoxAnnotator() - >>> labels = [ - ... f"{classes[class_id]} {confidence:0.2f}" - ... for _, _, confidence, class_id, _ - ... in detections - ... ] - >>> annotated_frame = box_annotator.annotate( - ... scene=image.copy(), - ... detections=detections, - ... labels=labels - ... ) + box_annotator = sv.BoxAnnotator() + labels = [ + f"{classes[class_id]} {confidence:0.2f}" + for _, _, confidence, class_id, _ in detections + ] + annotated_frame = box_annotator.annotate( + scene=image.copy(), + detections=detections, + labels=labels + ) ``` """ font = cv2.FONT_HERSHEY_SIMPLEX From 833edc95ade69f5dbd3678e054fe69401515919d Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 13:10:48 +0300 Subject: [PATCH 28/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/detect?= =?UTF-8?q?ion/utils.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/detection/utils.py | 38 ++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/supervision/detection/utils.py b/supervision/detection/utils.py index f7af7797..e8db4627 100644 --- a/supervision/detection/utils.py +++ b/supervision/detection/utils.py @@ -415,16 +415,17 @@ def move_boxes(xyxy: np.ndarray, offset: np.ndarray) -> np.ndarray: Example: ```python - >>> import numpy as np - >>> import supervision as sv + import numpy as np + import supervision as sv - >>> boxes = np.array([[10, 10, 20, 20], [30, 30, 40, 40]]) - >>> offset = np.array([5, 5]) - >>> sv.move_boxes(boxes, offset) - ... array([ - ... [15, 15, 25, 25], - ... [35, 35, 45, 45] - ... ]) + boxes = np.array([[10, 10, 20, 20], [30, 30, 40, 40]]) + offset = np.array([5, 5]) + moved_box = sv.move_boxes(boxes, offset) + print(moved_box) + # np.array([ + # [15, 15, 25, 25], + # [35, 35, 45, 45] + # ]) ``` """ return xyxy + np.hstack([offset, offset]) @@ -446,16 +447,17 @@ def scale_boxes(xyxy: np.ndarray, factor: float) -> np.ndarray: Example: ```python - >>> import numpy as np - >>> import supervision as sv + import numpy as np + import supervision as sv - >>> boxes = np.array([[10, 10, 20, 20], [30, 30, 40, 40]]) - >>> factor = 1.5 - >>> sv.scale_boxes(boxes, factor) - ... array([ - ... [ 7.5, 7.5, 22.5, 22.5], - ... [27.5, 27.5, 42.5, 42.5] - ... ]) + boxes = np.array([[10, 10, 20, 20], [30, 30, 40, 40]]) + factor = 1.5 + scaled_bb = sv.scale_boxes(boxes, factor) + print(scaled_bb) + # np.array([ + # [ 7.5, 7.5, 22.5, 22.5], + # [27.5, 27.5, 42.5, 42.5] + # ]) ``` """ centers = (xyxy[:, :2] + xyxy[:, 2:]) / 2 From 955a6d67fbc4ab2aac9d900698bbb636250e5afe Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 13:13:56 +0300 Subject: [PATCH 29/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/tracke?= =?UTF-8?q?r/byte=5Ftracker/core.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/tracker/byte_tracker/core.py | 41 ++++++++++++------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/supervision/tracker/byte_tracker/core.py b/supervision/tracker/byte_tracker/core.py index 34a90138..bf831daa 100644 --- a/supervision/tracker/byte_tracker/core.py +++ b/supervision/tracker/byte_tracker/core.py @@ -205,30 +205,29 @@ class ByteTrack: Detection: The updated detection results that now include tracking IDs. Example: ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> model = YOLO(...) - >>> byte_tracker = sv.ByteTrack() - >>> annotator = sv.BoxAnnotator() + 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_ultralytics(results) - ... detections = byte_tracker.update_with_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) + def callback(frame: np.ndarray, index: int) -> np.ndarray: + results = model(frame)[0] + detections = sv.Detections.from_ultralytics(results) + detections = byte_tracker.update_with_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 - ... ) + sv.process_video( + source_path='...', + target_path='...', + callback=callback + ) ``` """ From e2751368d573290f30308cf94af4c012580d016b Mon Sep 17 00:00:00 2001 From: SkalskiP Date: Wed, 24 Jan 2024 13:06:07 +0100 Subject: [PATCH 30/41] improvements --- supervision/detection/tools/smoother.py | 134 +++++++----------------- 1 file changed, 40 insertions(+), 94 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index be44b22d..f1478c8c 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -1,4 +1,5 @@ -from collections import deque +from collections import deque, defaultdict +from copy import deepcopy from typing import Optional import numpy as np @@ -8,132 +9,77 @@ from supervision.detection.core import Detections class DetectionsSmoother: """ - Smooth out noise in predictions over time with the `DetectionsSmoother` class. - This classes uses an existing `Tracker` to track objects over time. - Detections are averaged out over the `length` most recent frames. - - - > _On the left are the model's raw predictions, - > on the right is the output of DetectionsSmoother._ + A utility class for smoothing detections over multiple frames in video tracking. + It maintains a history of detections for each track and provides smoothed + predictions based on these histories. !!! warning - DetectionsSmoother uses the `tracker_id`. Read - [here](https://supervision.roboflow.com/trackers/) to learn - how to plug tracking into your inference pipeline. + - `DetectionsSmoother` requires the `tracker_id` for each detection. Refer to + [Roboflow Trackers](https://supervision.roboflow.com/trackers/) for + information on integrating tracking into your inference pipeline. + - This class is not compatible with segmentation models. - Note: DetectionsSmoother is intended for use on Detections - without a `mask` field. + Example: + ```python + import supervision as sv + from ultralytics import YOLO - ## Example Usage: + video_info = sv.VideoInfo.from_video_path(video_path=) + frame_generator = sv.get_video_frames_generator(source_path=) - ```python - import cv2 - # remember to `pip install inference` - from inference import InferencePipeline - import supervision as sv + model = YOLO() + tracker = sv.ByteTrack(frame_rate=video_info.fps) + smoother = sv.DetectionsSmoother() - box_annotator = sv.BoxAnnotator(color=sv.Color(52, 236, 217)) - byte_tracker = sv.ByteTrack() + annotator = sv.BoundingBoxAnnotator() - # Initialize the Smoother - smoother = sv.DetectionsSmoother() + with sv.VideoSink(, video_info=video_info) as sink: + for frame in frame_generator: + result = model(frame)[0] + detections = sv.Detections.from_ultralytics(result) + detections = tracker.update_with_detections(detections) + detections = tracker.update_with_detections(detections) - def render(detections, video_frame): - # Parse the detections - detections = sv.Detections.from_roboflow(detections) - - # Run a tracker to link predictions across frames - detections = byte_tracker.update_with_detections(detections) - - # Record the new frame and get the smoothed predictions - smoothed_detections = smoother.update_with_detections(detections) - - # Render - image_smoothed = box_annotator.annotate( - scene=image.copy(), - detections=smoothed_detections - ) - - # Visualize - cv2.imshow("Prediction", image) - cv2.waitKey(1) - - - pipeline = InferencePipeline.init( - model_id="microsoft-coco/9", # Or put your custom trained model here - # api_key="YOUR_ROBOFLOW_KEY", # Uncomment and fill if you want to access a - # model that requires auth (or setup a .env file) - video_reference=0, # Webcam; can also be video path or RTSP stream - on_prediction=render - ) - pipeline.start() - pipeline.join() - ``` - """ + annotated_frame = bounding_box_annotator.annotate(frame.copy(), detections) + sink.write_frame(annotated_frame) + ``` + """ # noqa: E501 // docs def __init__(self, length: int = 5) -> None: """ Args: - length (int): The current count of detected objects within the zone + length (int): The maximum number of frames to consider for smoothing + detections. Defaults to 5. """ - - self.length = length - - self.current_frame = 0 - self.tracks = {} - - def set_length(self, length: int) -> None: - """ - Sets the number of frames to average out detections over. - - Args: - length (int): The number of frames to average out detections over. - """ - - self.length = length - for track_id in self.tracks: - self.tracks[track_id] = deque(self.tracks[track_id], maxlen=length) + self.tracks = defaultdict(lambda: deque(maxlen=length)) def update_with_detections(self, detections: Detections) -> Detections: """ - Adds a new set of predictions to the smoother. Run this with every new - prediction received from the model. + Updates the smoother with a new set of detections from a frame. Args: detections (Detections): The detections to add to the smoother. """ - already_tracked_ids = set(self.tracks.keys()) + if detections.tracker_id is None: + print("DetectionsSmoother requires tracker_id to be set on Detections") + return detections for detection_idx in range(len(detections)): tracker_id = detections.tracker_id[detection_idx] if tracker_id is None: continue - if self.tracks.get(tracker_id, None) is None: - self.tracks[tracker_id] = deque(maxlen=self.length) + self.tracks[tracker_id].append(detections[detection_idx]) - if tracker_id in already_tracked_ids: - self.tracks[tracker_id].append(detections[detection_idx]) - - for track_id in list(self.tracks.keys()): + for track_id in self.tracks.keys(): if track_id not in detections.tracker_id: self.tracks[track_id].append(None) for track_id in list(self.tracks.keys()): - if ( - all([d is None for d in self.tracks[track_id]]) - and len(self.tracks[track_id]) == self.length - ): + if all([d is None for d in self.tracks[track_id]]): del self.tracks[track_id] - print("Removed track", track_id) - - print("Tracks:", self.tracks.keys()) return self.get_smoothed_detections() @@ -146,7 +92,7 @@ class DetectionsSmoother: if len(track) == 0: return None - ret = track.copy()[0] + ret = deepcopy(track[0]) ret.xyxy = np.mean([d.xyxy for d in track], axis=0) ret.confidence = np.mean([d.confidence for d in track], axis=0) From f6e5b6dc5476fcba5bda1fc712d2dd671388d1a6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:06:20 +0000 Subject: [PATCH 31/41] =?UTF-8?q?fix(pre=5Fcommit):=20=F0=9F=8E=A8=20auto?= =?UTF-8?q?=20format=20pre-commit=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supervision/detection/tools/smoother.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index f1478c8c..9fbd89a6 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -1,4 +1,4 @@ -from collections import deque, defaultdict +from collections import defaultdict, deque from copy import deepcopy from typing import Optional @@ -44,7 +44,7 @@ class DetectionsSmoother: annotated_frame = bounding_box_annotator.annotate(frame.copy(), detections) sink.write_frame(annotated_frame) ``` - """ # noqa: E501 // docs + """ # noqa: E501 // docs def __init__(self, length: int = 5) -> None: """ From e29e960c5f0ea6d822b64d9c43f06d7f09e8ba9b Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 15:14:18 +0300 Subject: [PATCH 32/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/metric?= =?UTF-8?q?s/detection.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/metrics/detection.py | 268 ++++++++++++++++--------------- 1 file changed, 135 insertions(+), 133 deletions(-) diff --git a/supervision/metrics/detection.py b/supervision/metrics/detection.py index c332ce9a..71007d71 100644 --- a/supervision/metrics/detection.py +++ b/supervision/metrics/detection.py @@ -116,31 +116,31 @@ class ConfusionMatrix: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> targets = [ - ... sv.Detections(...), - ... sv.Detections(...) - ... ] + targets = [ + sv.Detections(...), + sv.Detections(...) + ] - >>> predictions = [ - ... sv.Detections(...), - ... sv.Detections(...) - ... ] + predictions = [ + sv.Detections(...), + sv.Detections(...) + ] - >>> confusion_matrix = sv.ConfusionMatrix.from_detections( - ... predictions=predictions, - ... targets=target, - ... classes=['person', ...] - ... ) + confusion_matrix = sv.ConfusionMatrix.from_detections( + predictions=predictions, + targets=target, + classes=['person', ...] + ) - >>> confusion_matrix.matrix - array([ - [0., 0., 0., 0.], - [0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 1., 0., 0.] - ]) + print(confusion_matrix.matrix) + # np.array([ + # [0., 0., 0., 0.], + # [0., 1., 0., 1.], + # [0., 1., 1., 0.], + # [1., 1., 0., 0.] + # ]) ``` """ @@ -191,46 +191,47 @@ class ConfusionMatrix: Example: ```python - >>> import supervision as sv + import supervision as sv + import numpy as np - >>> targets = ( - ... [ - ... array( - ... [ - ... [0.0, 0.0, 3.0, 3.0, 1], - ... [2.0, 2.0, 5.0, 5.0, 1], - ... [6.0, 1.0, 8.0, 3.0, 2], - ... ] - ... ), - ... array([1.0, 1.0, 2.0, 2.0, 2]), - ... ] - ... ) + targets = ( + [ + np.array( + [ + [0.0, 0.0, 3.0, 3.0, 1], + [2.0, 2.0, 5.0, 5.0, 1], + [6.0, 1.0, 8.0, 3.0, 2], + ] + ), + np.array([1.0, 1.0, 2.0, 2.0, 2]), + ] + ) - >>> predictions = [ - ... array( - ... [ - ... [0.0, 0.0, 3.0, 3.0, 1, 0.9], - ... [0.1, 0.1, 3.0, 3.0, 0, 0.9], - ... [6.0, 1.0, 8.0, 3.0, 1, 0.8], - ... [1.0, 6.0, 2.0, 7.0, 1, 0.8], - ... ] - ... ), - ... array([[1.0, 1.0, 2.0, 2.0, 2, 0.8]]) - ... ] + predictions = [ + np.array( + [ + [0.0, 0.0, 3.0, 3.0, 1, 0.9], + [0.1, 0.1, 3.0, 3.0, 0, 0.9], + [6.0, 1.0, 8.0, 3.0, 1, 0.8], + [1.0, 6.0, 2.0, 7.0, 1, 0.8], + ] + ), + np.array([[1.0, 1.0, 2.0, 2.0, 2, 0.8]]) + ] - >>> confusion_matrix = sv.ConfusionMatrix.from_tensors( - ... predictions=predictions, - ... targets=targets, - ... classes=['person', ...] - ... ) + confusion_matrix = sv.ConfusionMatrix.from_tensors( + predictions=predictions, + targets=targets, + classes=['person', ...] + ) - >>> confusion_matrix.matrix - array([ - [0., 0., 0., 0.], - [0., 1., 0., 1.], - [0., 1., 1., 0.], - [1., 1., 0., 0.] - ]) + print(confusion_matrix.matrix) + # np.array([ + # [0., 0., 0., 0.], + # [0., 1., 0., 1.], + # [0., 1., 1., 0.], + # [1., 1., 0., 0.] + # ]) ``` """ validate_input_tensors(predictions, targets) @@ -365,28 +366,28 @@ class ConfusionMatrix: Example: ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> dataset = sv.DetectionDataset.from_yolo(...) + dataset = sv.DetectionDataset.from_yolo(...) - >>> model = YOLO(...) - >>> def callback(image: np.ndarray) -> sv.Detections: - ... result = model(image)[0] - ... return sv.Detections.from_ultralytics(result) + model = YOLO(...) + def callback(image: np.ndarray) -> sv.Detections: + result = model(image)[0] + return sv.Detections.from_ultralytics(result) - >>> confusion_matrix = sv.ConfusionMatrix.benchmark( - ... dataset = dataset, - ... callback = callback - ... ) + 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.] - ]) + print(confusion_matrix.matrix) + # np.array([ + # [0., 0., 0., 0.], + # [0., 1., 0., 1.], + # [0., 1., 1., 0.], + # [1., 1., 0., 0.] + # ]) ``` """ predictions, targets = [], [] @@ -532,25 +533,25 @@ class MeanAveragePrecision: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> targets = [ - ... sv.Detections(...), - ... sv.Detections(...) - ... ] + targets = [ + sv.Detections(...), + sv.Detections(...) + ] - >>> predictions = [ - ... sv.Detections(...), - ... sv.Detections(...) - ... ] + predictions = [ + sv.Detections(...), + sv.Detections(...) + ] - >>> mean_average_precision = sv.MeanAveragePrecision.from_detections( - ... predictions=predictions, - ... targets=target, - ... ) + mean_average_precision = sv.MeanAveragePrecision.from_detections( + predictions=predictions, + targets=target, + ) - >>> mean_average_precison.map50_95 - 0.2899 + print(mean_average_precison.map50_95) + # 0.2899 ``` """ prediction_tensors = [] @@ -583,23 +584,23 @@ class MeanAveragePrecision: Example: ```python - >>> import supervision as sv - >>> from ultralytics import YOLO + import supervision as sv + from ultralytics import YOLO - >>> dataset = sv.DetectionDataset.from_yolo(...) + dataset = sv.DetectionDataset.from_yolo(...) - >>> model = YOLO(...) - >>> def callback(image: np.ndarray) -> sv.Detections: - ... result = model(image)[0] - ... return sv.Detections.from_ultralytics(result) + model = YOLO(...) + def callback(image: np.ndarray) -> sv.Detections: + result = model(image)[0] + return sv.Detections.from_ultralytics(result) - >>> mean_average_precision = sv.MeanAveragePrecision.benchmark( - ... dataset = dataset, - ... callback = callback - ... ) + mean_average_precision = sv.MeanAveragePrecision.benchmark( + dataset = dataset, + callback = callback + ) - >>> mean_average_precision.map50_95 - 0.433 + print(mean_average_precision.map50_95) + # 0.433 ``` """ predictions, targets = [], [] @@ -637,40 +638,41 @@ class MeanAveragePrecision: Example: ```python - >>> import supervision as sv + import supervision as sv + import numpy as np - >>> targets = ( - ... [ - ... array( - ... [ - ... [0.0, 0.0, 3.0, 3.0, 1], - ... [2.0, 2.0, 5.0, 5.0, 1], - ... [6.0, 1.0, 8.0, 3.0, 2], - ... ] - ... ), - ... array([1.0, 1.0, 2.0, 2.0, 2]), - ... ] - ... ) + targets = ( + [ + np.array( + [ + [0.0, 0.0, 3.0, 3.0, 1], + [2.0, 2.0, 5.0, 5.0, 1], + [6.0, 1.0, 8.0, 3.0, 2], + ] + ), + np.array([[1.0, 1.0, 2.0, 2.0, 2]]), + ] + ) - >>> predictions = [ - ... array( - ... [ - ... [0.0, 0.0, 3.0, 3.0, 1, 0.9], - ... [0.1, 0.1, 3.0, 3.0, 0, 0.9], - ... [6.0, 1.0, 8.0, 3.0, 1, 0.8], - ... [1.0, 6.0, 2.0, 7.0, 1, 0.8], - ... ] - ... ), - ... array([[1.0, 1.0, 2.0, 2.0, 2, 0.8]]) - ... ] + predictions = [ + np.array( + [ + [0.0, 0.0, 3.0, 3.0, 1, 0.9], + [0.1, 0.1, 3.0, 3.0, 0, 0.9], + [6.0, 1.0, 8.0, 3.0, 1, 0.8], + [1.0, 6.0, 2.0, 7.0, 1, 0.8], + ] + ), + np.array([[1.0, 1.0, 2.0, 2.0, 2, 0.8]]) + ] - >>> mean_average_precison = sv.MeanAveragePrecision.from_tensors( - ... predictions=predictions, - ... targets=targets, - ... ) + mean_average_precison = sv.MeanAveragePrecision.from_tensors( + predictions=predictions, + targets=targets, + ) - >>> mean_average_precison.map50_95 - 0.2899 + print(mean_average_precison.map50_95) + # 0.6649 ``` """ validate_input_tensors(predictions, targets) From 8a5cd1bc3e5800335525dfd4be31ec3ee646873b Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 15:17:29 +0300 Subject: [PATCH 33/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/utils/?= =?UTF-8?q?video.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/utils/video.py | 60 +++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/supervision/utils/video.py b/supervision/utils/video.py index 1687c453..6be3bffe 100644 --- a/supervision/utils/video.py +++ b/supervision/utils/video.py @@ -24,15 +24,15 @@ class VideoInfo: Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> video_info = sv.VideoInfo.from_video_path(video_path='video.mp4') + video_info = sv.VideoInfo.from_video_path(video_path='video.mp4') - >>> video_info - VideoInfo(width=3840, height=2160, fps=25, total_frames=538) + video_info + # VideoInfo(width=3840, height=2160, fps=25, total_frames=538) - >>> video_info.resolution_wh - (3840, 2160) + video_info.resolution_wh + # (3840, 2160) ``` """ @@ -71,14 +71,14 @@ class VideoSink: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> video_info = sv.VideoInfo.from_video_path('source.mp4') - >>> frames_generator = sv.get_video_frames_generator('source.mp4') + video_info = sv.VideoInfo.from_video_path('source.mp4') + frames_generator = sv.get_video_frames_generator('source.mp4') - >>> with sv.VideoSink(target_path='target.mp4', video_info=video_info) as sink: - ... for frame in frames_generator: - ... sink.write_frame(frame=frame) + with sv.VideoSink(target_path='target.mp4', video_info=video_info) as sink: + for frame in frames_generator: + sink.write_frame(frame=frame) ``` """ @@ -143,10 +143,10 @@ def get_video_frames_generator( Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> for frame in sv.get_video_frames_generator(source_path='source_video.mp4'): - ... ... + for frame in sv.get_video_frames_generator(source_path='source_video.mp4'): + ... ``` """ video, start, end = _validate_and_setup_video(source_path, start, end) @@ -183,16 +183,16 @@ def process_video( Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> def callback(scene: np.ndarray, index: int) -> np.ndarray: - ... ... + def callback(scene: np.ndarray, index: int) -> np.ndarray: + ... - >>> process_video( - ... source_path='...', - ... target_path='...', - ... callback=callback - ... ) + process_video( + source_path='...', + target_path='...', + callback=callback + ) ``` """ source_video_info = VideoInfo.from_video_path(video_path=source_path) @@ -217,15 +217,15 @@ class FPSMonitor: Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> frames_generator = sv.get_video_frames_generator('source.mp4') - >>> fps_monitor = sv.FPSMonitor() + frames_generator = sv.get_video_frames_generator('source.mp4') + fps_monitor = sv.FPSMonitor() - >>> for frame in frames_generator: - ... # your processing code here - ... fps_monitor.tick() - ... fps = fps_monitor() + for frame in frames_generator: + # your processing code here + fps_monitor.tick() + fps = fps_monitor() ``` """ self.all_timestamps = deque(maxlen=sample_size) From 12b42f80dea7886ea8a542081f4e376bdeacb94b Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 15:17:49 +0300 Subject: [PATCH 34/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/utils/?= =?UTF-8?q?notebook.py=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/utils/notebook.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/supervision/utils/notebook.py b/supervision/utils/notebook.py index 97b6659c..e8a0c7aa 100644 --- a/supervision/utils/notebook.py +++ b/supervision/utils/notebook.py @@ -18,13 +18,13 @@ def plot_image( Examples: ```python - >>> import cv2 - >>> import supervision as sv + import cv2 + import supervision as sv - >>> image = cv2.imread("path/to/image.jpg") + image = cv2.imread("path/to/image.jpg") %matplotlib inline - >>> sv.plot_image(image=image, size=(16, 16)) + sv.plot_image(image=image, size=(16, 16)) ``` """ plt.figure(figsize=size) @@ -63,18 +63,18 @@ def plot_images_grid( Examples: ```python - >>> import cv2 - >>> import supervision as sv + import cv2 + import supervision as sv - >>> image1 = cv2.imread("path/to/image1.jpg") - >>> image2 = cv2.imread("path/to/image2.jpg") - >>> image3 = cv2.imread("path/to/image3.jpg") + image1 = cv2.imread("path/to/image1.jpg") + image2 = cv2.imread("path/to/image2.jpg") + image3 = cv2.imread("path/to/image3.jpg") - >>> images = [image1, image2, image3] - >>> titles = ["Image 1", "Image 2", "Image 3"] + images = [image1, image2, image3] + titles = ["Image 1", "Image 2", "Image 3"] %matplotlib inline - >>> plot_images_grid(images, grid_size=(2, 2), titles=titles, size=(16, 16)) + plot_images_grid(images, grid_size=(2, 2), titles=titles, size=(16, 16)) ``` """ nrows, ncols = grid_size From ab5a86596f5bd0649fa78626204eca64e3722019 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 15:26:43 +0300 Subject: [PATCH 35/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision=20down?= =?UTF-8?q?loader=20classfication=20draw=20geometry=20and=20utils=20>>>/..?= =?UTF-8?q?.=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- supervision/assets/downloader.py | 4 +- supervision/classification/core.py | 66 +++++++++++++++--------------- supervision/draw/color.py | 24 ++++++----- supervision/draw/utils.py | 8 ++-- supervision/geometry/utils.py | 9 ++-- supervision/utils/file.py | 12 +++--- supervision/utils/image.py | 24 +++++------ 7 files changed, 76 insertions(+), 71 deletions(-) diff --git a/supervision/assets/downloader.py b/supervision/assets/downloader.py index e37aca40..8e86359a 100644 --- a/supervision/assets/downloader.py +++ b/supervision/assets/downloader.py @@ -54,9 +54,9 @@ def download_assets(asset_name: Union[VideoAssets, str]) -> str: Example: ```python - >>> from supervision.assets import download_assets, VideoAssets + from supervision.assets import download_assets, VideoAssets - >>> download_assets(VideoAssets.VEHICLES) + download_assets(VideoAssets.VEHICLES) "vehicles.mp4" ``` """ diff --git a/supervision/classification/core.py b/supervision/classification/core.py index 279d358a..34df85e3 100644 --- a/supervision/classification/core.py +++ b/supervision/classification/core.py @@ -59,18 +59,18 @@ class Classifications: Example: ```python - >>> from PIL import Image - >>> import clip - >>> import supervision as sv + from PIL import Image + import clip + import supervision as sv - >>> model, preprocess = clip.load('ViT-B/32') + model, preprocess = clip.load('ViT-B/32') - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> image = preprocess(image).unsqueeze(0) + image = cv2.imread(SOURCE_IMAGE_PATH) + image = preprocess(image).unsqueeze(0) - >>> text = clip.tokenize(["a diagram", "a dog", "a cat"]) - >>> output, _ = model(image, text) - >>> classifications = sv.Classifications.from_clip(output) + text = clip.tokenize(["a diagram", "a dog", "a cat"]) + output, _ = model(image, text) + classifications = sv.Classifications.from_clip(output) ``` """ @@ -97,15 +97,15 @@ class Classifications: Example: ```python - >>> import cv2 - >>> from ultralytics import YOLO - >>> import supervision as sv + import cv2 + from ultralytics import YOLO + import supervision as sv - >>> image = cv2.imread(SOURCE_IMAGE_PATH) - >>> model = YOLO('yolov8n-cls.pt') + image = cv2.imread(SOURCE_IMAGE_PATH) + model = YOLO('yolov8n-cls.pt') - >>> output = model(image)[0] - >>> classifications = sv.Classifications.from_ultralytics(output) + output = model(image)[0] + classifications = sv.Classifications.from_ultralytics(output) ``` """ confidence = ultralytics_results.probs.data.cpu().numpy() @@ -125,25 +125,25 @@ class Classifications: Example: ```python - >>> from PIL import Image - >>> import timm - >>> from timm.data import resolve_data_config, create_transform - >>> import supervision as sv + from PIL import Image + import timm + from timm.data import resolve_data_config, create_transform + import supervision as sv - >>> model = timm.create_model( - ... model_name='hf-hub:nateraw/resnet50-oxford-iiit-pet', - ... pretrained=True - ... ).eval() + model = timm.create_model( + model_name='hf-hub:nateraw/resnet50-oxford-iiit-pet', + pretrained=True + ).eval() - >>> config = resolve_data_config({}, model=model) - >>> transform = create_transform(**config) + config = resolve_data_config({}, model=model) + transform = create_transform(**config) - >>> image = Image.open(SOURCE_IMAGE_PATH).convert('RGB') - >>> x = transform(image).unsqueeze(0) + image = Image.open(SOURCE_IMAGE_PATH).convert('RGB') + x = transform(image).unsqueeze(0) - >>> output = model(x) + output = model(x) - >>> classifications = sv.Classifications.from_timm(output) + classifications = sv.Classifications.from_timm(output) ``` """ confidence = timm_results.cpu().detach().numpy()[0] @@ -168,11 +168,11 @@ class Classifications: Example: ```python - >>> import supervision as sv + import supervision as sv - >>> classifications = sv.Classifications(...) + classifications = sv.Classifications(...) - >>> classifications.get_top_k(1) + classifications.get_top_k(1) (array([1]), array([0.9])) ``` diff --git a/supervision/draw/color.py b/supervision/draw/color.py index fe55b25c..7c26fb30 100644 --- a/supervision/draw/color.py +++ b/supervision/draw/color.py @@ -62,7 +62,7 @@ class Color: Example: ``` - >>> Color.from_hex('#ff00ff') + Color.from_hex('#ff00ff') Color(r=255, g=0, b=255) ``` """ @@ -82,8 +82,8 @@ class Color: Example: ``` - >>> Color(r=255, g=0, b=255).as_hex() - '#ff00ff' + Color(r=255, g=0, b=255).as_hex() + # '#ff00ff' ``` """ return f"#{self.r:02x}{self.g:02x}{self.b:02x}" @@ -97,8 +97,8 @@ class Color: Example: ``` - >>> color.as_rgb() - (255, 0, 255) + color.as_rgb() + # (255, 0, 255) ``` """ return self.r, self.g, self.b @@ -112,8 +112,8 @@ class Color: Example: ``` - >>> color.as_bgr() - (255, 0, 255) + color.as_bgr() + # (255, 0, 255) ``` """ return self.b, self.g, self.r @@ -193,7 +193,7 @@ class ColorPalette: Example: ``` - >>> ColorPalette.default() + ColorPalette.default() ColorPalette(colors=[Color(r=255, g=0, b=0), Color(r=0, g=255, b=0), ...]) ``` """ @@ -212,7 +212,7 @@ class ColorPalette: Example: ``` - >>> ColorPalette.from_hex(['#ff0000', '#00ff00', '#0000ff']) + ColorPalette.from_hex(['#ff0000', '#00ff00', '#0000ff']) ColorPalette(colors=[Color(r=255, g=0, b=0), Color(r=0, g=255, b=0), ...]) ``` """ @@ -231,8 +231,10 @@ class ColorPalette: Example: ``` - >>> color_palette.by_idx(1) - Color(r=0, g=255, b=0) + import supervision as sv + + color_palette.by_idx(1) + # Color(r=0, g=255, b=0) ``` """ if idx < 0: diff --git a/supervision/draw/utils.py b/supervision/draw/utils.py index 10f5c932..a6e600e3 100644 --- a/supervision/draw/utils.py +++ b/supervision/draw/utils.py @@ -135,9 +135,11 @@ def draw_text( Examples: ```python - >>> scene = np.zeros((100, 100, 3), dtype=np.uint8) - >>> text_anchor = Point(x=50, y=50) - >>> scene = draw_text(scene=scene, text="Hello, world!",text_anchor=text_anchor) + import numpy as np + + scene = np.zeros((100, 100, 3), dtype=np.uint8) + text_anchor = Point(x=50, y=50) + scene = draw_text(scene=scene, text="Hello, world!",text_anchor=text_anchor) ``` """ text_width, text_height = cv2.getTextSize( diff --git a/supervision/geometry/utils.py b/supervision/geometry/utils.py index f1b66db2..6069ca7f 100644 --- a/supervision/geometry/utils.py +++ b/supervision/geometry/utils.py @@ -22,10 +22,11 @@ def get_polygon_center(polygon: np.ndarray) -> Point: Examples: ```python - >>> from supervision.geometry.utils import get_polygon_center - - >>> vertices = np.array([[0, 0], [0, 1], [1, 1], [1, 0]]) - >>> get_center(vertices) + from supervision.geometry.utils import get_polygon_center + import numpy as np + + vertices = np.array([[0, 0], [0, 1], [1, 1], [1, 0]]) + get_center(vertices) Point(x=0.5, y=0.5) ``` """ diff --git a/supervision/utils/file.py b/supervision/utils/file.py index c0521236..dfce7eb0 100644 --- a/supervision/utils/file.py +++ b/supervision/utils/file.py @@ -34,14 +34,14 @@ def list_files_with_extensions( Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> # List all files in the directory - >>> files = sv.list_files_with_extensions(directory='my_directory') + # List all files in the directory + files = sv.list_files_with_extensions(directory='my_directory') - >>> # List only files with '.txt' and '.md' extensions - >>> files = sv.list_files_with_extensions( - ... directory='my_directory', extensions=['txt', 'md']) + # List only files with '.txt' and '.md' extensions + files = sv.list_files_with_extensions( + directory='my_directory', extensions=['txt', 'md']) ``` """ diff --git a/supervision/utils/image.py b/supervision/utils/image.py index 8abfbba9..442e9b6a 100644 --- a/supervision/utils/image.py +++ b/supervision/utils/image.py @@ -20,13 +20,13 @@ def crop_image(image: np.ndarray, xyxy: np.ndarray) -> np.ndarray: Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> detection = sv.Detections(...) - >>> with sv.ImageSink(target_dir_path='target/directory/path') as sink: - ... for xyxy in detection.xyxy: - ... cropped_image = sv.crop_image(image=image, xyxy=xyxy) - ... sink.save_image(image=image) + detection = sv.Detections(...) + with sv.ImageSink(target_dir_path='target/directory/path') as sink: + for xyxy in detection.xyxy: + cropped_image = sv.crop_image(image=image, xyxy=xyxy) + sink.save_image(image=image) ``` """ @@ -55,13 +55,13 @@ class ImageSink: Examples: ```python - >>> import supervision as sv + import supervision as sv - >>> with sv.ImageSink(target_dir_path='target/directory/path', - ... overwrite=True) as sink: - ... for image in sv.get_video_frames_generator( - ... source_path='source_video.mp4', stride=2): - ... sink.save_image(image=image) + with sv.ImageSink(target_dir_path='target/directory/path', + overwrite=True) as sink: + for image in sv.get_video_frames_generator( + source_path='source_video.mp4', stride=2): + sink.save_image(image=image) ``` """ From d4e0d8d46d1c7ce08e40c508333f1bc44a1462b2 Mon Sep 17 00:00:00 2001 From: Onuralp SEZER Date: Wed, 24 Jan 2024 15:40:08 +0300 Subject: [PATCH 36/41] =?UTF-8?q?docs:=20=F0=9F=93=9D=20supervision/annota?= =?UTF-8?q?tors/core.py=20PercentageBarAnnotator=20>>>/...=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onuralp SEZER --- docs/annotators.md | 16 ++++++++-------- supervision/annotators/core.py | 16 ++++++++-------- supervision/geometry/utils.py | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/annotators.md b/docs/annotators.md index 75a01802..3731b63c 100644 --- a/docs/annotators.md +++ b/docs/annotators.md @@ -194,16 +194,16 @@ comments: true === "PercentageBar" ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> percentage_bar_annotator = sv.PercentageBarAnnotator() - >>> annotated_frame = percentage_bar_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + percentage_bar_annotator = sv.PercentageBarAnnotator() + annotated_frame = percentage_bar_annotator.annotate( + scene=image.copy(), + detections=detections + ) ```
diff --git a/supervision/annotators/core.py b/supervision/annotators/core.py index f128631c..4e8b634b 100644 --- a/supervision/annotators/core.py +++ b/supervision/annotators/core.py @@ -1562,16 +1562,16 @@ class PercentageBarAnnotator(BaseAnnotator): Example: ```python - >>> import supervision as sv + import supervision as sv - >>> image = ... - >>> detections = sv.Detections(...) + image = ... + detections = sv.Detections(...) - >>> percentage_bar_annotator = sv.BoundingBoxAnnotator() - >>> annotated_frame = percentage_bar_annotator.annotate( - ... scene=image.copy(), - ... detections=detections - ... ) + percentage_bar_annotator = sv.BoundingBoxAnnotator() + annotated_frame = percentage_bar_annotator.annotate( + scene=image.copy(), + detections=detections + ) ``` ![percentage-bar-example](https://media.roboflow.com/ diff --git a/supervision/geometry/utils.py b/supervision/geometry/utils.py index 6069ca7f..dd4e64db 100644 --- a/supervision/geometry/utils.py +++ b/supervision/geometry/utils.py @@ -24,7 +24,7 @@ def get_polygon_center(polygon: np.ndarray) -> Point: ```python from supervision.geometry.utils import get_polygon_center import numpy as np - + vertices = np.array([[0, 0], [0, 1], [1, 1], [1, 0]]) get_center(vertices) Point(x=0.5, y=0.5) From 79560945f52308cab9ac47c390e14ee9fd1dd242 Mon Sep 17 00:00:00 2001 From: SkalskiP Date: Wed, 24 Jan 2024 15:07:32 +0100 Subject: [PATCH 37/41] ready for merge --- docs/annotators.md | 1 + docs/detection/core.md | 1 + docs/detection/tools/smoother.md | 5 ++++ docs/how_to/evaluate_model.md | 5 ---- docs/how_to/process_video.md | 5 ---- docs/index.md | 32 +++++++++++++++++++++++++ mkdocs.yml | 6 +++-- supervision/detection/tools/smoother.py | 21 +++++++++------- 8 files changed, 55 insertions(+), 21 deletions(-) delete mode 100644 docs/how_to/evaluate_model.md delete mode 100644 docs/how_to/process_video.md diff --git a/docs/annotators.md b/docs/annotators.md index f7dc8ece..84041330 100644 --- a/docs/annotators.md +++ b/docs/annotators.md @@ -1,5 +1,6 @@ --- comments: true +status: new --- === "BoundingBox" diff --git a/docs/detection/core.md b/docs/detection/core.md index e966d60b..94d641e8 100644 --- a/docs/detection/core.md +++ b/docs/detection/core.md @@ -1,5 +1,6 @@ --- comments: true +status: new --- ## Detections diff --git a/docs/detection/tools/smoother.md b/docs/detection/tools/smoother.md index 9f90636e..e19778d3 100644 --- a/docs/detection/tools/smoother.md +++ b/docs/detection/tools/smoother.md @@ -1,3 +1,8 @@ +--- +comments: true +status: new +--- + ## Detection Smoother :::supervision.detection.tools.smoother.DetectionsSmoother diff --git a/docs/how_to/evaluate_model.md b/docs/how_to/evaluate_model.md deleted file mode 100644 index 7adab821..00000000 --- a/docs/how_to/evaluate_model.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -comments: true ---- - -🚧 Page under construction. diff --git a/docs/how_to/process_video.md b/docs/how_to/process_video.md deleted file mode 100644 index 7adab821..00000000 --- a/docs/how_to/process_video.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -comments: true ---- - -🚧 Page under construction. diff --git a/docs/index.md b/docs/index.md index d3c48e20..2e04331d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,6 +17,38 @@ comments: true We write your reusable computer vision tools. Whether you need to load your dataset from your hard drive, draw detections on an image or video, or count how many detections are in a zone. You can count on us! +
+ +- __Detect and Annotate__ + + --- + + Annotate predictions from a range of object detection and segmentation models + + [:octicons-arrow-right-24: Tutorial](how_to/detect_and_annotate) + +- __Track Objects__ + + --- + + Discover how to enhance video analysis by implementing seamless object tracking + + [:octicons-arrow-right-24: Tutorial](how_to/track_objects) + +- > __Count Objects Crossing Line__ + + --- + + Explore methods to accurately count and analyze objects crossing a predefined line + +- > __Filter Objects in Zone__ + + --- + + Master the techniques to selectively filter and focus on objects within a specific zone + +
+ ## 💻 Install You can install `supervision` with pip in a diff --git a/mkdocs.yml b/mkdocs.yml index 5b6fa226..c9d4eae4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -28,10 +28,8 @@ nav: - Home: index.md - How to: - Detect and Annotate: how_to/detect_and_annotate.md - - Process Video: how_to/process_video.md - Track Objects: how_to/track_objects.md - Filter Detections: how_to/filter_detections.md - - Evaluate Model: how_to/evaluate_model.md - API: - Classifications: - Core: classification/core.md @@ -83,6 +81,7 @@ theme: code: Roboto Mono features: - content.code.copy + - content.code.annotate plugins: - mkdocstrings @@ -94,6 +93,9 @@ markdown_extensions: - pymdownx.superfences - attr_list - md_in_html + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.tabbed: alternate_style: true - toc: diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index 9fbd89a6..905d4f49 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -12,6 +12,12 @@ class DetectionsSmoother: A utility class for smoothing detections over multiple frames in video tracking. It maintains a history of detections for each track and provides smoothed predictions based on these histories. + + !!! warning @@ -23,6 +29,7 @@ class DetectionsSmoother: Example: ```python import supervision as sv + from ultralytics import YOLO video_info = sv.VideoInfo.from_video_path(video_path=) @@ -39,7 +46,7 @@ class DetectionsSmoother: result = model(frame)[0] detections = sv.Detections.from_ultralytics(result) detections = tracker.update_with_detections(detections) - detections = tracker.update_with_detections(detections) + detections = smoother.update_with_detections(detections) annotated_frame = bounding_box_annotator.annotate(frame.copy(), detections) sink.write_frame(annotated_frame) @@ -63,7 +70,10 @@ class DetectionsSmoother: """ if detections.tracker_id is None: - print("DetectionsSmoother requires tracker_id to be set on Detections") + print( + "Smoothing skipped. DetectionsSmoother requires tracker_id. Refer to " + "https://supervision.roboflow.com/trackers for more information." + ) return detections for detection_idx in range(len(detections)): @@ -99,13 +109,6 @@ class DetectionsSmoother: return ret def get_smoothed_detections(self) -> Detections: - """ - Returns a smoothed set of predictions based on the `length` most recent frames. - - Returns: - detections (Detections): The smoothed detections. - """ - tracked_detections = [] for track_id in self.tracks: track = self.get_track(track_id) From 7916d6a6a461a32eb3404201a7772b382733530c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:07:45 +0000 Subject: [PATCH 38/41] =?UTF-8?q?fix(pre=5Fcommit):=20=F0=9F=8E=A8=20auto?= =?UTF-8?q?=20format=20pre-commit=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supervision/detection/tools/smoother.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supervision/detection/tools/smoother.py b/supervision/detection/tools/smoother.py index 905d4f49..3913a9d3 100644 --- a/supervision/detection/tools/smoother.py +++ b/supervision/detection/tools/smoother.py @@ -12,7 +12,7 @@ class DetectionsSmoother: A utility class for smoothing detections over multiple frames in video tracking. It maintains a history of detections for each track and provides smoothed predictions based on these histories. - +