Merge branch 'develop' into feature/annotators-accept-PIL-images
This commit is contained in:
20 files changed
+1514
-293
No files matched your search
@@ -46,7 +46,7 @@ repos:
|
||||
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.2.0
|
||||
rev: v0.2.2
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix, --exit-non-zero-on-fix]
|
||||
|
||||
@@ -112,6 +112,20 @@ To run the documentation, install the project requirements with `poetry install
|
||||
|
||||
You can learn more about mkdocs on the [mkdocs website](https://www.mkdocs.org/).
|
||||
|
||||
## 🧑🍳 cookbooks
|
||||
|
||||
We are always looking for new examples and cookbooks to add to the `supervision`
|
||||
documentation. If you have a use case that you think would be helpful to others, please
|
||||
submit a PR with your example. Here are some guidelines for submitting a new example:
|
||||
|
||||
- Create a new notebook in the [`docs/nodebooks`](https://github.com/roboflow/supervision/tree/develop/docs/notebooks) folder.
|
||||
- Add a link to the new notebook in [`docs/theme/cookbooks.html`](https://github.com/roboflow/supervision/blob/develop/docs/theme/cookbooks.html). Make sure to add the path to the new notebook, as well as a title, labels, author and supervision version.
|
||||
- Use the [Count Objects Crossing the Line](https://supervision.roboflow.com/develop/notebooks/count-objects-crossing-the-line/) example as a template for your new example.
|
||||
- Freeze the version of `supervision` you are using.
|
||||
- Place an appropriate Open in Colab button at the top of the notebook. You can find an example of such a button in the aforementioned `Count Objects Crossing the Line` cookbook.
|
||||
- Notebook should be self-contained. If you rely on external data ( videos, images, etc.) or libraries, include download and installation commands in the notebook.
|
||||
- Annotate the code with appropriate comments, including links to the documentation describing each of the tools you have used.
|
||||
|
||||
## 🧪 tests
|
||||
|
||||
[`pytests`](https://docs.pytest.org/en/7.1.x/) is used to run our tests.
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# LineZone
|
||||
<div class="md-typeset">
|
||||
<h2>LineZone</h2>
|
||||
</div>
|
||||
|
||||
:::supervision.detection.line_counter.LineZone
|
||||
:::supervision.detection.line_zone.LineZone
|
||||
|
||||
<div class="md-typeset">
|
||||
<h2>LineZoneAnnotator</h2>
|
||||
</div>
|
||||
|
||||
:::supervision.detection.line_zone.LineZoneAnnotator
|
||||
@@ -2,7 +2,9 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# PolygonZone
|
||||
<div class="md-typeset">
|
||||
<h2>PolygonZone</h2>
|
||||
</div>
|
||||
|
||||
:::supervision.detection.tools.polygon_zone.PolygonZone
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
comments: true
|
||||
status: new
|
||||
---
|
||||
|
||||
# Detection Smoother
|
||||
|
||||
+11
-10
@@ -1,19 +1,20 @@
|
||||
---
|
||||
template: index.html
|
||||
comments: true
|
||||
hide:
|
||||
- navigation
|
||||
- toc
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<p>
|
||||
<a align="center" href="" target="_blank">
|
||||
<img
|
||||
width="850"
|
||||
src="https://media.roboflow.com/open-source/supervision/rf-supervision-banner.png?updatedAt=1678995927529"
|
||||
>
|
||||
</a>
|
||||
</p>
|
||||
<div class="md-typeset">
|
||||
<h1></h1>
|
||||
</div>
|
||||
|
||||
<div align="center" id="logo">
|
||||
<a align="center" href="" target="_blank">
|
||||
<img width="850"
|
||||
src="https://media.roboflow.com/open-source/supervision/rf-supervision-banner.png?updatedAt=1678995927529">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
## 👋 Hello
|
||||
@@ -45,7 +46,7 @@ You can install `supervision` with pip in a
|
||||
If you require the full version of `supervision` with GUI support you can install the desktop version. This version includes the GUI components of OpenCV, allowing you to display images and videos on the screen.
|
||||
|
||||
```bash
|
||||
pip install supervision[desktop]
|
||||
pip install "supervision[desktop]"
|
||||
```
|
||||
|
||||
!!! example "git clone (for development)"
|
||||
|
||||
@@ -55,7 +55,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
|
||||
let authorAvatarsHTML = authorDataArray.map((authorData, index) => {
|
||||
const marginLeft = index === 0 ? '0' : '-10px';
|
||||
const zIndex = 100 - index;
|
||||
const zIndex = 4 - index;
|
||||
return `
|
||||
<div
|
||||
class="author-container"
|
||||
|
||||
+269
-125
@@ -15,6 +15,15 @@
|
||||
"[](https://blog.roboflow.com/yolov8-tracking-and-counting/)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Click the `Open in Colab` button to run the cookbook on Google Colab."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "IyC-iI62u9y7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
@@ -28,20 +37,20 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "nD3EEfKzFftV",
|
||||
"outputId": "c4c7d7f8-7231-465d-97a4-8d12b7c78370"
|
||||
"outputId": "af204c68-c7ef-4365-e2b0-b40583d7f502"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Fri Feb 9 17:05:30 2024 \n",
|
||||
"Mon Feb 12 13:03:38 2024 \n",
|
||||
"+---------------------------------------------------------------------------------------+\n",
|
||||
"| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n",
|
||||
"|-----------------------------------------+----------------------+----------------------+\n",
|
||||
@@ -50,7 +59,7 @@
|
||||
"| | | MIG M. |\n",
|
||||
"|=========================================+======================+======================|\n",
|
||||
"| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n",
|
||||
"| N/A 45C P8 10W / 70W | 0MiB / 15360MiB | 0% Default |\n",
|
||||
"| N/A 48C P8 10W / 70W | 0MiB / 15360MiB | 0% Default |\n",
|
||||
"| | | N/A |\n",
|
||||
"+-----------------------------------------+----------------------+----------------------+\n",
|
||||
" \n",
|
||||
@@ -68,15 +77,24 @@
|
||||
"!nvidia-smi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"**NOTE:** To make it easier for us to manage datasets, images and models we create a `HOME` constant."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "S_coxWaEwNpB"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "AO4MWPmnFk7m",
|
||||
"outputId": "9c291c95-661d-4c3d-d706-980be0a7ab85"
|
||||
"outputId": "690d019e-8833-44a1-ed9a-ae2ce248ef20"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -96,7 +114,9 @@
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Install required packages"
|
||||
"## Install required packages\n",
|
||||
"\n",
|
||||
"In this cookbook, we'll leverage two Python packages - `ultralytics` for running object detection, and `supervision` for tracking, visualizing detections, and crucially, counting objects that cross a line."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "PE1dQcgiLuvV"
|
||||
@@ -108,24 +128,10 @@
|
||||
"!pip install -q ultralytics supervision==0.18.0"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "Yy86T0CJLz1Y",
|
||||
"outputId": "a5cbb25b-267c-4930-fafe-c870f56a0042"
|
||||
"id": "Yy86T0CJLz1Y"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m709.5/709.5 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[2K \u001b[90m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[32m86.7/86.7 kB\u001b[0m \u001b[31m11.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
||||
"\u001b[?25h"
|
||||
]
|
||||
}
|
||||
]
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -148,7 +154,7 @@
|
||||
"metadata": {
|
||||
"id": "Q8rPpDW4MEGU"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
@@ -160,6 +166,16 @@
|
||||
"## Download video"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"\n",
|
||||
"As an example input video, we will use one of the videos available in [`supervision.assets`](https://supervision.roboflow.com/develop/assets/). Supervision offers an assets download utility that allows you to download video files that you can use in your demos."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Ax3dupz7z0vn"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
@@ -171,9 +187,18 @@
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"**NOTE:** If you want to run the cookbook using your own file as input, simply upload video to Google Colab and replace `SOURCE_VIDEO_PATH` with the path to your file."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "-G9vhVBl2i-P"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 6,
|
||||
"metadata": {
|
||||
"id": "Y3DjvPRiGIht"
|
||||
},
|
||||
@@ -182,6 +207,22 @@
|
||||
"SOURCE_VIDEO_PATH = f\"{HOME}/vehicles.mp4\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"As a result of executing the above commands, you will download a video file and save it at the `SOURCE_VIDEO_PATH`. Keep in mind that the video preview below works only in the web version of the cookbooks and not in Google Colab.\n",
|
||||
"\n",
|
||||
"<video controls>\n",
|
||||
" <source\n",
|
||||
" src=\"https://storage.googleapis.com/com-roboflow-marketing/supervision/cookbooks/vehicles-1280x720.mp4\"\n",
|
||||
" type=\"video/mp4\"\n",
|
||||
" >\n",
|
||||
"</video>"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "cZaQUyUrZAek"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
@@ -191,6 +232,15 @@
|
||||
"id": "iiS871HqNnll"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"The [`get_video_frames_generator`](https://supervision.roboflow.com/latest/utils/video/#supervision.utils.video.get_video_frames_generator) enables us to easily iterate over video frames. Let's create a video generator for our sample input file and display its first frame on the screen."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "MPMlQs-22HX9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
@@ -205,9 +255,9 @@
|
||||
"height": 560
|
||||
},
|
||||
"id": "6jm4yX-3Ou_B",
|
||||
"outputId": "b67b2839-9ba7-4706-8cd7-f3b2da020788"
|
||||
"outputId": "b5799261-2ac9-40a3-ae4a-cb0548a2c034"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 7,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
@@ -224,25 +274,75 @@
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Run Object Detection"
|
||||
"\n",
|
||||
"We can also use [`VideoInfo.from_video_path`](https://supervision.roboflow.com/develop/utils/video/#supervision.utils.video.VideoInfo) to learn basic information about our video, such as duration, resolution, or FPS."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "L4pt1XDO3D7q"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"sv.VideoInfo.from_video_path(SOURCE_VIDEO_PATH)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "eVLsW_I72eXa",
|
||||
"outputId": "9182624b-2de5-47d1-a5ed-73dc60ed5e8a"
|
||||
},
|
||||
"execution_count": 8,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"VideoInfo(width=3840, height=2160, fps=25, total_frames=538)"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 8
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Run Object Detection\n",
|
||||
"\n",
|
||||
"Let's start by running the detection model on the first frame and annotating the results. In this cookbook, we use [Ultralytics](https://github.com/ultralytics/ultralytics) YOLOv8, but it can be successfully replaced with [other models](https://supervision.roboflow.com/latest/detection/core)."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "N0-qK6vDPsr-"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"We initiate the model and perform detection on the first frame of the video. Then, we convert the result into a [`sv.Detections`](https://supervision.roboflow.com/latest/detection/core/) object, which will be useful in the later parts of the cookbook."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "uGJKBHXnc1w3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"model = YOLO(\"yolov8x.pt\")"
|
||||
"model = YOLO(\"yolov8x.pt\")\n",
|
||||
"\n",
|
||||
"results = model(frame, verbose=False)[0]\n",
|
||||
"detections = sv.Detections.from_ultralytics(results)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "pgBcPmh5P2Kv",
|
||||
"outputId": "45923429-c7eb-4c03-e27f-90b136e0cac5"
|
||||
"id": "NW0G6ZKX1e1E",
|
||||
"outputId": "91687b08-667e-46c2-a421-e26fefc3388b"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 9,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
@@ -255,18 +355,26 @@
|
||||
"output_type": "stream",
|
||||
"name": "stderr",
|
||||
"text": [
|
||||
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 131M/131M [00:00<00:00, 159MB/s]\n"
|
||||
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 131M/131M [00:00<00:00, 241MB/s]\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"\n",
|
||||
"The results we've obtained can be easily visualized with [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/latest/annotators/#supervision.annotators.core.BoundingBoxAnnotator). By default, this annotator uses the same color to highlight objects of the same category. However, with the integration of a [tracker](https://supervision.roboflow.com/latest/trackers/), it becomes possible to assign unique colors to each tracked object. We can easily define our [own color palettes](https://supervision.roboflow.com/latest/draw/color/#supervision.draw.color.ColorPalette) and adjust parameters such as line thickness, allowing for a highly tailored visualization experience."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "zL56OvvfdYpB"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"results = model(frame, verbose=False)[0]\n",
|
||||
"detections = sv.Detections.from_ultralytics(results)\n",
|
||||
"\n",
|
||||
"annotated_frame = sv.BoundingBoxAnnotator(thickness=4).annotate(frame.copy(), detections)\n",
|
||||
"bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=4)\n",
|
||||
"annotated_frame = bounding_box_annotator.annotate(frame.copy(), detections)\n",
|
||||
"sv.plot_image(annotated_frame, (12, 12))"
|
||||
],
|
||||
"metadata": {
|
||||
@@ -275,9 +383,9 @@
|
||||
"height": 560
|
||||
},
|
||||
"id": "qpjNci4iRGkJ",
|
||||
"outputId": "a9553d20-9225-498b-97a0-dc95832826eb"
|
||||
"outputId": "b0ddb63b-9640-40b9-d8f4-e555195f0134"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 10,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
@@ -300,20 +408,26 @@
|
||||
"id": "HsPNfuM_3ENR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Supervision annotators can be easily combined with one another. Let's enhance our visualization by adding [`sv.LabelAnnotator`](https://supervision.roboflow.com/latest/annotators/#supervision.annotators.core.PolygonAnnotator.annotate), which we will use to mark detections with a label indicating their category and confidence level."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "H4lp2Ao_fHit"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"results = model(frame, verbose=False)[0]\n",
|
||||
"detections = sv.Detections.from_ultralytics(results)\n",
|
||||
"labels = [results.names[i] for i in detections.class_id]\n",
|
||||
"labels = [\n",
|
||||
" f\"{results.names[class_id]} {confidence:0.2f}\"\n",
|
||||
" for class_id, confidence\n",
|
||||
" in zip(detections.class_id, detections.confidence)\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"h, w, _ = frame.shape\n",
|
||||
"\n",
|
||||
"thickness = sv.calculate_dynamic_line_thickness(resolution_wh = (w, h))\n",
|
||||
"text_scale = sv.calculate_dynamic_text_scale(resolution_wh = (w, h))\n",
|
||||
"\n",
|
||||
"bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=thickness)\n",
|
||||
"label_annotator = sv.LabelAnnotator(text_thickness=thickness, text_scale=text_scale)\n",
|
||||
"bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=4)\n",
|
||||
"label_annotator = sv.LabelAnnotator(text_thickness=4, text_scale=2)\n",
|
||||
"\n",
|
||||
"annotated_frame = frame.copy()\n",
|
||||
"annotated_frame = bounding_box_annotator.annotate(annotated_frame, detections)\n",
|
||||
@@ -326,9 +440,9 @@
|
||||
"height": 560
|
||||
},
|
||||
"id": "lIYQULBI3Tf3",
|
||||
"outputId": "79fa2f02-46ed-4d01-c5ee-bb9fe5c8662e"
|
||||
"outputId": "8cd8d367-9003-4ac8-d62e-d81d38d2faeb"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 12,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
@@ -336,7 +450,7 @@
|
||||
"text/plain": [
|
||||
"<Figure size 1200x1200 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
@@ -351,6 +465,17 @@
|
||||
"id": "WZHe1xq_633e"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"To set the position of `sv.LineZone`, we need to define the `start` and `end` points. The position of each point is defined as a pair of coordinates `(x, y)`. The origin of the coordinate system is located in the top-left corner of the frame. The `x` axis runs from left to right, and the `y` axis runs from top to bottom.\n",
|
||||
"\n",
|
||||
"I decided to place my line horizontally, at the midpoint of the frame's height. I obtained the full dimensions of the frame using [`sv.VideoInfo`](https://supervision.roboflow.com/develop/utils/video/#supervision.utils.video.VideoInfo).\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "iniUELOr5hZ_"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
@@ -360,10 +485,10 @@
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "kY9Oy6rr693V",
|
||||
"outputId": "5ddd3667-473e-4c22-8c0f-80310700f5f4"
|
||||
"id": "pqwq-1OYihyB",
|
||||
"outputId": "3c74086d-7c1c-42f9-b8dc-25dc74b2e35a"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 14,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
@@ -373,22 +498,31 @@
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 18
|
||||
"execution_count": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"The line we've created, together with the `in_count` and `out_count`, can be elegantly visualized using [`sv.LineZoneAnnotator`](https://supervision.roboflow.com/latest/detection/tools/line_zone/#supervision.detection.line_zone.LineZoneAnnotator). This tool also allows for extensive customization options; we can alter the color of both the line and the text, opt to hide the in/out counts, and adjust the labels. By default, the labels are set to `in` and `out`, but they can be tailored to fit the context of our project, providing a clear and intuitive display of object movement across the designated line."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "WBavHZsdijjR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"START = sv.Point(0, 2160 // 2)\n",
|
||||
"END = sv.Point(3840, 2160 // 2)\n",
|
||||
"START = sv.Point(0, 1500)\n",
|
||||
"END = sv.Point(3840, 1500)\n",
|
||||
"\n",
|
||||
"line_zone = sv.LineZone(start=START, end=END)\n",
|
||||
"\n",
|
||||
"line_zone_annotator = sv.LineZoneAnnotator(\n",
|
||||
" thickness=thickness,\n",
|
||||
" text_thickness=thickness,\n",
|
||||
" text_scale=text_scale)\n",
|
||||
" thickness=4,\n",
|
||||
" text_thickness=4,\n",
|
||||
" text_scale=2)\n",
|
||||
"\n",
|
||||
"annotated_frame = frame.copy()\n",
|
||||
"annotated_frame = line_zone_annotator.annotate(annotated_frame, line_counter=line_zone)\n",
|
||||
@@ -400,9 +534,9 @@
|
||||
"height": 560
|
||||
},
|
||||
"id": "gqdGQABx7BzA",
|
||||
"outputId": "a376168b-12fb-4d67-b793-5b26b6756b63"
|
||||
"outputId": "42bb2e1c-ab6c-4e3d-b286-d78f0a959d7c"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 22,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
@@ -410,7 +544,7 @@
|
||||
"text/plain": [
|
||||
"<Figure size 1200x1200 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAIfCAYAAABEnkAKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9zY5sSbYuCn3DpnvEWplZu3ade/44FyEkpItEBxo8Bo/BW9DgJXgNXgEhIejQ4rYR4gquBPfsvasyK3OtCPc5bdAY4xvjs+m+slZBA20prCpXRLjPaT/j/8/MzN0dH+2jfbSP9tE+2kf7aB/to320j/bRPtq/0jb+/z2Bj/bRPtpH+2gf7aN9tI/20T7aR/toH+3/l/bh2H60j/bRPtpH+2gf7aN9tI/20T7aR/tX3T4c24/20T7aR/toH+2jfbSP9tE+2kf7aP+q24dj+9E+2kf7aB/to320j/bRPtpH+2gf7V91+3BsP9pH+2gf7aN9tI/20T7aR/toH+2j/atuH47tR/toH+2jfbSP9tE+2kf7aB/to320f9Xtw7H9aB/to320j/bRPtpH+2gf7aN9tI/2r7p9OLYf7aN9tI/20T7aR/toH+2jfbSP9tH+VbcPx/ajfbSP9tE+2kf7aB/to320j/bRPtq/6nb53gf/1/+b/y0MgNv6uY0NBmDA4O4wMwwzmAHu+dAwTABm8bKZ1++AwczqWTODYcZn/Dt/5/c6ieoTgDmyr3h6GmIeHM8d5iP7qh7jZQBj24CZz47sZxswGEZ+zr57/j1HwDGnYwyDm3N1AqwVdgMb3B0Og40B90OAhpjvk/dy0MAHHNMdliOZDbhPwCbgI1/2WK2x2+zXgTEGQPjaxDiijwkvfPJdQ8DQp2NYxEQmHDYMDn4esJhzxjtjxJoIPzgmgl4MwBwGzJxX/mK2CYwnbAYeMWId7oBhg7vBMTEgMMNI3Opnsm4bK22enjvjywN82BxwM0yT9xLurrSU0DYzWCwU7v3ZMla+xjF6dE+Ab/nkkYRcmCx6XtbHOZgHFFzo1D3erVdG9kNu8IbdQicWvL2sM3E9rNaG5Pm1WT2/gNnG+sQUll6AoqQfOHWnPJjZT8xhnFZhDswhcFlR1L0aMCZSPgXNYo5ljvI0LIgvMRT4OuDJey0DDah5ecKSw9tCRzGHgLWHDEPi3QhzEohL/9ZwVVIwgyCwFm2cw0gK8yMffxQulA01dvbJNQWOYuUI6YVmFuMiQw4J4q3IIN6f2e+YQtMpr2c+ORzYJur72eKi+Njcnuqmxlqvy4oXB19OePiCvymwI5f3urnmwkr2PZYRTX7nc4UbI73oDAVGZjBdkKV8dFlokkDAzWsewfeN/tYA3V9LScHZMhXVjw732bpWaCNRXc/OiYKpuRdfTpk2f1lYUvooWkpac5FJ9SvtA4HbyOdnjTgKU5Sx3yARoNYRPObuIQMW/qBsSv2J1W5pWojBRn43cWrCg0VzEJ5Ga7BWN6sdFLwn07J+l8/3ulofetHOIjTgKbNKVIu+r344L5s97KKCKC/kDT9gpAK359OUuZD3RG3V5/WO8Gooj6RGM7EBuU7C004Alfm6/G5Bt4HJYCQ/ZtkOAG3bWfNoOI9FJQ8HbKSd4xMHjhh+GHyuOsNLzvbUVpZcFGj+K/r4wTDXd6lfVhDYeQQBesm3k73rviB8aSqW2C1lDHVitFkgJz30OCtpuokN61jlsHvTX/HazBFHipHUXTPhhKPXorprIYzWt88kxkJa1jBeSFvwdzJp6tlho+zkZzhWv4j2H5x0fxAEBeiwrfmC2C+0LQqHqIm7yIZaA3FxQrWbJR9ZygCRbJ4dJ0641uFIjPQKp443Y+5b9jZLr+Q6iVeLN/9X/8v/Bb6nfbdjSxUIV4PYignGouG8AD7ys+lhiFoSGhmRf1sp+lRJou3cSX5UUvHcGDkX9+qDbykTx1SIfIBqveVIOlQ+00mb2d/AmKi/Q7kLPFSAZjNLYego5w+gkiCCA5Yj4TBtwnwCPkup8FmKsBq1BDcSTiaCmE6bh1Fk0sdZ7pUzDkIoDMSSbV4/xxj5t2ODYZrDx8Qw4OLAkZRMg3EI+XJsH17G0BDCHcQngOFU8o1HYMDS0JgIRREoawHVuimEnrWnKArQhfZaOSINEE8nwha6BI6kDWVGAWILaAFw4boM4cB12UVEMV8pw757cO3PN/k96Msc6TigBXhrgwg40PAqBwlNB8m3c4rBWka+PGe59oQhCdRE4ZSjpRKeCz33B7RzAVuf/5st+X86fLRrocZSqST5bFgEmuLP1cxMGy3UgBsYDDLH4nxWY8ALTUNE80xtZrLgaShji439tlJOnJ7gaNNhNldaWGirhmkYiJHwEGkoxy17eiITnEZiBpwWdZ/oH9NhODAN5X+cx1MTnEpecQJLnoCjPIDsw9ywKb9QJpVhr4rYg245hnhzrSKxOMqJmeipZDLKoTFEIAsWAdlm2FFOiAPtoCTsShmjA42c12Exl0EW8gzqqVCg5lLLQGBvGEk7bYx46hs6n/E+WhfwSXeU3it8NIBFc4MQahX/GJSDn+QV5UPNz+AGTDecC8PoGMnqWj7JAMb5WAdiSW+D8suatmjSmq3y0+UftcvPa2re8OpjNeyb2UruSxejgQ2gA2tEgpnQ8slBKAPQe6wig8TvQvfEIVAOCfVezphTFRtF6CblZtEyx8aCwpzvFCPXcBI9Mc+BgnkFZ9Lm6/GbPpc2HTaQwaRcg/KDtgySazd8q8jZG8+G1pf1sMIhbS7aAjF3BjgXkCd9JG1T9pvqgxyTNi9o5yXcyAfs12iLnJbpT35ddCvnwM7qixOsWiby23HmY6jMXAb59nOndnbcCotklzlDGlo/UCMIzFrOCPCdUGwEWvFyJqocYDB4pP1HHoi3KZMBtyG827S2gqXx+UTs9e9JCxLvFLPJSj45GUvedgCHz6QPw1zdPXGlUrYz2cf+3ERuH+S8gJwBZ1RpYKJlzOkZ+b3sfPmGvgsgpALKqEddC2dAs3W5KUy9dec9bVmKzBUahNhzunzW/i7HVoVlD8g1xETGGK2j0ZnaYeNhqsu7xuhvGM0mwOCg5uu7NDJKaYiB6NPbCapn4307TUGFE79XMFqte+AsSJYsLv+egI0LKgtjWIQCM5JnhmUfKiD1CWYwYW3MOakKDhtTCLqFLp3TWVH3gLHP2XAXhcKoWZGUN6E2qXdkmtbGSJz1M/3+kglVuM98PocYD1FyNSocPlN4qbOWzm8ZHN/R2ilupu3sJvpnTYVrxcP8tKkh1NG0FIA0QKrHXFM6pRq0KPKn1hO8PudxoaaaY2t/y7UWLuhECR2f2ygDTiBduLAHPPdUlGpXcMVy/PkanqxJDT3ycDlmMoeFX0uIUy5QyTalo946jejprzzRagaDz1l92vIdEiacNysZWrHVyESpGEfkw1qHW0Ypn4vzBddP15+OTq1BTdj+XXTMIqN8zqcjW1lL8pkEjOo7eczWDqJ/MRLRUCsZT3olDXBsdSAXHJxJ8DTw1kK05le8IQ7zSsue6xi1HkMYS9r9QGcE+s10bo008w2ZIfLEil+fyL9JgK4wK93kSCOoPhGj2PtJoZfFwFxWtK6DMqAzHdSFKHGkzyhX+eLw14pkPD+LiwRB9NpykNCPGfmZAfkIMxonNJqu+3eaOlTdhehhCZwsfxJvZg0zbef5IAK5rAxQ8oxfporvfEbnNPotWa9iju9w8h0K9BUQZ9JsIdQPrCgTarHGUX6xVBXVooIjKP5raON81kBQzTPH+FYWKWfw+FnJDglxMPjSA3f1wRl+3s/U48lHT/27WpjIcQPcJw4T+AlsFp5Yfm1Mn+m27LNv0vOJMB8eeFS8z7Kxi246j2Ds/rReGWEhLxOi+VtNF5rLUYmi+FqCxajHhUa/NSAdx2/r16dzkr6l/KieEW45D/dkBrrUVV5R/1dVzEmmdBCAnWRShmuLh6pvReE5maW8/jB/R/hQbvLtClNf+sjPaM+KvVtyKHn9QVeebe+aL+f0LPj57fb9jq0dcL/ASrIwWxqzmWKYzXROlcqqhM9lsgR+AdbacPaV+Uveg0KjVpyM5BkJjsiYb/2wpVKsrEzOyyr7QkKnM2gPWRaYZWIhS3CVuZPJKtpgALO8D2AUopwIw/OxrKXXP9MAbFhkiZ8lsn2A5cceXuIqqFzedQ/7yCLL61QqYNY3IiWMB/g0mKVy2MI4nHNmlhjZn9dcjA5mwtmGYfrE8AHDwIHIji54N8COWUKUQlEdxGkBn1FKZaAi+SITtHwwDC9fAhb5VOGisy8NrzJICZkqiU2lbUnLSxbiUVEsChWrgihcF2464BACIFlYs9LVd85T6mG8liUqXoyQUkBuvX5vgVKld8uKWig9WjOJpaShft6wwmKZRM2/19HrDris62QmOwpVcsxFAFKIq8HBQNKpzwkZK/oZ5pguVRWFg+iTCoZjM+OmOkHldXTrNQcaaz5sBR8kc6TeNwhWCwp3FG8rTzPoN8yyEoagXmmMOBINmHN9NHpK3Vl/0rTklfGOZWUZuDtqu4MaL8VylZqQERRH6vAljCyi2ORzSW+EXBbDTVV0ZUVy7MkMkEVeeJLfEmGdJO6Sw7Pe9ElHmvUPOdNS0DHm+JYz4xLjTn0eMtdkrgqXSXVy7gYVqCoWkHRgpwELHmvYxxSx9Qyo61qDFkQMltlg9sByUi3fi44OCyNmcPLFUyZjybj800PeTaNO4tgTaxiGb6Y+EznAaqVA6LYOwvcT35IDft5EViLnow7GxCxbpSRjsq6DIO7ZPpTy5T8twpIOCHPqWmuYaYkmnOXH1mWBoB0wZWUiZPl3MhVH7Gxi2ASefY6EZ4lea55rzVlSLPtS2AXNMKvELBNlgKfOkJmV6BjyqTqb8B4ZGKthX9Ns+QiZbSQAZlajSXaa8JVpt4G9VR+2ILH17Line truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
@@ -428,71 +562,45 @@
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"START = sv.Point(0, 1500)\n",
|
||||
"END = sv.Point(3840, 1500)\n",
|
||||
"\n",
|
||||
"line_zone = sv.LineZone(start=START, end=END)\n",
|
||||
"\n",
|
||||
"line_zone_annotator = sv.LineZoneAnnotator(\n",
|
||||
" thickness=thickness,\n",
|
||||
" text_thickness=thickness,\n",
|
||||
" text_scale=text_scale)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "1fgRF8Wo9UbA"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"video_info = sv.VideoInfo.from_video_path(SOURCE_VIDEO_PATH)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "zTZuQcgV9tJp"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"thickness = sv.calculate_dynamic_line_thickness(resolution_wh=video_info.resolution_wh)\n",
|
||||
"text_scale = sv.calculate_dynamic_text_scale(resolution_wh=video_info.resolution_wh)\n",
|
||||
"\n",
|
||||
"bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=thickness)\n",
|
||||
"label_annotator = sv.LabelAnnotator(text_thickness=thickness, text_scale=text_scale)\n",
|
||||
"trace_annotator = sv.TraceAnnotator(thickness=thickness)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "WpKDAJny9n3D"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"TARGET_VIDEO_PATH = f\"{HOME}/vehicles-result.mp4\""
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Ji0mnnNY8lKe"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"byte_tracker = sv.ByteTrack(frame_rate=video_info.fps)"
|
||||
"byte_tracker = sv.ByteTrack()"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "ayaocyX28ykm"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 18,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"For an even better visualization, we will add another annotator - `sv.TraceAnnotator`, which allows for drawing the path traversed by each object over the last few frames. We will use it in combination with `sv.BoundingBoxAnnotator` and `sv.LabelAnnotator`, which we became familiar with earlier."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "UJwZ8KVSln-_"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=4)\n",
|
||||
"label_annotator = sv.LabelAnnotator(text_thickness=4, text_scale=2)\n",
|
||||
"trace_annotator = sv.TraceAnnotator(thickness=4)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "WpKDAJny9n3D"
|
||||
},
|
||||
"execution_count": 17,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"All the operations we plan to perform for each frame of our video - detection, tracking, annotation, and counting - are encapsulated in a function named `callback`."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "8_slr3hrlX20"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
@@ -526,7 +634,27 @@
|
||||
"metadata": {
|
||||
"id": "-Qs07-Ml-ETD"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 19,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Finally, we are ready to process our entire video. We will use [`sv.process_video`](https://supervision.roboflow.com/develop/utils/video/#supervision.utils.video.process_video) and pass to it the previously defined `SOURCE_VIDEO_PATH`, `TARGET_VIDEO_PATH`, and `callback`."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "h8ip4Nmm5Gcm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"TARGET_VIDEO_PATH = f\"{HOME}/count-objects-crossing-the-line-result.mp4\""
|
||||
],
|
||||
"metadata": {
|
||||
"id": "2RHSS5hAmlnd"
|
||||
},
|
||||
"execution_count": 21,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
@@ -541,8 +669,24 @@
|
||||
"metadata": {
|
||||
"id": "a7F5Ij-Q-TWx"
|
||||
},
|
||||
"execution_count": null,
|
||||
"execution_count": 20,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
" Keep in mind that the video preview below works only in the web version of the cookbooks and not in Google Colab.\n",
|
||||
"\n",
|
||||
"<video controls>\n",
|
||||
" <source\n",
|
||||
" src=\"https://storage.googleapis.com/com-roboflow-marketing/supervision/cookbooks/count-objects-crossing-the-line-result-1280x720.mp4\"\n",
|
||||
" type=\"video/mp4\"\n",
|
||||
" >\n",
|
||||
"</video>"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Oxc4X5S7ffEw"
|
||||
}
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
Vendored
+1
-1
@@ -8,7 +8,7 @@
|
||||
"\n",
|
||||
"---\n",
|
||||
"\n",
|
||||
"[](https://colab.research.google.com/github/roboflow/supervision/blob/main/docs/notebooks/object-tracking.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/roboflow/supervision/blob/develop/docs/notebooks/object-tracking.ipynb)\n",
|
||||
"\n",
|
||||
"In some cases, it's important for us to track objects across multiple frames of a video. For example, we may need to figure out the direction a vehicle is moving, or count objects in a frame. Some Supervision [Annotators](https://supervision.roboflow.com/latest/annotators/) and Tools like [LineZone](https://supervision.roboflow.com/latest/detection/tools/line_zone/) require tracking to be setup. In this cookbook, we'll cover how to get a tracker up and running for use in your computer vision applications.\n",
|
||||
"\n",
|
||||
|
||||
@@ -0,0 +1,894 @@
|
||||
{
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": [],
|
||||
"gpuType": "T4"
|
||||
},
|
||||
"kernelspec": {
|
||||
"name": "python3",
|
||||
"display_name": "Python 3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
},
|
||||
"accelerator": "GPU"
|
||||
},
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# Zero-Shot Object Detection with YOLO-World\n",
|
||||
"---\n",
|
||||
"[](https://colab.research.google.com/github/roboflow/supervision/blob/develop/docs/notebooks/zero-shot-object-detection-with-yolo-world.ipynb)\n",
|
||||
"[](https://blog.roboflow.com/what-is-yolo-world/)\n",
|
||||
"[](https://github.com/AILab-CVC/YOLO-World)\n",
|
||||
"[](https://arxiv.org/abs/2401.17270)\n",
|
||||
"\n",
|
||||
"Click the `Open in Colab` button to run the cookbook on Google Colab.\n",
|
||||
"\n",
|
||||
"<br>\n",
|
||||
"\n",
|
||||
"YOLO-World was designed to solve a limitation of existing zero-shot object detection models: speed. Whereas other state-of-the-art models use Transformers, a powerful but typically slower architecture, YOLO-World uses the faster CNN-based YOLO architecture.\n",
|
||||
"\n",
|
||||
"According to the paper YOLO-World reached between 35.4 AP with 52.0 FPS for the large version and 26.2 AP with 74.1 FPS for the small version. While the V100 is a powerful GPU, achieving such high FPS on any device is impressive.\n",
|
||||
"\n",
|
||||
""
|
||||
],
|
||||
"metadata": {
|
||||
"id": "kR-PyK7YXPVZ"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Before you start\n",
|
||||
"\n",
|
||||
"Let's make sure that we have access to GPU. We can use `nvidia-smi` command to do that. In case of any problems navigate to `Edit` -> `Notebook settings` -> `Hardware accelerator`, set it to `GPU`, and then click `Save`."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "T-lkdAZUY73s"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "mP1Bv5jBXNbw",
|
||||
"outputId": "43cc5b50-9958-447d-f597-9ee510e52792"
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Fri Feb 16 12:46:14 2024 \n",
|
||||
"+---------------------------------------------------------------------------------------+\n",
|
||||
"| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n",
|
||||
"|-----------------------------------------+----------------------+----------------------+\n",
|
||||
"| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
|
||||
"| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n",
|
||||
"| | | MIG M. |\n",
|
||||
"|=========================================+======================+======================|\n",
|
||||
"| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n",
|
||||
"| N/A 65C P8 13W / 70W | 0MiB / 15360MiB | 0% Default |\n",
|
||||
"| | | N/A |\n",
|
||||
"+-----------------------------------------+----------------------+----------------------+\n",
|
||||
" \n",
|
||||
"+---------------------------------------------------------------------------------------+\n",
|
||||
"| Processes: |\n",
|
||||
"| GPU GI CI PID Type Process name GPU Memory |\n",
|
||||
"| ID ID Usage |\n",
|
||||
"|=======================================================================================|\n",
|
||||
"| No running processes found |\n",
|
||||
"+---------------------------------------------------------------------------------------+\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"!nvidia-smi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"**NOTE:** To make it easier for us to manage datasets, images and models we create a `HOME` constant."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "nySApmvdZDEd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"import os\n",
|
||||
"HOME = os.getcwd()\n",
|
||||
"print(HOME)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "JGXqXrQfY2yo",
|
||||
"outputId": "161ad18e-a296-4f27-b9c4-2c1fb68a2fc3"
|
||||
},
|
||||
"execution_count": 2,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"/content\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Install required packages\n",
|
||||
"\n",
|
||||
"In this guide, we utilize two Python packages: `inference`, for executing zero-shot object detection using YOLO-World, and `supervision`, for post-processing and visualizing the detected objects."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "h1jNp-i3ZL0D"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"!pip install -q inference-gpu[yolo-world]==0.9.12rc1"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "zfc06V9QZFup"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"!pip install -q supervision==0.19.0rc3"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "44LZf5qb3bet"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Imports"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "dnEI8EOpalbe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"import cv2\n",
|
||||
"import supervision as sv\n",
|
||||
"\n",
|
||||
"from tqdm import tqdm\n",
|
||||
"from inference.models.yolo_world.yolo_world import YOLOWorld"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "UIcZyEhuacFT"
|
||||
},
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Download example data"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "ULzC4SZdbO-L"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"!wget -P {HOME} -q https://media.roboflow.com/notebooks/examples/dog.jpeg\n",
|
||||
"!wget -P {HOME} -q https://media.roboflow.com/supervision/cookbooks/yellow-filling.mp4"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "29c6jMS1a7NS"
|
||||
},
|
||||
"execution_count": 6,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"SOURCE_IMAGE_PATH = f\"{HOME}/dog.jpeg\"\n",
|
||||
"SOURCE_VIDEO_PATH = f\"{HOME}/yellow-filling.mp4\""
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Kvq4jtTjg31-"
|
||||
},
|
||||
"execution_count": 7,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"**NOTE:** If you want to run the cookbook using your own file as input, simply upload video to Google Colab and replace `SOURCE_IMAGE_PATH` and `SOURCE_VIDEO_PATH` with the path to your file."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "M0_JmZ08gyYg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Run Object Detection\n",
|
||||
"\n",
|
||||
"The Inference package provides the YOLO-World model in three versions: `S`, `M`, and `L`. You can load them by defining model_id as `yolo_world/s`, `yolo_world/m`, and `yolo_world/l`, respectively. The `ROBOFLOW_API_KEY` is not required to utilize this model.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "NLP6DK4YbVpm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"model = YOLOWorld(model_id=\"yolo_world/l\")"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "osrplWqebju0"
|
||||
},
|
||||
"execution_count": 8,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"YOLO-World is a zero-shot model, enabling object detection without any training. You only need to define a prompt as a list of classes (things) you are searching for."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "vzZgYhZodzgS"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"classes = [\"person\", \"backpack\", \"dog\", \"eye\", \"nose\", \"ear\", \"tongue\"]\n",
|
||||
"model.set_classes(classes)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "UZTYuZlAdYhC",
|
||||
"outputId": "89dba6b8-5f80-4802-fe85-27b4b5c66bb3"
|
||||
},
|
||||
"execution_count": 9,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stderr",
|
||||
"text": [
|
||||
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 338M/338M [00:03<00:00, 106MiB/s]\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"We perform detection on our sample image. Then, we convert the result into a [`sv.Detections`](https://supervision.roboflow.com/latest/detection/core/) object, which will be useful in the later parts of the cookbook."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "fXLWvBQNgoV_"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"image = cv2.imread(SOURCE_IMAGE_PATH)\n",
|
||||
"results = model.infer(image)\n",
|
||||
"detections = sv.Detections.from_inference(results)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "ZinEbFJsdp9m"
|
||||
},
|
||||
"execution_count": 10,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"The results we've obtained can be easily visualized with [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/latest/annotators/#supervision.annotators.core.BoundingBoxAnnotator) and [`sv.LabelAnnotator`](https://supervision.roboflow.com/latest/annotators/#supervision.annotators.core.LabelAnnotator). We can adjust parameters such as line thickness, text scale, line and text color allowing for a highly tailored visualization experience."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "jiYw1EXzhpbu"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=2)\n",
|
||||
"LABEL_ANNOTATOR = sv.LabelAnnotator(text_thickness=2, text_scale=1, text_color=sv.Color.BLACK)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "37CMTxw0jSyH"
|
||||
},
|
||||
"execution_count": 11,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"annotated_image = image.copy()\n",
|
||||
"annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"sv.plot_image(annotated_image, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 807
|
||||
},
|
||||
"id": "YkVoWxchher5",
|
||||
"outputId": "ff1dce17-5584-496a-9113-e4d5123489b4"
|
||||
},
|
||||
"execution_count": 12,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Adjusting Confidence Level"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "KrferzhUnOk1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Note that many classes from our prompt were not detected. This is because the default confidence threshold in Inference is set to `0.5`. Let's try significantly lowering this value. We've observed that the confidence returned by YOLO-World is significantly lower when querying for classes outside the [COCO](https://universe.roboflow.com/microsoft/coco) dataset."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "-aBRGrJnlvjN"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"image = cv2.imread(SOURCE_IMAGE_PATH)\n",
|
||||
"results = model.infer(image, confidence=0.003)\n",
|
||||
"detections = sv.Detections.from_inference(results)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "XKAJJQVLiE6y"
|
||||
},
|
||||
"execution_count": 13,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"By default, `sv.LabelAnnotator` displays only the names of objects. To also view the confidence levels associated with each detection, we must define custom `labels` and pass them to `sv.LabelAnnotator`."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "E2UGr46TmiaQ"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"labels = [\n",
|
||||
" f\"{classes[class_id]} {confidence:0.3f}\"\n",
|
||||
" for class_id, confidence\n",
|
||||
" in zip(detections.class_id, detections.confidence)\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"annotated_image = image.copy()\n",
|
||||
"annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections, labels=labels)\n",
|
||||
"sv.plot_image(annotated_image, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 807
|
||||
},
|
||||
"id": "Zw9tE3fKl4R3",
|
||||
"outputId": "857333d8-7279-4a5c-9bb8-8be8584b82c2"
|
||||
},
|
||||
"execution_count": 14,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcUAAAMWCAYAAACA9J0sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9ebxvx1Ef+K0+v3vv23c9rZYlL7Il23g3xou8YAhgthAGEkIgMZgtIWSZZEgmCclMMplPyMwQ1izAQIxxwCzGNmYwNmBsvEjebVmSLVmLbT3p6e3bfffe3+maP6qru7pPn/M7d3l670m3pPt+v99Zeu/6VlVXVxMzMzZpkzZpkzZpkzYJ7mIXYJM2aZM2aZM26VKhTVDcpE3apE3apE0KtAmKm7RJm7RJm7RJgTZBcZM2aZM2aZM2KdAmKG7SJm3SJm3SJgXaBMVN2qRN2qRN2qRAm6C4SZu0SZu0SZsUaBMUN2mTNmmTNmmTAm2C4iZt0iZt0iZtUqDJ2Ad/8ldu61zz3gMAiEj+AEyc6zxDRHDOYTKZwDkCOcA+pkF1mDn/a1P6Nh/nHJqmCd+BxlFMS591zsXvAMDhz3sf02/bFsycrkkK4Q9ZmsyM6XSKtm0xbYHWI6Zh22GIasGDmAHwjPdCsTzlbdX7IFZfjj7K2nAdwY/W+u6FCLjU7afZbQZ4gBj2VS2bcy6OtwkAB+6kVo7hejny8Vm+Y//KtMtrmk785BZEAHPbeU/Lrp+18ul9W9danbRdmBkeU7R0Dg1th1/ehjnMo8EZtCtfwuGHPoMH7r0Lh7/yMK6++mnYte9JWG4ZR48dB7sJdu7ZhwNXXo2rrrkWC9t2wjkHjzBfCor5hXlY9o/3Hm3bdvqh/LRtLukx2BOYKUvP5inXGJOJA1G9L2Lbypu9+ac/jhW1/WLLwMwAu869tm0jn9L69NU5qxMFHsmMtvXw3sO3Oo4AIgeQB9DGMQUg8vWmadA0Tagnx7ZQsn1Tax9bnto4r2GEfc57gD1nZevgCTN+6vu/BrNoNCiWNJZZdScLAAa8TwNQG6xk+Fpx+8lmsDRNkz0/C5TWSlwOUK8QW58Em3S5UerPWc+Uw74EDoCrSZUMd2jM1ASfMc/XKAqJcCDHYHYZQ3FBOq2Brv1eA86yTp284dC4+SD0tSBaBvtFLC6exvETJ3Dy5Gns2XMQ1z7pRuw9+GTATbD76DF4ELbv3I1tO3djYev2xPRWMc2G2nD8JwdZSdPI6yhCBsV7mlWtf5kZ5AiEumCTPYd+/hfrxPk7gPDRPsGg7K/yk6E8WOvCAOyYcAKc7DvjQgFR+TGFtrFlqI6PgTHdB4xlOuXvcjzadhtLo0FxIyR26TArSVgpT5hObIRigNlKJu1TpDhfSEQbSd1OSNfX0/CbdPkRVbrYkTA6F/5qiFiOYaB/zJQTvwY6tXE+xHSIhM0SCeO2oBgZWY/2aUHQ/g1ZLNJcdPDtBGCCwxSuWcF0egqnTh3GsePH0Ey24sqrb8Tuvddg594DoGYOCzv3wDOhmczDzS8AboLWMzwYEaMGpnlNmyvbohRkau0Zrxf1TffzgjB72L6vARrBwbm8HGV5EVPpAmOnzYtr1srQ1yZlW+inZ+W/iGMElGpIJADo2WXlyjREbbPQFrbcfda0vnFX+12rl9aZtJCmbOX3sfSYgaIWznsPMIfBkTq0bdsoaSdgrEt51hwymQSm5PLJvpGkHdq2bfjLzTiboHi505i+YzhKY1ZIlgwcyR+Bexfp+6T+2nPl85ZWO7ZdXKcggHwvKJakgFguQ2jZ+jQQW3ZCA/gGjhnOLYPbMzh//lGcOXsMZ86cxZ6dB7H/iidj596rQHNbwUTYMr8NTA6eCZ4hnwAYFDSo2X3VZ3HS8vZ91jRfcpKl3E+alGhRVmjp5l3vy247dZg9OGMwVeAMAoI1DVpQrAGI5qVKRW4pQDSfAh7MPhQhiHxBInGUj5fSlC756MxApzx27PUBZM1iUWurrI5EsT1qY3I1tGbz6VooFjSaTyHWJrYSbP4OmXftBNWO9d6hcfbJ4v0ZUm23jEAp8emfgiKzi/mNAcQ+jSCv4QiaVfy6orIuemKAPcdu6Jeqde06swuBY4On8WzHLCrfy7RXVdIKw+ujUuKWAg6vT2oe5f0awNjrtXwJhDm3AIcVgM9gaekoTp54CEePPoKFLdtx4OCTsGXHATQLO8FNAwZhuZW1W+caeDC8Za7I+cOQ6azWTiWj7ZS3+HTOobSGqyalrydgbDr5WlOmlr+m8Zc8iopJXAJCTRuuAeOQRUH5qfdeFBQXLCGUBA/RfrVNCWD1B3HDYzDH/k49anWo9UHZn2X5s/ZWAB8Ym2Pn24aD4pDqnkwGQC4MEZyq2l7ZjEfjkjRmwVDT0kHgKK2L2DzLBlKbe3k/aaZpApSTKqrpFNYFzGStmUJW0WAYA4xlyn0dzKtZeNkkoagB1s2bojERGkLW15b5EPX3YsksZ2lo9nNWOkPP6r2kLabfQ2Yqm+awQFe/lgDVwXlC0xCm7SLOnzuOY0cexuLZRezZcy127TmI3fuuhHdz8GHuMTVgBnw7BUO0RKigSqpF1dvF5l/2T16uYRNe1h6BT6V0OGitFMyLFAAyz9P6SZRamu2PatkrjlodBl88YcGidGrpE2z003MQPYjhnGjHriHo5gQihOuJH9vxVQPh2li1vxVYLf9UKp2H+pSavK1dBJQOYK6SHlNNEUgaXkm1yusg1Gs18GEzQ8oG0LyYOXiudSfKEJXSWR/g10C4Vr+NoOE81p7GhdYIL0aeffkWpQiiv0jFqlCJRkCRITROBLcaKNp8KDDKkvGMBZcxdailPWvsMTgImV1A6APXIWGvdOiopQdmMLdo23NYOX8KJ44+jONHjmBhsg0H9l+HfQeuRrNlC5aC052a78KsEtM08jlWa7EhLcK2V195a3WPaRsLQOzrqFERQAJhXACRamEWHL330QPeCiuddg9crU8wUbC2da0910f6jpaRCIBToZCDr0YwWHMys6pwWObbLVu3vLU+svdqfVQ+U867fA2V47wbUszG0AXXFIHUuTkglg2QPu33cqyWTCmZX7vgmElP6A6gPgnRpmNNKbHzjKZo3+sbnH2dvUmXCJFOvjS+tL/1+8Q5TAhhXTGwD5/Pf9FiyvWV8YA4RlCraUT2d28a0byUa0x92tNQOfvudZg4MeYaxnR5EadOHcXRI49guuxx9bXX4cB+2WrBDQEISxKhUdV8mDNYBnNpWOyWpaYlzJrnQ+BfEzqsyRzFmsWgEMGqVSIbX2X5HPWPm1ieQjNdLU/J8iQdqxyEwGAOJg6g6LJtcEk7Wx0vK3l0n9LRl6bdZlSaplWQKNNZrcAAbDQoMncGbU11HzIX2sKLqSE3+ZTPMqMzMKzkYfcgaqP1TgLqmiXK8nvPIJbFZw4IbjujBrpDzHGTLgUS01zUEh3gmiDFQ7435NAYUAQAT7kmoK4g6pgRU+8BxTEg2FviHnDsBTlKlhf7TLklo8xjrUxPsvRYac/h3JnjePTwQzhz6jT27N6PvXuuxPZtewGawxQt0HhgCsTGYx/cO1i2CsgEw5QJTHVXpg7z4/z6EDAO94N6ZKZPRG6SBPzS3FcV0k2+tfuxXK77nB0vRFRi8ZqAMabJgKwfIgCg5OFJhTwH55o4VtYCNGX5avywL10LhN4zvG8rClPxDurgOIY2DBTLjleKQ7gyEPJGArraI4sECQeiJKUEN6NgugDCGnCS34y5wwPw7MUY0wFBc40oKAw62vI1g6ZpgqchwzOBdN9U8JJjQHf6RKBWiI1Au0Zg1FYZ9WZnfnPnRY7/PPGoziRTnxMRHDkxlYaJp25Vslcr9QY5Bwd1Z/dmKHXNpkNMYIgp95mdZ73Tvd/dUF0rT5/JrkvKuVsw+bjS5tCAmNBgDsQtVhYfxukTX8bRI0fBbgd27bse2/ddDbdlO1oQpisrYGI0ydMpmk89xP8gQLmgRTGc1bSpZWYGvHqHczH/snoxhK8Ma8hyu9YWucBbA7rObwpiE1G0TnjOtxMI/3BhNHJcu0yIGp7ywf+ih+H3CeVWy9NrLprVNR0XeJ1IiTInKBMOpEdYZ03yDK40Vd9Yspd9yyAHNE2cbQAzfBgPbRvMpT7wVzDY67wklLISm6KwSrsjmd5oUBxl2qlc8zDStZ2QPlRYB58OfSMNSbPLyi+TC9dkvw+c3CUns4ZTt8TGjoPAoICuXYQHYrliyQwwxqschgm5kL+YGlQDBQn4ClaT9lRIPtXHGN5Sa41QFuriRpdi39t3wwDqJjhsUpJ3L23kXI+mldLQ2cQAOzh2aEBo4oxikOfAjxszkWXiionJh3Gq6eTmdi3rrPIOmcv6y5+vCfabRPNxVzNfDVGn7ByYLImPKJNHQ43M9SlAnuCXl7F89is4cfQBLJ1fwZ4DT8LczmtA2/ZhkQiNc6AAnmzW5yJvZSCBL6SNmeP6HcU5Jg+kiCYOzHJPLEyIQnIyEyZht6xjDmYh86y9c61G/nxvW8a2o1Ad4nwKxjTlZ8sc98Tqq6KlkWwBhLQB+36hqhR+LCBaS5qk6yJP0DVErWdKj5WtwTPDkUTYQmhPAGDf5jze5GfLJJ9BkwnkQ50dxaKIgAPAMzBtfdzLLkpHLrg4I/RxSK9sD+qxMpT0mDvaAKgOHjtJ41pCnNi6hhe8VGGfTZtmZSJ1BwCQM4wxZRv6LukBEfDsH8mMVrPEpUi5ZLpJQj0aGdJ47JPIM/CrpbxGCwFQhseqA5/VVFYrKIwpVzVN8iIYUgNCA+IkRBJawJ/F0tJxnDxxHCeOn8DWbbuxd98V2LNvP+BcYbkJAoYKs6a+eWPUzZL6Pc17I3RmdbDts77xXwOdskylBilvmH2j8dPUndEJb2nTjekZVagcB32ezTVzYgTIEe3RZ262IDukLXfT0/onUjNpXPoKzLine truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Using Non-Max Suppression (NMS) to Eliminate Double Detections\n",
|
||||
"\n",
|
||||
"To eliminate duplicates, we will use [Non-Max Suppression (NMS)](https://blog.roboflow.com/how-to-code-non-maximum-suppression-nms-in-plain-numpy). NMS evaluates the extent to which detections overlap using the Intersection over Union metric and, upon exceeding a defined threshold, treats them as duplicates. Duplicates are then discarded, starting with those of the lowest confidence. The value should be within the range `[0, 1]`. The smaller the value, the more restrictive the NMS.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "t88HE-7FofwJ"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"image = cv2.imread(SOURCE_IMAGE_PATH)\n",
|
||||
"results = model.infer(image, confidence=0.003)\n",
|
||||
"detections = sv.Detections.from_inference(results).with_nms(threshold=0.1)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "pyyjlCkAl9g6"
|
||||
},
|
||||
"execution_count": 15,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"labels = [\n",
|
||||
" f\"{classes[class_id]} {confidence:0.3f}\"\n",
|
||||
" for class_id, confidence\n",
|
||||
" in zip(detections.class_id, detections.confidence)\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"annotated_image = image.copy()\n",
|
||||
"annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections, labels=labels)\n",
|
||||
"sv.plot_image(annotated_image, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 807
|
||||
},
|
||||
"id": "no-BoxjTpJt1",
|
||||
"outputId": "30322755-e956-4093-e302-785258476849"
|
||||
},
|
||||
"execution_count": 16,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Video Processing"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "S-LLI26VvF7B"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"The [`get_video_frames_generator`](https://supervision.roboflow.com/latest/utils/video/#supervision.utils.video.get_video_frames_generator) enables us to easily iterate over video frames. Let's create a video generator for our sample input file and display its first frame on the screen."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "E0rhepjGv9oe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"generator = sv.get_video_frames_generator(SOURCE_VIDEO_PATH)\n",
|
||||
"frame = next(generator)\n",
|
||||
"\n",
|
||||
"sv.plot_image(frame, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 472
|
||||
},
|
||||
"id": "J2Tm9lcGpLF1",
|
||||
"outputId": "94629d68-9266-474e-e311-cd311457816f"
|
||||
},
|
||||
"execution_count": 17,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Let's update our list of classes. This time we are looking for `yellow filling`. The rest of the code performing detection, filtering and visualization remains unchanged."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Su3lwi6D62sR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"classes = [\"yellow filling\"]\n",
|
||||
"model.set_classes(classes)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "bddF-z6WwAkD"
|
||||
},
|
||||
"execution_count": 23,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"results = model.infer(frame, confidence=0.002)\n",
|
||||
"detections = sv.Detections.from_inference(results).with_nms(threshold=0.1)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "xQ0kV9huwmoM"
|
||||
},
|
||||
"execution_count": 38,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"annotated_image = frame.copy()\n",
|
||||
"annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"sv.plot_image(annotated_image, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 472
|
||||
},
|
||||
"id": "AfWCMuq5wsuY",
|
||||
"outputId": "2a1ede5e-8e19-4d65-90a7-4579f0115183"
|
||||
},
|
||||
"execution_count": 39,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Filtering Detectuions by Area"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "CwI09wuYCztj"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Our prompt allowed us to locate all filled holes, but we also accidentally marked the entire high-level element. To address this issue, we'll filter detections based on their relative area in relation to the entire video frame. If a detection occupies more than 10% of the frame's total area, it will be discarded."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "TVAulRgE-idz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"We can use [`VideoInfo.from_video_path`](https://supervision.roboflow.com/develop/utils/video/#supervision.utils.video.VideoInfo) to learn basic information about our video, such as duration, resolution, or FPS."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "OX4l0ofl_Pe4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"video_info = sv.VideoInfo.from_video_path(SOURCE_VIDEO_PATH)\n",
|
||||
"video_info"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "LV99lGQJ_JzT",
|
||||
"outputId": "0683435f-a3cb-418f-b1b9-f94d299192f3"
|
||||
},
|
||||
"execution_count": 40,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"VideoInfo(width=1280, height=720, fps=25, total_frames=442)"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 40
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Knowing the frame's resolution allows us to easily calculate its total area, expressed in pixels."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "IGckLMVR_4kp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"width, height = video_info.resolution_wh\n",
|
||||
"frame_area = width * height\n",
|
||||
"frame_area"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "8aJBl-Rc_xUP",
|
||||
"outputId": "c4b2798b-c5c6-429c-8886-02b4f7af3924"
|
||||
},
|
||||
"execution_count": 41,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"921600"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 41
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"On the other hand, by using [`sv.Detections.area`](https://supervision.roboflow.com/develop/detection/core/#supervision.detection.core.Detections.area) property, we can learn the area of each individual bounding box."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Y_LO4ODXAntj"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"results = model.infer(frame, confidence=0.002)\n",
|
||||
"detections = sv.Detections.from_inference(results).with_nms(threshold=0.1)\n",
|
||||
"detections.area"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "B9PQhXf__TNW",
|
||||
"outputId": "dc096dd6-a93d-4599-e6d8-9d475a54b999"
|
||||
},
|
||||
"execution_count": 45,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([ 7.5408e+05, 92844, 11255, 12969, 9875.9, 8007.7, 5433.5])"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 45
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Now, we can combine these two pieces of information to construct a filtering condition for detections with an area greater than 10% of the entire frame."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "LAnsLumrBZNw"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"(detections.area / frame_area) < 0.10"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "lD9ONsS9BRov",
|
||||
"outputId": "100d1d15-eba3-47ed-823b-b8756e13c123"
|
||||
},
|
||||
"execution_count": 46,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([False, False, True, True, True, True, True])"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 46
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"detections = detections[(detections.area / frame_area) < 0.10]\n",
|
||||
"\n",
|
||||
"annotated_image = frame.copy()\n",
|
||||
"annotated_image = BOUNDING_BOX_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"annotated_image = LABEL_ANNOTATOR.annotate(annotated_image, detections)\n",
|
||||
"sv.plot_image(annotated_image, (10, 10))"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/",
|
||||
"height": 472
|
||||
},
|
||||
"id": "XzE7wjwE_bOR",
|
||||
"outputId": "5df62911-a001-46a4-a16c-8cdab7608e2e"
|
||||
},
|
||||
"execution_count": 47,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "display_data",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"<Figure size 1000x1000 with 1 Axes>"
|
||||
],
|
||||
"image/png": "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 truncated
|
||||
},
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Final Result"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "7SjPoFnLC9aI"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Finally, we are ready to process our entire video. Now in truth we can appreciate the speed of YOLO-World."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "WxwNMXGECodq"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"TARGET_VIDEO_PATH = f\"{HOME}/yellow-filling-output.mp4\""
|
||||
],
|
||||
"metadata": {
|
||||
"id": "p0aooVpaCSH3"
|
||||
},
|
||||
"execution_count": 49,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"frame_generator = sv.get_video_frames_generator(SOURCE_VIDEO_PATH)\n",
|
||||
"video_info = sv.VideoInfo.from_video_path(SOURCE_VIDEO_PATH)\n",
|
||||
"\n",
|
||||
"width, height = video_info.resolution_wh\n",
|
||||
"frame_area = width * height\n",
|
||||
"frame_area\n",
|
||||
"\n",
|
||||
"with sv.VideoSink(target_path=TARGET_VIDEO_PATH, video_info=video_info) as sink:\n",
|
||||
" for frame in tqdm(frame_generator, total=video_info.total_frames):\n",
|
||||
" results = model.infer(frame, confidence=0.002)\n",
|
||||
" detections = sv.Detections.from_inference(results).with_nms(threshold=0.1)\n",
|
||||
" detections = detections[(detections.area / frame_area) < 0.10]\n",
|
||||
"\n",
|
||||
" annotated_frame = frame.copy()\n",
|
||||
" annotated_frame = BOUNDING_BOX_ANNOTATOR.annotate(annotated_frame, detections)\n",
|
||||
" annotated_frame = LABEL_ANNOTATOR.annotate(annotated_frame, detections)\n",
|
||||
" sink.write_frame(annotated_frame)"
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"base_uri": "https://localhost:8080/"
|
||||
},
|
||||
"id": "A8TzekpEwtTO",
|
||||
"outputId": "cf71b8e7-00af-4b7b-c912-9157ced6b6c4"
|
||||
},
|
||||
"execution_count": 50,
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stderr",
|
||||
"text": [
|
||||
"100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 442/442 [00:31<00:00, 13.90it/s]\n"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
" Keep in mind that the video preview below works only in the web version of the cookbooks and not in Google Colab.\n",
|
||||
"\n",
|
||||
"<video controls>\n",
|
||||
" <source\n",
|
||||
" src=\"https://storage.googleapis.com/com-roboflow-marketing/supervision/cookbooks/yellow-filling-output-1280x720.mp4\"\n",
|
||||
" type=\"video/mp4\"\n",
|
||||
" >\n",
|
||||
"</video>"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "vMp9mSj1DGJ9"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
+2
-1
@@ -12,7 +12,8 @@
|
||||
</div>
|
||||
<div class="custom-grid">
|
||||
<p class="card repo-card" data-url="/develop/notebooks/quickstart" data-name="Supervision Quickstart" data-labels="ANNOTATOR,DETECTION,SAM" data-version="v0.18.0" data-author="SkalskiP,onuralpszr"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/count-objects-crossing-the-line" data-name="Count Objects Crossing the Line" data-labels="ANNOTATORS,LINE ZONE,YOLOv8,TRACKING" data-version="v0.18.0" data-author="SkalskiP"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/count-objects-crossing-the-line" data-name="Count Objects Crossing the Line" data-labels="ANNOTATORS,LINE ZONE,TRACKING" data-version="v0.18.0" data-author="SkalskiP"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/zero-shot-object-detection-with-yolo-world" data-name="Zero-Shot Object Detection with YOLO-World" data-labels="ANNOTATORS,DETECTION,INFERENCE" data-version="v0.19.0" data-author="SkalskiP"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/download-supervision-assets" data-name="Downloading Supervision Assets" data-labels="ASSETS" data-version="v0.18.0" data-author="nickherrig"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/annotate-video-with-detections" data-name="Annotate Video with Detections" data-labels="INFERENCE,YOLOV8" data-version="v0.18.0" data-author="nickherrig"></p>
|
||||
<p class="card repo-card" data-url="/develop/notebooks/object-tracking" data-name="Object Tracking" data-labels="TRACKING, ANNOTATOR" data-version="v0.18.0" data-author="nickherrig"></p>
|
||||
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
{% extends "main.html" %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
.md-content__button {
|
||||
display: none;
|
||||
}
|
||||
#logo {
|
||||
position: relative;
|
||||
top: -60px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
Generated
+190
-134
@@ -698,44 +698,44 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"]
|
||||
|
||||
[[package]]
|
||||
name = "cryptography"
|
||||
version = "42.0.0"
|
||||
version = "42.0.4"
|
||||
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{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"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-win32.whl", hash = "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925"},
|
||||
{file = "cryptography-42.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-win32.whl", hash = "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129"},
|
||||
{file = "cryptography-42.0.4-cp39-abi3-win_amd64.whl", hash = "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854"},
|
||||
{file = "cryptography-42.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298"},
|
||||
{file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88"},
|
||||
{file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20"},
|
||||
{file = "cryptography-42.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce"},
|
||||
{file = "cryptography-42.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74"},
|
||||
{file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd"},
|
||||
{file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b"},
|
||||
{file = "cryptography-42.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660"},
|
||||
{file = "cryptography-42.0.4.tar.gz", hash = "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1069,6 +1069,62 @@ files = [
|
||||
[package.dependencies]
|
||||
colorama = ">=0.4"
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
version = "0.14.0"
|
||||
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
|
||||
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "1.0.2"
|
||||
description = "A minimal low-level HTTP client."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"},
|
||||
{file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
certifi = "*"
|
||||
h11 = ">=0.13,<0.15"
|
||||
|
||||
[package.extras]
|
||||
asyncio = ["anyio (>=4.0,<5.0)"]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
socks = ["socksio (==1.*)"]
|
||||
trio = ["trio (>=0.22.0,<0.23.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "httpx"
|
||||
version = "0.26.0"
|
||||
description = "The next generation HTTP client."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"},
|
||||
{file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
anyio = "*"
|
||||
certifi = "*"
|
||||
httpcore = "==1.*"
|
||||
idna = "*"
|
||||
sniffio = "*"
|
||||
|
||||
[package.extras]
|
||||
brotli = ["brotli", "brotlicffi"]
|
||||
cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
socks = ["socksio (==1.*)"]
|
||||
|
||||
[[package]]
|
||||
name = "identify"
|
||||
version = "2.5.33"
|
||||
@@ -1551,18 +1607,19 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>
|
||||
|
||||
[[package]]
|
||||
name = "jupyterlab"
|
||||
version = "4.0.11"
|
||||
version = "4.1.1"
|
||||
description = "JupyterLab computational environment"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "jupyterlab-4.0.11-py3-none-any.whl", hash = "sha256:536bf0e78723153a5016ca7efb88ed0ecd7070d3f1555d5b0e2770658f900a3c"},
|
||||
{file = "jupyterlab-4.0.11.tar.gz", hash = "sha256:d1aec24712566bc25a36229788242778e498ca4088028e2f9aa156b8b7fdc8fc"},
|
||||
{file = "jupyterlab-4.1.1-py3-none-any.whl", hash = "sha256:fa3e8c18b804eac04e51ceebd9dd3dd396e08106816f0d09cc426799d7087632"},
|
||||
{file = "jupyterlab-4.1.1.tar.gz", hash = "sha256:8acc9f561729d8f32c14c294c397917cddfeeb13a5d46f811979b71b4911a9fd"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
async-lru = ">=1.0.0"
|
||||
httpx = ">=0.25.0"
|
||||
importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
|
||||
importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""}
|
||||
ipykernel = "*"
|
||||
@@ -1578,9 +1635,9 @@ tornado = ">=6.2.0"
|
||||
traitlets = "*"
|
||||
|
||||
[package.extras]
|
||||
dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"]
|
||||
docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"]
|
||||
docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"]
|
||||
dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"]
|
||||
docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"]
|
||||
docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"]
|
||||
test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"]
|
||||
|
||||
[[package]]
|
||||
@@ -1919,59 +1976,59 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "matplotlib"
|
||||
version = "3.7.4"
|
||||
version = "3.7.5"
|
||||
description = "Python plotting package"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:b71079239bd866bf56df023e5146de159cb0c7294e508830901f4d79e2d89385"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bf91a42f6274a64cb41189120b620c02e574535ff6671fa836cade7701b06fbd"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f757e8b42841d6add0cb69b42497667f0d25a404dcd50bd923ec9904e38414c4"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dfee00aa4bd291e08bb9461831c26ce0da85ca9781bb8794f2025c6e925281"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3640f33632beb3993b698b1be9d1c262b742761d6101f3c27b87b2185d25c875"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff539c4a17ecdf076ed808ee271ffae4a30dcb7e157b99ccae2c837262c07db6"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-win32.whl", hash = "sha256:24b8f28af3e766195c09b780b15aa9f6710192b415ae7866b9c03dee7ec86370"},
|
||||
{file = "matplotlib-3.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fa193286712c3b6c3cfa5fe8a6bb563f8c52cc750006c782296e0807ce5e799"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:b167f54cb4654b210c9624ec7b54e2b3b8de68c93a14668937e7e53df60770ec"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7dfe6821f1944cb35603ff22e21510941bbcce7ccf96095beffaac890d39ce77"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c557d9165320dff3c5f2bb99bfa0b6813d3e626423ff71c40d6bc23b83c3339"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08372696b3bb45c563472a552a705bfa0942f0a8ffe084db8a4e8f9153fbdf9d"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81e1a7ac818000e8ac3ca696c3fdc501bc2d3adc89005e7b4e22ee5e9d51de98"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390920a3949906bc4b0216198d378f2a640c36c622e3584dd0c79a7c59ae9f50"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-win32.whl", hash = "sha256:62e094d8da26294634da9e7f1856beee3978752b1b530c8e1763d2faed60cc10"},
|
||||
{file = "matplotlib-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:f8fc2df756105784e650605e024d36dc2d048d68e5c1b26df97ee25d1bd41f9f"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:568574756127791903604e315c11aef9f255151e4cfe20ec603a70f9dda8e259"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7d479aac338195e2199a8cfc03c4f2f55914e6a120177edae79e0340a6406457"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32183d4be84189a4c52b4b8861434d427d9118db2cec32986f98ed6c02dcfbb6"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0037d066cca1f4bda626c507cddeb6f7da8283bc6a214da2db13ff2162933c52"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44856632ebce88abd8efdc0a0dceec600418dcac06b72ae77af0019d260aa243"},
|
||||
{file = "matplotlib-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:632fc938c22117d4241411191cfb88ac264a4c0a9ac702244641ddf30f0d739c"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:ce163be048613b9d1962273708cc97e09ca05d37312e670d166cf332b80bbaff"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e680f49bb8052ba3b2698e370155d2b4afb49f9af1cc611a26579d5981e2852a"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0604880e4327114054199108b7390f987f4f40ee5ce728985836889e11a780ba"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e6abcde6fc52475f9d6a12b9f1792aee171ce7818ef6df5d61cb0b82816e6e8"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f59a70e2ec3212033ef6633ed07682da03f5249379722512a3a2a26a7d9a738e"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a9981b2a2dd9da06eca4ab5855d09b54b8ce7377c3e0e3957767b83219d652d"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-win32.whl", hash = "sha256:83859ac26839660ecd164ee8311272074250b915ac300f9b2eccc84410f8953b"},
|
||||
{file = "matplotlib-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:7a7709796ac59fe8debde68272388be6ed449c8971362eb5b60d280eac8dadde"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:b1d70bc1ea1bf110bec64f4578de3e14947909a8887df4c1fd44492eca487955"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c83f49e795a5de6c168876eea723f5b88355202f9603c55977f5356213aa8280"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c9133f230945fe10652eb33e43642e933896194ef6a4f8d5e79bb722bdb2000"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798ff59022eeb276380ce9a73ba35d13c3d1499ab9b73d194fd07f1b0a41c304"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1707b20b25e90538c2ce8d4409e30f0ef1df4017cc65ad0439633492a973635b"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e6227ca8492baeef873cdd8e169a318efb5c3a25ce94e69727e7f964995b0b1"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-win32.whl", hash = "sha256:5661c8639aded7d1bbf781373a359011cb1dd09199dee49043e9e68dd16f07ba"},
|
||||
{file = "matplotlib-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:55eec941a4743f0bd3e5b8ee180e36b7ea8e62f867bf2613937c9f01b9ac06a2"},
|
||||
{file = "matplotlib-3.7.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab16868714e5cc90ec8f7ff5d83d23bcd6559224d8e9cb5227c9f58748889fe8"},
|
||||
{file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c698b33f9a3f0b127a8e614c8fb4087563bb3caa9c9d95298722fa2400cdd3f"},
|
||||
{file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be3493bbcb4d255cb71de1f9050ac71682fce21a56089eadbcc8e21784cb12ee"},
|
||||
{file = "matplotlib-3.7.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f8c725d1dd2901b2e7ec6cd64165e00da2978cc23d4143cb9ef745bec88e6b04"},
|
||||
{file = "matplotlib-3.7.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:286332f8f45f8ffde2d2119b9fdd42153dccd5025fa9f451b4a3b5c086e26da5"},
|
||||
{file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:116ef0b43aa00ff69260b4cce39c571e4b8c6f893795b708303fa27d9b9d7548"},
|
||||
{file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90590d4b46458677d80bc3218f3f1ac11fc122baa9134e0cb5b3e8fc3714052"},
|
||||
{file = "matplotlib-3.7.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de7c07069687be64fd9d119da3122ba13a8d399eccd3f844815f0dc78a870b2c"},
|
||||
{file = "matplotlib-3.7.4.tar.gz", hash = "sha256:7cd4fef8187d1dd0d9dcfdbaa06ac326d396fb8c71c647129f0bf56835d77026"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"},
|
||||
{file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"},
|
||||
{file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"},
|
||||
{file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"},
|
||||
{file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"},
|
||||
{file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"},
|
||||
{file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"},
|
||||
{file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"},
|
||||
{file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"},
|
||||
{file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"},
|
||||
{file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"},
|
||||
{file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"},
|
||||
{file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"},
|
||||
{file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"},
|
||||
{file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2132,14 +2189,14 @@ mkdocs = ">=1.1"
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs-git-committers-plugin-2"
|
||||
version = "2.2.3"
|
||||
version = "2.3.0"
|
||||
description = "An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8,<4"
|
||||
files = [
|
||||
{file = "mkdocs-git-committers-plugin-2-2.2.3.tar.gz", hash = "sha256:e0dddef4e3e321d97bcb83123fd963a839d9f9fa801c3125efeb6544bd8b247c"},
|
||||
{file = "mkdocs_git_committers_plugin_2-2.2.3-py3-none-any.whl", hash = "sha256:0f20d61a9315174f30d5a0266d4a457d3d88909ca5c5bd7d0e0dd2e1841f2af0"},
|
||||
{file = "mkdocs-git-committers-plugin-2-2.3.0.tar.gz", hash = "sha256:d6baca1ae04db8120640038eda8142f2d081c27b53f3b566c83c75717e4ed81a"},
|
||||
{file = "mkdocs_git_committers_plugin_2-2.3.0-py3-none-any.whl", hash = "sha256:7b3434af3be525c12858eb3b44b4c6b695b7c7b7760482ea8de1c6e292e84f0f"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2190,14 +2247,14 @@ test = ["coverage[toml]", "pymdown-extensions", "pytest", "pytest-cov"]
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs-material"
|
||||
version = "9.5.8"
|
||||
version = "9.5.11"
|
||||
description = "Documentation that simply works"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "mkdocs_material-9.5.8-py3-none-any.whl", hash = "sha256:14563314bbf97da4bfafc69053772341babfaeb3329cde01d3e63cec03997af8"},
|
||||
{file = "mkdocs_material-9.5.8.tar.gz", hash = "sha256:2a429213e83f84eda7a588e2b186316d806aac602b7f93990042f7a1f3d3cf65"},
|
||||
{file = "mkdocs_material-9.5.11-py3-none-any.whl", hash = "sha256:788ee0f3e036dca2dc20298d65e480297d348a44c9d7b2ee05c5262983e66072"},
|
||||
{file = "mkdocs_material-9.5.11.tar.gz", hash = "sha256:7af7f8af0dea16175558f3fb9245d26c83a17199baa5f157755e63d7437bf971"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2375,14 +2432,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=
|
||||
|
||||
[[package]]
|
||||
name = "nbconvert"
|
||||
version = "7.16.0"
|
||||
description = "Converting Jupyter Notebooks"
|
||||
category = "dev"
|
||||
version = "7.16.1"
|
||||
description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "nbconvert-7.16.0-py3-none-any.whl", hash = "sha256:ad3dc865ea6e2768d31b7eb6c7ab3be014927216a5ece3ef276748dd809054c7"},
|
||||
{file = "nbconvert-7.16.0.tar.gz", hash = "sha256:813e6553796362489ae572e39ba1bff978536192fb518e10826b0e8cadf03ec8"},
|
||||
{file = "nbconvert-7.16.1-py3-none-any.whl", hash = "sha256:3188727dffadfdc9c6a1c7250729063d7bc78b355ad7aa023138afa030d1cd07"},
|
||||
{file = "nbconvert-7.16.1.tar.gz", hash = "sha256:e79e6a074f49ba3ed29428ed86487bf51509d9aab613bd8522ac08f6d28fd7fd"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2489,19 +2545,19 @@ setuptools = "*"
|
||||
|
||||
[[package]]
|
||||
name = "notebook"
|
||||
version = "7.0.7"
|
||||
version = "7.1.0"
|
||||
description = "Jupyter Notebook - A web-based notebook environment for interactive computing"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"},
|
||||
{file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"},
|
||||
{file = "notebook-7.1.0-py3-none-any.whl", hash = "sha256:a8fa4ccb5e5fe220f29d9900337efd7752bc6f2efe004d6f320db01f7743adc9"},
|
||||
{file = "notebook-7.1.0.tar.gz", hash = "sha256:99caf01ff166b1cc86355c9b37c1ba9bf566c1d7fc4ab57bb6f8f24e36c4260e"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
jupyter-server = ">=2.4.0,<3"
|
||||
jupyterlab = ">=4.0.2,<5"
|
||||
jupyterlab = ">=4.1.1,<4.2"
|
||||
jupyterlab-server = ">=2.22.1,<3"
|
||||
notebook-shim = ">=0.2,<0.3"
|
||||
tornado = ">=6.2.0"
|
||||
@@ -3074,14 +3130,14 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "8.0.0"
|
||||
version = "8.0.2"
|
||||
description = "pytest: simple powerful testing with Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"},
|
||||
{file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"},
|
||||
{file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"},
|
||||
{file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -3706,29 +3762,29 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.2.1"
|
||||
version = "0.2.2"
|
||||
description = "An extremely fast Python linter and code formatter, written in Rust."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"},
|
||||
{file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"},
|
||||
{file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"},
|
||||
{file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"},
|
||||
{file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"},
|
||||
{file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"},
|
||||
{file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"},
|
||||
{file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"},
|
||||
{file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"},
|
||||
{file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"},
|
||||
{file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"},
|
||||
{file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"},
|
||||
{file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"},
|
||||
{file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"},
|
||||
{file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"},
|
||||
{file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"},
|
||||
{file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"},
|
||||
{file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"},
|
||||
{file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"},
|
||||
{file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"},
|
||||
{file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"},
|
||||
{file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4019,14 +4075,14 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "tox"
|
||||
version = "4.12.1"
|
||||
version = "4.13.0"
|
||||
description = "tox is a generic virtualenv management and test command line tool"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "tox-4.12.1-py3-none-any.whl", hash = "sha256:c07ea797880a44f3c4f200ad88ad92b446b83079d4ccef89585df64cc574375c"},
|
||||
{file = "tox-4.12.1.tar.gz", hash = "sha256:61aafbeff1bd8a5af84e54ef6e8402f53c6a6066d0782336171ddfbf5362122e"},
|
||||
{file = "tox-4.13.0-py3-none-any.whl", hash = "sha256:1143c7e2489c68026a55d3d4ae84c02c449f073b28e62f80e3e440a3b72a4afa"},
|
||||
{file = "tox-4.13.0.tar.gz", hash = "sha256:dd789a554c16c4b532924ba393c92fc8991323c4b3d466712bfecc8c9b9f24f7"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -4047,14 +4103,14 @@ testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-po
|
||||
|
||||
[[package]]
|
||||
name = "tqdm"
|
||||
version = "4.66.1"
|
||||
version = "4.66.2"
|
||||
description = "Fast, Extensible Progress Meter"
|
||||
category = "main"
|
||||
optional = true
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"},
|
||||
{file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"},
|
||||
{file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"},
|
||||
{file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -4084,14 +4140,14 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,
|
||||
|
||||
[[package]]
|
||||
name = "twine"
|
||||
version = "4.0.2"
|
||||
version = "5.0.0"
|
||||
description = "Collection of utilities for publishing packages on PyPI"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "twine-4.0.2-py3-none-any.whl", hash = "sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8"},
|
||||
{file = "twine-4.0.2.tar.gz", hash = "sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8"},
|
||||
{file = "twine-5.0.0-py3-none-any.whl", hash = "sha256:a262933de0b484c53408f9edae2e7821c1c45a3314ff2df9bdd343aa7ab8edc0"},
|
||||
{file = "twine-5.0.0.tar.gz", hash = "sha256:89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -4344,4 +4400,4 @@ desktop = ["opencv-python"]
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.8"
|
||||
content-hash = "844f11f37895e0e56d43bd31f189e84e64c21248e120260a067597c822f35cc1"
|
||||
content-hash = "d635be9c5f61a2af5901d9ad00f31cdb714074ab5d5537e8280214d9d98aed64"
|
||||
+2
-3
@@ -43,15 +43,14 @@ defusedxml = "^0.7.1"
|
||||
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 }
|
||||
tqdm = { version = ">=4.62.3,<=4.66.1", optional = true }
|
||||
pillow = "^10.2.0"
|
||||
tqdm = { version = ">=4.62.3,<=4.66.2", optional = true }
|
||||
|
||||
[tool.poetry.extras]
|
||||
desktop = ["opencv-python"]
|
||||
assets = ["requests","tqdm"]
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
twine = "^4.0.2"
|
||||
twine = ">=4.0.2,<6.0.0"
|
||||
pytest = ">=7.2.2,<9.0.0"
|
||||
wheel = ">=0.40,<0.43"
|
||||
build = ">=0.10,<1.1"
|
||||
|
||||
@@ -35,7 +35,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.line_zone import LineZone, LineZoneAnnotator
|
||||
from supervision.detection.tools.csv_sink import CSVSink
|
||||
from supervision.detection.tools.inference_slicer import InferenceSlicer
|
||||
from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator
|
||||
|
||||
@@ -973,6 +973,20 @@ class LabelAnnotator:
|
||||
center_x + text_w // 2,
|
||||
center_y + text_h,
|
||||
)
|
||||
elif position == Position.CENTER_LEFT:
|
||||
return (
|
||||
center_x - text_w,
|
||||
center_y - text_h // 2,
|
||||
center_x,
|
||||
center_y + text_h // 2,
|
||||
)
|
||||
elif position == Position.CENTER_RIGHT:
|
||||
return (
|
||||
center_x,
|
||||
center_y - text_h // 2,
|
||||
center_x + text_w,
|
||||
center_y + text_h // 2,
|
||||
)
|
||||
|
||||
@scene_to_annotator_img_type
|
||||
def annotate(
|
||||
|
||||
@@ -487,7 +487,9 @@ class Detections:
|
||||
)
|
||||
|
||||
if np.asarray(xyxy).shape[0] == 0:
|
||||
return cls.empty()
|
||||
empty_detection = cls.empty()
|
||||
empty_detection.data = {CLASS_NAME_DATA_FIELD: np.empty(0)}
|
||||
return empty_detection
|
||||
|
||||
return cls(
|
||||
xyxy=xyxy,
|
||||
|
||||
@@ -14,6 +14,12 @@ class LineZone:
|
||||
This class is responsible for counting the number of objects that cross a
|
||||
predefined line.
|
||||
|
||||
<video controls>
|
||||
<source
|
||||
src="https://media.roboflow.com/supervision/cookbooks/count-objects-crossing-the-line-result-1280x720.mp4"
|
||||
type="video/mp4">
|
||||
</video>
|
||||
|
||||
!!! warning
|
||||
|
||||
LineZone uses the `tracker_id`. Read
|
||||
@@ -25,7 +31,28 @@ class LineZone:
|
||||
to inside.
|
||||
out_count (int): The number of objects that have crossed the line from inside
|
||||
to outside.
|
||||
"""
|
||||
|
||||
Example:
|
||||
```python
|
||||
import supervision as sv
|
||||
from ultralytics import YOLO
|
||||
|
||||
model = YOLO(<SOURCE_MODEL_PATH>)
|
||||
tracker = sv.ByteTrack()
|
||||
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
|
||||
start, end = sv.Point(x=0, y=1080), sv.Point(x=3840, y=1080)
|
||||
line_zone = sv.LineZone(start=start, end=end)
|
||||
|
||||
for frame in frames_generator:
|
||||
result = model(frame)[0]
|
||||
detections = sv.Detections.from_ultralytics(result)
|
||||
detections = tracker.update_with_detections(detections)
|
||||
crossed_in, crossed_out = line_zone.trigger(detections)
|
||||
|
||||
line_zone.in_count, line_zone.out_count
|
||||
# 7, 2
|
||||
```
|
||||
""" # noqa: E501 // docs
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -59,8 +59,11 @@ def box_iou_batch(boxes_true: np.ndarray, boxes_detection: np.ndarray) -> np.nda
|
||||
return area_inter / (area_true[:, None] + area_detection - area_inter)
|
||||
|
||||
|
||||
def mask_iou_batch(masks_true: np.ndarray, masks_detection: np.ndarray) -> np.ndarray:
|
||||
def _mask_iou_batch_split(
|
||||
masks_true: np.ndarray, masks_detection: np.ndarray
|
||||
) -> np.ndarray:
|
||||
"""
|
||||
Internal function.
|
||||
Compute Intersection over Union (IoU) of two sets of masks -
|
||||
`masks_true` and `masks_detection`.
|
||||
|
||||
@@ -74,9 +77,9 @@ def mask_iou_batch(masks_true: np.ndarray, masks_detection: np.ndarray) -> np.nd
|
||||
intersection_area = np.logical_and(masks_true[:, None], masks_detection).sum(
|
||||
axis=(2, 3)
|
||||
)
|
||||
|
||||
masks_true_area = masks_true.sum(axis=(1, 2))
|
||||
masks_detection_area = masks_detection.sum(axis=(1, 2))
|
||||
|
||||
union_area = masks_true_area[:, None] + masks_detection_area - intersection_area
|
||||
|
||||
return np.divide(
|
||||
@@ -87,6 +90,48 @@ def mask_iou_batch(masks_true: np.ndarray, masks_detection: np.ndarray) -> np.nd
|
||||
)
|
||||
|
||||
|
||||
def mask_iou_batch(
|
||||
masks_true: np.ndarray,
|
||||
masks_detection: np.ndarray,
|
||||
memory_limit: int = 1024 * 1024 * 5,
|
||||
) -> np.ndarray:
|
||||
"""
|
||||
Compute Intersection over Union (IoU) of two sets of masks -
|
||||
`masks_true` and `masks_detection`.
|
||||
|
||||
Args:
|
||||
masks_true (np.ndarray): 3D `np.ndarray` representing ground-truth masks.
|
||||
masks_detection (np.ndarray): 3D `np.ndarray` representing detection masks.
|
||||
memory_limit (int, optional): memory limit in bytes, default is 5GB.
|
||||
|
||||
Returns:
|
||||
np.ndarray: Pairwise IoU of masks from `masks_true` and `masks_detection`.
|
||||
"""
|
||||
memory = (
|
||||
masks_true.shape[0]
|
||||
* masks_true.shape[1]
|
||||
* masks_true.shape[2]
|
||||
* masks_detection.shape[0]
|
||||
)
|
||||
if memory <= memory_limit: # 5GB memory
|
||||
return _mask_iou_batch_split(masks_true, masks_detection)
|
||||
|
||||
ious = []
|
||||
step = max(
|
||||
memory_limit
|
||||
// (
|
||||
masks_detection.shape[0]
|
||||
* masks_detection.shape[1]
|
||||
* masks_detection.shape[2]
|
||||
),
|
||||
1,
|
||||
)
|
||||
for i in range(0, masks_true.shape[0], step):
|
||||
ious.append(_mask_iou_batch_split(masks_true[i : i + step], masks_detection))
|
||||
|
||||
return np.vstack(ious)
|
||||
|
||||
|
||||
def resize_masks(masks: np.ndarray, max_dimension: int = 640) -> np.ndarray:
|
||||
"""
|
||||
Resize all masks in the array to have a maximum dimension of max_dimension,
|
||||
|
||||
@@ -28,7 +28,7 @@ class VideoInfo:
|
||||
```python
|
||||
import supervision as sv
|
||||
|
||||
video_info = sv.VideoInfo.from_video_path(video_path='video.mp4')
|
||||
video_info = sv.VideoInfo.from_video_path(video_path=<SOURCE_VIDEO_FILE>)
|
||||
|
||||
video_info
|
||||
# VideoInfo(width=3840, height=2160, fps=25, total_frames=538)
|
||||
@@ -75,14 +75,14 @@ class VideoSink:
|
||||
```python
|
||||
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_VIDEO_PATH>)
|
||||
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
|
||||
|
||||
with sv.VideoSink(target_path='target.mp4', video_info=video_info) as sink:
|
||||
with sv.VideoSink(target_path=<TARGET_VIDEO_PATH>, video_info=video_info) as sink:
|
||||
for frame in frames_generator:
|
||||
sink.write_frame(frame=frame)
|
||||
```
|
||||
"""
|
||||
""" # noqa: E501 // docs
|
||||
|
||||
def __init__(self, target_path: str, video_info: VideoInfo, codec: str = "mp4v"):
|
||||
self.target_path = target_path
|
||||
@@ -147,7 +147,7 @@ def get_video_frames_generator(
|
||||
```python
|
||||
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_PATH>):
|
||||
...
|
||||
```
|
||||
"""
|
||||
@@ -191,8 +191,8 @@ def process_video(
|
||||
...
|
||||
|
||||
process_video(
|
||||
source_path='...',
|
||||
target_path='...',
|
||||
source_path=<SOURCE_VIDEO_PATH>,
|
||||
target_path=<TARGET_VIDEO_PATH>,
|
||||
callback=callback
|
||||
)
|
||||
```
|
||||
|
||||
Reference in new issue
Block a user