From a69197aa138e8d7b51def89a3219f73804e8464e Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 11:42:04 +0200 Subject: [PATCH 1/3] version bump 3.0 --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- deeplabcut/version.py | 2 +- examples/test.sh | 2 +- pyproject.toml | 2 +- reinstall.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 155b218b1..764dfe563 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -25,7 +25,7 @@ body: attributes: label: DeepLabCut version description: What version of DLC are you using? Please check with `import deeplabcut`, `deeplabcut.__version__` - placeholder: 3.0.0rc14 + placeholder: 3.0.0 validations: required: true - type: dropdown diff --git a/deeplabcut/version.py b/deeplabcut/version.py index 150be4aa2..08022ce8d 100644 --- a/deeplabcut/version.py +++ b/deeplabcut/version.py @@ -9,5 +9,5 @@ # Licensed under GNU Lesser General Public License v3.0 # -__version__ = "3.0.0rc14" +__version__ = "3.0.0" VERSION = __version__ diff --git a/examples/test.sh b/examples/test.sh index c26419917..b9be0a511 100755 --- a/examples/test.sh +++ b/examples/test.sh @@ -6,7 +6,7 @@ rm -r OUT cd .. pip uninstall deeplabcut python3 setup.py sdist bdist_wheel -pip install dist/deeplabcut-3.0.0rc14-none-any.whl +pip install dist/deeplabcut-3.0.0-none-any.whl cd examples diff --git a/pyproject.toml b/pyproject.toml index 17b761a51..00ec5e988 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = [ "setuptools>=61" ] [project] name = "deeplabcut" -version = "3.0.0rc14" +version = "3.0.0" description = "Markerless pose-estimation of user-defined features with deep learning" readme = { file = "README.md", content-type = "text/markdown" } keywords = [ diff --git a/reinstall.sh b/reinstall.sh index 1483261a6..ec60dc6a8 100755 --- a/reinstall.sh +++ b/reinstall.sh @@ -1,4 +1,4 @@ pip uninstall deeplabcut rm -rf dist/ build/ *.egg-info python3 setup.py sdist bdist_wheel -pip install dist/deeplabcut-3.0.0rc14-py3-none-any.whl +pip install dist/deeplabcut-3.0.0-py3-none-any.whl From 5f05fab389d228c5e294c77af78c5e3bd254060c Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 13:47:08 +0200 Subject: [PATCH 2/3] update uv.lock (deeplabcut version 3.0) --- uv.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/uv.lock b/uv.lock index 8105d28c8..cf94ac726 100644 --- a/uv.lock +++ b/uv.lock @@ -1184,7 +1184,7 @@ wheels = [ [[package]] name = "deeplabcut" -version = "3.0.0rc14" +version = "3.0.0" source = { editable = "." } dependencies = [ { name = "albumentations" }, @@ -1554,10 +1554,10 @@ dependencies = [ { name = "numpy" }, { name = "opencv-python" }, { name = "pandas" }, - { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-tf') or (python_full_version < '3.11' and extra != 'extra-10-deeplabcut-tf-cu11' and extra != 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, - { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-tf') or (python_full_version >= '3.11' and extra != 'extra-10-deeplabcut-tf-cu11' and extra != 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-tf') or (python_full_version < '3.11' and extra != 'extra-10-deeplabcut-tf-cu11' and extra != 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, - { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-tf') or (python_full_version >= '3.11' and extra != 'extra-10-deeplabcut-tf-cu11' and extra != 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, + { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, + { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra == 'extra-10-deeplabcut-fmpose3d') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12') or (python_full_version < '3.11' and extra == 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-apple-mchips' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra == 'extra-10-deeplabcut-apple-mchips' and extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu11') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-cu12') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu11' and extra == 'extra-10-deeplabcut-tf-latest') or (extra != 'extra-10-deeplabcut-fmpose3d' and extra == 'extra-10-deeplabcut-tf-cu12' and extra == 'extra-10-deeplabcut-tf-latest')" }, { name = "timm" }, { name = "torch", version = "2.11.0", source = { registry = "https://pypi.org/simple" } }, { name = "torchvision", version = "0.26.0", source = { registry = "https://pypi.org/simple" } }, From 5465bc8afe5cc4fdc5a545cc7f988530915a78f2 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 21 May 2026 10:24:12 +0200 Subject: [PATCH 3/3] Add 3.0 changelog (#3340) * Add 3.0 changelog ### Contents - Finalized 3.0 changelog - Adds benchmark images ### TODO - [ ] Fix image links to point to github user content on main * Use raw GitHub URLs for changelog images Replace relative image paths with raw.githubusercontent.com absolute URLs in changelog/3_0_0/v3_0_0.md so images render correctly when viewed in releases. Updated three image references (openfield_benchmark_pr2613.png, speed_tensorflow.avif, buctd_benchmarks.png). --- changelog/3_0_0/images/buctd_benchmarks.png | Bin 0 -> 21358 bytes .../images/openfield_benchmark_pr2613.png | Bin 0 -> 55965 bytes changelog/3_0_0/images/speed_tensorflow.avif | Bin 0 -> 12678 bytes changelog/3_0_0/v3_0_0.md | 158 ++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 changelog/3_0_0/images/buctd_benchmarks.png create mode 100644 changelog/3_0_0/images/openfield_benchmark_pr2613.png create mode 100644 changelog/3_0_0/images/speed_tensorflow.avif create mode 100644 changelog/3_0_0/v3_0_0.md diff --git a/changelog/3_0_0/images/buctd_benchmarks.png b/changelog/3_0_0/images/buctd_benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..127b1d4f1b7be0d52cc66abe9ba0fd6beb7c9d28 GIT binary patch literal 21358 zcmb`v2|QMBy9K-rMN+6lGDRvw8Iwp7Awy*rGEnQmH5jC7G#Y2xUm5GDJu+ zHlZk$GJWgTd*1V&@0|1d&hMP>`Td9Dd7i!Zy|4Sa*0t8UcGQ7=>dTn8m?(-`wpT+{ zkD}RlqYb~ey~lA!R~P9m za$97?_>Xvcx*eAn7kB>W8@9N592Vyj67<5CEOFB~c$}hGtjWJLnM$`EDN66nUR7lS zpKD`pPnhVxo@W?8vCHUys;WDGsDN&`ltD&JnVWTT=AOE;1f!hXyDr&=W(;Y?ab>14 zM!9sFhrC{i)tI=HAr-`%ZP4nYg57Rk2yQ9TOG5NXJ6Q*yX_2+Z5IrZ8Tf2AjP1*Qtyn$`hmLzk&&6&C0mcPr{(9f2nq`7MCkUfS+nMG zZ?8q0wSmvybN-%|!hPVtx%^KDA|o}lBogn~TnhVAf2wwsPK2`R%|}_O+a2hCsVJY! z5L`!X5)s)=GcO&fK{q)$c_TYJTkp^YX~QPGx#x^lt0$+bs)6#7(2$!q*WbK-+evLF!^<(69uyf$T z#nJcGy(+>xy~nzfmPbTpWe#lZJXzi)7mPF-Ey$Jf{T+fajC@Z7_k7qM%k?Z!0MuOL5s zm8n}2@Vlt`NA$?UfSr_`o!u^hc&qujS^KgNr%%(L4i6XDzP(iY1Dm7h!YLVK3EVLd zeIqL)qw3=$7c?`Wo^z;t_3WP?HGIJ{G{M2a+&g>s~yLUhyB)=5k28$G}uio6duT{$^5GEk50Uoo_k+xtn$E>vI#M5Dx}r^71CD%lKGU==VC78!dY-DOmDuZAyN6I^E&Jhr66yU0s=Z z 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 p|EsyIc>O7%3#lQej48#B_K?DN{TPbOf25AscN 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 HzT5u;;02SY literal 0 HcmV?d00001 diff --git a/changelog/3_0_0/v3_0_0.md b/changelog/3_0_0/v3_0_0.md new file mode 100644 index 000000000..994a65958 --- /dev/null +++ b/changelog/3_0_0/v3_0_0.md @@ -0,0 +1,158 @@ +# DeepLabCut 3.0: familiar workflows, modern foundations, better performance + +DeepLabCut 3.0 introduces a PyTorch-first training and inference stack while keeping the core DeepLabCut workflow familiar. +Projects still follow the same labeling, training, evaluation, and video-analysis pipeline used throughout the 2.x series, but the underlying engine has been substantially modernized. + +For users who have already been following the release candidates, many of these changes will already feel familiar. +DeepLabCut 3.0 consolidates these incremental changes into a stable release. + +## Increased model performance and speed + + + + + + + + +
Benchmark tableOpenfield benchmark results
Pose estimation performance of the 3.0 PyTorch models compared against previous TensorFlow models on the DeepLabCut Openfield dataset (see PR #2613); RMSE: root mean squared error. *Values from Mathis et al. 2018.
+ + + + + + + + + +
Trimice datasetSpeed comparison: PyTorch vs TensorFlow
Speed of the current PyTorch implementation (ResNet50) compared to the TensorFlow implementation. Results were obtained using a NVIDIA GeForce RTX 2080 Ti with CUDA 12.2 on the DeepLabCut Trimice dataset.
+ + + + + + + + +
BUCTD benchmarks
Comparison of the new BUCTD model architectures with DLCRNet and DEKR on the Marmoset, Fish and Trimice dataset. From Zhou et al., ICCV 2023.
+ +## The journey to 3.0 + +A quick recap of some of the major milestones leading to this release: + +- #2613 - Full initial PyTorch backend implementation +- #2952 - New bottom-up conditional top-down (BUCTD) model architecture +- #2795 - New RTMPose top-down architecture +- #2868 - Updated notebooks and Colab examples for PyTorch workflows +- #2804 - PyTorch model export + +And more, find the full PR reference [on GitHub](https://github.com/DeepLabCut/DeepLabCut/pulls?page=1&q=is%3Apr+label%3ADLC3.0%F0%9F%94%A5)! + +## Notable features in 3.0.0 + +### PyTorch-first, TensorFlow-compatible + +DeepLabCut 3.0 adds a new PyTorch backend while retaining TensorFlow support for legacy workflows. +Project management remains the same and labeled datasets remain compatible. +PyTorch models can be trained alongside previous TensorFlow models on the same train/test splits for direct benchmarking and comparison. + + +### Expanded architecture support + +DeepLabCut 3.0 significantly broadens the supported model ecosystem beyond the classic ResNet-based workflows. The PyTorch stack includes: + +- ResNet and HRNet backbones +- Bottom-up multi-animal approaches such as DEKR and PAF/DLCRNet variants +- Top-down detector-plus-pose pipelines including RTMPose +- Hybrid architectures such as BUCTD and CTD variants +- SuperAnimal-related pretrained workflows + +The documentation now includes dedicated [architecture guides](https://deeplabcut.github.io/DeepLabCut/docs/pytorch/architectures.html) to help users choose models based on scene complexity and experimental needs. + +### Flexible PyTorch training configuration + +The PyTorch engine introduces a modern training stack with expanded augmentation options, training schedules, device management, and model architectures. For each training run, the settings are stored in a `pytorch_config.yaml`, enabling easy reproducibility. + +### Improved interoperability + +The new PyTorch data pipeline introduces loaders for both standard DeepLabCut projects and COCO-style datasets, making it easier to integrate DeepLabCut with broader computer-vision workflows and external annotation formats. + +### Model Zoo and SuperAnimal workflows + +DeepLabCut 3.0 continues to expand the Model Zoo and SuperAnimal ecosystem, making pretrained models and transfer learning more accessible. +Colab notebooks and updated GUI tooling make it easier to experiment with modern architectures without extensive setup. (see the [documentation](https://deeplabcut.github.io/DeepLabCut/README.html)) + +### Modernized installation and packaging + +The project has been moved to a newer packaging system, and is now based around pyproject.toml. This enables the use of modern package-managers & dependency resolvers, such as `uv` or `pdm`. +Users can still install only the components they require, be it GUI support, TensorFlow compatibility, ModelZoo features, and optional experimental integrations. + +### Labeling GUI + +DeepLabCut 3.0 is shipped with a new release of the napari-deeplabcut plugin. Our napari-based labeling GUI has undergone a major internal re-write and modernization: while preserving familiar UI and the DeepLabCut workflow, the update substantially improves stability, data handling, usability, visualization, and annotation workflows, now with automated point tracking for faster labeling. See the [release notes](https://github.com/DeepLabCut/napari-deeplabcut/releases) to find out about all improvements. + +### Upcoming: refreshed documentation + +We have updated and streamlined the documentation, with a focus on clarity and up-to-date information in core areas (installation, getting started guides, and more). +Expect the documentation to continue evolving soon after the release! + +## A major transition + +The jump from the final DeepLabCut 2.x releases to the current codebase is best understood as a transition to more recent Python & deep learning ecosystems rather than a routine update. +Taken together, the PyTorch backend, broader architecture support, ModelZoo integration, packaging modernization, updated labeling GUI, and documentation improvements represent a major evolution of DeepLabCut, which we are happy to release as 3.0. + + +## Closing thoughts + +We hope you enjoy this new version, and we aim to keep sharing many exciting improvements in the future in all areas, be it performance and speed, codebase quality improvements, foundation models integration, user experience and documentation. + +--- +## Changelog since 3.0.0rc14 + +- Add up-to-date uv.lock (#3242) +- Remove unnecessary imports (#3224) +- Add custom styling options for docs (custom.css) (#3207) +- Add internal helper for batched modelzoo inference from in-memory arrays (inference runner) (#3222) +- Implement intelligent test selection in CI (#3046) +- Revamp CONTRIBUTING.md (#3241) +- Update FMPose3D modelzoo integration (#3221) +- Add automated docs & notebooks freshness + normalization checks (#3228) +- Install from PyPI pre-release; add both-backends (#3238) +- Apply linting to entire codebase & add CI workflow to check linting (#3216) +- Bump requests from 2.32.5 to 2.33.0 (#3259) +- Refactor Analyze Videos tab (#3268) +- Consolidate test workflow infrastructure in CI (#3254) +- Move protobuf requirement to pyproject.toml (#3235) +- Use pinned ffmpeg version in CI (#3276) +- Docs versioning: Add glob support, better validation and reporting (#3278) +- Bump cryptography from 46.0.5 to 46.0.7 (#3277) +- Fix failing local Windows tests due to ruamel parsing (#3275) +- Update & de-duplicate skeleton builder (#3258) +- Bump pygments from 2.19.2 to 2.20.0 (#3262) +- update conda yaml: install pyside6 via conda instead of pip (#3253) +- Bump pyasn1 from 0.6.2 to 0.6.3 (#3249) +- Fix SuperAnimal / pretrained load for RTMPose: implement convert_weights on RTMCCHead (#3270) +- Use async update check in GUI (#3234) +- Update napari-DLC docs for refactor (#3280) +- Refactor/predict multianimal (#3220) +- Fix incorrect MultiLevel construction in outlier_frames.compute_deviations (#3247) +- Bump pillow from 12.1.1 to 12.2.0 (#3283) +- Bump pytest from 9.0.2 to 9.0.3 (#3284) +- CircleCI: disable hugginface xet (#3316) +- Update and diversify TensorFlow optional installations. (#3292) +- Bump urllib3 from 2.6.3 to 2.7.0 (#3325) +- Bump gitpython from 3.1.47 to 3.1.50 (#3322) +- make GenerativeSampler visibility-aware (#3305) +- Add isatty method to StreamWriter + eval GUI fix (#3314) +- Add conditional replacement of `@torch.inference_mode` for inference on AMD DirectML GPUs (#3295) +- Robustness fix: Annotation file not dropping likelihood column if present from machine labels (#3323) +- Remove trailing comma in models_to_framework.json (#3330) +- update `list_videos_in_folder` (#3303) +- Improve `TrainingDatasetMetadata` and `get_shuffle_engine` for incomplete projects (#3313) +- update RTMPose `SimCCPredictor`: expose `apply_softmax` and fix visibility thresholding (#3306) +- GUI: Add "Generate debug log" action (#3328) +- [Docker 1] Simplify and modernize Dockerfile (#3290) +- [Docker 2] Update deeplabcut-docker package (#3291) +- Add additional drop_likelihood_columns guards (#3333) +- Resolve inconsistent parameter names via aliasing + deprecationwarning (#3332) +- bump dlclibrary (v0.0.12) and napari-deeplabcut (v3.1.0) (#3338)