From eb6b3d435948573577d4c4a13b0bf1e78c087fda Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 21 May 2026 10:59:07 +0200 Subject: [PATCH 01/86] Docs audit [April 2026]: Tooling update (#3296) * Add docs and notebooks audit export tool Add tools/docs_and_notebooks_audit.py: a CLI tool that scans Markdown and Jupyter notebooks for a deeplabcut metadata namespace, validates selected fields (visibility, status, recommendation, last_verified) against enums via pydantic, and exports a CSV audit register. Features include YAML frontmatter and notebook metadata parsing, alias support for recommendation, preservation of human-authored CSV columns across re-runs, configurable include/exclude scan patterns, target filtering (files, dirs, globs), and basic reporting of parse/validation issues. * Ignore tools/docs_audits in docs scan Add tools/docs_audits/** to the scan exclude list in tools/docs_and_notebooks_report_config.yml so the docs & notebooks report skips files in that directory (e.g., generated audit artifacts or temporary outputs). * Ignore docs_audits; include tools MD files Add an exclude pattern (^tools/docs_audits/) to the docs/notebooks pre-commit hook so files under tools/docs_audits/ are skipped. Also add tools/**/*.md to the scan list in tools/docs_and_notebooks_report_config.yml so Markdown files in the tools directory are included in the docs/notebooks report. * Introduce markdown-myst pre-commit hook ## Summary Adds `mdformat` v1.0 as a pre commit hook with the myst plugin. This helps automate formatting of documentation and catch any mistakes in structure or syntax, making docs maintenance easier. ## Scope As a hook with write permissions, it is meant to run locally, not in CI. * Add notes field and 'move' recommendation Add support for human-editable notes and a new Recommendation.MOVE enum. AuditMetadata now includes a notes field and FIELD_SPECS registers notes so notes are read from CSV. merged_row now preserves existing human notes, warns on conflicts between scanned and previous notes, and prefers previous notes when present. build_row no longer unconditionally writes an empty notes value (to avoid clobbering preserved notes). Also removed the file shebang line. * Document Recommendation enum values Add brief inline comments to each member of the Recommendation enum in tools/docs_and_notebooks_audit.py to clarify what each action means for auditors (keep, verify, update, move, merge, archive, remove). This is a documentation-only change and does not alter runtime behavior. * Update docs_and_notebooks_audit.py * Fix pre-commit YAML indent and update usage examples Corrects YAML indentation in .pre-commit-config.yaml so mdformat-myst is properly listed under additional_dependencies. Also updates usage examples in tools/docs_and_notebooks_audit.py to reference the docs_and_notebooks_audit.py script (replacing docs_audit_export.py) to reflect the current script name. --- .pre-commit-config.yaml | 10 + tools/docs_and_notebooks_audit.py | 552 +++++++++++++++++++++ tools/docs_and_notebooks_report_config.yml | 2 + 3 files changed, 564 insertions(+) create mode 100644 tools/docs_and_notebooks_audit.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 315fabee9f..1494b6f26e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -82,6 +82,15 @@ repos: args: [--check, --diff] stages: [manual] + - repo: https://github.com/hukkin/mdformat + rev: 1.0.0 + hooks: + - id: mdformat + additional_dependencies: + - mdformat-myst + files: ^docs/.*\.md$ + stages: [pre-commit] + # check only, no modifications - repo: local hooks: @@ -91,6 +100,7 @@ repos: language: python pass_filenames: true files: ^(docs/|examples/(JUPYTER|COLAB)/|tools/).*(\.md|\.ipynb)$ + exclude: ^tools/docs_audits/ args: - --config - tools/docs_and_notebooks_report_config.yml diff --git a/tools/docs_and_notebooks_audit.py b/tools/docs_and_notebooks_audit.py new file mode 100644 index 0000000000..a8c7e355e7 --- /dev/null +++ b/tools/docs_and_notebooks_audit.py @@ -0,0 +1,552 @@ +""" +DeepLabCut docs audit export tool (validated / extensible). + +Purpose +------- +Read audit metadata from the `deeplabcut` namespace in Markdown frontmatter and +notebook-level metadata, validate selected fields against enums/schema, and +export a CSV register with docs metadata and review notes to help drive documentation maintenance. + +Supported metadata fields +------------------------- +From `deeplabcut:` this tool currently validates and exports: +- visibility +- status +- recommendation (with fallback alias: review_decision) +- last_verified (pass-through) +- notes (pass-through, but preserved from previous CSV if present even if updated in source) + +Example metadata +---------------- +Markdown frontmatter: + +--- +deeplabcut: + visibility: online + status: viable + recommendation: keep + last_verified: 2026-04-15 +--- + +Notebook metadata: +{ + "metadata": { + "deeplabcut": { + "visibility": "online", + "status": "viable", + "recommendation": "keep", + "last_verified": "2026-04-15" + } + } +} + +Usage +----- +python tools/docs_and_notebooks_audit.py \ + --config tools/docs_and_notebooks_report_config.yml \ + --out docs/_meta/docs_audit_register.csv + +python tools/docs_and_notebooks_audit.py \ + --targets docs/gui/ docs/recipes/*.md examples/COLAB/*.ipynb +""" + +from __future__ import annotations + +import argparse +import csv +import fnmatch +import os +import re +import subprocess +from collections.abc import Callable, Iterable, Sequence +from enum import Enum +from pathlib import Path +from typing import Any, Literal, TypedDict + +import nbformat +import yaml +from pydantic import BaseModel, ConfigDict, ValidationError + +# ----------------------------------------------------------------------------- +# Constants / defaults +# ----------------------------------------------------------------------------- +DLC_NAMESPACE = "deeplabcut" +DEFAULT_CONFIG = Path("tools/docs_and_notebooks_report_config.yml") +DEFAULT_OUTPUT = Path("docs/_meta/docs_audit_register.csv") +GLOB_CHARS = set("*?[") +FRONTMATTER_RE = re.compile(r"^---\s*$") + +# Generated columns owned by this tool. Any additional columns present in an +# existing CSV are preserved as human columns. +GENERATED_COLUMNS = [ + "path", + "kind", + "metadata_present", + "visibility", + "status", + "recommendation", + "last_verified", + "parse_error", + "validation_error", + "notes", +] + +DEFAULT_INCLUDE = [ + "docs/**/*.md", + "docs/**/*.markdown", + "docs/**/*.ipynb", + "examples/**/*.ipynb", + "README.md", + "CONTRIBUTING.md", +] +DEFAULT_EXCLUDE = [ + ".git/**", + ".github/**", + "**/.ipynb_checkpoints/**", + "**/node_modules/**", + "**/.venv/**", +] + +FileKind = Literal["md", "ipynb", "other"] +TargetKind = Literal["invalid", "file", "dir", "glob"] + + +# ----------------------------------------------------------------------------- +# Enums / schema +# ----------------------------------------------------------------------------- +class Visibility(str, Enum): + """How discoverable the page is in the documentation surface.""" + + ONLINE = "online" # current docs surface / discoverable + UNLISTED = "unlisted" # intentionally available but not surfaced in nav + ARCHIVED = "archived" # only discoverable via archive/historical area + ORPHANED = "orphaned" # not listed and no supported inbound links + + +class Status(str, Enum): + """Current health / lifecycle state of the page.""" + + VIABLE = "viable" # current and acceptable + REVIEW_NEEDED = "review_needed" # needs human review before decision + OUTDATED = "outdated" # content exists but is stale / drifted + DEPRECATED = "deprecated" # not preferred; replacement exists/coming + ARCHIVED = "archived" # kept for historical or niche reference + REMOVED = "removed" # removed from active docs surface + + +class Recommendation(str, Enum): + """Recommended next action for the page.""" + + KEEP = "keep" # content is fine as-is; no action needed + VERIFY = "verify" # content and/or formatting could use verification + UPDATE = "update" # requires content update to be considered viable + MOVE = "move" # move to a more appropriate location + MERGE = "merge" # merge into another page + ARCHIVE = "archive" # if deprecated, archive before removal + REMOVE = "remove" # remove from repository (can be resurrected from git history if needed) + + +class AuditMetadata(BaseModel): + """ + Strictly validate only the fields this exporter owns. + + Keep extra metadata allowed so the deeplabcut namespace can still contain + other fields used by the main checks tool or future workflows. + """ + + model_config = ConfigDict(extra="allow") + + visibility: Visibility | None = None + status: Status | None = None + recommendation: Recommendation | None = None + last_verified: str | None = None + notes: str | None = None + + +class TargetSpec(TypedDict): + raw: str + normalized: str + kind: TargetKind + + +class FieldSpec(BaseModel): + """Describes how a CSV column maps from deeplabcut metadata.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + column: str + source_keys: list[str] + extractor: Callable[[AuditMetadata, dict[str, Any]], str] | None = None + + +FIELD_SPECS: list[FieldSpec] = [ + FieldSpec(column="visibility", source_keys=["visibility"]), + FieldSpec(column="status", source_keys=["status"]), + FieldSpec(column="recommendation", source_keys=["recommendation", "review_decision"]), + FieldSpec(column="last_verified", source_keys=["last_verified"]), + FieldSpec(column="notes", source_keys=["notes"]), +] + + +# ----------------------------------------------------------------------------- +# Path / target helpers +# ----------------------------------------------------------------------------- +def normalize_target_spec(spec: str, repo_root: Path) -> str: + s = spec.strip() + if not s: + return s + s = s.replace("\\", "/") + while s.startswith("./"): + s = s[2:] + p = Path(s) + if p.is_absolute(): + try: + s = str(p.resolve().relative_to(repo_root)).replace(os.sep, "/") + except ValueError: + s = str(p).replace(os.sep, "/") + s = re.sub(r"/+", "/", s) + if len(s) > 1: + s = s.rstrip("/") + return s + + +def compile_target_specs(targets: list[str] | None, repo_root: Path) -> list[TargetSpec] | None: + if not targets: + return None + specs: list[TargetSpec] = [] + for raw in targets: + normalized = normalize_target_spec(raw, repo_root) + if not normalized: + specs.append({"raw": raw, "normalized": "", "kind": "invalid"}) + continue + if any(ch in normalized for ch in GLOB_CHARS): + specs.append({"raw": raw, "normalized": normalized, "kind": "glob"}) + continue + if raw.endswith(("/", "\\")): + specs.append({"raw": raw, "normalized": normalized, "kind": "dir"}) + continue + candidate = repo_root / normalized + specs.append( + { + "raw": raw, + "normalized": normalized, + "kind": "dir" if candidate.exists() and candidate.is_dir() else "file", + } + ) + return specs + + +def target_spec_matches_path(rel_path: str, spec: TargetSpec) -> bool: + rel_path = rel_path.replace("\\", "/") + kind = spec["kind"] + normalized = spec["normalized"] + if kind == "invalid": + return False + if kind == "file": + return rel_path == normalized + if kind == "dir": + return rel_path == normalized or rel_path.startswith(normalized + "/") + if kind == "glob": + return fnmatch.fnmatchcase(rel_path, normalized) + return False + + +def target_matches(rel_path: str, specs: list[TargetSpec] | None) -> bool: + return True if specs is None else any(target_spec_matches_path(rel_path, spec) for spec in specs) + + +def find_repo_root(start: Path) -> Path: + cur = start.resolve() + for _ in range(50): + if (cur / ".git").exists(): + return cur + if cur.parent == cur: + break + cur = cur.parent + proc = subprocess.run(["git", "rev-parse", "--show-toplevel"], cwd=str(start), capture_output=True, text=True) + if proc.returncode == 0 and proc.stdout.strip(): + return Path(proc.stdout.strip()).resolve() + raise RuntimeError("Could not locate repository root") + + +def file_kind(path: Path) -> FileKind: + suffix = path.suffix.lower() + if suffix in {".md", ".markdown"}: + return "md" + if suffix == ".ipynb": + return "ipynb" + return "other" + + +# ----------------------------------------------------------------------------- +# Config / discovery +# ----------------------------------------------------------------------------- +def load_scan_patterns(config_path: Path | None) -> tuple[list[str], list[str]]: + if not config_path or not config_path.exists(): + return DEFAULT_INCLUDE, DEFAULT_EXCLUDE + + raw = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {} + scan = raw.get("scan") or {} + include = scan.get("include") or DEFAULT_INCLUDE + exclude = scan.get("exclude") or DEFAULT_EXCLUDE + return include, exclude + + +def is_excluded(rel_path: str, exclude_patterns: list[str]) -> bool: + return any(fnmatch.fnmatch(rel_path, pat) for pat in exclude_patterns) + + +def iter_candidate_paths( + repo_root: Path, + include_patterns: list[str], + exclude_patterns: list[str], + targets: list[str] | None = None, +) -> list[Path]: + specs = compile_target_specs(targets, repo_root) + matches: dict[str, Path] = {} + for pattern in include_patterns: + for path in repo_root.glob(pattern): + if not path.is_file(): + continue + rel = str(path.resolve().relative_to(repo_root)).replace(os.sep, "/") + if is_excluded(rel, exclude_patterns): + continue + if not target_matches(rel, specs): + continue + matches[rel] = path.resolve() + return [matches[k] for k in sorted(matches)] + + +# ----------------------------------------------------------------------------- +# Metadata readers (minimal duplication via namespace dispatch) +# ----------------------------------------------------------------------------- +def read_md_frontmatter(text: str) -> tuple[dict | None, str | None]: + lines = text.splitlines(keepends=True) + if not lines or not FRONTMATTER_RE.match(lines[0]): + return None, None + + end_idx = None + for i in range(1, min(len(lines), 5000)): + if FRONTMATTER_RE.match(lines[i]): + end_idx = i + break + if end_idx is None: + return None, "unterminated_markdown_frontmatter" + + fm_text = "".join(lines[1:end_idx]) + try: + fm = yaml.safe_load(fm_text) if fm_text.strip() else {} + except Exception as exc: + return None, f"markdown_frontmatter_yaml_error: {exc}" + if not isinstance(fm, dict): + return None, "markdown_frontmatter_not_mapping" + return fm, None + + +def read_container(path: Path) -> tuple[dict | None, str | None]: + """ + Return the top-level metadata container for a file. + - Markdown: YAML frontmatter mapping + - Notebook: notebook.metadata mapping + """ + kind = file_kind(path) + + if kind == "md": + try: + text = path.read_text(encoding="utf-8") + except Exception as exc: + return None, f"read_failed: {exc}" + return read_md_frontmatter(text) + + if kind == "ipynb": + try: + nb = nbformat.read(str(path), as_version=4) + meta = getattr(nb, "metadata", {}) or {} + except Exception as exc: + return None, f"notebook_read_failed: {exc}" + if not isinstance(meta, dict): + return None, "notebook_metadata_not_mapping" + return meta, None + + return None, None + + +def read_dlc_namespace(path: Path) -> tuple[dict | None, str | None]: + container, error = read_container(path) + if error: + return None, error + if container is None: + return None, None + raw = container.get(DLC_NAMESPACE) + if raw is None: + return None, None + if not isinstance(raw, dict): + return None, "deeplabcut_namespace_not_mapping" + return raw, None + + +# ----------------------------------------------------------------------------- +# Validation / normalization +# ----------------------------------------------------------------------------- +def build_validation_input(raw_meta: dict[str, Any]) -> dict[str, Any]: + """ + Map raw deeplabcut metadata into the schema-owned keys. + This is where aliases are resolved to canonical names. + """ + payload: dict[str, Any] = {} + for spec in FIELD_SPECS: + for key in spec.source_keys: + if key in raw_meta and raw_meta.get(key) not in {None, ""}: + payload[spec.column] = raw_meta.get(key) + break + return payload + + +def validate_metadata(raw_meta: dict[str, Any] | None) -> tuple[AuditMetadata | None, str | None]: + if raw_meta is None: + return None, None + try: + validated = AuditMetadata.model_validate(build_validation_input(raw_meta)) + return validated, None + except ValidationError as exc: + messages = [] + for err in exc.errors(): + loc = ".".join(str(x) for x in err.get("loc", [])) + msg = err.get("msg", "invalid value") + messages.append(f"{loc}: {msg}" if loc else msg) + return None, "; ".join(messages) + + +def extract_field_value(spec: FieldSpec, validated: AuditMetadata | None, raw_meta: dict[str, Any]) -> str: + if spec.extractor is not None: + return spec.extractor(validated, raw_meta) + if validated is not None: + value = getattr(validated, spec.column, None) + if isinstance(value, Enum): + return value.value + return "" if value is None else str(value) + # If validation failed, still emit raw/aliased value when present for easier triage. + for key in spec.source_keys: + if key in raw_meta and raw_meta.get(key) is not None: + return str(raw_meta.get(key)) + return "" + + +# ----------------------------------------------------------------------------- +# CSV merge / preserve human annotations +# ----------------------------------------------------------------------------- +def load_existing_rows(csv_path: Path) -> tuple[dict[str, dict[str, str]], list[str]]: + if not csv_path.exists(): + return {}, [] + with csv_path.open("r", newline="", encoding="utf-8") as fh: + reader = csv.DictReader(fh) + rows = {row.get("path", ""): row for row in reader if row.get("path")} + existing_columns = reader.fieldnames or [] + extra_columns = [c for c in existing_columns if c not in GENERATED_COLUMNS] + return rows, extra_columns + + +def merged_row(base: dict[str, Any], previous: dict[str, str] | None, extra_columns: Iterable[str]) -> dict[str, Any]: + row = dict(base) + + if previous: + prev_notes = (previous.get("notes") or "").strip() + scanned_notes = (row.get("notes") or "").strip() + if prev_notes and scanned_notes and prev_notes != scanned_notes: + print(f"WARNING: Notes conflict for {row['path']}:") + print(f"- Previous: {prev_notes}") + print(f"- Scanned: {scanned_notes}") + print("Preserving previous notes and ignoring scanned notes.") + # Preserve human notes if present, otherwise keep scanned notes + row["notes"] = prev_notes if prev_notes else scanned_notes + + for col in extra_columns: + row[col] = previous.get(col, "") if previous else "" + + return row + + +# ----------------------------------------------------------------------------- +# Row building / export +# ----------------------------------------------------------------------------- +def build_row(repo_root: Path, path: Path) -> dict[str, Any]: + rel = str(path.resolve().relative_to(repo_root)).replace(os.sep, "/") + kind = file_kind(path) + raw_meta, parse_error = read_dlc_namespace(path) + raw_meta = raw_meta or {} + metadata_present = bool(raw_meta) + validated, validation_error = validate_metadata(raw_meta if metadata_present else None) + + row: dict[str, Any] = { + "path": rel, + "kind": kind, + "metadata_present": "true" if metadata_present else "false", + "parse_error": parse_error or "", + "validation_error": validation_error or "", + # "notes": "", + } + + for spec in FIELD_SPECS: + row[spec.column] = extract_field_value(spec, validated, raw_meta) + return row + + +def export_csv( + repo_root: Path, include: list[str], exclude: list[str], out_path: Path, targets: list[str] | None +) -> int: + candidates = iter_candidate_paths(repo_root, include, exclude, targets=targets) + existing_rows, extra_columns = load_existing_rows(out_path) + + rows = [] + for path in candidates: + base = build_row(repo_root, path) + previous = existing_rows.get(base["path"]) + rows.append(merged_row(base, previous, extra_columns)) + + fieldnames = list(GENERATED_COLUMNS) + [c for c in extra_columns if c not in GENERATED_COLUMNS] + + out_path.parent.mkdir(parents=True, exist_ok=True) + with out_path.open("w", newline="", encoding="utf-8") as fh: + writer = csv.DictWriter(fh, fieldnames=fieldnames) + writer.writeheader() + for row in rows: + writer.writerow(row) + + print(f"Wrote {len(rows)} records to {out_path}") + invalid = sum(1 for row in rows if row.get("validation_error")) + parse_fail = sum(1 for row in rows if row.get("parse_error")) + if invalid or parse_fail: + print(f"Validation issues: {invalid}; parse issues: {parse_fail}") + return 0 + + +# ----------------------------------------------------------------------------- +# CLI +# ----------------------------------------------------------------------------- +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser(description="Export DeepLabCut audit metadata to CSV") + parser.add_argument("--config", default=str(DEFAULT_CONFIG), help="Optional path to scan config YAML") + parser.add_argument("--root", default=".", help="Repository root or path inside the repository") + parser.add_argument("--out", default=str(DEFAULT_OUTPUT), help="CSV output path") + parser.add_argument( + "--targets", + nargs="*", + help=( + "Optional repo-relative targets to limit the export. Supports exact files, " + "directories, and glob patterns (e.g. docs/page.md, docs/gui/, 'docs/**/*.md')." + ), + ) + args = parser.parse_args(list(argv) if argv is not None else None) + + repo_root = find_repo_root(Path(args.root)) + config_path = Path(args.config) + include, exclude = load_scan_patterns(config_path) + out_path = Path(args.out) + if not out_path.is_absolute(): + out_path = repo_root / out_path + + return export_csv(repo_root, include, exclude, out_path, targets=args.targets) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/docs_and_notebooks_report_config.yml b/tools/docs_and_notebooks_report_config.yml index 60dfcb21f8..ee7995b742 100644 --- a/tools/docs_and_notebooks_report_config.yml +++ b/tools/docs_and_notebooks_report_config.yml @@ -6,10 +6,12 @@ scan: - "examples/JUPYTER/**/*.ipynb" - "docs/**/*.md" - "docs/**/*.ipynb" # if notebooks get added to docs (Jupyter Book supports this) + - "tools/**/*.md" exclude: - "**/.ipynb_checkpoints/**" - "**/_build/**" - "**/build/**" + - "tools/docs_audits/**" policy: warn_if_content_older_than_days: 365 From 988f2c6ce293df1eaf4e92b967a3db878c161d22 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 21 May 2026 11:00:16 +0200 Subject: [PATCH 02/86] Introduce mdformat pre-commit hook (#3287) ## Summary Adds `mdformat` v1.0 as a pre commit hook with the myst plugin. This helps automate formatting of documentation and catch any mistakes in structure or syntax, making docs maintenance easier. ## Scope As a hook with write permissions, it is meant to run locally, not in CI. From 73532cd47465c85be7d6dccef0d07b5462209305 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 21 May 2026 11:00:29 +0200 Subject: [PATCH 03/86] Docs versioning: update CI to warn for outdated metadata (#3279) * Docs versioning: Add glob support, better validation and reporting Normalize CLI target specs (handle Windows/backslashes, ./, absolute paths) and classify them as file/dir/glob. Implement matching logic and validation (report matched files and unmatched selectors, return rc=2 on unmatched), and apply target specs in scan/update. Add helpers (normalize_target_spec, compile_target_specs, validate_requested_targets, print_target_match_summary, iter_scan_candidate_paths) and adjust main argument help. Update tests to cover directory, glob, Windows-style paths, and CLI reporting. * Add metadata sync check and CI helpers Add a fail_if_metadata_sync_needed policy flag and utilities to detect/collect files whose embedded metadata last_content_updated differs from the computed git content date. New helpers: record_needs_metadata_sync() (skips non-md/ipynb and meta.ignore), collect_metadata_sync_targets() (returns sorted unique paths), and build_metadata_sync_command() (emits a ready-to-run python command to update targets using --set-content-date-from-git and --ack-meta-commit-marker). The enforce() flow now emits violations for out-of-sync md/ipynb files when the flag is enabled. * Add metadata sync suggestions to report Introduce actionable metadata-sync guidance for maintainers: rename SCHEMA_VERSION to REPORT_SCHEMA_VERSION, restrict ToolConfig.version to 1, and add metadata_sync_targets and metadata_sync_command to the Report model. Add build_git_add_command helper and mark records requiring metadata sync (metadata_sync_needed) so summaries include that count. Extend markdown output and CLI to show which files need metadata updates and to print suggested commands (sync command, git add and commit) for applying fixes locally. * Limit docs/notebooks scan to changed files Update the GitHub Actions workflow to only run docs and notebook staleness checks for changed .md/.markdown/.ipynb files. Adds a step to collect changed docs into tmp/docs_nb_checks/changed_docs.txt and expose the count via outputs; conditionally runs the report and optional policy check only when there are changed files, passing the files as --targets to the checker. Adds a no-op step when no docs changed and uploads the changed_docs.txt alongside other artifacts. Also renames the job to reflect the new behavior to reduce unnecessary scanning and noise. * Handle invalid target specs in validation Treat target specs that fail normalization as kind "invalid" so they are not silently ignored. compile_target_specs now appends invalid specs, target_spec_matches_path returns False for invalid kinds, and validate_requested_targets records invalid raw selectors as unmatched (and safely iterates when specs may be None). This ensures malformed or non-normalizable CLI selectors are reported back to the user rather than dropped. * tests: add repo/cfg fixtures and refactor tests Introduce shared pytest fixtures (repo, cfg) and import Callable to reduce repetition of tmp_path/git init logic across tests. Refactor many tests to use the new fixtures and ToolConfig factory, and add/adjust tests covering target validation and scanning edge cases (several validate_requested_targets variations, scan_files with invalid only-targets, and main returning 2 for invalid selector). Overall this centralizes repo/config setup and adds coverage for target handling behavior. * Drop .markdown from docs CI as it is unused * Fix const import in tests * Handle missing timestamps and shell-quote paths tools/docs_and_notebooks_check.py: Return False from record_needs_metadata_sync when computed timestamp is None to avoid triggering sync for files with no computed last_content_updated. Also import shlex and quote paths in build_metadata_sync_command so generated shell commands are safe for paths with spaces/special chars. * Clarify --targets help text Expand and clarify the --targets argument help strings in tools/docs_and_notebooks_check.py for the update and normalize subcommands. The updated messages document that --targets accepts exact files, directories, and glob patterns (with examples) and note that both '/' and '\\' path separators are accepted. This is a documentation-only change to improve user guidance; no functional behavior is altered. * Update tools/docs_and_notebooks_check.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update docs_and_notebooks_check.py * Update tools/docs_and_notebooks_check.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update .github/workflows/docs_and_notebooks_checks.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Quote config path * Revert "Merge branch 'cy/docs-versioning-tweaks' of https://github.com/DeepLabCut/DeepLabCut into cy/docs-versioning-tweaks" This reverts commit 46fdb042e13eb7a968b0a1c4da0a6681cd9ef75a, reversing changes made to 6d3b1be82255da0f832a4b47e0732507d52305d3. * Use TypedDict for targets and simplify glob matching Introduce TypedDict-based types for FileKind and TargetSpec (with TargetKind) and tighten type annotations across functions (compile_target_specs, target_spec_matches_path, target_matches). Replace PurePosixPath-based glob matching with fnmatch.fnmatchcase only to ensure consistent, shell-style pattern behavior across platforms and remove unused imports. Minor cleanups: import TypedDict and update variable type hints for better static checking and readability. * Avoid mixing metadata sync needed and invalid meta * Add tests for metadata sync warnings/enforcement Add parameterized tests covering both markdown and notebook files to verify metadata sync behavior. test_metadata_sync_warning_populates_report_targets_and_command creates a file with an out-of-date embedded last_content_updated, commits a newer git date, and asserts the record gets a metadata_sync_needed warning, that metadata_sync_targets and metadata_sync_command are populated (and include the target and --set-content-date-from-git flag), and that the rendered markdown includes guidance. test_enforce_fails_when_metadata_sync_needed_is_configured asserts that when fail_if_metadata_sync_needed=True an out-of-sync file is reported as a policy violation. These tests ensure reporting and enforcement handle embedded vs git-derived content dates correctly. * Avoid metadata sync on parse errors Do not mark files as needing metadata sync when metadata could not be read/parsed/validated reliably. Add blocking error prefixes (metadata_read_failed:, markdown_frontmatter_invalid:, nbformat_invalid:) to record_needs_metadata_sync so such scan/repair issues are treated separately. Also clarify the enforcement message to mention embedded last_content_updated and the git content update date for more precise guidance. * Change schema version type to Literal * Fix mismatched test error message Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Case insensitive check for file ext Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> --- .../workflows/docs_and_notebooks_checks.yml | 65 +++++++-- .../test_check_contracts.py | 117 ++++++++++++++- tools/docs_and_notebooks_check.py | 137 +++++++++++++++++- 3 files changed, 304 insertions(+), 15 deletions(-) diff --git a/.github/workflows/docs_and_notebooks_checks.yml b/.github/workflows/docs_and_notebooks_checks.yml index b35b68eda7..d671223769 100644 --- a/.github/workflows/docs_and_notebooks_checks.yml +++ b/.github/workflows/docs_and_notebooks_checks.yml @@ -11,7 +11,7 @@ permissions: jobs: staleness: - name: Docs and notebooks scan (read-only) + name: Docs and notebooks scan (changed docs only) runs-on: ubuntu-latest timeout-minutes: 5 @@ -31,29 +31,74 @@ jobs: python -m pip install --upgrade pip python -m pip install "pydantic>=2,<3" pyyaml "nbformat>=5" + - name: Collect changed .md/.ipynb files + id: changed_docs + shell: bash + run: | + set -euo pipefail + mkdir -p tmp/docs_nb_checks + + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + base="${{ github.event.pull_request.base.sha }}" + head="${{ github.event.pull_request.head.sha }}" + else + base="${{ github.event.before }}" + head="${{ github.sha }}" + fi + + git diff --name-only --diff-filter=ACMR "$base" "$head" \ + | { grep -iE '\.(md|ipynb)$' || true; } \ + | sort -u > tmp/docs_nb_checks/changed_docs.txt + + count=$(wc -l < tmp/docs_nb_checks/changed_docs.txt | tr -d ' ') + echo "count=$count" >> "$GITHUB_OUTPUT" + + echo "Changed docs files:" + if [[ "$count" -eq 0 ]]; then + echo "(none)" + else + sed 's/^/- /' tmp/docs_nb_checks/changed_docs.txt + fi + - name: Run staleness report (read-only) + if: steps.changed_docs.outputs.count != '0' + shell: bash run: | - python tools/docs_and_notebooks_check.py \ - --config tools/docs_and_notebooks_report_config.yml \ - --out-dir tmp/docs_nb_checks \ - report + set -euo pipefail + mapfile -t targets < tmp/docs_nb_checks/changed_docs.txt + python tools/docs_and_notebooks_check.py \ + --config tools/docs_and_notebooks_report_config.yml \ + --out-dir tmp/docs_nb_checks \ + report \ + --targets "${targets[@]}" - # Optional: run check mode (will fail only once you populate allowlists in config) - name: Run staleness policy check (optional gate) + if: steps.changed_docs.outputs.count != '0' continue-on-error: true + shell: bash run: | + set -euo pipefail + mapfile -t targets < tmp/docs_nb_checks/changed_docs.txt + python tools/docs_and_notebooks_check.py \ - --config tools/docs_and_notebooks_report_config.yml \ - --out-dir tmp/docs_nb_checks \ - --no-step-summary \ - check + --config tools/docs_and_notebooks_report_config.yml \ + --out-dir tmp/docs_nb_checks \ + --no-step-summary \ + check \ + --targets "${targets[@]}" + + - name: No changed docs to scan + if: steps.changed_docs.outputs.count == '0' + run: echo "No changed .md or .ipynb files found in the repo. Skipping scan." - name: Upload staleness artifacts + if: steps.changed_docs.outputs.count != '0' uses: actions/upload-artifact@v4 with: name: staleness-report path: | tmp/docs_nb_checks/*.json tmp/docs_nb_checks/*.md + tmp/docs_nb_checks/changed_docs.txt if-no-files-found: error diff --git a/tests/tools/docs_and_notebooks_checks/test_check_contracts.py b/tests/tools/docs_and_notebooks_checks/test_check_contracts.py index 1abe6c47cb..c2fcc5cc7c 100644 --- a/tests/tools/docs_and_notebooks_checks/test_check_contracts.py +++ b/tests/tools/docs_and_notebooks_checks/test_check_contracts.py @@ -443,7 +443,7 @@ def test_write_outputs_contract(tool, repo: Path, cfg, tmp_path: Path): assert md_path.exists() payload = json.loads(json_path.read_text(encoding="utf-8")) - assert payload["schema_version"] == tool.SCHEMA_VERSION + assert payload["schema_version"] == tool.REPORT_SCHEMA_VERSION assert "records" in payload and isinstance(payload["records"], list) assert md_path.read_text(encoding="utf-8").startswith("#") @@ -557,3 +557,118 @@ def test_main_returns_2_for_invalid_target_selector(tool, repo: Path, monkeypatc rc = tool.main(["--config", str(cfg_path), "--no-step-summary", "report", "--targets", "./"]) assert rc == 2 + + +@pytest.mark.parametrize( + ("rel", "kind"), + [ + ("docs/page.md", "md"), + ("docs/nbs/nb.ipynb", "ipynb"), + ], +) +def test_metadata_sync_warning_populates_report_targets_and_command(tool, repo: Path, cfg, rel: str, kind: str): + """ + Out-of-sync embedded last_content_updated should: + - add metadata_sync_needed warning + - appear in Report.metadata_sync_targets + - generate a non-empty metadata_sync_command + """ + embedded_date = "2000-01-01" + + if kind == "md": + _write( + repo, + rel, + f"---\ndeeplabcut:\n last_content_updated: {embedded_date}\n---\n# hello\n", + ) + else: + nb = tool.nbformat.v4.new_notebook(metadata={tool.DLC_NAMESPACE: {"last_content_updated": embedded_date}}) + _write( + repo, + rel, + tool.nbformat.writes(nb, version=4, indent=2, ensure_ascii=False) + "\n", + ) + + # Git-derived content date differs from embedded metadata date + _git_commit(repo, "docs: add file", "2020-01-01T12:00:00+00:00") + + tool_cfg = cfg(include=[rel]) + records = tool.scan_files(repo, tool_cfg, targets=[rel]) + + assert len(records) == 1 + rec = records[0] + + # Sanity check: embedded metadata is parsed, but differs from git-derived date + assert rec.meta is not None + assert rec.meta.last_content_updated == date(2000, 1, 1) + assert rec.last_content_updated == date(2020, 1, 1) + + # New warning should be present + assert "metadata_sync_needed" in rec.warnings + + metadata_sync_targets = tool.collect_metadata_sync_targets(records) + metadata_sync_command = tool.build_metadata_sync_command( + "tools/docs_and_notebooks_report_config.yml", + metadata_sync_targets, + ) + + report = tool.Report( + generated_at=datetime.now(timezone.utc), + repo_root=str(repo), + config_path="tools/docs_and_notebooks_report_config.yml", + totals=tool.summarize(records), + records=records, + metadata_sync_targets=metadata_sync_targets, + metadata_sync_command=metadata_sync_command, + ) + + assert report.metadata_sync_targets == [rel] + assert report.metadata_sync_command + assert "--set-content-date-from-git" in report.metadata_sync_command + assert "--targets" in report.metadata_sync_command + assert rel in report.metadata_sync_command + + # Optional: also verify the markdown report renders the guidance section + rendered = tool.to_markdown(report, tool_cfg) + assert "## Metadata sync suggestions" in rendered + assert f"- `{rel}`" in rendered + + +@pytest.mark.parametrize( + ("rel", "kind"), + [ + ("docs/page.md", "md"), + ("docs/nbs/nb.ipynb", "ipynb"), + ], +) +def test_enforce_fails_when_metadata_sync_needed_is_configured(tool, repo: Path, cfg, rel: str, kind: str): + """ + If policy.fail_if_metadata_sync_needed=True, an out-of-sync file should + become a policy violation in check/enforcement mode. + """ + embedded_date = "2000-01-01" + + if kind == "md": + _write( + repo, + rel, + f"---\ndeeplabcut:\n last_content_updated: {embedded_date}\n---\n# hello\n", + ) + else: + nb = tool.nbformat.v4.new_notebook(metadata={tool.DLC_NAMESPACE: {"last_content_updated": embedded_date}}) + _write( + repo, + rel, + tool.nbformat.writes(nb, version=4, indent=2, ensure_ascii=False) + "\n", + ) + + _git_commit(repo, "docs: add file", "2020-01-01T12:00:00+00:00") + + tool_cfg = cfg(include=[rel], fail_if_metadata_sync_needed=True) + records = tool.scan_files(repo, tool_cfg, targets=[rel]) + + violations = tool.enforce(tool_cfg, records) + + assert violations == [ + f"{rel}: embedded last_content_updated is missing or out of sync with git content update date" + ] diff --git a/tools/docs_and_notebooks_check.py b/tools/docs_and_notebooks_check.py index 0d720814d8..d7d9690e8c 100644 --- a/tools/docs_and_notebooks_check.py +++ b/tools/docs_and_notebooks_check.py @@ -80,6 +80,7 @@ import json import os import re +import shlex import subprocess from collections.abc import Sequence from datetime import date, datetime, timezone @@ -91,7 +92,7 @@ from nbformat.validator import NotebookValidationError from pydantic import BaseModel, ConfigDict, Field, ValidationError -SCHEMA_VERSION = 1 +REPORT_SCHEMA_VERSION: Literal[1, 2] = 2 GLOB_CHARS = set("*?[") DLC_NAMESPACE = "deeplabcut" OUTPUT_FILENAME = "docs_nb_checks" @@ -147,6 +148,7 @@ class PolicyConfig(BaseModel): # Strict-mode toggle: if true, scan/parsing errors also fail `check` fail_on_scan_errors: bool = False + fail_if_metadata_sync_needed: bool = False # Allowlists for strict checks (start empty; ratchet later) require_metadata: list[str] = Field(default_factory=list) @@ -156,7 +158,7 @@ class PolicyConfig(BaseModel): class ToolConfig(BaseModel): - version: int = 1 + version: Literal[1] = 1 scan: ScanConfig policy: PolicyConfig @@ -188,7 +190,7 @@ class FileRecord(BaseModel): class Report(BaseModel): - schema_version: int = SCHEMA_VERSION + schema_version: Literal[1, 2] = REPORT_SCHEMA_VERSION generated_at: datetime repo_root: str config_path: str @@ -196,6 +198,10 @@ class Report(BaseModel): totals: dict[str, int] records: list[FileRecord] + # New: actionable metadata-sync guidance for maintainers + metadata_sync_targets: list[str] = Field(default_factory=list) + metadata_sync_command: str | None = None + # Rebuild models due to __future__ annotations DLCMeta.model_rebuild() @@ -591,6 +597,75 @@ def match_allowlist(rel_path: str, allowlist: list[str]) -> bool: return any(pat == rel_path or fnmatch.fnmatch(rel_path, pat) for pat in allowlist) +# ----------------------------- +# CI enforcement utils +# ----------------------------- +def record_needs_metadata_sync(rec: FileRecord) -> bool: + if "invalid_metadata" in rec.warnings: + # avoid mixing "invalid metadata" issues with "metadata sync needed" guidance, + # since the former may require manual fixes + return False + + # If metadata could not be read/parsed/validated reliably, just return False. + # These are scan/repair issues first, not "missing/out-of-sync metadata". + metadata_sync_blocking_error_prefixes = ( + "metadata_read_failed:", + "markdown_frontmatter_invalid:", + "nbformat_invalid:", + ) + if any(err.startswith(metadata_sync_blocking_error_prefixes) for err in (rec.errors or [])): + return False + + if rec.kind not in {"md", "ipynb"}: + return False + if rec.meta and rec.meta.ignore: + return False + + embedded = rec.meta.last_content_updated if rec.meta else None + computed = rec.last_content_updated + + if computed is None: + return False + + return embedded != computed + + +def collect_metadata_sync_targets(records: list[FileRecord]) -> list[str]: + paths: list[str] = [] + for rec in records: + if record_needs_metadata_sync(rec): + paths.append(rec.path) + return sorted(set(paths)) + + +def build_metadata_sync_command(config_path: str, paths: list[str]) -> str | None: + if not paths: + return None + config_path = shlex.quote(config_path) + paths = [shlex.quote(p) for p in paths] + + target_lines = " \\\n ".join(paths) + return ( + "python tools/docs_and_notebooks_check.py \\\n" + f" --config {config_path} \\\n" + " update \\\n" + " --write \\\n" + " --set-content-date-from-git \\\n" + " --targets \\\n" + f" {target_lines} \\\n" + " --ack-meta-commit-marker" + ) + + +def build_git_add_command(paths: list[str]) -> str | None: + if not paths: + return None + paths = [shlex.quote(p) for p in paths] + + path_lines = " \\\n ".join(paths) + return f"git add \\\n {path_lines}" + + # ----------------------------- # Core scanning # ----------------------------- @@ -681,6 +756,9 @@ def scan_files(repo_root: Path, cfg: ToolConfig, targets: list[str] | None = Non records.append(rec) continue + if record_needs_metadata_sync(rec): + rec.warnings.append("metadata_sync_needed") + last_verified = rec.meta.last_verified if rec.meta else None rec.days_since_verified = compute_days_since(last_verified, today) @@ -893,6 +971,7 @@ def summarize(records: list[FileRecord]) -> dict[str, int]: "missing_last_verified": sum(1 for r in records if "missing_last_verified" in r.warnings), "content_stale": sum(1 for r in records if any(w.startswith("content_stale") for w in r.warnings)), "verified_stale": sum(1 for r in records if any(w.startswith("verified_stale") for w in r.warnings)), + "metadata_sync_needed": sum(1 for r in records if "metadata_sync_needed" in r.warnings), } @@ -912,7 +991,8 @@ def to_markdown(report: Report, cfg: ToolConfig) -> str: lines.append(f"- Missing metadata: **{t['missing_metadata']}**\n") lines.append(f"- Missing last_verified: **{t['missing_last_verified']}**\n") lines.append(f"- Content-stale (> {pol.warn_if_content_older_than_days}d): **{t['content_stale']}**\n") - lines.append(f"- Verification-stale (> {pol.warn_if_verified_older_than_days}d): **{t['verified_stale']}**\n\n") + lines.append(f"- Verification-stale (> {pol.warn_if_verified_older_than_days}d): **{t['verified_stale']}**\n") + lines.append(f"- Metadata sync needed: **{t['metadata_sync_needed']}**\n\n") def fmt_date(d: date | None) -> str: return d.isoformat() if d else "-" @@ -960,6 +1040,30 @@ def fmt_date(d: date | None) -> str: lines.append(f"- **{r.path}**: {', '.join(r.errors)}\n") lines.append("\n") + if report.metadata_sync_targets: + lines.append("## Metadata sync suggestions\n\n") + lines.append( + "The following files have embedded `deeplabcut.last_content_updated` metadata " + "that is missing or out of sync with the git-derived content date:\n\n" + ) + for p in report.metadata_sync_targets: + lines.append(f"- `{p}`\n") + lines.append("\n") + + if report.metadata_sync_command: + lines.append("Run this locally:\n\n") + lines.append("```bash\n") + lines.append(report.metadata_sync_command + "\n") + lines.append("```\n\n") + + git_add = build_git_add_command(report.metadata_sync_targets) + if git_add: + lines.append("Then commit with:\n\n") + lines.append("```bash\n") + lines.append(git_add + "\n") + lines.append(f'git commit -m "{SUGGESTED_TAGGED_COMMIT}"\n') + lines.append("```\n\n") + lines.append("## Notes\n") lines.append("- 'Out of date' does not necessarily mean 'broken'. Use this as a triage signal.\n") lines.append( @@ -1021,6 +1125,11 @@ def enforce(cfg: ToolConfig, records: list[FileRecord]) -> list[str]: f"{r.path}: last_verified is {days}d old (> {pol.warn_if_verified_older_than_days}d)" ) + if pol.fail_if_metadata_sync_needed and record_needs_metadata_sync(r): + violations.append( + f"{r.path}: embedded last_content_updated is missing or out of sync with git content update date" + ) + if r.kind == "ipynb" and match_allowlist(r.path, pol.require_notebook_normalized): if "notebook_not_normalized" in (r.warnings or []): violations.append(f"{r.path}: notebook is not normalized (run update/format)") @@ -1198,16 +1307,36 @@ def main(argv: Sequence[str] | None = None) -> int: if args.write: print(f"\nSuggested commit message:\n {SUGGESTED_TAGGED_COMMIT}\n") + metadata_sync_targets = collect_metadata_sync_targets(records) + metadata_sync_command = build_metadata_sync_command(str(config_path), metadata_sync_targets) + report = Report( generated_at=datetime.now(timezone.utc), repo_root=str(repo_root), config_path=str(config_path), totals=summarize(records), records=records, + metadata_sync_targets=metadata_sync_targets, + metadata_sync_command=metadata_sync_command, ) json_path, md_path = write_outputs(report, cfg, out_dir) + if metadata_sync_targets and args.cmd in {"report", "check"}: + print(f"\nMetadata sync needed for {len(metadata_sync_targets)} file(s):") + for p in metadata_sync_targets: + print(f"- {p}") + + if metadata_sync_command: + print("\nRun this locally:") + print(metadata_sync_command) + + git_add = build_git_add_command(metadata_sync_targets) + if git_add: + print("\nThen commit with:") + print(git_add) + print(f'git commit -m "{SUGGESTED_TAGGED_COMMIT}"') + # Emit GitHub Actions job summary if available emit_summary = not getattr(args, "no_step_summary", False) step_summary = os.environ.get("GITHUB_STEP_SUMMARY") From 62d58d393521af2d763ce82052a3d938c51ca765 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 21 May 2026 11:16:46 +0200 Subject: [PATCH 04/86] Docs audit [April 2026]: Review docs - metadata update only (#3297) * Add docs and notebooks audit export tool Add tools/docs_and_notebooks_audit.py: a CLI tool that scans Markdown and Jupyter notebooks for a deeplabcut metadata namespace, validates selected fields (visibility, status, recommendation, last_verified) against enums via pydantic, and exports a CSV audit register. Features include YAML frontmatter and notebook metadata parsing, alias support for recommendation, preservation of human-authored CSV columns across re-runs, configurable include/exclude scan patterns, target filtering (files, dirs, globs), and basic reporting of parse/validation issues. * Ignore tools/docs_audits in docs scan Add tools/docs_audits/** to the scan exclude list in tools/docs_and_notebooks_report_config.yml so the docs & notebooks report skips files in that directory (e.g., generated audit artifacts or temporary outputs). * Ignore docs_audits; include tools MD files Add an exclude pattern (^tools/docs_audits/) to the docs/notebooks pre-commit hook so files under tools/docs_audits/ are skipped. Also add tools/**/*.md to the scan list in tools/docs_and_notebooks_report_config.yml so Markdown files in the tools directory are included in the docs/notebooks report. * Introduce markdown-myst pre-commit hook ## Summary Adds `mdformat` v1.0 as a pre commit hook with the myst plugin. This helps automate formatting of documentation and catch any mistakes in structure or syntax, making docs maintenance easier. ## Scope As a hook with write permissions, it is meant to run locally, not in CI. * Add notes field and 'move' recommendation Add support for human-editable notes and a new Recommendation.MOVE enum. AuditMetadata now includes a notes field and FIELD_SPECS registers notes so notes are read from CSV. merged_row now preserves existing human notes, warns on conflicts between scanned and previous notes, and prefers previous notes when present. build_row no longer unconditionally writes an empty notes value (to avoid clobbering preserved notes). Also removed the file shebang line. * Document Recommendation enum values Add brief inline comments to each member of the Recommendation enum in tools/docs_and_notebooks_audit.py to clarify what each action means for auditors (keep, verify, update, move, merge, archive, remove). This is a documentation-only change and does not alter runtime behavior. * chore(metadata): update docs/notebooks metadata Installation page * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * Update audit files * chore(metadata): update docs/notebooks metadata * Update docs_and_notebooks_audit.py * Fix pre-commit YAML indent and update usage examples Corrects YAML indentation in .pre-commit-config.yaml so mdformat-myst is properly listed under additional_dependencies. Also updates usage examples in tools/docs_and_notebooks_audit.py to reference the docs_and_notebooks_audit.py script (replacing docs_audit_export.py) to reflect the current script name. * Fix typo Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> --------- Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> --- docs/HelperFunctions.md | 4 + docs/Overviewof3D.md | 4 + docs/beginner-guides/Training-Evaluation.md | 4 + docs/beginner-guides/beginners-guide.md | 4 + docs/beginner-guides/labeling.md | 4 + docs/beginner-guides/manage-project.md | 4 + docs/beginner-guides/video-analysis.md | 4 + docs/course.md | 3 + docs/docker.md | 3 + docs/gui/PROJECT_GUI.md | 4 + docs/gui/napari_GUI.md | 4 + docs/installation.md | 10 ++- docs/maDLC_UserGuide.md | 4 + docs/pytorch/Benchmarking_shuffle_guide.md | 4 + docs/pytorch/architectures.md | 3 + docs/pytorch/pytorch_config.md | 4 + docs/pytorch_dlc.md | 4 + docs/quick-start/single_animal_quick_guide.md | 4 + docs/quick-start/tutorial_maDLC.md | 3 + docs/recipes/MegaDetectorDLCLive.md | 3 + docs/recipes/installTips.md | 6 +- ...ng_notebooks_into_the_DLC_main_cookbook.md | 4 + docs/standardDeepLabCut_UserGuide.md | 4 + .../docs_audits/april-2026/audit_metadata.csv | 78 +++++++++++++++++++ 24 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 tools/docs_audits/april-2026/audit_metadata.csv diff --git a/docs/HelperFunctions.md b/docs/HelperFunctions.md index aa90f91975..e651f45b02 100644 --- a/docs/HelperFunctions.md +++ b/docs/HelperFunctions.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: outdated + recommendation: archive + notes: I would suggest using API docs over pages like this to avoid drift. The advice below promises updates that are not being made, and the content is already quite outdated. Automating API docs generation and putting usage info for obtaining commands info in ipython in a basic 'evergreen' page would be more sustainable than trying to maintain this page. --- (helper-functions)= # Helper & Advanced Optional Function Documentation diff --git a/docs/Overviewof3D.md b/docs/Overviewof3D.md index 07c9384a90..afb844db38 100644 --- a/docs/Overviewof3D.md +++ b/docs/Overviewof3D.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-10-14' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: update + notes: Contents seem up-to-date as the codebase has not evolved drastically for 3D, but formatting and organization could be improved. Separate basic/advanced sections could help, as well as more admonitions/dropdowns to streamline. --- (3D-overview)= # 3D DeepLabCut diff --git a/docs/beginner-guides/Training-Evaluation.md b/docs/beginner-guides/Training-Evaluation.md index 802a22aec5..d94ee69f53 100644 --- a/docs/beginner-guides/Training-Evaluation.md +++ b/docs/beginner-guides/Training-Evaluation.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-02-28' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: move + notes: "As mentioned on other beginner-guides/ docs, this should be part of the GUI section." --- # Neural Network training and evaluation in the GUI DLC LIVE! diff --git a/docs/beginner-guides/beginners-guide.md b/docs/beginner-guides/beginners-guide.md index 784e522c65..a4df28db50 100644 --- a/docs/beginner-guides/beginners-guide.md +++ b/docs/beginner-guides/beginners-guide.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2026-03-03' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: outdated + recommendation: update + notes: "While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed." --- (beginners-guide)= # Using DeepLabCut diff --git a/docs/beginner-guides/labeling.md b/docs/beginner-guides/labeling.md index 546d76b96e..8e3173cbe2 100644 --- a/docs/beginner-guides/labeling.md +++ b/docs/beginner-guides/labeling.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: update + notes: "Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow." --- (labeling)= # Labeling GUI diff --git a/docs/beginner-guides/manage-project.md b/docs/beginner-guides/manage-project.md index ee0e0f339e..4159ba99b9 100644 --- a/docs/beginner-guides/manage-project.md +++ b/docs/beginner-guides/manage-project.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: move + notes: "It seems the beginner guide section is more of a GUI step-by-step. As such, it should be moved to the GUI section, and merged/integrated with the contents there. The content is useful, but making it clear that this is for the GUI would reduce the confusion of a beginner guide being in fact rather central GUI use instructions." --- # Setting up what keypoints to track DLC LIVE! diff --git a/docs/beginner-guides/video-analysis.md b/docs/beginner-guides/video-analysis.md index 8c48d3209c..5ed5892530 100644 --- a/docs/beginner-guides/video-analysis.md +++ b/docs/beginner-guides/video-analysis.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: move + notes: "As mentioned on oher beginner-guides/ docs, this should be part of the GUI section." --- # Video Analysis with DeepLabCut DLC LIVE! diff --git a/docs/course.md b/docs/course.md index 58c9d153c0..a47610c787 100644 --- a/docs/course.md +++ b/docs/course.md @@ -3,6 +3,9 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: outdated + recommendation: archive --- # DeepLabCut Self-paced Course diff --git a/docs/docker.md b/docs/docker.md index dbca607353..7e4e440937 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -3,6 +3,9 @@ deeplabcut: last_content_updated: '2025-04-15' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: verify --- (docker-containers)= # DeepLabCut Docker containers diff --git a/docs/gui/PROJECT_GUI.md b/docs/gui/PROJECT_GUI.md index 479b6c01d9..2527b4b062 100644 --- a/docs/gui/PROJECT_GUI.md +++ b/docs/gui/PROJECT_GUI.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-02-28' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: update + notes: "While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commmands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide." --- (project-manager-gui)= # Interactive Project Manager GUI diff --git a/docs/gui/napari_GUI.md b/docs/gui/napari_GUI.md index 0bafe5c84f..79f1ee7e92 100644 --- a/docs/gui/napari_GUI.md +++ b/docs/gui/napari_GUI.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2026-02-10' last_metadata_updated: '2026-04-09' ignore: false + visibility: online + status: outdated + recommendation: archive + notes: Being updated in a separate PR (#3280) last_verified: '2026-04-09' verified_for: 3.0.0rc14 --- diff --git a/docs/installation.md b/docs/installation.md index 333a1e72bc..dd9d0e743c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,10 +1,16 @@ --- deeplabcut: last_content_updated: '2026-02-23' - last_metadata_updated: '2026-03-06' + last_metadata_updated: '2026-04-21' ignore: false + visibility: online + status: outdated + recommendation: update + notes: Could be moved to a core/installation folder for clarity. + last_verified: '2026-04-21' + verified_for: 3.0.0rc14 --- -(how-to-install)= +(file:how-to-install)= # How To Install DeepLabCut - **DeepLabCut can be run on Windows, Linux, or MacOS as long as you have Python 3.10 installed** diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 1c4dcc5731..4e79c41358 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2026-02-10' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: verify + notes: Could use a small formatting pass. Contents are 4-5y old in some places, recommend to review for accuracy. --- (multi-animal-userguide)= # DeepLabCut for Multi-Animal Projects diff --git a/docs/pytorch/Benchmarking_shuffle_guide.md b/docs/pytorch/Benchmarking_shuffle_guide.md index ba54ceca9f..81802cf164 100644 --- a/docs/pytorch/Benchmarking_shuffle_guide.md +++ b/docs/pytorch/Benchmarking_shuffle_guide.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: move + notes: "Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends." --- # DeepLabCut Benchmarking - User Guide diff --git a/docs/pytorch/architectures.md b/docs/pytorch/architectures.md index 755a967a77..a6cefbe586 100644 --- a/docs/pytorch/architectures.md +++ b/docs/pytorch/architectures.md @@ -3,6 +3,9 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: keep --- (dlc3-architectures)= # DeepLabCut 3.0 - PyTorch Model Architectures diff --git a/docs/pytorch/pytorch_config.md b/docs/pytorch/pytorch_config.md index cbd435c46a..0019433993 100644 --- a/docs/pytorch/pytorch_config.md +++ b/docs/pytorch/pytorch_config.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-10-02' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: verify + notes: "Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update." --- (dlc3-pytorch-config)= # The PyTorch Configuration file diff --git a/docs/pytorch_dlc.md b/docs/pytorch_dlc.md index 6d2ddca45b..50890c3440 100644 --- a/docs/pytorch_dlc.md +++ b/docs/pytorch_dlc.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2024-01-17' last_metadata_updated: '2026-03-06' ignore: false + visibility: orphaned + status: viable + recommendation: move + notes: "Unclear why this is unlisted in TOC; recommend updating and moving to PyTorch section." --- # DeepLabCut: PyTorch API diff --git a/docs/quick-start/single_animal_quick_guide.md b/docs/quick-start/single_animal_quick_guide.md index 99362ea9d0..5f88c9b126 100644 --- a/docs/quick-start/single_animal_quick_guide.md +++ b/docs/quick-start/single_animal_quick_guide.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: archive + notes: "This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving." --- # QUICK GUIDE to single Animal Training: **The main steps to take you from project creation to analyzed videos:** diff --git a/docs/quick-start/tutorial_maDLC.md b/docs/quick-start/tutorial_maDLC.md index 111ed996f5..adf8dda979 100644 --- a/docs/quick-start/tutorial_maDLC.md +++ b/docs/quick-start/tutorial_maDLC.md @@ -3,6 +3,9 @@ deeplabcut: last_content_updated: '2025-02-28' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: viable + recommendation: keep --- # Multi-animal pose estimation with DeepLabCut: A 5-minute tutorial diff --git a/docs/recipes/MegaDetectorDLCLive.md b/docs/recipes/MegaDetectorDLCLive.md index 416a23125c..3f216e5ba3 100644 --- a/docs/recipes/MegaDetectorDLCLive.md +++ b/docs/recipes/MegaDetectorDLCLive.md @@ -3,6 +3,9 @@ deeplabcut: last_content_updated: '2026-02-10' last_metadata_updated: '2026-03-06' ignore: false + visibility: orphaned + status: outdated + recommendation: archive --- # 💚 MegaDetector+DeepLabCut 💜 diff --git a/docs/recipes/installTips.md b/docs/recipes/installTips.md index 1ddefa0ca7..a76b7ace45 100644 --- a/docs/recipes/installTips.md +++ b/docs/recipes/installTips.md @@ -1,8 +1,12 @@ --- deeplabcut: last_content_updated: '2025-02-28' - last_metadata_updated: '2026-03-06' + last_metadata_updated: '2026-04-27' ignore: false + visibility: online + status: outdated + recommendation: archive + notes: "Should be removed in favor of the main installation guide." --- (installation-tips)= # Installation Tips diff --git a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md index 99d754c731..2efd55b858 100644 --- a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md +++ b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: verify + notes: Sligthly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo. --- # Publishing Notebooks into the Main DLC Cookbook ### Your Recipe Guide to Contributing to the DLC Cookbook diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 59985ea3bb..9847b41dc9 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: review_needed + recommendation: update + notes: This is a crucial piece of the doc, but it is rather long and verbose. Recommend breaking it up into smaller sections, and adding more visuals (e.g. screenshots of the GUI, etc.) to make it more engaging and easier to read. Also, consider adding a table of contents at the beginning for easier navigation. --- (single-animal-userguide)= # DeepLabCut User Guide (for single animal projects) diff --git a/tools/docs_audits/april-2026/audit_metadata.csv b/tools/docs_audits/april-2026/audit_metadata.csv new file mode 100644 index 0000000000..2a89a1285a --- /dev/null +++ b/tools/docs_audits/april-2026/audit_metadata.csv @@ -0,0 +1,78 @@ +path,kind,metadata_present,visibility,status,recommendation,last_verified,parse_error,validation_error,notes,review_decision,review_priority +docs/Governance.md,md,true,,,,,,,,, +docs/HelperFunctions.md,md,true,online,outdated,archive,,,,"I would suggest using API docs over pages like this to avoid drift. The advice below promises updates that are not being made, and the content is already quite outdated. Automating API docs generation and putting usage info for obtaining commands info in ipython in a basic 'evergreen' page would be more sustainable than trying to maintain this page.",, +docs/MISSION_AND_VALUES.md,md,true,,,,,,,,, +docs/ModelZoo.md,md,true,,,,,,,,, +docs/Overviewof3D.md,md,true,online,review_needed,update,,,,"Contents seem up-to-date as the codebase has not evolved drastically for 3D, but formatting and organization could be improved. Separate basic/advanced sections could help, as well as more admonitions/dropdowns to streamline.",, +docs/README.md,md,true,,,,,,,,, +docs/UseOverviewGuide.md,md,true,online,viable,keep,2026-04-27,,,,, +docs/beginner-guides/Training-Evaluation.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, +docs/beginner-guides/beginners-guide.md,md,true,online,outdated,update,,,,"While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed.",, +docs/beginner-guides/labeling.md,md,true,online,viable,update,,,,"Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow.",, +docs/beginner-guides/manage-project.md,md,true,online,viable,move,,,,"It seems the beginner guide section is more of a GUI step-by-step. As such, it should be moved to the GUI section, and merged/integrated with the contents there. The content is useful, but making it clear that this is for the GUI would reduce the confusion of a beginner guide being in fact rather central GUI use instructions.",, +docs/beginner-guides/video-analysis.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, +docs/benchmark.md,md,true,,,,,,,,, +docs/citation.md,md,true,,,,,,,,, +docs/convert_maDLC.md,md,true,,,,,,,,, +docs/course.md,md,true,online,outdated,archive,,,,,, +docs/dlc-live/deeplabcutlive.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/index.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/quickstart/install.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md,md,true,,,,,,,,, +docs/dlc-live/dlc-live-gui/user_guide/overview.md,md,true,,,,,,,,, +docs/docker.md,md,true,online,review_needed,verify,,,,,, +docs/gui/PROJECT_GUI.md,md,true,online,review_needed,update,,,,"While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commmands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide.",, +docs/gui/napari_GUI.md,md,true,online,outdated,archive,,,,Being updated in a separate PR (#3280),, +docs/installation.md,md,true,online,outdated,update,2026-04-21,,,Could be moved to a core/installation folder for clarity.,, +docs/intro.md,md,true,,,,,,,,, +docs/maDLC_UserGuide.md,md,true,online,review_needed,verify,,,,"Could use a small formatting pass. Contents are 4-5y old in some places, recommend to review for accuracy.",, +docs/pytorch/Benchmarking_shuffle_guide.md,md,true,online,viable,move,,,,"Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends.",, +docs/pytorch/architectures.md,md,true,online,viable,keep,,,,,, +docs/pytorch/pytorch_config.md,md,true,online,review_needed,verify,,,,"Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update.",, +docs/pytorch/user_guide.md,md,true,,,,,,,,, +docs/pytorch_dlc.md,md,true,orphaned,viable,move,,,,Unclear why this is unlisted in TOC; recommend updating and moving to PyTorch section.,, +docs/quick-start/single_animal_quick_guide.md,md,true,online,viable,archive,,,,"This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving.",, +docs/quick-start/tutorial_maDLC.md,md,true,online,viable,keep,,,,,, +docs/recipes/BatchProcessing.md,md,true,,,,,,,,, +docs/recipes/ClusteringNapari.md,md,true,,,,,,,,, +docs/recipes/DLCMethods.md,md,true,,,,,,,,, +docs/recipes/MegaDetectorDLCLive.md,md,true,orphaned,outdated,archive,,,,,, +docs/recipes/OpenVINO.md,md,true,,,,,,,,, +docs/recipes/OtherData.md,md,true,,,,,,,,, +docs/recipes/TechHardware.md,md,true,,,,,,,,, +docs/recipes/UsingModelZooPupil.md,md,true,,,,,,,,, +docs/recipes/flip_and_rotate.ipynb,ipynb,true,,,,,,,,, +docs/recipes/installTips.md,md,true,online,outdated,archive,,,,Should be removed in favor of the main installation guide.,, +docs/recipes/io.md,md,true,,,,,,,,, +docs/recipes/nn.md,md,true,,,,,,,,, +docs/recipes/pose_cfg_file_breakdown.md,md,true,,,,,,,,, +docs/recipes/post.md,md,true,,,,,,,,, +docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md,md,true,online,review_needed,verify,,,,"Sligthly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo.",, +docs/roadmap.md,md,true,,,,,,,,, +docs/standardDeepLabCut_UserGuide.md,md,true,online,review_needed,update,,,,"This is a crucial piece of the doc, but it is rather long and verbose. Recommend breaking it up into smaller sections, and adding more visuals (e.g. screenshots of the GUI, etc.) to make it more engaging and easier to read. Also, consider adding a table of contents at the beginning for easier navigation.",, +examples/COLAB/COLAB_3miceDemo.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_BUCTD_and_CTD_tracking.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_DLC_ModelZoo.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_HumanPose_with_RTMPose.ipynb,ipynb,false,,,,,,,,, +examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_transformer_reID.ipynb,ipynb,false,,,,,,,,, +examples/JUPYTER/Demo_3D_DeepLabCut.ipynb,ipynb,true,,,,,,,,, +examples/JUPYTER/Demo_labeledexample_MouseReaching.ipynb,ipynb,true,,,,,,,,, +examples/JUPYTER/Demo_labeledexample_Openfield.ipynb,ipynb,true,,,,,,,,, +examples/JUPYTER/Demo_napari.ipynb,ipynb,true,,,,,,,,, +examples/JUPYTER/Demo_yourowndata.ipynb,ipynb,true,,,,,,,,, +examples/JUPYTER/Docker_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,,,,,, +tools/README.md,md,false,,,,,,,,, +tools/docs_and_notebooks_tool_README.md,md,false,,,,,,,,, +tools/ruff_cleanup_helpers.md,md,false,,,,,,,,, From a4faaf776ef484a744deacada7443c19a7343ff0 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 12:12:00 +0200 Subject: [PATCH 05/86] Docs audit [April 2026]: Docs content update (#3298) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs and notebooks audit export tool Add tools/docs_and_notebooks_audit.py: a CLI tool that scans Markdown and Jupyter notebooks for a deeplabcut metadata namespace, validates selected fields (visibility, status, recommendation, last_verified) against enums via pydantic, and exports a CSV audit register. Features include YAML frontmatter and notebook metadata parsing, alias support for recommendation, preservation of human-authored CSV columns across re-runs, configurable include/exclude scan patterns, target filtering (files, dirs, globs), and basic reporting of parse/validation issues. * Ignore tools/docs_audits in docs scan Add tools/docs_audits/** to the scan exclude list in tools/docs_and_notebooks_report_config.yml so the docs & notebooks report skips files in that directory (e.g., generated audit artifacts or temporary outputs). * Ignore docs_audits; include tools MD files Add an exclude pattern (^tools/docs_audits/) to the docs/notebooks pre-commit hook so files under tools/docs_audits/ are skipped. Also add tools/**/*.md to the scan list in tools/docs_and_notebooks_report_config.yml so Markdown files in the tools directory are included in the docs/notebooks report. * Introduce markdown-myst pre-commit hook ## Summary Adds `mdformat` v1.0 as a pre commit hook with the myst plugin. This helps automate formatting of documentation and catch any mistakes in structure or syntax, making docs maintenance easier. ## Scope As a hook with write permissions, it is meant to run locally, not in CI. * Add notes field and 'move' recommendation Add support for human-editable notes and a new Recommendation.MOVE enum. AuditMetadata now includes a notes field and FIELD_SPECS registers notes so notes are read from CSV. merged_row now preserves existing human notes, warns on conflicts between scanned and previous notes, and prefers previous notes when present. build_row no longer unconditionally writes an empty notes value (to avoid clobbering preserved notes). Also removed the file shebang line. * Document Recommendation enum values Add brief inline comments to each member of the Recommendation enum in tools/docs_and_notebooks_audit.py to clarify what each action means for auditors (keep, verify, update, move, merge, archive, remove). This is a documentation-only change and does not alter runtime behavior. * chore(metadata): update docs/notebooks metadata Installation page * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * Update audit files * chore(metadata): update docs/notebooks metadata * Polish README content and docs metadata Clean up and reorganize README.md: adjust headings and phrasing, remove extraneous blank lines, clarify installation and TensorFlow deprecation wording, add/rename sections (Pretrained Models, Development and Applications, Ecosystem, Code contributors, Funding), comment out outdated course/residency/roadmap links, update community badges and links, and improve news/release notes. Also add brief HTML comments to docs/README.md indicating the root README is used for main documentation and noting frontmatter metadata behavior. * Revise installation docs and update instructions Refactor docs/installation.md: update frontmatter metadata and restructure the installation guide. Broaden supported Python versions (3.10–3.12), clarify conda vs miniconda usage, add `uv` developer install instructions and editable `pip install -e` guidance, and reorganize sections for Conda, pip, Docker, GPU support, troubleshooting, and system/hardware considerations. Update TensorFlow deprecation timeline and GPU/CUDA guidance, improve admonitions/notes formatting, fix anchors/section refs, and add various wording and usability improvements. * docs: clarify and reformat installation guide Large cleanup and reorganization of docs/installation.md: rename heading, fix Markdown/admonition syntax, and normalize code fences. Clarified differences between Miniconda/Anaconda/conda, added a dedicated 'Build a conda environment' step, Windows-specific warnings, and tips for activating and managing environments. Added guidance for launching the GUI, created a simple conda env example, improved GPU/CUDA notes and troubleshooting links, and reformatted numerous paragraphs and images for readability. * Revise UseOverviewGuide content and layout Restructure and update the UseOverviewGuide page: fix markup (e.g. hint directive), add an Introduction and Workflow overview, embed/adjust images, and reorganize sections (What we support → Main modes; Additional learning resources; Usage advice & project types). Clarify installation reference, start/requirements guidance, and what you don't need. Add tips/warnings (recommend single-animal first, Windows admin warning), improve option headings for demos/GUI/terminal, and add brief terminal usage steps and useful links. Remove or comment out outdated/broken link references and tidy copy for clarity. * Update installation docs: GPU/OS guidance Rewrite and clarify installation guidance in docs/installation.md. Rephrase installation bullets (conda recommended, Docker note, GPU performance), fix image HTML closing and caption, and replace a single admonition with a tab-set providing CPU, NVIDIA GPU, and Apple M-chip GPU tabs (including CUDA/cuDNN guidance). Minor wording and link adjustments for clarity and reproducibility. * Clarify and reformat UseOverviewGuide Refines wording and layout in the UseOverviewGuide: changes "What scenario" to "Which scenario", normalizes "Quick start" capitalization, and restructures multi-animal guidance into clearer bullet points. Expands guidance about using multianimal mode for single-animal projects (when a skeleton helps) and warns against treating fixed-position parts (e.g., whiskers) as separate individuals. Consolidates and repositions tutorial links, adds an important note to label identifiable animals consistently, updates the conversion link phrasing, and clarifies the Windows note to state admin is required for certain usage tasks (downloading models/symlinks) but not for installation. * Convert links to Sphinx refs and tidy docs Replace Markdown inline links with Sphinx {ref} cross-references, standardize admonition/class syntax, and clean up spacing and punctuation throughout docs/installation.md. Also normalize casing for the DeepLabCut heading, adjust image/code block indentation, add a MacOS GPU support footnote, and make minor clarity edits to GPU/PyTorch/TensorFlow installation notes and examples. * Fix typos and formatting in installation docs Clean up docs/installation.md: fix an escaped Windows activate path (activate.ps1), remove stray blank lines, and separate/version-check and update encouragement into their own paragraph. Add a "Data compatibility" subsection, rename the system-wide header to "System-wide installation considerations", and make small wording/formatting tweaks (e.g., emphasize "temporarily", reword potential package conflicts, and normalize "very slow"). These changes improve clarity and readability of the installation guide. * Fix markdown code blocks and list numbering Adjust formatting in docs/UseOverviewGuide.md: indent fenced code blocks for proper rendering and normalize the ordered list numbering (use '1.' for sequential steps) for consistency in the instructions. * Remove outdated installation tips links Disable references to the outdated 'installation tips' page in docs/installation.md. Replaced direct links and related guidance with HTML comments, added a note that the git-clone section is the place for editable installs, adjusted the pro-tip wording to point users to the test video, and commented out the 'Additional tips' block. Original content is preserved in comments for review. * Update PROJECT_GUI.md * Clarify Project GUI wording in docs Make minor copy edits to docs/gui/PROJECT_GUI.md for clarity: change "easy-entry point" to "easy entry point", replace "easy-to-deploy GUI interface" with "easy-to-use GUI interface", and rephrase the following sentence to more clearly state that several advanced features are not available in the Project GUI. * Update beginner guide ref * Revise Beginner Guide to focus on GUI Refactor beginners-guide.md to center the guide on the DeepLabCut GUI. Updated the main heading and clarified startup wording (python -m deeplabcut) and project-creation workflow. Removed/replaced redundant installation text with a reference to the installation page and commented out an outdated course link. Added notes recommending the PyTorch engine, improved tips for video selection/copying, added guidance for defining bodyparts and multiple individuals, included a video tutorial GIF, and updated the next-steps reference to the GUI-specific manage-project page. Miscellaneous wording and screenshot tweaks for clarity. * Update install link ref * Refactor labeling guide and napari workflow Restructure and clarify the labeling documentation: reorganized headings and sections, consolidated frame selection guidance (automatic vs manual), and added an example workflow, important/tip admonitions, and a "Next steps" pointer to training/evaluation. Updated phrasing for clarity, fixed formatting (headings, links, and image reference), and replaced a quoted YAML note with unquoted text. These changes improve readability and better integrate the napari-DLC labeling workflow with the rest of the docs. * Clarify GUI config editing in manage-project Revise the manage-project beginner guide to focus on editing the GUI configuration file. Renamed the section, added a file anchor, and reworded the intro to explain config.yaml as the central project record. Introduced a dedicated "Editing the configuration" and a step-by-step walkthrough that consolidates bodyparts and skeleton guidance (including details on entries/IDs), improved bullets and examples, and added a tip and an HTML comment. Updated the link to the labeling guide (file:labeling-gui) and made minor YAML/frontmatter and formatting fixes. * Update GUI training/evaluation guide Revise docs/beginner-guides/Training-Evaluation.md: add RST anchor and restructure headings (Network training, Creating a training set, Starting the training process, Network evaluation, Next steps). Clarify wording (e.g. defaults described as “good” to start), convert tip to RST directive, adjust evaluation section formatting and images, and add reference to the video-analysis GUI section. Also change YAML notes value formatting. * Refactor video analysis guide for GUI Rework the beginner video-analysis doc to focus on the GUI workflow: add a file anchor, rename and restructure headings (Analyzing videos with your trained model, Generating labeled videos, Next steps), reorganize and clarify step-by-step instructions, and update copy. Also remove quoting from the frontmatter notes and add a TODO link comment for future cross-references. * Refine beginner guides and napari usage docs Update several docs to improve formatting, clarity, and links. Convert inline notes to admonition blocks, fix spacing/indentation around images and note blocks, and bold example items for readability (docs/beginner-guides/beginners-guide.md). Clarify labeling guidance and emphasize labeling across multiple videos; update front-matter note to link to napari plugin docs (docs/beginner-guides/labeling.md). Adjust manage-project wording and next-step link to the labeling guide (docs/beginner-guides/manage-project.md). Add a brief napari usage recommendation with a link to the official napari docs (docs/gui/napari/basic_usage.md). These changes aim to make the GUI/napari workflow and labeling guidance clearer for beginners. * Tidy beginner-guides Minor cleanup and reorganization prep for beginner guides: remove an extra closing parenthesis from an image link in Training-Evaluation.md; update frontmatter recommendation from "update" to "move" and simplify notes to indicate moving content to a dedicated GUI section in beginners-guide.md, labeling.md, and manage-project.md; and change "Click on" to "Select" in the labeling workflow example. These edits prepare the docs for consolidation under a GUI section. * Refine PROJECT_GUI docs layout and links Polish docs/gui/PROJECT_GUI.md: rename headings for clarity ("Interactive Project Manager GUI" → "Project Manager GUI", "Get Started:" → "Getting started", "Video Demo" → "User guide" / "Video demos"); replace inline markdown links with Sphinx {ref} cross-references (napari and beginners guide); add an important note linking to the beginners guide and a tip to "Click on the images!". These changes improve consistency with the docs style and surface the step-by-step GUI guide. * Fix link in getting started * docs: update Docker docs formatting and notes Refactor docs/docker.md to improve formatting and clarify guidance. Renamed the section heading, convert several inline notes into MyST admonitions (important/note), wrap the napari-deeplabcut install guidance into an important block, and adjust the GPU reminder into an admonition. Minor rework of the mount/example instructions and commented out a redundant labelling note to reduce duplication and improve readability. * Apply suggestions from code review Credita to @deruyter92 Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> * Separate GPU and cloud bullets; remove link Split the combined GPU/cloud sentence into two separate bullets for clarity. Removed the technical specs (FAQ) link from the GPU item and removed the troubleshooting wiki link at the bottom. Also cleaned up trailing newline/whitespace. * Update README: TF backend, dataset links Simplify and update README text: streamline TensorFlow engine install instructions and add a planned deprecation target (tensorflow backend deprecated in v3.2). Replace prior dataset references with explicit Zenodo DOIs for SuperAnimal-Quadruped and SuperAnimal-TopViewMouse and add a citation to Ye et al. 2024. Clarify that models including AP-10K are available in the API/GUI, and fix minor wording in the funding acknowledgement ("following support"). * Clarify Docker usage and napari limitation Update docs/docker.md to improve clarity and accuracy of Docker guidance. Reworded introduction to explain that DeepLabCut images are available on DockerHub, that Docker requires a local Docker installation, and that containers provide a reproducible, isolated environment for terminal and Jupyter use. Explicitly state the DeepLabCut GUI is not supported in containers and move/strengthen the important note that the napari-deeplabcut plugin cannot be run inside Docker and must be installed locally (e.g. via pip). Clarified that deeplabcut-docker is a lightweight helper that will not disrupt local TensorFlow/PyTorch or other dependencies, and fixed wording/formatting issues. * Clarify training dataset creation steps Add brief guidance in the Training Dataset section to outline key steps (splitting labeled data and creating shuffle folders) so beginners have a clearer workflow before training. Also include a small formatting/whitespace adjustment in the GPU/Colab note. * Clarify labeling progress and color-scheme docs Update docs/gui/napari/advanced_usage.md to improve clarity and usability. Reword the labeling progress note to emphasize that the displayed percentage is a rough estimate and that occluded/hidden keypoints are not counted. Expand and simplify instructions for jumping to a bodypart from the color scheme by breaking into explicit steps and clarifying behavior when the bodypart is already visible. Minor wording/formatting cleanups for readability. * Relocate demo video link; cleanup whitespace Move the demo video link to appear before the warning block and tidy up minor whitespace/trailing-space issues in docs/gui/napari/basic_usage.md. These are formatting-only changes and do not alter substantive content. * Update installation.md * Fix docs formatting, typos and image tags Clean up documentation across multiple files: add quotes to image src attributes, correct typos (e.g. "oher"→"other", "built"→"build", "compartimentalized"→"compartmentalized"), normalize admonition/code-block syntax, adjust cross-reference/link syntax, and make minor wording/grammar improvements. Affected files include docs/README.md, UseOverviewGuide.md, beginner-guides/*, course.md, docker.md, gui/PROJECT_GUI.md, and installation.md. * Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Docs: add external data import recipe Add a new recipe (docs/recipes/external_data_import.md) describing how to convert externally annotated data (CSV/H5) into the DeepLabCut format and how to merge multiple datasets (uses deeplabcut.convertcsv2h5). Update docs/installation.md to use a local Sphinx cross-reference for the Conda section, add the section anchor (sec:installation-using-conda), and fix the uv pip install line to quote the extras ('.[gui,modelzoo,tf]') to avoid shell globbing. Also add a file anchor (file:hardware-requirements)= to docs/recipes/TechHardware.md for cross-references. * Refine wording and links in user guides Small editorial updates to user documentation for clarity and better Sphinx linking. In docs/UseOverviewGuide.md: use inline `help` function wording, rephrase 'jump back in' to 'resume work' for clarity, and replace the 'Option 3' Project Manager GUI link with a Sphinx {ref} cross-reference. In docs/beginner-guides/beginners-guide.md: change the tip to 'Avoid spaces' and emphasize the scorer/experimenter field. These changes improve readability and consistency. * Convert internal docs links to Sphinx refs Replace Markdown-style internal links with Sphinx/MyST cross-reference syntax and adjust anchors/formatting for proper rendering. Updated docs/UseOverviewGuide.md to use {ref}`...` and change the target anchor to sec:important-info-regd-usage, and fixed the user-guide list formatting. Updated docs/gui/PROJECT_GUI.md to use {ref}`Read more here ` in two places. * chore(metadata): update docs/notebooks metadata * Update course.md * Docs: copyedits, formatting, and install updates Editorial and formatting updates across documentation to improve clarity and accuracy. Key changes: - README.md: minor whitespace/paragraph tweak in funding section. - docs/UseOverviewGuide.md: corrected phrasing for mode selection. - docs/beginner-guides/beginners-guide.md: reworded intro, removed stray blank line, clarified install link. - docs/course.md: removed trailing colon from heading. - docs/gui/PROJECT_GUI.md: removed outdated release-note lines. - docs/gui/napari_GUI.md: adjusted front-matter spacing and landing file anchor. - docs/installation.md: updated PyTorch install example to pip + CUDA 12.6 wheel URL, clarified pip install deeplabcut usage (mentioning --pre), updated uv editable install extras (removed tf), added recommended clone step, improved version-check example and a few other clarifications. - docs/pytorch/pytorch_config.md: multiple formatting fixes (lists, line wraps, links, code blocks), corrected table header alignment, minor text clarifications and punctuation fixes. - docs/recipes/TechHardware.md: heading and subsection title adjustments and minor wording tweaks. - docs/recipes/external_data_import.md: combined demo CSV links into one sentence and adjusted bullet formatting. - docs/standardDeepLabCut_UserGuide.md: extensive copyedits and formatting cleanups (headings, admonitions, code blocks, escaped characters, consistent naming like add_new_videos), reflowed many paragraphs and improved examples and API-admonition formatting. Overall these changes are non-functional documentation improvements to make instructions clearer and fix formatting/typography issues. --------- Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- README.md | 102 +++-- docs/README.md | 5 + docs/UseOverviewGuide.md | 203 ++++++--- docs/beginner-guides/Training-Evaluation.md | 50 ++- docs/beginner-guides/beginners-guide.md | 128 ++++-- docs/beginner-guides/labeling.md | 89 ++-- docs/beginner-guides/manage-project.md | 51 ++- docs/beginner-guides/video-analysis.md | 42 +- docs/course.md | 92 ++-- docs/docker.md | 89 ++-- docs/gui/PROJECT_GUI.md | 51 ++- docs/gui/napari/advanced_usage.md | 12 +- docs/gui/napari/basic_usage.md | 18 +- docs/gui/napari_GUI.md | 2 + docs/installation.md | 452 ++++++++++++-------- docs/pytorch/pytorch_config.md | 74 ++-- docs/recipes/TechHardware.md | 23 +- docs/recipes/external_data_import.md | 37 ++ docs/standardDeepLabCut_UserGuide.md | 229 ++++++---- 19 files changed, 1084 insertions(+), 665 deletions(-) create mode 100644 docs/recipes/external_data_import.md diff --git a/README.md b/README.md index 5c177728ad..746bdebf28 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,6 @@ - - - - - - [📚Documentation](https://deeplabcut.github.io/DeepLabCut/README.html) | [🛠️ Installation](https://deeplabcut.github.io/DeepLabCut/docs/installation.html) | [🌎 Home Page](https://www.deeplabcut.org) | @@ -57,7 +51,7 @@ **DeepLabCut™️** is a toolbox for state-of-the-art markerless pose estimation of animals performing various behaviors. As long as you can see (label) what you want to track, you can use this toolbox, as it is animal and object agnostic. [Read a short development and application summary below](https://github.com/DeepLabCut/DeepLabCut#why-use-deeplabcut). -# [Installation: how to install DeepLabCut](https://deeplabcut.github.io/DeepLabCut/docs/installation.html) +# [Installation](https://deeplabcut.github.io/DeepLabCut/docs/installation.html) Please click the link above for all the information you need to get started! Please note that currently we support only Python 3.10+ (see conda files for guidance). @@ -80,39 +74,47 @@ pip install --pre "deeplabcut[gui]" or `pip install --pre "deeplabcut"` (headless version with PyTorch)! -To use the TensorFlow (TF) engine (requires Python 3.10; TF up to v2.10 supported on Windows, -up to v2.12 on other platforms): you'll need to run `pip install "deeplabcut[gui,tf]"` -(which includes all functions plus GUIs) or `pip install "deeplabcut[tf]"` (headless -version with PyTorch and TensorFlow). We aim to depreciate the TF part in 2027. +To use the TensorFlow (TF) engine: you'll need to run `pip install "deeplabcut[gui,tf]"` or `pip install "deeplabcut[tf]"` (headless version with TF). +We aim to deprecate the tensorflow backend in version 3.2 (release date TBD). We recommend using our conda file, see [here](https://github.com/DeepLabCut/DeepLabCut/blob/main/conda-environments/README.md) or the [`deeplabcut-docker` package](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker). -# [Documentation: The DeepLabCut Process](https://deeplabcut.github.io/DeepLabCut/README.html) + +# Documentation: The DeepLabCut Process Our docs walk you through using DeepLabCut, and key API points. For an overview of the toolbox and workflow for project management, see our step-by-step at [Nature Protocols paper](https://doi.org/10.1038/s41596-019-0176-0). -For a deeper understanding and more resources for you to get started with Python and DeepLabCut, please check out our free online course! https://deeplabcut.github.io/DeepLabCut/docs/course.html + +

-# [DEMO the code](examples/README.md) +# [Code demo](examples/README.md) -🐭 pose tracking of single animals demo [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DeepLabCut/DeepLabCut/blob/master/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb) +🐭 Pose tracking of single animals demo [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DeepLabCut/DeepLabCut/blob/master/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb) -See [more demos here](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/README.md). We provide data and several Jupyter Notebooks: one that walks you through a demo dataset to test your installation, and another Notebook to run DeepLabCut from the beginning on your own data. We also show you how to use the code in Docker, and on Google Colab. +See [more demos here](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/README.md). +We provide data and several Jupyter Notebooks, walking you through a demo dataset to test your installation, and another to run DeepLabCut from the start on your own data. +We also show how to use the code in Docker, and on Google Colab. # Why use DeepLabCut? -DeepLabCut continues to be actively maintained and we strive to provide a user-friendly `GUI` and `API` for computer vision researchers and life scientists alike. This means we integrate state-of-the-art models and frameworks, while providing our "best-guess" defaults for life scientists. We highly encourage you to read our papers to get a better understanding of what to use and how to modify the models for your setting. +DeepLabCut continues to be actively maintained and we strive to provide a user-friendly `GUI` and `API` for computer vision researchers and life scientists alike. This means we integrate state-of-the-art models and frameworks, while providing our "best-guess" defaults for life scientists. +We highly encourage you to read our papers to get a better understanding of what to use and how to modify the models for your setting. ## Performance 🔥 In general, we provide all the tooling for you to train and use custom models with various high-performance backbones. -We also provide two foundation pretrained animal models: `SuperAnimal-Quadruped`, `SuperAnimal-TopViewMouse`. To gauge their *out-of-distribution* performance, we provide the following tables. -These models are trained on the [SuperAnimal-Quadruped with AP-10K held out for out-of-domain testing]([https://cocodataset.org/](https://www.nature.com/articles/s41467-024-48792-2)) and the [SuperAnimal-TopViewMouse with DLC-openfield held out for out-of-distribution testing](https://www.nature.com/articles/s41467-024-48792-2). We provide models that include AP-10K in the API (and GUI). +## Pretrained Models + +We also provide two foundation pretrained animal models: `SuperAnimal-Quadruped` & `SuperAnimal-TopViewMouse`. +To gauge their *out-of-distribution* performance, we provide the following tables. + +These models are trained on the [SuperAnimal-Quadruped dataset](https://doi.org/10.5281/zenodo.10619172) with *AP-10K* held out for out-of-domain testing and the [SuperAnimal-TopViewMouse dataset](https://doi.org/10.5281/zenodo.13757509) with *DLC-openfield* held out for out-of-distribution testing (see [Ye et al. 2024](https://www.nature.com/articles/s41467-024-48792-2)). +We provide models that include AP-10K in the API (and GUI). Note, there are many different models to select from in DeepLabCut 3.0. We strongly recommend you check [this Guide](https://deeplabcut.github.io/DeepLabCut/docs/pytorch/architectures.html) for more details. This table, and those below, give you a sense of performance in real-world complex in-the-wild and lab mouse data, respectively. This [link provides the model weights](https://huggingface.co/mwmathis/DeepLabCutModelZoo-SuperAnimal-Quadruped) to reproduce the numbers; but please note, our `full` models are in our DLClibrary and released in the API. @@ -132,8 +134,13 @@ This [link provides the model weights](https://huggingface.co/mwmathis/DeepLabCu ## The History -In 2018, we demonstrated the capabilities for [trail tracking](https://vnmurthylab.org/), [reaching in mice](http://www.mousemotorlab.org/) and various Drosophila behaviors during egg-laying (see [Mathis et al.](https://www.nature.com/articles/s41593-018-0209-y) for details). There is, however, nothing specific that makes the toolbox only applicable to these tasks and/or species. The toolbox has already been successfully applied (by us and others) to [rats](http://www.mousemotorlab.org/deeplabcut), humans, various fish species, bacteria, leeches, various robots, cheetahs, [mouse whiskers](http://www.mousemotorlab.org/deeplabcut) and [race horses](http://www.mousemotorlab.org/deeplabcut). DeepLabCut utilized the feature detectors (ResNets + readout layers) of one of the state-of-the-art algorithms for human pose estimation by Insafutdinov et al., called DeeperCut, which inspired the name for our toolbox (see references below). Since this time, the package has changed substantially. The code has been re-tooled and re-factored since 2.1+: We have added faster and higher performance variants with MobileNetV2s, EfficientNets, and our own DLCRNet backbones (see [Pretraining boosts out-of-domain robustness for pose estimation](https://arxiv.org/abs/1909.11229) and [Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0)). Additionally, we have improved the inference speed and provided both additional and novel augmentation methods, added real-time, and multi-animal support. -In v3.0+ we have changed the backend to support PyTorch. This brings not only an easier installation process for users, but performance gains, developer flexibility, and a lot of new tools! Importantly, the high-level API stays the same, so it will be a seamless transition for users 💜! +### Development and Applications + +In 2018, we demonstrated the capabilities for [trail tracking](https://vnmurthylab.org/), [reaching in mice](http://www.mousemotorlab.org/) and various Drosophila behaviors during egg-laying (see [Mathis et al.](https://www.nature.com/articles/s41593-018-0209-y) for details). There is, however, nothing specific that makes the toolbox only applicable to these tasks and/or species. +The toolbox has already been successfully applied (by us and others) to [rats](http://www.mousemotorlab.org/deeplabcut), humans, various fish species, bacteria, leeches, various robots, cheetahs, [mouse whiskers](http://www.mousemotorlab.org/deeplabcut) and [race horses](http://www.mousemotorlab.org/deeplabcut). +DeepLabCut utilized the feature detectors (ResNets + readout layers) of one of the state-of-the-art algorithms for human pose estimation by Insafutdinov et al., called DeeperCut, which inspired the name for our toolbox (see references below). Since this time, the package has changed substantially. +The code has been re-tooled and re-factored since 2.1+: We have added faster and higher performance variants with MobileNetV2s, EfficientNets, and our own DLCRNet backbones (see [Pretraining boosts out-of-domain robustness for pose estimation](https://arxiv.org/abs/1909.11229) and [Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0)). Additionally, we have improved the inference speed and provided both additional and novel augmentation methods, added real-time, and multi-animal support. +In v3.0+ we have updated the backend to support PyTorch. This brings not only an easier installation process for users, but performance gains, developer flexibility, and a lot of new tools! Importantly, the high-level API stays the same, so it will be a seamless transition for users 💜! We currently provide state-of-the-art performance for animal pose estimation and the labs (M. Mathis Lab and A. Mathis Group) have both top journal and computer vision conference papers.

@@ -145,49 +152,51 @@ We currently provide state-of-the-art performance for animal pose estimation and **Left:** Due to transfer learning it requires **little training data** for multiple, challenging behaviors (see [Mathis et al. 2018](https://www.nature.com/articles/s41593-018-0209-y) for details). **Mid Left:** The feature detectors are robust to video compression (see [Mathis/Warren](https://www.biorxiv.org/content/early/2018/10/30/457242) for details). **Mid Right:** It allows 3D pose estimation with a single network and camera (see [Mathis/Warren](https://www.biorxiv.org/content/early/2018/10/30/457242)). **Right:** It allows 3D pose estimation with a single network trained on data from multiple cameras together with standard triangulation methods (see [Nath* and Mathis* et al. 2019](https://doi.org/10.1038/s41596-019-0176-0)). -**DeepLabCut** is embedding in a larger open-source eco-system, providing behavioral tracking for neuroscience, ecology, medical, and technical applications. Moreover, many new tools are being actively developed. See [DLC-Utils](https://github.com/DeepLabCut/DLCutils) for some helper code. +### Ecosystem + +**DeepLabCut** is part of a larger open-source eco-system, providing behavioral tracking for neuroscience, ecology, medical, and technical applications. +Moreover, many new tools are being actively developed. See [DLC-Utils](https://github.com/DeepLabCut/DLCutils) for some helper code.

-## Code contributors: +### Code contributors -DLC code was originally developed by [Alexander Mathis](https://github.com/AlexEMG) & [Mackenzie Mathis](https://github.com/MMathisLab), and was extended in 2.0 with the core dev team consisting of [Tanmay Nath](https://github.com/meet10may) (2.0-2.1), [Jessy Lauer](https://github.com/jeylau) (2.1-2.4), and [Niels Poulsen](https://github.com/n-poulsen) (2.3-3.0). -DeepLabCut is an open-source tool and has benefited from suggestions and edits by many individuals including early contributors: Mert Yuksekgonul, Tom Biasi, Richard Warren, Ronny Eichler, Hao Wu, Federico Claudi, Gary Kane and Jonny Saunders as well as the [100+ contributors](https://github.com/DeepLabCut/DeepLabCut/graphs/contributors). Please see [AUTHORS](https://github.com/DeepLabCut/DeepLabCut/blob/master/AUTHORS) for more details! +DeepLabCut was originally developed by [Alexander Mathis](https://github.com/AlexEMG) & [Mackenzie Mathis](https://github.com/MMathisLab), and was extended in 2.0 with the core dev team consisting of [Tanmay Nath](https://github.com/meet10may) (2.0-2.1), [Jessy Lauer](https://github.com/jeylau) (2.1-2.4), and [Niels Poulsen](https://github.com/n-poulsen) (2.3-3.0). +DeepLabCut is an open-source tool and has benefited from suggestions and edits by many individuals including early contributors: Mert Yuksekgonul, Tom Biasi, Richard Warren, Ronny Eichler, Hao Wu, Federico Claudi, Gary Kane and Jonny Saunders as well as the [100+ contributors](https://github.com/DeepLabCut/DeepLabCut/graphs/contributors). +Please see [AUTHORS](https://github.com/DeepLabCut/DeepLabCut/blob/master/AUTHORS) for more details! 🤩 This is an actively developed package and we welcome community development and involvement: [![Contributors](https://contrib.rocks/image?repo=DeepLabCut/DeepLabCut)](https://github.com/DeepLabCut/DeepLabCut/graphs/contributors) - - -# Get Assistance & be part of the DLC Community✨: +# Get Assistance & be part of the DLC Community✨ | 🚉 Platform | 🎯 Goal | ⏱️ Estimated Response Time | 📢 Support Squad | |------------------------------------------------------------|-----------------------------------------------------------------------------|---------------------------|----------------------------------------| -| GitHub DeepLabCut/[Issues](https://github.com/DeepLabCut/DeepLabCut/issues) | To report bugs and code issues🐛 (we encourage you to search issues first) | 2-5 days | DLC Core Dev Team | -| GitHub DeepLabCut/[Contributing](https://github.com/DeepLabCut/DeepLabCut/blob/master/CONTRIBUTING.md) | To contribute your expertise and experience🙏💯 | 2-5 days | DLC Core Dev Team | -| 🚧 GitHub DeepLabCut/[Roadmap](https://github.com/DeepLabCut/DeepLabCut/blob/master/docs/roadmap.md) | To learn more about our journey✈️ | N/A | N/A +| GitHub - [Issues](https://github.com/DeepLabCut/DeepLabCut/issues) | To report bugs and code issues🐛 (we encourage you to search issues first) | 2-5 days | DLC Core Dev Team | +| GitHub - [Contributing](https://github.com/DeepLabCut/DeepLabCut/blob/master/CONTRIBUTING.md) | To contribute your expertise and experience🙏💯 | 2-5 days | DLC Core Dev Team | | [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftag%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tag/deeplabcut)
🐭Tag: DeepLabCut | To ask help and support questions 👋 | Promptly🔥 | The DLC Community | |[![Gitter](https://badges.gitter.im/DeepLabCut/community.svg)](https://gitter.im/DeepLabCut/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) | To discuss with other users, share ideas and collaborate💡 | 2-5 days | The DLC Community | -| [BluSky🦋](https://bsky.app/profile/deeplabcut.bsky.social) | To keep up with our latest news and updates 📢 | 2-5 days | DLC Team | +| [![BlueSky](https://img.shields.io/badge/BlueSky-%40deeplabcut-blue?logo=bluesky)](https://bsky.app/profile/deeplabcut.bsky.social) | To keep up with our latest news and updates 📢 | 2-5 days | DLC Team | | [![Twitter Follow](https://img.shields.io/twitter/follow/DeepLabCut.svg?label=DeepLabCut&style=social)](https://x.com/DeepLabCut) | To keep up with our latest news and updates 📢 | 2-5 days | DLC Team | -| The DeepLabCut [AI Residency Program](https://www.deeplabcutairesidency.org/) | To come and work with us next summer👏 | Annually | DLC Team | + + -## References \& Citations: +## References \& Citations Please see our [dedicated page](https://deeplabcut.github.io/DeepLabCut/docs/citation.html) on how to **cite DeepLabCut** 🙏 and our suggestions for your Methods section! -## License: +## License This project is primarily licensed under the GNU Lesser General Public License v3.0. Note that the software is provided "as is", without warranty of any kind, express or implied. If you use the code or data, please cite us! Note, artwork (DeepLabCut logo) and images are copyrighted; please do not take or use these images without written permission. SuperAnimal models are provided for research use only (non-commercial use). -## Major Versions: +## Major Versions **For all versions, please see [here](https://github.com/DeepLabCut/DeepLabCut/releases).** @@ -202,18 +211,21 @@ This package includes graphical user interfaces to label your data, and take you VERSION 1.0: The initial, Nature Neuroscience version of [DeepLabCut](https://www.nature.com/articles/s41593-018-0209-y) can be found in the history of git, or here: https://github.com/DeepLabCut/DeepLabCut/releases/tag/1.11 -# News (and in the news): +# News + +## Major releases -:purple_heart: We released a major update, moving from 2.x --> 3.x with the backend change to PyTorch +💜 We released a major update, moving from 2.x --> 3.x with the backend change to PyTorch -:purple_heart: The DeepLabCut Model Zoo launches SuperAnimals, see more [here](https://deeplabcut.github.io/DeepLabCut/docs/ModelZoo.html). +💜 The DeepLabCut Model Zoo launches SuperAnimals, see more [here](https://deeplabcut.github.io/DeepLabCut/docs/ModelZoo.html). -:purple_heart: **DeepLabCut supports multi-animal pose estimation!** maDLC is out of beta/rc mode and beta is deprecated, thanks to the testers out there for feedback! Your labeled data will be backwards compatible, but not all other steps. Please see the [new `2.2+` releases](https://github.com/DeepLabCut/DeepLabCut/releases) for what's new & how to install it, please see our new [paper, Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0), and the [new docs]( https://deeplabcut.github.io/DeepLabCut) on how to use it! +💜 **DeepLabCut supports multi-animal pose estimation!** maDLC is out of beta/rc mode and beta is deprecated, thanks to the testers out there for feedback! Your labeled data will be backwards compatible, but not all other steps. Please see the [new `2.2+` releases](https://github.com/DeepLabCut/DeepLabCut/releases) for what's new & how to install it, please see our new [paper, Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0), and the [new docs]( https://deeplabcut.github.io/DeepLabCut) on how to use it! -:purple_heart: We support multi-animal re-identification, see [Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0). +💜 We support multi-animal re-identification, see [Lauer et al 2022](https://www.nature.com/articles/s41592-022-01443-0). -:purple_heart: We have a **real-time** package available! http://DLClive.deeplabcut.org +💜 We have a **real-time** package available! [DLC-live on GitHub](https://github.com/DeepLabCut/DeepLabCut-live) and [DLC-live-GUI](https://github.com/DeepLabCut/DeepLabCut-live-GUI) +## In the news - June 2024: Our second DLC paper ['Using DeepLabCut for 3D markerless pose estimation across species and behaviors'](https://www.nature.com/articles/s41596-019-0176-0) in Nature Protocols has surpassed 1,000 Google Scholar citations! - May 2024: DeepLabCut was featured in Nature: ['DeepLabCut: the motion-tracking tool that went viral'](https://www.nature.com/articles/d41586-024-01474-x) @@ -251,6 +263,8 @@ importing a project into the new data format for DLC 2.0 - July 2018: Ed Yong covered DeepLabCut and interviewed several users for the [Atlantic](https://www.theatlantic.com/science/archive/2018/07/deeplabcut-tracking-animal-movements/564338). - April 2018: first DeepLabCut preprint on [arXiv.org](https://arxiv.org/abs/1804.03142) - ## Funding + # Funding - We are grateful for the follow support over the years! This software project was supported in part by the Essential Open Source Software for Science (EOSS) program at Chan Zuckerberg Initiative (cycles 1, 3, 3-DEI, 4), and jointly with the Kavli Foundation for EOSS Cycle 6! We also thank the Rowland Institute at Harvard for funding from 2017-2020, and EPFL from 2020-present. +We are grateful for the following support and funding over the years! +This software project was supported in part by the **Essential Open Source Software for Science (EOSS)** program at **Chan Zuckerberg Initiative** (cycles 1, 3, 3-DEI, 4), and jointly with the **Kavli Foundation** for **EOSS Cycle 6**! +We also thank the **Rowland Institute** at **Harvard** for funding from 2017-2020, and **EPFL** from 2020-present. diff --git a/docs/README.md b/docs/README.md index 2812d8f001..00b76cff14 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,11 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + + + + + Please see https://deeplabcut.github.io/DeepLabCut for documentation on how to use this software. This directory contains the source code for the docs. diff --git a/docs/UseOverviewGuide.md b/docs/UseOverviewGuide.md index 77cf3eda53..74038ef62b 100644 --- a/docs/UseOverviewGuide.md +++ b/docs/UseOverviewGuide.md @@ -4,80 +4,94 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (overview)= + # 🥳 Get started with DeepLabCut: our key recommendations Below we will first outline what you need to get started, the different ways you can use DeepLabCut, and then the full workflow. Note, we highly recommend you also read and follow our [Nature Protocols paper](https://www.nature.com/articles/s41596-019-0176-0), which is (still) fully relevant to standard DeepLabCut. -```{Hint} -💡📚 If you are new to Python and DeepLabCut, you might consider checking our [beginner guide](https://deeplabcut.github.io/DeepLabCut/docs/beginner-guides/beginners-guide.html) once you are ready to jump into using the DeepLabCut App! +```{hint} +💡📚 If you are new to Python and DeepLabCut, you might consider checking our {ref}`beginner guide ` once you are ready to jump into using the DeepLabCut App! ``` +## Introduction + +**DeepLabCut** is a software package for markerless pose estimation of animals performing various tasks. The software can manage multiple projects for various tasks. Each project is identified by the name of the project (e.g. TheBehavior), name of the experimenter (e.g. YourName), as well as the date at creation. This project folder holds a `config.yaml` (a text document) file containing various (project) parameters as well as links the data of the project. + +

+ +

+ +

+ +

-## [How to install DeepLabCut](how-to-install) +## {ref}`Installing DeepLabCut` We don't cover installation in depth on this page, so click on the link above if that is what you are looking for. See below for details on getting started with DeepLabCut! -## What we support: +## What we support We are primarily a package that enables deep learning-based pose estimation. We have a lot of models and options, but don't get overwhelmed -- the developer team has tried our best to "set the best defaults we possibly can"! -- Decide on your needs: there are **two main modes, standard DeepLabCut or multi-animal DeepLabCut**. We highly recommend carefully considering which one is best for your needs. For example, a white mouse + black mouse would call for standard, while two black mice would use multi-animal. **[Important Information on how to use DLC in different scenarios (single vs multi animal)](important-info-regd-usage)** Then pick a user guide: +### Main modes of DeepLabCut + +- Decide on your needs: there are **two main modes, standard DeepLabCut or multi-animal DeepLabCut**. + + - We highly recommend carefully considering which one is best for your needs. + - For example, a white mouse + black mouse would call for standard, while two black mice would use multi-animal. See {ref}`important-info-regd-usage`. + - Then pick a user guide: + 1. [How to use standard DeepLabCut](single-animal-userguide) + 1. [How to use multi-animal DeepLabCut](multi-animal-userguide) - - (1) [How to use standard DeepLabCut](single-animal-userguide) - - (2) [How to use multi-animal DeepLabCut](multi-animal-userguide) +- To note, as of DLC3+ the single and multi-animal code bases are more integrated and we support **top-down**, **bottom-up**, and a new "hybrid" approach that is state-of-the-art, called **BUCTD** (bottom-up conditional top down) -- To note, as of DLC3+ the single and multi-animal code bases are more integrated and we support **top-down**, **bottom-up**, and a new "hybrid" approach that is state-of-the-art, called **BUCTD** (bottom-up conditional top down), models. - If these terms are new to you, check out our [Primer on Motion Capture with Deep Learning!](https://www.sciencedirect.com/science/article/pii/S0896627320307170). In brief, both work for single or multiple animals and each method can be better or worse on your data.

- +

- - Here is more information on BUCTD: +- Here is more information on BUCTD: +

- +

- **Additional Learning Resources:** - - - [TUTORIALS:](https://www.youtube.com/channel/UC2HEbWpC_1v6i9RnDMy-dfA?view_as=subscriber) video tutorials that demonstrate various aspects of using the code base. - - [HOW-TO-GUIDES:](overview) step-by-step user guidelines for using DeepLabCut on your own datasets (see below) - - [EXPLANATIONS:](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials) resources on understanding how DeepLabCut works - - [REFERENCES:](https://github.com/DeepLabCut/DeepLabCut#references) read the science behind DeepLabCut - - [BEGINNER GUIDE TO THE GUI](https://deeplabcut.github.io/DeepLabCut/docs/beginner-guides/beginners-guide.html) +### Additional learning resources -Getting Started: [a video tutorial on navigating the documentation!](https://www.youtube.com/watch?v=A9qZidI7tL8) +- [Video tutorials:](https://www.youtube.com/channel/UC2HEbWpC_1v6i9RnDMy-dfA?view_as=subscriber) video tutorials that demonstrate various aspects of using the code base. + -### What you need to get started: + - - **a set of videos that span the types of behaviors you want to track.** Having 10 videos that include different backgrounds, different individuals, and different postures is MUCH better than 1 or 2 videos of 1 or 2 different individuals (i.e. 10-20 frames from each of 10 videos is **much better** than 50-100 frames from 2 videos). +- [Explanations:](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials) resources on understanding how DeepLabCut works +- [References:](https://github.com/DeepLabCut/DeepLabCut#references) read the science behind DeepLabCut +- {ref}`Beginner's guide to the GUI`: a step-by-step walkthrough of the GUI for new users. - - **minimally, a computer w/a CPU.** If you want to use DeepLabCut on your own computer for many experiments, then you should get an NVIDIA GPU. See technical specs [here](https://github.com/DeepLabCut/DeepLabCut/wiki/FAQ). You can also use cloud computing resources, including COLAB ([see how](https://github.com/DeepLabCut/DeepLabCut/blob/master/examples/README.md)). + + -### What you DON'T need to get started: +### What you need to get started - - no specific cameras/videos are required; color, monochrome, etc., is all fine. If you can see what you want to measure, then this will work for you (given enough labeled data). +- **A set of videos that span the types of behaviors you want to track.** Having 10 videos that include different backgrounds, different individuals, and different postures is MUCH better than 1 or 2 videos of 1 or 2 different individuals (i.e. 10-20 frames from each of 10 videos is **much better** than 50-100 frames from 2 videos). - - no specific computer is required (but see recommendations above), our software works on Linux, Windows, and MacOS. +- **Ideally, a computer with a GPU.** If you want to use DeepLabCut on your own computer for training and/or for many experiments, then you should get an NVIDIA GPU. +- You can also use cloud computing resources, including COLAB ([see how](https://github.com/DeepLabCut/DeepLabCut/blob/master/examples/README.md)). -### Overview: -**DeepLabCut** is a software package for markerless pose estimation of animals performing various tasks. The software can manage multiple projects for various tasks. Each project is identified by the name of the project (e.g. TheBehavior), name of the experimenter (e.g. YourName), as well as the date at creation. This project folder holds a ``config.yaml`` (a text document) file containing various (project) parameters as well as links the data of the project. +### What you DON'T need to get started +- No specific cameras/videos are required; color, monochrome, etc., is all fine. If you can see what you want to measure, then this will work for you (given enough labeled data). -

- -

+- No specific computer is required (but see recommendations above), our software works on Linux, Windows, and MacOS. -

- -

+## Workflow overview -### Overview of the workflow: -This page contains a list of the essential functions of DeepLabCut as well as demos. There are many optional parameters with each described function. For detailed function documentation, please refer to the main user guides or API documentation. For additional assistance, you can use the [help](UseOverviewGuide.md#help) function to better understand what each function does. +This page contains a list of the essential functions of DeepLabCut as well as demos. There are many optional parameters with each described function. For detailed function documentation, please refer to the main user guides or API documentation. For additional assistance, you can use the `help` function to better understand what each function does.

@@ -87,89 +101,142 @@ This page contains a list of the essential functions of DeepLabCut as well as de

-You can have as many projects on your computer as you wish. You can have DeepLabCut installed in an [environment](../conda-environments/README.md) and always exit and return to this environment to run the code. You just need to point to the correct ``config.yaml`` file to [jump back in](/docs/UseOverviewGuide.md#tips-for-daily-use)! The documentation below will take you through the individual steps. +You can have as many projects on your computer as you wish. +You can have DeepLabCut installed in a {ref}`conda environment`; once you are finished, exit your terminal, and later re-activate your environment. + +When working on a given project, you just need to point to the correct `config.yaml` file to resume work; the documentation below will take you through the individual steps.

- +

+(sec:important-info-regd-usage)= -(important-info-regd-usage)= +## Usage advice & project types -# Specific Advice for Using DeepLabCut: +```{tip} +We recommend first using **DeepLabCut for a single animal scenario** to understand the workflow - even if it's just our demo data. Multi-animal tracking is more complex - i.e. it has several decisions the user needs to make. Then, when you are ready you can jump into multi-animal mode. +``` -## Important information on using DeepLabCut: +### First project: single or multi-animal? -We recommend first using **DeepLabCut for a single animal scenario** to understand the workflow - even if it's just our demo data. Multi-animal tracking is more complex - i.e. it has several decisions the user needs to make. Then, when you are ready you can jump into multi-animals... +*Which scenario do you have?* -### Additional information for getting started with maDeepLabCut: +- **I have single animal videos:** -We highly recommend using it first in the Project Manager GUI ([Option 3](docs/functionDetails.md#deeplabcut-project-manager-gui)). This will allow you to get used to the additional steps by being walked through the process. Then, you can always use all the functions in your favorite IDE, notebooks, etc. + - Quick start: when you `create_new_project` (and leave the default flag to False in `multianimal=False`). This is the typical work path for a single animal project. -### *What scenario do you have?* +- **I have single animal videos, but I want to use the updated network capabilities introduced for multi-animal projects:** -- **I have single animal videos:** - - quick start: when you `create_new_project` (and leave the default flag to False in `multianimal=False`). This is the typical work path for many of you. + - Quick start: when you `create_new_project` just set the flag `multianimal=True`. -- **I have single animal videos, but I want to use the updated network capabilities introduced for multi-animal projects:** - - quick start: when you `create_new_project` just set the flag `multianimal=True`. This enables you to use maDLC features even though you have only one animal. To note, this is rarely required for single animal projects, and not the recommended path. Some tips for when you might want to use this: this is good for say, a hand or a mouse if you feel the "skeleton" during training would increase performance. DON'T do this for things that could be identified an individual objects. i.e., don't do whisker 1, whisker 2, whisker 3 as 3 individuals. Each whisker always has a specific spatial location, and by calling them individuals you will do WORSE than in single animal mode. + - This enables you to use maDLC features even though you have only one animal. To note, this is rarely required for single animal projects, and not the recommended path. + - Some tips for when you might want to use this: + - This is good for e.g. a hand or a mouse if you feel the "skeleton" during training would increase performance. + - Do not do this for things that could be identified as an individual objects. i.e., don't do whisker 1, whisker 2, whisker 3 as 3 individuals. + Each whisker always has a specific spatial location, and by calling them individuals the network will perform worse than in single animal mode. -[VIDEO TUTORIAL AVAILABLE!](https://youtu.be/JDsa8R5J0nQ) + - [VIDEO TUTORIAL AVAILABLE!](https://youtu.be/JDsa8R5J0nQ) - **I have multiple *identical-looking animals* in my videos:** - - quick start: when you `create_new_project` set the flag `multianimal=True`. If you can't tell them apart, you can assign the "individual" ID to any animal in each frame. See this [labeling w/2.2 demo video](https://www.youtube.com/watch?v=_qbEqNKApsI) -[VIDEO TUTORIAL AVAILABLE!](https://youtu.be/Kp-stcTm77g) + - Quick start: when you `create_new_project` set the flag `multianimal=True`. + - If you can't tell them apart, you can assign the "individual" ID to any animal in each frame. See this [labeling w/2.2 demo video](https://www.youtube.com/watch?v=_qbEqNKApsI) + - [VIDEO TUTORIAL AVAILABLE!](https://youtu.be/Kp-stcTm77g) - **I have multiple animals, *but I can tell them apart,* in my videos and want to use DLC2.2:** - - quick start: when you `create_new_project` set the flag `multianimal=True`. And always label the "individual" ID name the same; i.e. if you have mouse1 and mouse2 but mouse2 always has a miniscope, in every frame label mouse2 consistently. See this [labeling w/2.2 demo video](https://www.youtube.com/watch?v=_qbEqNKApsI). Then, you MUST put the following in the config.yaml file: `identity: true` -[VIDEO TUTORIAL AVAILABLE!](https://youtu.be/Kp-stcTm77g) - ALSO, if you can tell them apart, label animals them consistently! + - Quick start: when you `create_new_project` set the flag `multianimal=True`. + - Always label the "individual" ID name the same; i.e. if you have mouse1 and mouse2 but mouse2 always has a miniscope, in every frame label mouse2 consistently. See this [labeling w/2.2 demo video](https://www.youtube.com/watch?v=_qbEqNKApsI). + - Then, you MUST put the following in the config.yaml file: `identity: true` + - [VIDEO TUTORIAL AVAILABLE!](https://youtu.be/Kp-stcTm77g) + +```{important} +If you can tell them apart, label your animals consistently! +``` - **I have a pre-2.2 single animal project, but I want to use 2.2:** + - Please read [the conversion to maDLC guide](convert-maDLC) -Please read [this convert 2 maDLC guide](convert-maDLC) +### Getting started with multi-animal (ma) DeepLabCut -# The options for using DeepLabCut: +We highly recommend using it first in the {ref}`Project Manager GUI `. +This will allow you to get used to the additional steps by being walked through the process. Then, you can always use all the functions in your favorite IDE, notebooks, etc. -Great - now that you get the overall workflow let's jump in! Here, you have several options. +## How to run DeepLabCut -[**Option 1**](using-demo-notebooks) DEMOs: for a quick introduction to DLC on our data. +There are several options to use DeepLabCut, and we recommend you pick the one that best suits your needs and experience level. You can always switch between them, so don't worry about picking the "wrong" one. -[**Option 2**](using-project-manager-gui) Standalone GUI: is the perfect place for -beginners who want to start using DeepLabCut on your own data. +- **Option 1**: [Demo notebooks](using-demo-notebooks): for a quick introduction to DLC on our data. -[**Option 3**](using-the-terminal) In the terminal: is best for more advanced users, as -with the terminal interface you get the most versatility and options. +- **Option 2**: [Standalone GUI](using-project-manager-gui): is the perfect place for + beginners who want to start using DeepLabCut on your own data. + +- **Option 3**: [In the terminal](using-the-terminal): is best for more advanced users, as + with the terminal interface you get the most versatility and options. (using-demo-notebooks)= -## Option 1: Demo Notebooks: + +### Option 1: Demo Jupyter notebooks + [VIDEO TUTORIAL AVAILABLE!](https://www.youtube.com/watch?v=DRT-Cq2vdWs) We provide Jupyter and COLAB notebooks for using DeepLabCut on both a pre-labeled dataset, and on the end user's -own dataset. See all the demo's [here!](../examples/README.md) Please note that GUIs are not easily supported in Jupyter in MacOS, as you need a framework build of python. While it's possible to launch them with a few tweaks, we recommend using the Project Manager GUI or terminal, so please follow the instructions below. +own dataset. See all the demo's [here!](../examples/README.md) +Please note that GUIs are not easily supported in Jupyter in MacOS, as you need a framework build of python. While it's possible to launch them with a few tweaks, we recommend using the Project Manager GUI or terminal, so please follow the instructions below. (using-project-manager-gui)= -## Option 2: using the Project Manager GUI: + +### Option 2: using the Project Manager GUI + [VIDEO TUTORIAL!](https://www.youtube.com/watch?v=KcXogR-p5Ak) [VIDEO TUTORIAL#2!](https://youtu.be/Kp-stcTm77g) -Start Python by typing ``ipython`` or ``python`` in the terminal (note: using pythonw for Mac users was depreciated in 2022). -If you are using DeepLabCut on the cloud, you cannot use the GUIs. If you use Windows, please always open the terminal with administrator privileges. Please read more in our Nature Protocols paper [here](https://www.nature.com/articles/s41596-019-0176-0). And, see our [troubleshooting wiki](https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips). + + + + +If you are using DeepLabCut on the cloud, you cannot use the GUIs. + +```{warning} +On **Windows**: Open the terminal/cmd/anaconda prompt as **Administrator** (right click and select "Run as administrator") to avoid permission issues during usage when downloading models, and for symlink support when videos are not copied into the project folder. +Admin mode is not required for installation. +``` Simply open the terminal and type: + ```python python -m deeplabcut ``` + That's it! Follow the GUI for details (using-the-terminal)= -## Option 3: using the program terminal, Start iPython*: + +### Option 3: using the terminal + +1. Start iPython: + + ```bash + ipython + ``` + +1. Import DeepLabCut: + + ```python + import deeplabcut + ``` + +1. Follow the instructions in the user guides for either standard or multi-animal DeepLabCut (see below). [VIDEO TUTORIAL AVAILABLE!](https://www.youtube.com/watch?v=7xwOhUcIGio) -Please decide with mode you want to use DeepLabCut, and follow one of the following: +Please decide which mode you want to use DeepLabCut with, and follow one of: - (1) [How to use standard DeepLabCut](single-animal-userguide) - (2) [How to use multi-animal DeepLabCut](multi-animal-userguide) + +## Useful links + +Please read more in our Nature Protocols paper [here](https://www.nature.com/articles/s41596-019-0176-0). diff --git a/docs/beginner-guides/Training-Evaluation.md b/docs/beginner-guides/Training-Evaluation.md index d94ee69f53..c106b8982c 100644 --- a/docs/beginner-guides/Training-Evaluation.md +++ b/docs/beginner-guides/Training-Evaluation.md @@ -6,19 +6,32 @@ deeplabcut: visibility: online status: viable recommendation: move - notes: "As mentioned on other beginner-guides/ docs, this should be part of the GUI section." + notes: As mentioned on other beginner-guides/ docs, this should be part of the GUI section. --- -# Neural Network training and evaluation in the GUI + +(file:training-evaluation-gui)= + +# Neural network training and evaluation in the GUI + DLC LIVE! +## Network training + +### Creating a training dataset Before training your model, the first step is to assemble your training dataset. +This involves: -**Create Training Dataset:** Move to the corresponding tab and click **`Create Training Dataset`**. For starters, the default settings will do just fine. While there are more powerful models and data augmentations you might want to consider, you can trust that for most projects the defaults are an ideal place to start. +- Splitting labeled data into training and evaluation subsets +- Creating each shuffle folder with the model configuration ready for training. -> 💡 **Note:** This guide assumes you have a GPU on your local machine. If you're CPU-bound and finding training challenging, consider using Google Colab. Our [Colab Guide](https://colab.research.google.com/github/DeepLabCut/DeepLabCut/blob/master/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb) can help you get started! +**Create Training Dataset:** Move to the corresponding tab and click **`Create Training Dataset`**. For starters, the default settings will do just fine. While there are more powerful models and data augmentations you might want to consider, you can trust that for most projects the defaults are a good place to start. -## Kickstarting the Training Process +```{note} +This guide assumes you have a (CUDA-enabled) GPU on your local machine. If you're CPU-bound and training is not feasible, consider using Google Colab. Our [Colab Guide](https://colab.research.google.com/github/DeepLabCut/DeepLabCut/blob/master/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb) can help you get started! +``` + +### Starting the training process With your training dataset ready, it's time to train your model. @@ -33,31 +46,34 @@ You can keep an eye on the training progress via your terminal window. This will ![DeepLabCut Training in Terminal with TF](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779598041-DC8UJA2NXJXG65ZWJH1O/training-terminal.png?format=500w) -## Evaluate the Network +## Network evaluation After training, it's time to see how well your model performs. -### Steps to Evaluate the Network +### Step-by-step 1. Find and click on the **`Evaluate Network`** tab. -2. **Choose Evaluation Options:** +1. **Choose Evaluation Options:** - **Plot Predictions:** Select this to visualize the model's predictions, similar to standard DeepLabCut (DLC) evaluations. - **Compare Bodyparts:** Opt to compare all the bodyparts for a comprehensive evaluation. -3. Click the **`Evaluate Network`** button, located on the right side of the main window. - ->💡 Tip: If you wish to evaluate all saved snapshots, go to the configuration file and change the `snapshotindex` parameter to `all`. +1. Click the **`Evaluate Network`** button, located on the right side of the main window. +```{tip} +If you wish to evaluate all saved snapshots, go to the configuration file and change the `snapshotindex` parameter to `all`. +``` -### Understanding the Evaluation Results +### Interpreting the results - **Performance Metrics:** DLC will assess the latest snapshot of your model, generating a `.CSV` file with performance -metrics. This file is stored in the **`evaluation-results`** (for TensorFlow models) or the -**`evaluation-results-pytorch`** (for PyTorch models) folder within your project. + metrics. This file is stored in the **`evaluation-results`** (for TensorFlow models) or the + **`evaluation-results-pytorch`** (for PyTorch models) folder within your project. +![Combined Evaluation Results in DeepLabCut](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779617667-0RLTM9DVRALN9YIKSHJZ/combined-evaluation-results.png?format=750w) -![Combined Evaluation Results in DeepLabCut](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779617667-0RLTM9DVRALN9YIKSHJZ/combined-evaluation-results.png?format=750w)) - **Visual Feedback:** Additionally, DLC creates subfolders containing your frames overlaid with both the labeled bodyparts and the model's predictions, allowing you to visually gauge the network's performance. -![Evaluation Example in DeepLabCut](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779623162-BFDAW37B9TO94EGME2O5/check-labels.png?format=500w)) +![Evaluation Example in DeepLabCut](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779623162-BFDAW37B9TO94EGME2O5/check-labels.png?format=500w) + +## Next steps -## Next, head over the beginner guide for [using your new neural network for video analysis](video-analysis) +Head over the {ref}`file:video-analysis-gui` section to learn about applying your trained model to videos, and creating labeled videos with the results of your analysis! diff --git a/docs/beginner-guides/beginners-guide.md b/docs/beginner-guides/beginners-guide.md index a4df28db50..ecc1a4afd4 100644 --- a/docs/beginner-guides/beginners-guide.md +++ b/docs/beginner-guides/beginners-guide.md @@ -5,24 +5,32 @@ deeplabcut: ignore: false visibility: online status: outdated - recommendation: update - notes: "While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed." + recommendation: move + notes: Move to GUI section. --- -(beginners-guide)= -# Using DeepLabCut + +(file:beginners-guide)= + +# Using the DeepLabCut GUI + DLC LIVE! -This guide, and related pages, are meant as a very-new-to-python beginner guide to DeepLabCut. After you are comfortable with this material we recommend then jumping into the more detailed User Guides! +This guide and the related pages are intended as a beginner-friendly introduction to DeepLabCut for users who are new to Python. After you are comfortable with this material, we recommend then jumping into the more detailed user guides! + + -- **ProTip:** For even more 'in-depth' understanding, head over to check out the [DeepLabCut Course](https://deeplabcut.github.io/DeepLabCut/docs/course.html), which provides a deeper dive into the science behind DeepLabCut. + ## Installation Before you begin, make sure that DeepLabCut is installed on your system. +Please see the {ref}`installation page` for detailed instructions on how to install DeepLabCut on your computer. -- **ProTip:** For detailed installation instructions, geared towards a bit more advanced users, refer to the [Full Installation Guide](https://deeplabcut.github.io/DeepLabCut/docs/installation.html). + + -## Starting DeepLabCut +## Starting the DeepLabCut GUI + +In the terminal, type: -In the terminal, enter: ```bash python -m deeplabcut ``` -This will open the DeepLabCut App (note, the default is dark mode, but you can click "appearance" to change: + +This will open DeepLabCut. + + ![DeepLabCut GUI Screenshot](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779625875-5UHPC367I293CBSP8CT6/GUI-screenshot.png?format=500w) -> 💡 **Note:** For a visual guide on navigating through the DeepLabCut GUI, check out our [YouTube tutorial](https://www.youtube.com/watch?v=tr3npnXWoD4). +```{note} +For a visual guide on navigating through the DeepLabCut GUI, check out our [YouTube tutorial](https://www.youtube.com/watch?v=tr3npnXWoD4). +``` -## Starting a New Project +## Starting a new project -### Navigating the GUI on Initial Launch +### Navigating the GUI on initial Launch When you first launch the GUI, you'll find three primary main options: 1. **Create New Project:** Geared towards new initiatives. A good choice if you're here to start something new. -2. **Load Project:** Use this to resume your on-hold or past work. -3. **Model Zoo:** Best suited for those who want to explore Model Zoo. +1. **Load Project:** Use this to resume your on-hold or past work. +1. **Model Zoo:** Best suited for those who want to explore Model Zoo. -### Commencing Your Work: + -- For a first-time or new user, please click on **`Start New Project`**. + -## 🐾 Steps to Start a New Project +### 🐾 New project step-by-step 1. **Launch New Project:** + - When you start a new project, you'll be presented with an empty project window. In DLC3+ you will see a new option "Engine". - - We recommend using the PyTorch Engine: - ![DeepLabCut Engine](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717780414978-17LOVBUJ8JR102QVSFDY/Screen+Shot+2024-06-07+at+7.13.14+PM.png?format=1500w)) + ![DeepLabCut Engine](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717780414978-17LOVBUJ8JR102QVSFDY/Screen+Shot+2024-06-07+at+7.13.14+PM.png?format=1500w) + + ```{note} + For most users, the engine will be PyTorch. See {ref}`sec:deeplabcut-with-tf-install` for TensorFlow support. + ``` + +1. **Filling in Project Details:** -2. **Filling in Project Details:** - **Naming Your Project:** - - Give a specific, well-defined name to your project. - > **💡 Tip:** Avoid empty spaces in your project name. + - Give a specific, easy-to-track name to your project. + + ```{tip} + Avoid spaces in your project name. + ``` + + - **Fill in the name of the scorer/experimenter**. This name is used in data headers and directory names and it remains permanently associated with the project. - - **Naming the Experimenter:** - - Fill in the name of the experimenter. This part of the data remains immutable. +1. **Determine Project Location:** -3. **Determine Project Location:** - By default, your project will be located on the **Desktop**. - - To pick a different home, modify the path as needed. + - To pick a different location, browse as needed. -4. **Multi-Animal or Single-Animal Project:** - - Tick the 'Multi-Animal' option in the menu, but only if that's the mode of the project. +1. **Multi-Animal or Single-Animal Project:** + + - Tick the 'Multi-Animal' option in the menu if relevant to your experiment. - Choose the 'Number of Cameras' as per your experiment. -5. **Adding Videos:** +1. **Adding Videos:** + - First, click on **`Browse Videos`** button on the right side of the window, to search for the video contents. - Once the media selection tool opens, navigate and select the folder with your videos. - - > **💡 Tip:** DeepLabCut supports **`.mp4`**, **`.avi`**, **`.mkv`** and **`.mov`** files. + ```{tip} + DeepLabCut supports **`.mp4`**, **`.avi`**, **`.mkv`** and **`.mov`** files. + ``` - A list will be created with all the videos inside this folder. - Unselect the videos you wish to remove from the project. + - Videos outside the project directory can be automatically copied into the project folder by selecting the "Copy videos to project folder" option. This is the recommended strategy for data management. External videos that are not copied are instead referenced via symbolic links. While using symbolic links avoids duplicating files and reduces storage usage, it is also more prone to issues, for example if the original files are moved or deleted. + - ```{tip} + By default, the GUI will look for a **directory** containing videos. Use the "Select individual files" + checkbox if you want to select individual videos instead of a whole folder. + ``` + +1. **Define bodyparts and individuals:** -6. **Create your project:** - - Click on **`Create`** button on the bottom, right side of the main window. - - A new folder named after your project's name will be created in the location you chose above. + - Enter all the name, numbers or IDs of bodyparts you wish to track. + - **Example:** "head", "tail", "left paw", "right paw", etc. + - Less recommended: "L1", "L2", "L3", etc. + - **If you have multiple animals**: + - Enter the name, numbers or IDs of the individuals in your experiment. + - **Example:** "mouse1", "mouse2", "mouse3", etc. + - **Unique bodyparts**: If you wish to track "landmark" locations, such as the edges of a maze, or a specific object, you can add these as "unique bodyparts". These are not considered part of an individual, but are still tracked as part of the project. + - **Example**: "maze_left_edge", "maze_right_edge", "reward_port", etc. + - **Identity labeling**: if and only if you can tell individuals apart by their appearance (not their location), set this to Yes and consistently label your individuals in the same way across videos. This will allow DeepLabCut to learn to tell them apart, and assign consistent identities across frames and videos. +1. **Create your project:** + + - Click on the **`Create`** button on the bottom, right side of the main window. + - A new folder will be created in the location you chose above. + +## Video tutorial ### 📽 Video Tutorial: Setting Up Your Project in DeepLabCut ![DeepLabCut Create Project GIF](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779616437-30U5RFYV0OY6ACGDG7F4/create-project.gif?format=500w) -## Next, head over to the beginner guide for [Setting up what keypoints to track](https://deeplabcut.github.io/DeepLabCut/docs/beginner-guides/manage-project.html) +## Next steps + +Next, head over to the beginner guide for {ref}`editing the configuration and managing the project `, which will show you how to edit the configuration file to edit your bodyparts and skeleton structure. diff --git a/docs/beginner-guides/labeling.md b/docs/beginner-guides/labeling.md index 8e3173cbe2..359e1f3817 100644 --- a/docs/beginner-guides/labeling.md +++ b/docs/beginner-guides/labeling.md @@ -5,75 +5,78 @@ deeplabcut: ignore: false visibility: online status: viable - recommendation: update - notes: "Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow." + recommendation: move + notes: Move to GUI section. Updated to link directly to the napari plugin docs. Making the link specific to the workflow section of the napari docs could help. --- -(labeling)= -# Labeling GUI - -## Selecting Frames to Label - -In DeepLabCut, choosing the right frames for labeling is a key step. The trick is always to select the MOST DIVERSE data you can that your model will see. That means good lighting, bad lighting, anything you want to throw at it. So, first, pick a range of diverse videos! Then, we will help you pick frames. You've got two easy ways to do this: -1. **Let DeepLabCut Choose:** DeepLabCut can extract frames automatically for you. It's got two neat ways to do that: - - **Uniform:** This is like taking a snapshot at regular time intervals. - - **K-means clustering:** This one applies k-means and picks images from different clusters. This is typically better, as it gives you a variety of actions and poses. Note, as it is a clustering tool, it will miss rare events, so ideally run this step, then perhaps consider running the manual GUI to get some rare frames! You can do both within DLC. +(file:labeling-gui)= -2. **Pick Frames Yourself:** Just like flipping through a photo album, you can go through your video and pick the frames that catch your eye - this is great for finding rare frames. Choose the **`manual`** extraction method. +# Labeling GUI -### Here's how to get started: +## Selecting frames to label -- **Step 1:** Click on **`automatic`** in the frame selection area. -- **Step 2:** Choose **`k-means`** for some variety. -- **Step 3:** Hit the **`Extract Frames`** button, usually found at the bottom right corner. +In DeepLabCut, choosing the right frames for labeling is a key step. -By default, DeepLabCut will grab 20 frames from each of your videos and put them into sub-folders, per video, under **labeled-data** in your project. Now, you're all set to start labeling! +```{important} +Always aim to select the **most diverse data** you can for your model to be trained on. This implies picking a variety of good lighting, bad lighting, partial occlusions, and different poses. +If relevant, label data across several experimental sessions, animals, and conditions. +**Labeling 10 frames from several different videos is typically more effective than labeling 100 frames from a single video.** +``` -## Labeling Your First Set of Frames in DeepLabCut +To help you select "different" frames, DeepLabCut provides two main options: -Alright, you've got your extracted frames ready. Now comes the labeling! +1. **Automated frame extraction** DeepLabCut can extract frames automatically for you. -### Entering the Label Frames Area + - **Uniform:** Samples at regular time intervals. Does not guarantee diversity, but is simple and fast. + - **K-means clustering:** This one runs a k-means algorithm and picks images from different clusters. This is typically more robust in extracting a variety of actions and poses. Note, as it is a clustering tool, it will miss rare events, so after running this step, consider using the manual GUI to get some rare frames! You can do both within DLC. -- **Click on `Label Frames`:** This takes you straight to where your frames are, sorted in the **labeled-data** folder, each video in its own sub-folder. -- **Open a Folder:** Click on the first one to start, and then click **`open`**. +1. **Manual frame extraction** Pick frames yourself using the GUI. This is the most time-consuming, but allows you to have full control over the frames you pick, and can be useful to get rare events that automated tools might miss. You can also use this after running automated frame extraction to get some of those "rare" frames. -### The napari DeepLabCut Labeler +### Example workflow -- **Plugin Window Opens:** As soon as you click **`open`**, the napari DeepLabCut plugin window appears, your main stage for labeling. -- **Tutorial Popup:** A quick tutorial window shows up. It's a brief guide, so give it a look to understand the basics. +1. Select **`automatic`** in the frame selection area. +1. Choose **`k-means`** as a good default option for frame extraction, and set the number of frames you want to extract. +1. Hit the **`Extract Frames`** button. -![Labeling Frames in DeepLabCut using Napari Interface](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779602092-LVR2TI6OADSHEYRCGS6F/labeling-napari.png?format=500w)) +By default, DeepLabCut will grab 20 frames from each of your videos and put them into sub-folders, per video, under **labeled-data** in your project. +With this, you are all set to start labeling! -### Labeling Setup +## Frame labeling workflow -- **Frames on Display:** Your frames are lined up in the middle, with a slider below to shuffle through them. -- **Tools and Keypoints:** To the bottom right, you find a list of bodyparts from your configuration. On the top left, all your labeling tools are ready. +Alright, you've got your extracted frames ready. Now comes the labeling! -### The Labeling Process +### Launching the labeling GUI -- **Start with `Add points`:** Click this to begin placing keypoints on your first frame. If you can't see a bodypart, just move to the next one. -- **Navigate Through Frames:** Use the slider to go from one frame to the next after you're done labeling. -- **Save Progress:** Remember to save your work as you go with **`Command and S`** (or **`Ctrl and S`** on Windows). +- **Click on `Label Frames`:** This takes you straight to where your frames are, sorted in the **labeled-data** folder, each video in its own sub-folder. +- **Open a Folder:** Click on the first unlabeled folder to start, and then click **`Open`**. -> 💡 **Note:** For a detailed walkthrough on using the Napari labeling GUI, have a look at the -[DeepLabCut Napari Guide](file:napari-gui-landing). Additionally, you can watch our instructional -[YouTube video](https://www.youtube.com/watch?v=hsA9IB5r73E) for more insights and tips. +### napari-deeplabcut +Please refer to the {ref}`file:napari-dlc-basic-usage` section for a detailed walkthrough of how to use the napari-DLC plugin for labeling your frames. -### Completing the Set +### Completing the labeling -Work through all the frames in the first folder. Then, proceed to the next, continuing this way until each folder in your **labeled-data** directory is done. +Work through all the frames in the first folder and save them. -## Checking Your Labels +```{tip} +After saving, you can close napari and click **`Label Frames`** again to open the next folder +**OR** +Remove all layers in napari and drag-and-drop the next folder in the same napari session to keep going without needing to close and reopen napari. +``` -After you've labeled all your frames, it's important to ensure they're accurate. +## Checking labels -### How to Check Your Labels +After you've labeled all your frames, you may want to review their accuracy before moving on to training your model. This is a crucial step, as the quality of your labels will directly impact the performance of your model. -- **Return to the Main Window:** Once you're done with labeling, head back to DeepLabCut's main window, and click on **`Check Labels`**. +- **Return to the DeepLabCut GUI:** Once you're done with labeling, head back to DeepLabCut's main window, and click on **`Check Labels`**. - **Review the Labeled Folders:** The system will have created new folders for each labeled set inside your labeled-data folder. These folders contain your original frames overlaid with the keypoints you've added. ![Checking Labels in DeepLabCut](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779615252-6BNW661XB2ULH85RTAD3/evaluation-example.png?format=500w) -Take the time to go through each folder. Accurate labels are key. If there are mistakes, the model might learn incorrectly and mislabel your videos later on. It's all about setting the right foundation for accurate analysis. +Take the time to go through each folder. Accurate labels are key. +If there are mistakes, the model might learn incorrectly and mislabel your videos later on. +A clean foundation is essential for accurate analysis. + +## Next steps + +Head on to {ref}`file:training-evaluation-gui` to learn about training and evaluating your neural network with the labeled data you created! diff --git a/docs/beginner-guides/manage-project.md b/docs/beginner-guides/manage-project.md index 4159ba99b9..fd091a2c44 100644 --- a/docs/beginner-guides/manage-project.md +++ b/docs/beginner-guides/manage-project.md @@ -6,49 +6,62 @@ deeplabcut: visibility: online status: viable recommendation: move - notes: "It seems the beginner guide section is more of a GUI step-by-step. As such, it should be moved to the GUI section, and merged/integrated with the contents there. The content is useful, but making it clear that this is for the GUI would reduce the confusion of a beginner guide being in fact rather central GUI use instructions." + notes: Move to a dedicated GUI section. Making the config edit tool slightly easier to work with and updating the docs below to include additional fields would be helpful. --- -# Setting up what keypoints to track + +(file:manage-project-gui)= + +# Editing and working with the configuration file + DLC LIVE! -**Edit the Configuration File** +The configuration file (`config.yaml`) is the central record of files in your project, as well as the settings for your models. +As a YAML file, it can be edited manually, but the GUI provides an easy way to edit it without needing to know the YAML format. In this guide, we will show you how to edit the configuration file using the GUI. -After creating your DeepLabCut project, you'll go to the main GUI window, where you'll start managing your project from the Project Management Tab. +## Editing the configuration -**Accessing the Configuration File** +After creating your DeepLabCut project, you'll be shown the main GUI window, where you can manage your project from the Project Management Tab. - **Locate the Configuration File:** At the top of the main window, you'll find the file path to the configuration file. -- **Edit the File:** Click on **`Edit config.yaml`**. This action allows you to: - - Define the bodyparts you wish to track. - - Outline the skeleton structure (optional!). +- **Edit the File:** Click on **`Edit config.yaml`**. + - A **`Configuration Editor`** window will open, displaying all the configuration details. + - You will need to modify some of these settings to align with your experiment. + - For example: + - Update or define the bodyparts you wish to track. + - *Optional:* Outline the skeleton structure. -A **`Configuration Editor`** window will open, displaying all the configuration details. You'll need to modify some of these settings to align with your research requirements. +## Step-by-step configuration walkthrough -## Steps to Edit the Configuration - -### 1. Defining Bodyparts +### Defining & updating bodyparts - **Locate the Bodyparts Section:** In the Configuration Editor, find the **`bodyparts`** category. - **Modify the List:** Click on the arrow next to **`bodyparts`** to expand the list. Here, you can: - Update the list with the names of the bodyparts relevant to your study. - Add more entries by right-clicking on a row number and selecting **`Insert`**. - ![Editing Bodyparts in DeepLabCut's Config File](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779624617-CIVZCM23U69NYK9BO3GY/bodyparts.png?format=500w) + -### 2. Defining the Skeleton +### Defining the skeleton - **Navigate to the Skeleton Section:** Scroll down to the **`skeleton`** category. -- **Adjust the Skeleton List:** Click on the arrow to expand this section. You can then: - - Update the pairs of bodyparts to define the skeleton structure of your model. +- **Adjust the Skeleton List:** Click on the arrow to expand this section. + - You can then update the list of bodypart pairs: i.e. the connections that define the skeleton structure of your model. + - In the list of bodypart pairs, each pair has an index. (ranging from 0 to the total number of pairs in the skeleton). + - Each item of the pair (also indexed; 0 or 1) has a value: the name of the bodypart. + - Each pair of two bodyparts represents a connection, where all connections together make the skeleton. ![Defining the Skeleton Structure in Config File](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779598505-HQNECHIKSQ6XL033JX8M/skeleton.png?format=500w) -> 💡 **Tip:** If you're new to DeepLabCut, spend some time visualizing how the chosen bodyparts can be connected effectively to form a coherent skeleton. +```{tip} +Spend some time visualizing how the chosen bodyparts can be connected effectively to form a coherent, visually helpful skeleton. +``` -### Saving Your Changes +### Saving changes - **Save the Configuration:** Once you're satisfied with the modifications, click **`Save`**. This will store your changes and return you to the main GUI window. -## Next, head over the beginner guide for [Labeling your data](labeling) +## Next steps + +Head over the guide for the {ref}`file:labeling-gui`, which will show you how to label your data using the napari-based labeling GUI. diff --git a/docs/beginner-guides/video-analysis.md b/docs/beginner-guides/video-analysis.md index 5ed5892530..842ee78506 100644 --- a/docs/beginner-guides/video-analysis.md +++ b/docs/beginner-guides/video-analysis.md @@ -6,23 +6,28 @@ deeplabcut: visibility: online status: viable recommendation: move - notes: "As mentioned on oher beginner-guides/ docs, this should be part of the GUI section." + notes: As mentioned on other beginner-guides/ docs, this should be part of the GUI section. --- -# Video Analysis with DeepLabCut -DLC LIVE! +(file:video-analysis-gui)= + +# Video analysis in the GUI + +DLC LIVE! After training and evaluating your model, the next step is to apply it to your videos. -**How to Analyze Videos** +## Analyzing videos with your trained model + +### Step-by-step 1. **Navigate to the 'Analyze Videos' Tab:** Begin applying your trained model to video data here. -2. **Select Your Video Format and Files:** - - **Choose Video Format:** Pick the format of your video (`.mp4`, `.avi`, `.mkv`, or `.mov`). - - **Select Videos:** Click **`Select Videos`** to find and open your video file. -3. **Start Analysis:** Click **`Analyze`**. The analysis time depends on video length and resolution. Track progress in the terminal or Anaconda prompt. +1. **Select Your Video Format and Files:** + - **Choose Video Format:** Pick the format of your video (`.mp4`, `.avi`, `.mkv`, or `.mov`). + - **Select Videos:** Click **`Select Videos`** to find and open your video file. +1. **Start Analysis:** Click **`Analyze`**. The analysis time depends on video length and resolution. Track progress in the terminal or Anaconda prompt. -## Reviewing Analysis Results +### Reviewing analysis results - **Find Results in Your Project Folder:** After analysis, go to your project's video folder. - **Analysis Files:** Look also for a `.metapickle`, an `.h5`, and possibly a `.csv` file for detailed analysis data. @@ -30,16 +35,21 @@ After training and evaluating your model, the next step is to apply it to your v ![Plot poses](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1717779600836-YOWM5T2MBY0JN1LB537B/plot-poses.png?format=500w) -## Creating a Labeled Video +## Generating labeled videos + +### Create a labeled video 1. **Go to 'Create Labeled Video' Tab:** The previously analyzed video should be selected. -2. If not already selected, choose your video. -3. Click **`Create Videos`**. +1. If not already selected, choose your video. +1. Click **`Create Videos`**. -## Viewing the Labeled Video +### View the labeled video - Your labeled video will be in your video folder, named after the original video plus model details and 'labeled'. -- Watch the video to assess the model's labeling accuracy. +- Use it in your results, or perform downstream analyses with it! + +## Next steps + + -## Happy DeepLabCutting! -- Check out the more advanced user guides for even more options! +Check our more advanced guides, and consider reading more about models, augmentations and other parameters to further optimize your model and analysis! diff --git a/docs/course.md b/docs/course.md index a47610c787..83d23e5848 100644 --- a/docs/course.md +++ b/docs/course.md @@ -7,16 +7,17 @@ deeplabcut: status: outdated recommendation: archive --- + # DeepLabCut Self-paced Course -::::{warning} +```{warning} This course was designed for DLC 2. An updated version for DLC 3 is in the works. -:::: +``` Do you have video of animal behaviors? Step 1: Get Poses ... - DLC LIVE! +DLC LIVE! This document is an outline of resources for a course for those wanting to learn to use `Python` and `DeepLabCut`. We expect it to take *roughly* 1-2 weeks to get through if you do it rigorously. To get the basics, it should take 1-2 days. @@ -27,14 +28,13 @@ We expect it to take *roughly* 1-2 weeks to get through if you do it rigorously.

- -## Installation: +## Installation You need Python and DeepLabCut installed! -- [See these "beginner docs" for help!](beginners-guide) -- **WATCH:** overview of conda: [Python Tutorial: Anaconda - Installation and Using Conda](https://www.youtube.com/watch?v=YJC6ldI3hWk) +- See the {ref}`file:beginners-guide` for help! +- **WATCH:** overview of conda: [Python Tutorial: Anaconda - Installation and Using Conda](https://www.youtube.com/watch?v=YJC6ldI3hWk) ## Outline: @@ -47,93 +47,91 @@ You need Python and DeepLabCut installed! - **Learning:** learning and teaching signal processing, and overview from Prof. Demba Ba [talk at JupyterCon](https://www.youtube.com/watch?v=ywz-LLYwkQQ) - **DEMO:** Can I DEMO DEEPLABCUT (DLC) quickly? - - Yes: [you can click through this DEMO notebook](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb) - - AND follow along with me: [Video Tutorial!](https://www.youtube.com/watch?v=DRT-Cq2vdWs) + - Yes: [you can click through this DEMO notebook](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb) + - AND follow along with me: [Video Tutorial!](https://www.youtube.com/watch?v=DRT-Cq2vdWs) - **WATCH:** How do you know DLC is installed properly? (i.e. how to use our test script!) [Video Tutorial!](https://youtu.be/IOWtKn3l33s) - review! - **REVIEW PAPER:** The state of animal pose estimation w/ deep learning i.e. "Deep learning tools for the measurement of animal behavior in neuroscience" [arXiv](https://arxiv.org/abs/1909.13868) & [published version](https://www.sciencedirect.com/science/article/pii/S0959438819301151) - **REVIEW PAPER:** [A Primer on Motion Capture with Deep Learning: Principles, Pitfalls and Perspectives](https://www.sciencedirect.com/science/article/pii/S0896627320307170) - - **WATCH:** There are a lot of docs... where to begin: [Video Tutorial!](https://www.youtube.com/watch?v=A9qZidI7tL8) ### **Module 1: getting started on data** **What you need:** any videos where you can see the animals/objects, etc. You can use our demo videos, grab some from the internet, or use whatever older data you have. Any camera, color/monochrome, etc will work. Find diverse videos, and label what you want to track well :) -- IF YOU ARE PART OF THE COURSE: you will be contributing to the DLC Model Zoo 😊 - - **Slides:** [Overview of starting new projects](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/main/part1-labeling.pdf) - - **READ ME PLEASE:** [DeepLabCut, the science](https://rdcu.be/4Rep) - - **READ ME PLEASE:** [DeepLabCut, the user guide](https://rdcu.be/bHpHN) - - **WATCH:** Video tutorial 1: [using the Project Manager GUI](https://www.youtube.com/watch?v=KcXogR-p5Ak) - - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! - - **WATCH:** Video tutorial 2: [using the Project Manager GUI for multi-animal pose estimation](https://www.youtube.com/watch?v=Kp-stcTm77g) - - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! - - **WATCH:** Video tutorial 3: [using ipython/pythonw (more functions!)](https://www.youtube.com/watch?v=7xwOhUcIGio) - - multi-animal DLC: [labeling](https://www.youtube.com/watch?v=Kp-stcTm77g) - - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! +- IF YOU ARE PART OF THE COURSE: you will be contributing to the DLC Model Zoo 😊 + - **Slides:** [Overview of starting new projects](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/main/part1-labeling.pdf) + - **READ ME PLEASE:** [DeepLabCut, the science](https://rdcu.be/4Rep) + - **READ ME PLEASE:** [DeepLabCut, the user guide](https://rdcu.be/bHpHN) + - **WATCH:** Video tutorial 1: [using the Project Manager GUI](https://www.youtube.com/watch?v=KcXogR-p5Ak) + - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! + - **WATCH:** Video tutorial 2: [using the Project Manager GUI for multi-animal pose estimation](https://www.youtube.com/watch?v=Kp-stcTm77g) + - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! + - **WATCH:** Video tutorial 3: [using ipython/pythonw (more functions!)](https://www.youtube.com/watch?v=7xwOhUcIGio) + - multi-animal DLC: [labeling](https://www.youtube.com/watch?v=Kp-stcTm77g) + - Please go from project creation (use >1 video!) to labeling your data, and then check the labels! ### **Module 2: Neural Networks** - - **Slides:** [Overview of creating training and test data, and training networks](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/main/part2-network.pdf) - - **READ ME PLEASE:** [What are convolutional neural networks?](https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53) +- **Slides:** [Overview of creating training and test data, and training networks](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/main/part2-network.pdf) + +- **READ ME PLEASE:** [What are convolutional neural networks?](https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53) - - **READ ME PLEASE:** Here is a new paper from us describing challenges in robust pose estimation, why PRE-TRAINING really matters - which was our major scientific contribution to low-data input pose-estimation - and it describes new networks that are available to you. [Pretraining boosts out-of-domain robustness for pose estimation](https://paperswithcode.com/paper/pretraining-boosts-out-of-domain-robustness) +- **READ ME PLEASE:** Here is a new paper from us describing challenges in robust pose estimation, why PRE-TRAINING really matters - which was our major scientific contribution to low-data input pose-estimation - and it describes new networks that are available to you. [Pretraining boosts out-of-domain robustness for pose estimation](https://paperswithcode.com/paper/pretraining-boosts-out-of-domain-robustness) - - **MORE DETAILS:** ImageNet: check out the original paper and dataset: http://www.image-net.org/ + - **MORE DETAILS:** ImageNet: check out the original paper and dataset: http://www.image-net.org/ - - **REVIEW PAPER:** [A Primer on Motion Capture with Deep Learning: Principles, Pitfalls and Perspectives](https://www.sciencedirect.com/science/article/pii/S0896627320307170) +- **REVIEW PAPER:** [A Primer on Motion Capture with Deep Learning: Principles, Pitfalls and Perspectives](https://www.sciencedirect.com/science/article/pii/S0896627320307170) +review! - review! +Before you create a training/test set, please read/watch: - Before you create a training/test set, please read/watch: - - **More information:** [Which types neural networks are available, and what should I use?](https://github.com/DeepLabCut/DeepLabCut/wiki/What-neural-network-should-I-use%3F-(Trade-offs,-speed-performance,-and-considerations)) - - **WATCH:** Video tutorial 1: [How to test different networks in a controlled way](https://www.youtube.com/watch?v=WXCVr6xAcCA) - - Now, decide what model(s) you want to test. - - IF you want to train on your CPU, then run the step `create_training_dataset`, in the GUI etc. on your own computer. - - IF you want to use GPUs on google colab, [**(1)** watch this FIRST/follow along here!](https://www.youtube.com/watch?v=qJGs8nxx80A) **(2)** move your whole project folder to Google Drive, and then [**use this notebook**](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb) +- **More information:** [Which types neural networks are available, and what should I use?]() +- **WATCH:** Video tutorial 1: [How to test different networks in a controlled way](https://www.youtube.com/watch?v=WXCVr6xAcCA) + - Now, decide what model(s) you want to test. - **MODULE 2 webinar**: https://youtu.be/ILsuC4icBU0 + - IF you want to train on your CPU, then run the step `create_training_dataset`, in the GUI etc. on your own computer. + - IF you want to use GPUs on google colab, [**(1)** watch this FIRST/follow along here!](https://www.youtube.com/watch?v=qJGs8nxx80A) **(2)** move your whole project folder to Google Drive, and then [**use this notebook**](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb) + **MODULE 2 webinar**: https://youtu.be/ILsuC4icBU0 ### **Module 3: Evaluation of network performance** - - **Slides** [Evaluate your network](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/master/part3-analysis.pdf) - - **WATCH:** [Evaluate the network in ipython](https://www.youtube.com/watch?v=bgfnz1wtlpo) - - why evaluation matters; how to benchmark; analyzing a video and using scoremaps, conf. readouts, etc. +- **Slides** [Evaluate your network](https://github.com/DeepLabCut/DeepLabCut-Workshop-Materials/blob/master/part3-analysis.pdf) +- **WATCH:** [Evaluate the network in ipython](https://www.youtube.com/watch?v=bgfnz1wtlpo) + - why evaluation matters; how to benchmark; analyzing a video and using scoremaps, conf. readouts, etc. ### **Module 4: Scaling your analysis to many new videos** Once you have good networks, you can deploy them. You can create "cron jobs" to run a timed analysis script, for example. We run this daily on new videos collected in the lab. Check out a simple script to get started, and read more below: - - [Analyzing videos in batches, over many folders, setting up automated data processing](https://github.com/DeepLabCut/DLCutils/tree/master/SCALE_YOUR_ANALYSIS) +- [Analyzing videos in batches, over many folders, setting up automated data processing](https://github.com/DeepLabCut/DLCutils/tree/master/SCALE_YOUR_ANALYSIS) - - How to automate your analysis in the lab: [datajoint.io](https://datajoint.io), Cron Jobs: [schedule your code runs](https://www.ostechnix.com/a-beginners-guide-to-cron-jobs/) +- How to automate your analysis in the lab: [datajoint.io](https://datajoint.io), Cron Jobs: [schedule your code runs](https://www.ostechnix.com/a-beginners-guide-to-cron-jobs/) ### **Module 5: Got Poses? Now what ...** Pose estimation took away the painful part of digitizing your data, but now what? There is a rich set of tools out there to help you create your own custom analysis, or use others (and edit them to your needs). Check out more below: - - [Helper code and packages for use on DLC outputs](https://github.com/DeepLabCut/DLCutils) +- [Helper code and packages for use on DLC outputs](https://github.com/DeepLabCut/DLCutils) - - Create your own machine learning classifiers: https://scikit-learn.org/stable/ +- Create your own machine learning classifiers: https://scikit-learn.org/stable/ - - **REVIEW PAPER:** [Toward a Science of Computational Ethology](https://www.sciencedirect.com/science/article/pii/S0896627314007934) +- **REVIEW PAPER:** [Toward a Science of Computational Ethology](https://www.sciencedirect.com/science/article/pii/S0896627314007934) - - **REVIEW PAPER:** The state of animal pose estimation w/ deep learning i.e. "Deep learning tools for the measurement of animal behavior in neuroscience" [arXiv](https://arxiv.org/abs/1909.13868) & [published version](https://www.sciencedirect.com/science/article/pii/S0959438819301151) - - - **REVIEW PAPER:** [Big behavior: challenges and opportunities in a new era of deep behavior profiling](https://www.nature.com/articles/s41386-020-0751-7) +- **REVIEW PAPER:** The state of animal pose estimation w/ deep learning i.e. "Deep learning tools for the measurement of animal behavior in neuroscience" [arXiv](https://arxiv.org/abs/1909.13868) & [published version](https://www.sciencedirect.com/science/article/pii/S0959438819301151) - - **READ**: [Automated measurement of mouse social behaviors using depth sensing, video tracking, and machine learning](https://www.pnas.org/content/112/38/E5351) +- **REVIEW PAPER:** [Big behavior: challenges and opportunities in a new era of deep behavior profiling](https://www.nature.com/articles/s41386-020-0751-7) +- **READ**: [Automated measurement of mouse social behaviors using depth sensing, video tracking, and machine learning](https://www.pnas.org/content/112/38/E5351) *compiled and edited by Mackenzie Mathis* diff --git a/docs/docker.md b/docs/docker.md index 7e4e440937..a2d539b1c0 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -7,66 +7,64 @@ deeplabcut: status: review_needed recommendation: verify --- + (docker-containers)= -# DeepLabCut Docker containers - -For DeepLabCut 2.2.0.2 and onwards, we provide container containers on [DockerHub]( -https://hub.docker.com/r/deeplabcut/deeplabcut). Using Docker is an alternative approach -to using DeepLabCut, which only requires the user to install [Docker]( -https://www.docker.com/) on your machine, vs. following the step-by-step installation -guide for a Anaconda setup. All dependencies needed to run DeepLabCut in the terminal or -running Jupyter notebooks with DeepLabCut pre-installed are shipped with the provided -Docker images. - -The [`napari-deeplabcut` labelling GUI]( -https://deeplabcut.github.io/DeepLabCut/docs/gui/napari_GUI.html) can be used to label -your data, but it cannot be run in a Docker container: it should be installed as -documented in the link above: `pip install napari-deeplabcut` (checkout the [workflow]( -https://deeplabcut.github.io/DeepLabCut/docs/gui/napari_GUI.html#workflow) as well!). + +# DeepLabCut in Docker + +From DeepLabCut 2.2.0.2 onward, we provide container images on [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut). +Using Docker is an alternative approach to installing DeepLabCut in a local conda or pip environment: the images bundle all dependencies needed to run DeepLabCut in a reproducible, self-contained environment. +In a Docker container, DeepLabCut can be used from the terminal, or with Jupyter notebooks; the DeepLabCut GUI is not supported. +The approach requires a local installation of [Docker / Docker Desktop](https://www.docker.com/), and is meant for users who need strict reproducibility, an isolated environment, or server-based automation. + +```{important} +The napari-deeplabcut plugin **cannot be run in a Docker container**. To label +your data, please {ref}`install napari-deeplabcut ` in a local, non-dockerized environment, e.g. using pip: `pip install napari-deeplabcut` . +``` Advanced users can directly head to [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut) and use the provided images there. To get started with using the images, we however also provide a helper tool, `deeplabcut-docker`, which makes the transition to docker images particularly convenient; to install the tool, run -``` bash +```bash $ pip install deeplabcut-docker ``` -on your machine (potentially in a virtual environment, or an existing Anaconda environment). -Note that this will *not* disprupt or install Tensorflow, or any other DeepLabCut dependencies on your computer---the Docker containers are completely isolated from your existing software installation! +on your machine (in any environment). deeplabcut-docker is just a lightweight package for setting up the Docker environment and it will *not* disrupt your installation of TensorFlow, PyTorch or any other dependencies. The Docker container itself is completely isolated from your existing software installation! ## Usage modes With `deeplabcut-docker`, you can use the images in two modes. -- *Note 1: When running any of the following commands first, it can take some time to complete (a few minutes, depending on your internet connection), since it downloads the Docker image in the background. If you do not see any errors in your terminal, assume that everything is working fine! Subsequent runs of the command will be faster.* -- *Note 2: The labelling GUI cannot be used through the Docker images. However, you can install [`napari-deeplabcut`](https://github.com/DeepLabCut/napari-deeplabcut/tree/main?tab=readme-ov-file#napari-deeplabcut-keypoint-annotation-for-pose-estimation) in a conda environment to do the labelling!* -- *Note 3: For any mode below, you might want to set which directory is the base, namely, so you can have read/write (or read-only access). Here is how to do so: -If you want to mount the whole directory could e.g., pass* - -`deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT` - -(which will mount the full directory into the container in read/write mode) - -If read-only access is enough, `deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT:ro` + +```{note} +1. When running any of the following commands first, it can take some time to complete (a few minutes, depending on your internet connection), since it downloads the Docker image in the background. If you do not see any errors in your terminal, assume that everything is working fine! Subsequent runs of the command will be faster. +2. For any mode below, you might want to set which directory is the base, namely, so you can have read/write (or read-only access). Here is how to do so: + If you want to mount the whole directory could e.g., pass + `deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT` + (which will mount the full directory into the container in read/write mode) + If read-only access is enough, `deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT:ro` +``` ### Terminal mode You can run the light version of DeepLabCut and open a terminal by running -``` bash +```bash $ deeplabcut-docker bash ``` -**Important:** if have GPUs on your machine and want to use them to train models, you +````{important} +If you have GPUs on your machine and want to use them to train models, you need to pass the `--gpus all` argument to `deeplabcut-docker`: ``` bash $ deeplabcut-docker bash --gpus all ``` +```` Inside the terminal, you can confirm that DeepLabCut is correctly installed by running and noting which version installs. -``` bash +```bash $ ipython >>> import deeplabcut ``` @@ -75,7 +73,7 @@ $ ipython You can run DeepLabCut by starting a jupyter notebook server. The corresponding image can be pulled and started by running -``` bash +```bash $ deeplabcut-docker notebook ``` @@ -92,28 +90,35 @@ Advanced users and developers can visit the [`/docker` subdirectory](https://git **(1)** Install Docker. See https://docs.docker.com/install/ & for Ubuntu: https://docs.docker.com/install/linux/docker-ce/ubuntu/ Test docker: - $ sudo docker run hello-world - - The output should be: ``Hello from Docker! This message shows that your installation appears to be working correctly.`` +``` +$ sudo docker run hello-world +``` -*if you get the error ``docker: Error response from daemon: Unknown runtime specified nvidia.`` just simply restart docker: +The output should be: `Hello from Docker! This message shows that your installation appears to be working correctly.` - $ sudo systemctl daemon-reload - $ sudo systemctl restart docker +\*if you get the error `docker: Error response from daemon: Unknown runtime specified nvidia.` just simply restart docker: +``` + $ sudo systemctl daemon-reload + $ sudo systemctl restart docker +``` **(2)** Add your user to the docker group (https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user) -Quick guide to create the docker group and add your user: +Quick guide to create the docker group and add your user: Create the docker group. - $ sudo groupadd docker +``` +$ sudo groupadd docker +``` + Add your user to the docker group. - $ sudo usermod -aG docker $USER +``` +$ sudo usermod -aG docker $USER +``` (perhaps restart your computer (best) or (at min) open a new terminal to make sure that you are added from now on) - ## Notes and troubleshooting We dropped GUI support in 2.3.5+ due to too many numerous issues supporting them. Also please note these are tested on unix systems. diff --git a/docs/gui/PROJECT_GUI.md b/docs/gui/PROJECT_GUI.md index 2527b4b062..3bede5488b 100644 --- a/docs/gui/PROJECT_GUI.md +++ b/docs/gui/PROJECT_GUI.md @@ -6,60 +6,65 @@ deeplabcut: visibility: online status: review_needed recommendation: update - notes: "While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commmands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide." + notes: 'While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide.' --- -(project-manager-gui)= -# Interactive Project Manager GUI - -As some users may be more comfortable working with an interactive interface, we wanted to provide an easy-entry point to the software. All the main functionality is available in an easy-to-deploy GUI interface. Thus, while the many advanced features are not fully available in this Project GUI, we hope this gets more users up-and-running quickly. - -**Release notes:** As of DeepLabCut 2.1+ now provide a full front-end user experience for DeepLabCut, and as of 2.3+ we changed the GUI from wxPython to PySide6 with napari support. -## Get Started: - -(1) Install DeepLabCut using the simple-install with Anaconda found [here!](how-to-install)*. -Now you have DeepLabCut installed, but if you want to update it, either follow the prompt in the GUI which will ask you to upgrade when a new version is available, or just go into your env (activate DEEPLABCUT) then run: +(project-manager-gui)= -` pip install 'deeplabcut[gui,modelzoo]'` *but please see [full install guide](how-to-install)! +# Project Manager GUI +As some users may be more comfortable working with an interactive interface, we wanted to provide an easy entry point to the software. All the main functionality is available in an easy-to-use GUI interface. +While several advanced features are not fully available in this Project GUI, we hope this gets more users up-and-running quickly. -(2) Open the terminal and run: `python -m deeplabcut` +## Getting started +1. Install DeepLabCut following the instructions in the {ref}`installation page`. +1. Open the terminal and run: `python -m deeplabcut`

-Start at the Project Management Tab and work your way through the tabs to built your customized model and deploy it on new data. +Start at the Project Management Tab and work your way through the tabs to build your customized model and deploy it on new data. We recommend to keep the terminal visible (as well as the GUI) so you can see the ongoing processes as you step through your project, or any errors that might arise. -- For specific napari-based labeling features, see the ["napari gui" docs](file:napari-gui-landing). +- For specific napari-based labeling features, see the {ref}`napari gui` section. - To change from dark to light mode, set appearance at the top: +

- +

-## Video Demos: How to launch and run the Project Manager GUI: +## User guide + +```{important} +See the dedicated {ref}`file:beginners-guide` section for a step-by-step walkthrough of the GUI. +``` + +## Video demos + +### How to launch and run the Project Manager GUI +```{tip} **Click on the images!** +``` Note that currently the video demo is the wxPython version, but the logic is the same! [![Watch the video](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w)](https://youtu.be/KcXogR-p5Ak) -### Using the Project Manager GUI with the latest DLC code (single animals, plus objects): ⬇️ +### Using the Project Manager GUI with the latest DLC code (single animals, plus objects) [![Watch the video](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1589046800303-OV1CCNZINWDMF1PZWCWE/ke17ZwdGBToddI8pDm48kB4PVlRPKDmSlQNbUD3wvXgUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcaja1QZ1SznGf7WzFOi-J6zLusnaF2VdeZcKivwxvFiDfGDqVYuwbAlftad9hfoui/dlc_gui_22.png?format=1000w)](https://www.youtube.com/watch?v=JDsa8R5J0nQ) -[Read more here](important-info-regd-usage) +{ref}`Read more here ` -### Using the Project Manager GUI with the latest DLC code (multiple identical-looking animals, plus objects): +### Using the Project Manager GUI with the latest DLC code (multiple identical-looking animals, plus objects) [![Watch the video](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1589047147498-G1KTFA5BXR4PVHOOR7OG/ke17ZwdGBToddI8pDm48kJDij24pM2COisBTLIGjR1pZw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZamWLI2zvYWH8K3-s_4yszcp2ryTI0HqTOaaUohrI8PIel60EThn7SDFlTiSprUhmjQQHn9bhdY9dnQSKs8bCCo/Untitled.png?format=1000w)](https://www.youtube.com/watch?v=Kp-stcTm77g) -[Read more here](important-info-regd-usage) +{ref}`Read more here ` -## VIDEO DEMO: How to benchmark your data with the new networks and data augmentation pipelines: +### How to benchmark your data with the new networks and data augmentation pipelines [Watch the video](https://youtu.be/WXCVr6xAcCA) diff --git a/docs/gui/napari/advanced_usage.md b/docs/gui/napari/advanced_usage.md index 20aaafd254..3ce04c4d5d 100644 --- a/docs/gui/napari/advanced_usage.md +++ b/docs/gui/napari/advanced_usage.md @@ -25,11 +25,11 @@ This is the folder where annotations will be saved when using **File -> Save Sel ### Labeling progress -When a labeled data folder is loaded, the widget shows a percentage of labeled frames, based on the theoretical maximum number of keypoints (i.e. number of body parts x number of individuals x number of frames) that could be labeled. +When a labeled data folder is loaded, the widget shows a percentage of labeled frames, based on the theoretical maximum number of keypoints (i.e. number of bodyparts x number of individuals x number of frames) that could be labeled. ```{note} This can be a useful reference to track labeling progress.
-Since visibility cannot be accounted for, it should be considered an estimate of relative labeling progress rather than an absolute measure of completeness. (as not all videos would need 100% labeling, i.e. every body part on every individual in every frame). +Since visibility cannot be accounted for, it should be considered only a rough estimate of relative labeling progress rather than an absolute measure of completeness: hidden/occluded keypoints are not counted, therefore projects with occlusions will not have every body part on every individual in every frame. ``` ### Point size slider @@ -46,7 +46,7 @@ To copy-paste keypoints from one frame to another: ## Color scheme display features -The plugin shows a list of body parts and their corresponding colors in the dock widget. You can toggle the visibility of this color scheme using the **Show color scheme** button. +The plugin shows a list of bodyparts and their corresponding colors in the dock widget. You can toggle the visibility of this color scheme using the **Show color scheme** button. ```{tip} The display only shows keypoints that are currently visible in the viewer.
@@ -63,7 +63,11 @@ In individual coloring mode, the color scheme also shows the individuals list, a ### Jump to body part in viewer -If showing all body parts in the color scheme from the config, clicking on a keypoint in the list that is not currently visible in the viewer will jump to the first instance of that body part in the viewer and select it, if applicable. +To locate a bodypart label that is currently not visible in the viewer, enable "Show all bodyparts" in the color scheme list. +Then, click on a bodypart entry in the color scheme list. +The viewer will jump to the first instance of that body part and select it (when it exists). +If the bodypart is already visible in the viewer, clicking on it in the color scheme will simply select all keypoints of that bodypart, as described above. + This helps quickly find a specific body part in the viewer. ## Trajectory plot diff --git a/docs/gui/napari/basic_usage.md b/docs/gui/napari/basic_usage.md index b6f2cb6f3f..5e126b0727 100644 --- a/docs/gui/napari/basic_usage.md +++ b/docs/gui/napari/basic_usage.md @@ -8,6 +8,7 @@ deeplabcut: --- (file:napari-dlc-basic-usage)= + # napari-DLC - Basic usage `napari-deeplabcut` is a napari plugin for keypoint annotation and label refinement. It can be used either as part of the DeepLabCut GUI or as a standalone annotation tool. @@ -56,6 +57,12 @@ You can load files either by: If you drag and drop a compatible labeled-data folder, the widget opens automatically. ``` +## Using napari + +```{important} +To familiarize yourself with napari, we recommend checking out the [official napari documentation and tutorials](https://napari.org/stable/usage.html). +``` + ## Recommended basic labeling workflow The simplest way to **start labeling** is: @@ -164,7 +171,7 @@ Keeping data inside the project directory is recommended for best compatibility. - napari-deeplabcut specific: - `M`: cycle through annotation modes - `E`: toggle edge coloring - - `F`: toggle between individual and body-part coloring modes + - `F`: toggle between individual and bodypart coloring modes - `V`: toggle visibility of the selected layer - `Backspace`: delete selected point(s) - `Ctrl+C` / `Ctrl+V`: copy and paste selected points @@ -175,7 +182,7 @@ Use the **View shortcuts** button in the dock widget for a quick reference of na ### More quality-of-life features -See the {ref}`Advanced features ` for useful features such as copy-pasting annotations, quick body part selection, and more. +See the {ref}`Advanced features ` for useful features such as copy-pasting annotations, quick bodypart selection, and more. ## Labeling workflows @@ -203,9 +210,9 @@ Use this when the folder already contains a `CollectedData_.h5` file - Open (or drag and drop) the folder in napari. Existing annotations and keypoint metadata will be loaded automatically from the H5 file. -In this case, loading `config.yaml` is usually **not needed** unless : +In this case, loading `config.yaml` is usually **not needed** unless: -- The project's body parts have changed or +- The project's bodyparts have changed or - You want to refresh the configured color scheme ### Refining machine labels @@ -270,8 +277,9 @@ This helps keep saving behavior unambiguous. A short demo video is available here: +[Link to video](https://youtu.be/hsA9IB5r73E) + ```{warning} This demo may be outdated, but the general annotation workflow remains the same. If you would like an updated video tutorial, please open a feature request issue on GitHub, and we will update it. -[Link to video](https://youtu.be/hsA9IB5r73E) ``` diff --git a/docs/gui/napari_GUI.md b/docs/gui/napari_GUI.md index 79f1ee7e92..2fefc50e82 100644 --- a/docs/gui/napari_GUI.md +++ b/docs/gui/napari_GUI.md @@ -10,7 +10,9 @@ deeplabcut: last_verified: '2026-04-09' verified_for: 3.0.0rc14 --- + (file:napari-gui-landing)= + # napari GUI Welcome to the documentation for napari-DLC, the napari plugin for keypoint annotation and label refinement. This plugin can be used either as part of the DeepLabCut GUI or as a standalone annotation tool. diff --git a/docs/installation.md b/docs/installation.md index dd9d0e743c..73890d523c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -10,134 +10,165 @@ deeplabcut: last_verified: '2026-04-21' verified_for: 3.0.0rc14 --- + (file:how-to-install)= -# How To Install DeepLabCut -- **DeepLabCut can be run on Windows, Linux, or MacOS as long as you have Python 3.10 installed** - - (see also [technical considerations](tech-considerations-during-install) and if you run into issues also check out the [Installation Tips](https://deeplabcut.github.io/DeepLabCut/docs/recipes/installTips.html) page). -- 🚧 Please note, there are several modes of installation: - - please decide to either use a [**conda environment**](https://deeplabcut.github.io/DeepLabCut/docs/installation.html#conda-the-installation-process-is-as-easy-as-this-figure) based installation (**recommended**), - - or the supplied [**Docker container**](docker-containers) (recommended for Ubuntu advanced users). -- 🚀 Please note, you will get the best performance with using a **GPU**! - - Please see the section on [GPU support](https://deeplabcut.github.io/DeepLabCut/docs/installation.html#gpu-support) to install your GPU driver and CUDA. +# Installing DeepLabCut + +- **DeepLabCut can be run on Windows, Linux, or MacOS as long as you have Python 3.10-3.12 installed** + - See also {ref}`technical considerations `. + + -```{Hint} Familiar with python packages and conda? Quick Install Guide: + + +- 🚧 Please note, there are several possibilities for installation: + - **Recommended for most users**: Install in a {ref}`conda environment ` + - Install with **{ref}`uv `** (recommended for developers) + - In the supplied **{ref}`Docker container `** (recommended for Ubuntu advanced users and reproducibility). +- 🚀 You will get the best performance when using a **GPU**! + - Please see the section on {ref}`GPU support ` to install your GPU driver and CUDA. + +````{hint} +Familiar with python packages and conda? This assumes you have `conda`/`mamba` installed and this will install DeepLabCut in a fresh -environment. If you have an NVIDIA GPU, install PyTorch according to [their instructions -](https://pytorch.org/get-started/locally/) (with your desired CUDA version) - you just -need your GPU drivers installed. +environment. +If you have an NVIDIA GPU, install PyTorch according to [their instructions](https://pytorch.org/get-started/locally/) (with your desired CUDA version) - you just need your GPU drivers installed. ```bash conda create -n DEEPLABCUT python=3.12 conda activate DEEPLABCUT -# install PyTorch with your desired CUDA version (or for CPU only) - check [their -](https://pytorch.org/get-started/locally/) website: -# GPU version of pytorch for CUDA 11.3 -conda install pytorch cudatoolkit=11.3 -c pytorch - +# Install PyTorch with your desired CUDA version (or CPU only) +# Example: install GPU-enabled pytorch for CUDA 12.6 +pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126 # install the latest version of DeepLabCut -pip install --pre deeplabcut +pip install deeplabcut # add --pre for pre-release versions! # or if you want to use the GUI -pip install --pre deeplabcut[gui] +pip install deeplabcut[gui] # ONLY IF YOU HAVE A CUDA GPU - check that PyTorch can access your GPU; this # should print `True` python -c "import torch; print(torch.cuda.is_available())" ``` +```` -- If you're familiar with the command line and want TensorFlow support, look [below]( -deeplabcut-with-tf-install) for a fresh installation that has worked for us (on Linux) -and makes it possible to use the GPU with both PyTorch and TensorFlow. +- If you're familiar with the command line and want TensorFlow support, look {ref}`below ` for a fresh installation on Linux and makes it possible to use the GPU with both PyTorch and TensorFlow. +(sec:installation-using-conda)= -## CONDA: The installation process is as easy as this figure! --> +## Using Conda - DLC +DLC -### 🚨 Before you start with our conda file, do you have a GPU? -````{admonition} 🚨 Click here for more information! -:class: dropdown -- We recommend having a GPU if possible! -- You **need to decide if you want to use a CPU or GPU for your models**: (Note, you can also use the CPU-only for project management and labeling the data! Then, for example, use Google Colaboratory GPUs for free (read more [here](https://github.com/DeepLabCut/DeepLabCut/tree/master/examples#demo-4-deeplabcut-training-and-analysis-on-google-colaboratory-with-googles-gpus) and there are a lot of helper videos on [our YouTube channel!](https://www.youtube.com/playlist?list=PLjpMSEOb9vRFwwgIkLLN1NmJxFprkO_zi)). +**The installation process is as easy as the figure on the right!↘️** - - **CPU?** Great, jump to the next section below! +### 🚨 Before you start... - - **NVIDIA GPU?** If you want to use your own GPU (i.e., a GPU is in your workstation), then you need to be sure you have a CUDA compatible GPU, CUDA, and cuDNN installed. Please note, which CUDA you install depends on what version of PyTorch you want to use. So, please check "GPU Support" below carefully. **Note, DeepLabCut is up to date with the latest CUDA and PyTorch!** +Do you have a GPU? If yes, see the {ref}`GPU support section ` below for installation instructions. - - **Apple M-chip GPU?** Be sure to install miniconda3, and your GPU will be used by default. -```` +If not, you can still install DeepLabCut and use it on your CPU, but it will be much slower for training and evaluation (but not for labeling or project management). -### Step 1: Install Python via Anaconda +`````{admonition} 🚨 Hardware information! +--- +class: dropdown +--- +- We recommend having a GPU if possible! +- You **need to decide if you want to use a CPU or GPU for your models** + + ````{tab-set} + ```{tab-item} CPU + Great, jump to the next section below! + ``` + ```{tab-item} NVIDIA GPU + If you want to use your own GPU (i.e., a GPU is in your workstation), then you need to be sure you have a CUDA compatible GPU, CUDA, and cuDNN installed. + Please note, which CUDA you install depends on what version of PyTorch you want to use. So, please check {ref}`sec:install-gpu-support` below carefully. **Note, DeepLabCut is up to date with the latest CUDA and PyTorch!** + ``` + ```{tab-item} Apple M-chip GPU + Be sure to install miniconda, and your GPU will be used by default. + ``` + ```` + +- Note, you can also use the CPU-only install for project management and labeling the data! + Then, for example, use Google Colaboratory GPUs for free (read more [here](https://github.com/DeepLabCut/DeepLabCut/tree/master/examples#demo-4-deeplabcut-training-and-analysis-on-google-colaboratory-with-googles-gpus) and there are a lot of helper videos on [our YouTube channel!](https://www.youtube.com/playlist?list=PLjpMSEOb9vRFwwgIkLLN1NmJxFprkO_zi)). +````` + +### Step 1: Install miniconda + +```{important} +Download [miniconda](https://www.anaconda.com/docs/getting-started/miniconda/main) for your operating system +``` + +- miniconda is an easy way to install Python and additional packages across various operating systems +- With miniconda, you can install all the dependencies in an [environment](https://conda.io/docs/user-guide/tasks/manage-environments.html) on your machine +- Miniconda is a lightweight version of Anaconda that includes only conda and its dependencies. -### Install [anaconda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html#), or use miniconda3 for MacOS users (see below) +```{admonition} Wait, why are we mixing Anaconda, miniconda and conda? +--- +class: dropdown tip +--- +`conda` is the terminal-based environment management system that is included in both Anaconda and Miniconda. This is the actual workhorse that allows you to create and manage environments, and install packages. -- Anaconda is an easy way to install Python and additional packages across various operating systems. With Anaconda you create all the dependencies in an [environment](https://conda.io/docs/user-guide/tasks/manage-environments.html) on your machine. +**Anaconda** is a full-featured distribution that includes conda, Python, and a large number of scientific packages and their dependencies, plus some graphical user interfaces (GUIs) for managing environments and packages. It is a larger download and takes up more disk space. -```{Hint} -Download anaconda for your operating system: [anaconda.com/download/ -](https://www.anaconda.com/download/) +**Miniconda** is a minimal distribution that includes only conda and its dependencies, along with Python. It does not include any additional packages or GUIs. We recommend it as most GUIs and base packages provided by the full Anaconda distribution are not necessary for DeepLabCut. ``` -- IF you use a M1 or M2 chip in your MacBook with v12.5+ (typically 2020 or newer machines), we recommend **miniconda3,** which operates with the same principles as anaconda. This is straight forward and explained in detail here: https://docs.conda.io/projects/conda/en/latest/user-guide/install/macos.html. But in short, open the program "terminal" and copy/paste and run the code that is supplied below. +(sec:conda-build-env)= -### 💡 miniconda for Mac -````{admonition} Click the button to see code for miniconda for Mac -:class: dropdown -wget https://repo.anaconda.com/miniconda/Miniconda3-py310_4.12.0-MacOSX-arm64.sh -O ~/miniconda.sh -bash ~/miniconda.sh -b -p $HOME/miniconda -source ~/miniconda/bin/activate -conda init zsh -```` +### Step 2: Build a conda environment -### Step 2: Build an Env using our Conda file! +Use the `DEEPLABCUT.yaml` file to build a conda environment with all the dependencies for DeepLabCut. -You simply need to have this `.yaml` file anywhere locally on your computer. So, let's download it! +You simply need to have this `.yaml` file locally on your computer. -```{Hint} -Windows users: Be sure you have `git` installed along with anaconda: https://gitforwindows.org/ +```{warning} +On **Windows**, make sure you have `git` installed: [Git for Windows](https://gitforwindows.org/) ``` -- TO DIRECTLY DOWNLOAD THE CONDA FILE conda: +- Follow the link ➡️ for the [conda file](https://github.com/DeepLabCut/DeepLabCut/blob/main/conda-environments/DEEPLABCUT.yaml#:~:text=Raw%20file%20content-,Download,-%E2%8C%98) and then click "..." and select Download - - click ➡️ for [CONDA FILE](https://github.com/DeepLabCut/DeepLabCut/blob/main/conda-environments/DEEPLABCUT.yaml#:~:text=Raw%20file%20content-,Download,-%E2%8C%98) and then click the "..." and select Download - Screen Shot 2023-09-13 at 10 33 32 PM + Screen Shot 2023-09-13 at 10 33 32 PM -- **Now, in Terminal (or Anaconda Command Prompt for Windows users)**, if you clicked to download, go to your downloads folder. +- **Now, in Terminal (or Anaconda Command Prompt for Windows users)**: -```{Hint} -Windows users: Be sure to open the program terminal/cmd/anaconda prompt with a RIGHT-click, "open as admin" -``` + - If you clicked to download, go to your downloads folder. -```{Hint} -:class: dropdown -If you cloned the repo onto your Desktop, the command may look like: -``cd C:\Users\YourUserName\Desktop\DeepLabCut\conda-environments`` -You can (on Windows) hold SHIFT and right-click > Copy as path, or (on Mac) right-click and while in the menu press the OPTION key to reveal Copy as Pathname. -``` -Be sure you are in the folder that has the `.yaml` file, then run: + - Be sure you are in the folder that has the `.yaml` file, then run: + + `conda env create -f DEEPLABCUT.yaml` + +- You can now use this environment from anywhere on your computer. + Just activate your environment by running: `conda activate DEEPLABCUT` -``conda env create -f DEEPLABCUT.yaml`` +Now you should see (`DEEPLABCUT`) on the left of your terminal screen: +``` +(DEEPLABCUT) YourName-MacBook... +``` -- You can now use this environment from anywhere on your computer (i.e., no need to go back into the conda- folder). Just enter your environment by running: - - Ubuntu/MacOS: ``source/conda activate nameoftheenv`` (i.e. on your Mac: ``conda activate DEEPLABCUT``) - - Windows: ``activate nameoftheenv`` (i.e. ``activate DEEPLABCUT``) +```{note} +No need to run `pip install deeplabcut`, it's already in the conda file! +``` -Now you should see (`nameofenv`) on the left of your terminal screen, i.e. ``(DEEPLABCUT) YourName-MacBook...`` -NOTE: no need to run pip install deeplabcut, as it is already installed!!! :) +(sec:deeplabcut-with-tf-install)= -(deeplabcut-with-tf-install)= -### 💡 Notice: PyTorch and TensorFlow Support within DeepLabCut +#### TensorFlow support ````{admonition} DeepLabCut TensorFlow Support -:class: dropdown -As of June 2024 we have a PyTorch Engine backend and we will be depreciating the -TensorFlow backend by the end of 2024. Currently, if you want to use TensorFlow, you +--- +class: dropdown +--- +💡 **PyTorch and TensorFlow Support within DeepLabCut** + +As of June 2024 we have a PyTorch Engine backend and we will be deprecating the +TensorFlow backend by version 3.2 latest (TBD). +Currently, if you want to use TensorFlow, you need to run `pip install deeplabcut[tf]` in order to install the correct version of -TensorFlow in your conda env. Please note, we will be providing bug fixes, but we will +TensorFlow in your conda env. +Please note, we will be providing bug fixes, but we will not be supporting new TensorFlow versions beyond 2.10 (Windows), and 2.12 for other OS. Installing TensorFlow and getting it to have access to the GPU can be a bit tricky. @@ -170,66 +201,78 @@ pip install --pre deeplabcut ``` ```` -**Great, that's it! DeepLabCut is installed!** 🎉💜 +### Step 3: Let's run DeepLabCut! +**DeepLabCut is installed!** 🎉💜 -### Step 3: Really, that's it! Let's run DeepLabCut +Launch the DeepLabCut GUI in your new conda env by running `python -m deeplabcut` Head over to the [User Guide Overview](https://deeplabcut.github.io/DeepLabCut/docs/UseOverviewGuide.html) for information. -🎉 Launch DeepLabCut in your new env by running `python -m deeplabcut` +```{warning} +On **Windows**: Open the terminal/cmd/anaconda prompt as **Administrator** (right click and select "Run as administrator") to avoid permission issues when downloading models, and for symlink support when videos are not copied into the project folder. +``` -## Other ways to install DeepLabCut and additional tips +### Conda environment management tips -### Alternatively, you can git clone this repo and install from source! -i.e., if the download did not work or you just want to have the source code handy! +Here are some conda environment management tips: [kapeli.com: Conda Cheat Sheet](https://kapeli.com/cheat_sheets/Conda.docset/Contents/Resources/Documents/index) -- **Windows/Linux/MacBooks:** git clone this repo (in the terminal/cmd program, while **in a folder** you wish to place DeepLabCut -To git clone type: ``git clone https://github.com/DeepLabCut/DeepLabCut.git``). Note, this can be anywhere, even downloads is fine.) -- Then follow the same steps as in Step 2 above, adjusting for the file now being in the downloaded folder. + -### PIP: + -- Everything you need to build custom models within DeepLabCut (i.e., use our source code and our dependencies) can be installed with `pip install 'deeplabcut[gui]'` (for GUI support w/PyTorch) or without the gui: `pip install 'deeplabcut'`. -- If you want to use the SuperAnimal models, then please use `pip install 'deeplabcut[gui,modelzoo]'`. +Please see how to test your installation by following [this video](https://www.youtube.com/watch?v=IOWtKn3l33s). -## DOCKER: + -- We also have docker containers. Docker is the most reproducible way to use and deploy code. Please see our dedicated docker package and page [here](https://deeplabcut.github.io/DeepLabCut/docs/docker.html). +## Other ways to install DeepLabCut -## Pro Tips: +### git clone -More [installation ProTips](installation-tips) are also available. +Recommended for users who want to modify the code, or want to be up-to-date with the latest code on GitHub. -If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` once -you are inside your env. If you want to use a specific release, then you need to specify -the version you want, such as `pip install deeplabcut==3.0`. Once installed, you can -check the version by running `import deeplabcut` `deeplabcut.__version__`. Don't be -afraid to update, DLC is backwards compatible with your 2.0+ projects and performance -continues to get better and new features are added nearly monthly. +- To clone the repository run: `git clone https://github.com/DeepLabCut/DeepLabCut.git` +- Then follow the same steps as in Step 2 above, adjusting for the `DEEPLABCUT.yaml` env file now being in the folder where you git cloned the repo. +- Or use pip/uv to install from the cloned repo (see below). -**All of the data you labelled in version 2.X is also compatible with version 3+ and the -PyTorch engine**! There is no change in the workflow or the way labels are handled: the -big changes happen under-the-hood! If you've been working with DeepLabCut 2.X and want -to learn more about moving to the PyTorch engine, checkout our docs on [moving from -TensorFlow to PyTorch](dlc3-user-guide) +(sec:uv-install)= + +### `uv` (recommended for developers) + +- Clone the [repository](https://github.com/DeepLabCut/DeepLabCut) +- Install `uv` following [instructions here](https://docs.astral.sh/uv/getting-started/installation/) +- Run in the cloned repo: + +```bash +uv venv -p 3.12 +uv pip install -e '.[gui,modelzoo]' # Change optional install as needed +source .venv/bin/activate # or & .venv\Scripts\activate.ps1 on Windows +``` + +### `pip` -Here are some conda environment management tips: [kapeli.com: Conda Cheat Sheet]( -https://kapeli.com/cheat_sheets/Conda.docset/Contents/Resources/Documents/index) +If you already have a local environment, everything you need to use the project manager GUI, train and/or build custom models within DeepLabCut (i.e., use our source code and our dependencies) can be installed with `pip install 'deeplabcut[gui]'` (for GUI support w/PyTorch) or without the gui: `pip install 'deeplabcut'`. -**Pro Tip:** If you want to modify code and then test it, you can use our provided -testscripts. This would mean you need to be up-to-date with the latest GitHub-based code -though! Please see [here](installation-tips) on how to get the latest GitHub code, and -how to test your installation by following this video: -https://www.youtube.com/watch?v=IOWtKn3l33s. +- If you **cloned the repo** and want to make edits to the code locally, navigate to the cloned repo folder and run `pip install -e .[gui,modelzoo,tf]` to install the package in "editable" mode, which allows you to make changes to the code and have those changes reflected when you import the package. +- If you want to use the SuperAnimal models, then please use `pip install 'deeplabcut[gui,modelzoo]'`. -## Creating your own customized conda env (recommended route for Linux: Ubuntu, CentOS, Mint, etc.) +### Docker + +- We also have docker containers. Docker is the most reproducible way to use and deploy code. Please see our dedicated docker package and page [here](https://deeplabcut.github.io/DeepLabCut/docs/docker.html). -*Note in a fresh ubuntu install, you will often have to run: ``sudo apt-get install gcc python3-dev`` to install the GNU Compiler Collection and the python developing environment. +### Creating your own conda environment -Some users might want to create their own customize env. - Here is an example. + -In the terminal type: + + +```{tip} +In a fresh ubuntu install, you will often have to run: `sudo apt-get install gcc python3-dev` to install the GNU Compiler Collection and the python developing environment. +``` + +Create a new conda environment with Python 3.10 (or 3.11, 3.12) by running: `conda create -n DLC python=3.10` @@ -237,68 +280,91 @@ In the terminal type: `pip install deeplabcut`) or `pip install 'deeplabcut[gui]'` which has a napari based GUI. +## Updating your installation -## **GPU Support:** +If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` inside your env. +If you want to use a specific release, then specify the version you want, such as `pip install deeplabcut==3.0`. +Once installed, you can +check the version by running: -The ONLY thing you need to do **first** if you have an NVIDIA GPU and the matching NVIDIA CUDA+driver installed. -- CUDA: https://developer.nvidia.com/cuda-downloads (just follow the prompts here!) -- DRIVERS: https://www.nvidia.com/Download/index.aspx +```python +import deeplabcut +deeplabcut.__version__ +``` -### The most common "new user" hurdle is installing and using your GPU, so don't get discouraged! +Don't be afraid to update, DLC is backwards compatible with your 2.0+ projects and performance continues to get better and new features are added often. -**CRITICAL:** If you have a GPU, you should FIRST **install an appropriate driver for -your specific GPU**, then you can use the supplied conda file. You'll need an NVIDIA GPU -which is compatible with CUDA. To see a list of CUDA-enabled NVIDIA GPUs, please [see -their website](https://developer.nvidia.com/cuda-gpus). +### Data compatibility -- Here we provide notes on how to install and check your GPU use with TensorFlow (which -is used by DeepLabCut and already installed with the Anaconda files above). Thus, you do -not need to independently install tensorflow. +**All of the data you labelled in version 2.X is also compatible with version 3+ and the +PyTorch engine**! +There is no change in the workflow or the way labels are handled: the +big changes happen under-the-hood! If you've been working with DeepLabCut 2.X and want +to learn more about moving to the PyTorch engine, check out our docs on [moving from +TensorFlow to PyTorch](dlc3-user-guide) + +(sec:install-gpu-support)= + +## GPU Support -**FIRST**, install a driver for your GPU. Find DRIVER HERE: -https://www.nvidia.com/download/index.aspx +### General GPU support -- Check which driver is installed by typing this into the terminal: ``nvidia-smi``. +Please ensure you have an NVIDIA GPU and the matching NVIDIA driver installed. + +```{warning} +If you have a GPU, you should first **install an appropriate driver for +your specific GPU**, then you can use the supplied conda file. +``` -**SECOND**, install CUDA: https://developer.nvidia.com/ (Note that cuDNN, https://developer.nvidia.com/cudnn, is supplied inside the anaconda environment files, so you don't need to install it again). +- Drivers: see [NVIDIA Drivers](https://www.nvidia.com/Download/index.aspx) +- CUDA: download [here](https://developer.nvidia.com/cuda-downloads) if needed. Installing the drivers usually allows you to skip installing CUDA; instead obtaining via the PyTorch installation process. -**THIRD:** Follow the steps above to get the `DEEPLABCUT` conda file and install it! +### Installing CUDA and cuDNN for TensorFlow GPU support -### Notes: +You will need an NVIDIA GPU that is compatible with CUDA. + +To see a list of CUDA-enabled NVIDIA GPUs, please [see their website](https://developer.nvidia.com/cuda-gpus). + +Here we provide notes on how to install and check your GPU use with TensorFlow, which is used by DeepLabCut. + +1. Install a driver for your GPU, using the NVIDIA Drivers link above. + - Check which driver is installed by typing this into the terminal: `nvidia-smi`. +1. Install [CUDA](https://developer.nvidia.com/). Note that [cuDNN](https://developer.nvidia.com/cudnn) is supplied inside the anaconda environment files, so you don't need to install it again. +1. Follow the steps above to get the `DEEPLABCUT` conda file and install it! + +### Notes + +- **As of version 3.0+ we moved to PyTorch. The last supported version of TensorFlow is + 2.10 (for Windows users) and 2.12 for others**. Support will not be provided for future versions. -- **As of version 3.0+ we moved to PyTorch. The Last supported version of TensorFlow is -2.10 (window users) and 2.12 for others (we have not tested beyond this).** - Please be mindful different versions of TensorFlow require different CUDA versions. + - As the combination of TensorFlow and CUDA matters, we strongly encourage you to -**check your driver/cuDNN/CUDA/TensorFlow versions** [on this StackOverflow post]( -https://stackoverflow.com/questions/30820513/what-is-version-of-cuda-for-nvidia-304-125/30820690#30820690 -). + **check your driver/cuDNN/CUDA/TensorFlow versions** [on this StackOverflow post](https://stackoverflow.com/questions/30820513/what-is-version-of-cuda-for-nvidia-304-125/30820690#30820690). + - To check your GPU is working, in the terminal, run: -`nvcc -V` to check your installed version(s). + `nvcc -V` to check your installed version(s). - The best practice is to then run the supplied `testscript_pytorch_single_animal.py` -(or `testscript_tensorflow_single_animal.py` for the TensorFlow engine); this is inside the examples folder you -acquired when you git cloned the repo. Here is more information/a short -[video on running the testscript](https://www.youtube.com/watch?v=IOWtKn3l33s). -- Additionally, if you want to use the bleeding edge, with your git clone you also get -the latest code. While inside the main DeepLabCut folder, you can run `./reinstall.sh` -to be sure it's installed (more [here](installation-tips)) -- You can test that your GPU is being properly engaged with these additional [tips]( -https://www.tensorflow.org/programmers_guide/using_gpu). -- Ubuntu users might find this [installation guide]( -https://deeplabcut.github.io/DeepLabCut/docs/recipes/installTips.html#installation-on-ubuntu-20-04-lts -) for a fresh ubuntu install useful as well. - -## Troubleshooting: - -TensorFlow: + (or `testscript_tensorflow_single_animal.py` for the TensorFlow engine); this is inside the examples folder you + acquired when you git cloned the repo. Here is more information/a short + [video on running the test scripts](https://www.youtube.com/watch?v=IOWtKn3l33s). + +- You can test that your GPU is being properly used with these additional [tips](https://www.tensorflow.org/programmers_guide/using_gpu). + +- Ubuntu users might find this [installation guide](https://deeplabcut.github.io/DeepLabCut/docs/recipes/installTips.html#installation-on-ubuntu-20-04-lts) for a fresh DLC install on Ubuntu useful as well. + +## Troubleshooting + +### TensorFlow + Here are some additional resources users have found helpful (posted without endorsement): - https://stackoverflow.com/questions/30820513/what-is-the-correct-version-of-cuda-for-my-nvidia-driver/30820690

- +

- https://www.tensorflow.org/install/source#gpu @@ -307,38 +373,66 @@ Here are some additional resources users have found helpful (posted without endo - https://developer.nvidia.com/cuda-toolkit-archive - -FFMPEG: +### FFMPEG - A few Windows users report needing to install re-install ffmpeg (after windows updates) as described here: https://video.stackexchange.com/questions/20495/how-do-i-set-up-and-use-ffmpeg-in-windows (A potential error could occur when making new videos). On Ubuntu, the command is: `sudo apt install ffmpeg` -DEEPLABCUT: +### DeepLabCut + +- If you git clone or download this folder, and are inside of it then `import deeplabcut` will import the package from the local folder rather than from the latest on PyPi! + +(sec:system-wide-considerations-during-install)= + +## System-wide installation considerations + +```{note} +**What is a system-wide installation?** + +A system-wide installation, or a base environment installation, is when you install using the default Python environment/interpreter on your computer, instead of a compartmentalized, separate environment (e.g., a conda environment). + +This is often a source of conflicts between packages, user confusion and progressive "dependency hell" (where you have to keep installing and uninstalling packages to get the right versions for different applications). + +To avoid this, we recommend using a virtual environment (e.g., conda or uv managed environments) to keep your DeepLabCut installation separate from other Python packages and applications on your system. +``` + +If you perform a system-wide/base environment installation, and the computer has other Python packages or TensorFlow versions installed that conflict, this will overwrite them. + +If you have a dedicated machine for DeepLabCut, this may be *temporarily* fine, but will degrade over time as you try to install or update other packages. + +Indeed, if there are other applications that require different versions of libraries, then installing/updating anything would potentially break those applications. + +One way to manage virtual environments is to use conda environments (for which you need Anaconda/miniconda installed). +An environment is a self-contained directory that contains a Python installation for a particular version of Python, plus additional packages, without any cross-talk with other environments (NVIDIA drivers being a notable exception, as they are system-wide by nature). + +(sec:hardware-considerations-during-install)= + +## Hardware considerations + +- **Computer**: + + - For reference, we use e.g. Dell workstations (79xx series) with **Ubuntu 16.04 LTS, 18.04 LTS, 20.04 LTS, 22.04 LTS** and for versions prior to 2.2, we run a Docker container that has TensorFlow, etc. installed (https://github.com/DeepLabCut/Docker4DeepLabCut2.0). Now we use the new Docker containers supplied on this repo (linux support only), also available through [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut) or the [`deeplabcut-docker`](https://pypi.org/project/deeplabcut-docker/) helper script. + +- **Computing Hardware**: -- if you git clone or download this folder, and are inside of it then ``import deeplabcut`` will import the package from there rather than from the latest on PyPi! + - An NVIDIA GPU with *at least* 8GB VRAM (memory) is ideal. + - A GPU is not strictly necessary, but on a CPU the (training and evaluation) code is considerably slower (10x) for ResNets, but MobileNets are faster. You might also consider using cloud computing services like [Google cloud/amazon web services](https://github.com/DeepLabCut/DeepLabCut/issues/47) or Google Colaboratory. -(system-wide-considerations-during-install)= -## System-wide considerations: +- **Camera Hardware**: -If you perform the system-wide installation, and the computer has other Python packages or TensorFlow versions installed that conflict, this will overwrite them. If you have a dedicated machine for DeepLabCut, this is fine. If there are other applications that require different versions of libraries, then one would potentially break those applications. The solution to this problem is to create a virtual environment, a self-contained directory that contains a Python installation for a particular version of Python, plus additional packages. One way to manage virtual environments is to use conda environments (for which you need Anaconda installed). + - The software is very robust to variations stemming from various cameras (cell phone cameras, grayscale, color; captured under infrared light, different manufacturers, etc.). See demos on our [website](https://www.mousemotorlab.org/deeplabcut/). + - Note that a model trained on certain data/camera may not generalize to data from a different camera however, so we recommend using the same camera for training and inference. -(tech-considerations-during-install)= -## Technical Considerations: +- **Software**: -- Computer: + - Operating System: Linux (Ubuntu), MacOS[^1] (Mojave), or Windows 10. However, we the authors strongly recommend Ubuntu! + - DeepLabCut is written in Python 3 (https://www.python.org/) and not compatible with Python 2. - - For reference, we use e.g. Dell workstations (79xx series) with **Ubuntu 16.04 LTS, 18.04 LTS, 20.04 LTS, 22.04 LTS** and for versions prior to 2.2, we run a Docker container that has TensorFlow, etc. installed (https://github.com/DeepLabCut/Docker4DeepLabCut2.0). Now we use the new Docker containers supplied on this repo (linux support only), also available through [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut) or the [`deeplabcut-docker`](https://pypi.org/project/deeplabcut-docker/) helper script. + -- Computer Hardware: - - Ideally, you will use a strong NVIDIA GPU with *at least* 8GB memory. A GPU is not necessary, but on a CPU the (training and evaluation) code is considerably slower (10x) for ResNets, but MobileNets are faster (see WIKI). You might also consider using cloud computing services like [Google cloud/amazon web services](https://github.com/DeepLabCut/DeepLabCut/issues/47) or Google Colaboratory. + -- Software: - - Operating System: Linux (Ubuntu), MacOS* (Mojave), or Windows 10. However, the authors strongly recommend Ubuntu! *MacOS does not support NVIDIA GPUs (easily), so we only suggest this option for CPU use or a case where the user wants to label data, refine data, etc and then push the project to a cloud resource for GPU computing steps, or use MobileNets. - - Anaconda/Python3: Anaconda: a free and open source distribution of the Python programming language (download from https://www.anaconda.com/). DeepLabCut is written in Python 3 (https://www.python.org/) and not compatible with Python 2. - - `pip install deeplabcut` - - TensorFlow - - If you want to use a pre3.0 version, you will need [TensorFlow](https://www.tensorflow.org/) (we used version 1.0 in the Nature Neuroscience paper, later versions also work with the provided code (we tested **TensorFlow versions 1.0 to 1.15, and 2.0 to 2.10**; we recommend TF2.10 now) for Python 3.8, 3.9, 3.10 with GPU support. - - To note, is it possible to run DeepLabCut on your CPU, but it will be VERY slow (see: [Mathis & Warren](https://www.biorxiv.org/content/early/2018/10/30/457242)). However, this is the preferred path if you want to test DeepLabCut on your own computer/data before purchasing a GPU, with the added benefit of a straightforward installation! Otherwise, use our COLAB notebooks for GPU access for testing. - - Docker: We highly recommend advanced users use the supplied [Docker container](docker-containers) +[^1]: MacOS does not support NVIDIA GPUs (easily), so we only suggest this option for CPU use or a case where the user wants to label data, refine data, etc, and then push the project to a cloud resource for GPU computing steps, or use MobileNets diff --git a/docs/pytorch/pytorch_config.md b/docs/pytorch/pytorch_config.md index 0019433993..a4c33cd8fb 100644 --- a/docs/pytorch/pytorch_config.md +++ b/docs/pytorch/pytorch_config.md @@ -6,9 +6,11 @@ deeplabcut: visibility: online status: review_needed recommendation: verify - notes: "Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update." + notes: Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update. --- + (dlc3-pytorch-config)= + # The PyTorch Configuration file The `pytorch_config.yaml` file specifies the configuration for your PyTorch pose models, @@ -47,10 +49,10 @@ resume_training_from: # optional: restart the training at the specific checkpoi There are a few singleton parameters defined in the PyTorch configuration file: - `device`: The device to use for training/inference. The default is `auto`, which sets -the device to `cuda` if an NVIDIA GPU is available, and `cpu` otherwise. For users -running models on macOS with an M1/M2/M3 chip, this is set to `mps` for certain models -(not all operations are currently supported on Apple GPUs - so some models like HRNets -need to be trained on CPU, while others like ResNets can take advantage of the GPU). + the device to `cuda` if an NVIDIA GPU is available, and `cpu` otherwise. For users + running models on macOS with an M1/M2/M3 chip, this is set to `mps` for certain models + (not all operations are currently supported on Apple GPUs - so some models like HRNets + need to be trained on CPU, while others like ResNets can take advantage of the GPU). - `method`: Either `bu` for bottom-up models, or `td` for top-down models. - `net_type`: The type of pose model configured by the file (e.g. `resnet_50`). @@ -59,11 +61,10 @@ need to be trained on CPU, while others like ResNets can take advantage of the G The data section configures: - `bbox_margin`: The margin (in pixels) to add around ground truth pose when generating -bounding boxes. For more information, see [generating bounding boxes from pose]( -#bbox-from-pose). + bounding boxes. For more information, see [generating bounding boxes from pose](#bbox-from-pose). - `colormode`: in which format images are given to the model (e.g., `RGB`, `BGR`) - `inference`: which transformations should be applied to images when running evaluation -or inference + or inference - `train`: which transformations should be applied to images when training The default configuration for a pose model is: @@ -124,11 +125,9 @@ auto_padding: border_mask_value: null # str: padding value for mask if border_mode is 'constant' ``` -**Covering**: Based on Albumentations's [CoarseDropout]( -https://albumentations.ai/docs/api_reference/augmentations/dropout/coarse_dropout/#albumentations.augmentations.dropout.coarse_dropout) +**Covering**: Based on Albumentations's [CoarseDropout](https://albumentations.ai/docs/api_reference/augmentations/dropout/coarse_dropout/#albumentations.augmentations.dropout.coarse_dropout) augmentation, this "cuts" holes out of the image. As defined in -[Improved Regularization of Convolutional Neural Networks with Cutout]( -https://arxiv.org/abs/1708.04552). +[Improved Regularization of Convolutional Neural Networks with Cutout](https://arxiv.org/abs/1708.04552). ```yaml covering: true # bool: if true, applies a coarse dropout with probability 50% @@ -192,14 +191,14 @@ height and width of images in the batches. There are a few different ways to ens all images in a batch have the same size: 1. **Crop sampling**. This is the default behavior for the PyTorch engine in DeepLabCut. -A part of each image (of a fixed size) is cropped and given to the model to train. See -below for more information. -2. **A custom collate function**. Collate functions define a way that images of different -sizes can be combined into one tensor. This involves resizing and padding images to the -same size and aspect ratio. Available collate functions are defined in -`deeplabcut/pose_estimation_pytorch/data/collate.py`. -3. **Resizing all images**. All images can simply be resized to the same size. This -usually doesn't lead to the best performance. + A part of each image (of a fixed size) is cropped and given to the model to train. See + below for more information. +1. **A custom collate function**. Collate functions define a way that images of different + sizes can be combined into one tensor. This involves resizing and padding images to the + same size and aspect ratio. Available collate functions are defined in + `deeplabcut/pose_estimation_pytorch/data/collate.py`. +1. **Resizing all images**. All images can simply be resized to the same size. This + usually doesn't lead to the best performance. **Resizing - Crop Sampling**: An alternative way to ensure all images have the same size is through cropping. The `crop_sampling` crops images down to a maximum width and @@ -223,12 +222,13 @@ crop_sampling: function to use is `ResizeFromDataSizeCollate` (other collate functions are defined in `deeplabcut/pose_estimation_pytorch/data/collate.py`). For each batch to collate, this implementation: + 1. Selects the target width & height all images will be resized to by getting the size -of the first image in the batch, and multiplying it by a scale sampled uniformly at -random from `(min_scale, max_scale)`. -2. Resizes all images in the batch (while preserving their aspect ratio) such that they -are the smallest size such that the target size fits entirely in the image. -3. Crops each resulting image into the target size with a random crop. + of the first image in the batch, and multiplying it by a scale sampled uniformly at + random from `(min_scale, max_scale)`. +1. Resizes all images in the batch (while preserving their aspect ratio) such that they + are the smallest size such that the target size fits entirely in the image. +1. Crops each resulting image into the target size with a random crop. ```yaml collate: # rescales the images when putting them in a batch @@ -352,8 +352,7 @@ after every epoch, you could decide to evaluate every 5 epochs (by setting is training, it can speed up training on large datasets. **Optimizer**: Any optimizer inheriting `torch.optim.Optimizer`. More information about -optimizers can be found in [PyTorch's documentation]( -https://pytorch.org/docs/stable/optim.html). Examples: +optimizers can be found in [PyTorch's documentation](https://pytorch.org/docs/stable/optim.html). Examples: ```yaml # SGD with initial learning rate 1e-3 and momentum 0.9 @@ -372,8 +371,7 @@ https://pytorch.org/docs/stable/optim.html). Examples: lr: 1e-4 ``` -**Scheduler**: You can use [any scheduler]( -https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate) defined in +**Scheduler**: You can use [any scheduler](https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate) defined in `torch.optim.lr_scheduler`, where the arguments given are arguments of the scheduler. The default scheduler is an LRListScheduler, which changes the learning rates at each milestone to the corresponding values in `lr_list`. Examples: @@ -396,10 +394,8 @@ milestone to the corresponding values in `lr_list`. Examples: ``` You can also use schedulers that use other schedulers as parameters, such as a -[`ChainedScheduler`]( -https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.ChainedScheduler.html) -or a [`SequentialLR`]( -https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.SequentialLR.html). +[`ChainedScheduler`](https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.ChainedScheduler.html) +or a [`SequentialLR`](https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.SequentialLR.html). The `SequentialLR` can be particularly useful, such as to use a first scheduler for some warmup epochs, and a second scheduler later. An example usage would be: @@ -437,8 +433,7 @@ warmup epochs, and a second scheduler later. An example usage would be: The `train_settings` key contains parameters that are specific to training. For more information about the `dataloader_workers` and `dataloader_pin_memory` settings, see -[Single- and Multi-process Data Loading]( -https://pytorch.org/docs/stable/data.html#single-and-multi-process-data-loading) +[Single- and Multi-process Data Loading](https://pytorch.org/docs/stable/data.html#single-and-multi-process-data-loading) and [memory pinning](https://pytorch.org/docs/stable/data.html#memory-pinning). Setting `dataloader_workers: 0` uses single-process data loading, while setting it to 1 or more will use multi-process data loading. You should always keep @@ -504,11 +499,13 @@ Otherwise, the parameters for the scheduler your started training with will be l from the state dictionary, and your edits might not be kept! ### Inference + The `inference:` block in `pytorch_config.yaml` allows configuring **inference-specific behavior** for your model. It is independent of training settings and can include multiple sub-configs, currently supporting **multithreading**, **compile**, **autocast**, and **conditions**. **Example** + ```yaml inference: multithreading: @@ -526,6 +523,7 @@ inference: ``` **Sub-configs** + - `multithreading` Controls producer-consumer threading during inference for preprocessing and batching. - `enabled` (`bool`): Enable/disable multithreading. @@ -541,7 +539,7 @@ inference: - `autocast` Controls optional mixed precision during inference. - `enabled` (`bool`): Enable/disable `torch.autocast`. Default: `false`. - Note: Enabling autocast may reduce inference accuracy. It is disabled by default. + Note: Enabling autocast may reduce inference accuracy. It is disabled by default. - `conditions` Only used for **Conditional Top-Down (CTD)** models to specify which conditions should be used during inference. @@ -594,13 +592,12 @@ detector that brings enough performance. The recommended variants are the follow (from fastest to most powerful, taken from torchvision's documentation): | name | Box MAP (larger = more powerful) | Params (larger = more powerful) | GFLOPS (larger = slower) | -|-----------------------------------|---------------------------------:|--------------------------------:|-------------------------:| +| --------------------------------- | -------------------------------: | ------------------------------: | -----------------------: | | SSDLite | 21.3 | 3.4M | 0.58 | | fasterrcnn_mobilenet_v3_large_fpn | 32.8 | 19.4M | 4.49 | | fasterrcnn_resnet50_fpn | 37 | 41.8M | 134.38 | | fasterrcnn_resnet50_fpn_v2 | 46.7 | 43.7M | 280.37 | - ### Restarting Training of an Object Detector at a Specific Checkpoint If you wish to restart the training of a detector at a specific checkpoint, you can @@ -623,6 +620,7 @@ config! Otherwise, the parameters for the scheduler your started training with w loaded from the state dictionary, and your edits might not be kept! (bbox-from-pose)= + ### Generating Bounding Boxes from Pose To train object detection models (for top-down pose estimation), ground truth bounding diff --git a/docs/recipes/TechHardware.md b/docs/recipes/TechHardware.md index 9ab75ade22..e8f7059e8c 100644 --- a/docs/recipes/TechHardware.md +++ b/docs/recipes/TechHardware.md @@ -4,20 +4,24 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- -# Technical (Hardware) Considerations -## Quick summary: +(file:hardware-requirements)= + +# Technical & hardware considerations + +## Quick summary + [On our install page](tech-considerations-during-install) we highlight that for GPU computing through standard installation you need a NVIDIA GPU, with at least 8 GB of memory. If you have an Intel or AMD GPU, and are on windows, there is an alternative method of installation available which is shown on the [installation tips page](installation-tips) under "How to install Deeplabcut for Intel and AMD GPUs". Note, some info is repeated here, and will be updated as systems and hardware changes. -### Computer: +### Computer For reference, we use e.g. Dell workstations (79xx series) with **Ubuntu 16.04 LTS, 18.04 LTS, or 20.04 LTS** and run a Docker container that has TensorFlow, etc. installed (https://github.com/DeepLabCut/Docker4DeepLabCut2.0). -### Computer Hardware: +### Computer hardware -Ideally, you will use a strong GPU with *at least* 8GB memory such as the [NVIDIA GeForce 1080 Ti, 2080 Ti, or 3090](https://marketplace.nvidia.com/en-us/consumer/graphics-cards/). A GPU is not strictly necessary, but on a CPU the (training and evaluation) code is considerably slower (10x) for ResNets, but MobileNets and EfficientNets are slightly faster. Still, a GPU will give you a massive speed boost. You might also consider using cloud computing services like [Google cloud/amazon web services](https://github.com/DeepLabCut/DeepLabCut/issues/47) or Google Colaboratory. +Ideally, you will use a strong GPU with *at least* 8GB memory such as the [NVIDIA GeForce 1080 Ti, 2080 Ti, or 3090](https://marketplace.nvidia.com/en-us/consumer/graphics-cards/). A GPU is not strictly necessary, but on a CPU the (training and evaluation) code is considerably slower (10x) for ResNets, but MobileNets and EfficientNets are slightly faster. Still, a GPU will give you a massive speed boost. You might also consider using cloud computing services like [Google cloud/amazon web services](https://github.com/DeepLabCut/DeepLabCut/issues/47) or Google Colaboratory. ```{note} If you encounter errors during inference related to @@ -26,13 +30,13 @@ If you encounter errors during inference related to context to `torch.no_grad`, which is compatible with the DirectML execution path. ``` -### Camera Hardware: +### Camera Hardware The software is very robust to track data from any camera (cell phone cameras, grayscale, color; captured under infrared light, different manufacturers, etc.). See demos on our [website](https://www.mousemotorlab.org/deeplabcut/). -### Software: +### Software -**Operating System:** Linux (Ubuntu), MacOS* (Mojave), or Windows 10. However, the authors strongly recommend Ubuntu! *MacOS does not support NVIDIA GPUs (easily), so we only suggest this option for CPU use or a case where the user wants to label data, refine data, etc and then push the project to a cloud resource for GPU computing steps, or use MobileNets. +**Operating System:** Linux (Ubuntu), MacOS\* (Mojave), or Windows 10. However, the authors strongly recommend Ubuntu! \*MacOS does not support NVIDIA GPUs (easily), so we only suggest this option for CPU use or a case where the user wants to label data, refine data, etc and then push the project to a cloud resource for GPU computing steps, or use MobileNets. **Anaconda/Python3:** Anaconda: a free and open source distribution of the Python programming language (download from https://www.anaconda.com/). DeepLabCut is written in Python 3 (https://www.python.org/) and not compatible with Python 2. @@ -48,8 +52,7 @@ DeepLabCut on your own computer/data before purchasing a GPU, with the added ben a straightforward installation! Otherwise, use our COLAB notebooks for GPU access for testing. -Docker: We highly recommend advanced users use the supplied [Docker container]( -docker-containers). +Docker: We highly recommend advanced users use the supplied [Docker container](docker-containers). NOTE: [Currently GPU support in Docker Desktop is only available on Windows with the WSL2 backend.](https://docs.docker.com/desktop/features/gpu/) diff --git a/docs/recipes/external_data_import.md b/docs/recipes/external_data_import.md new file mode 100644 index 0000000000..21ca77ef81 --- /dev/null +++ b/docs/recipes/external_data_import.md @@ -0,0 +1,37 @@ +--- +deeplabcut: + last_metadata_updated: '2026-05-22' + last_verified: '2026-05-22' + verified_for: 3.0.0rc14 + ignore: false +--- + +(file:recipe-importing-data)= + +# Importing annotated data from elsewhere + +## Using data labeled elsewhere + +Some users may have annotation data in different formats, yet want to use the DLC pipeline. In this case, you need to convert the data to our format. Simply, you can format your data in an excel sheet (.csv file) or pandas array (.h5 file). + +Here is a guide to do this via the ".csv" route: (the pandas array route is identical, just format the pandas array in the same way). + +1. Create a project + +1. Edit the `config.yaml` file to include the body part names, please take care that spelling, spacing, and capitalization are IDENTICAL to the "labeled data body part names". + +1. Please inspect the excel formatted sheet (.csv) from our [demo project](https://github.com/DeepLabCut/DeepLabCut/tree/main/examples/Reaching-Mackenzie-2018-08-30/labeled-data/reachingvideo1). For example, see [this file](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/Reaching-Mackenzie-2018-08-30/labeled-data/reachingvideo1/CollectedData_Mackenzie.csv). + +1. Edit the .csv file such that it contains the X, Y pixel coordinates, the body part names, the scorer name as well as the relative path to the image: e.g. /labeled-data/somefolder/img017.jpg + Then make sure the scorer name, and body parts are the same in the config.yaml file. + Also add for each folder a video to the `video_set` in the config.yaml file. + This can also be a dummy variable, but should be e.g. `C://somefolder.avi` if the folder is called `somefolder`. See demo config.yaml file for proper formatting. + +1. When you are done, run `deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')` + + - The scorer name must be identical to the input name for experimenter that you used when you created the project. This will automatically update "Mackenzie" to your name in the example demo notebook. + +## Merging multiple datasets + +1. Rename the CSV files to be the target name. +1. Run and pass the target name `deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')`. This will overwrite the H5 file so the data is all merged under the target name. diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 9847b41dc9..8d6847c5f5 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -8,7 +8,9 @@ deeplabcut: recommendation: update notes: This is a crucial piece of the doc, but it is rather long and verbose. Recommend breaking it up into smaller sections, and adding more visuals (e.g. screenshots of the GUI, etc.) to make it more engaging and easier to read. Also, consider adding a table of contents at the beginning for easier navigation. --- + (single-animal-userguide)= + # DeepLabCut User Guide (for single animal projects) This document covers single/standard DeepLabCut use. If you have a complicated multi-animal scenario (i.e., they look @@ -18,8 +20,6 @@ To get started, you can use the GUI, or the terminal. See below. ## DeepLabCut Project Manager GUI (recommended for beginners) - - **GUI:** To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch @@ -28,6 +28,7 @@ To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin simply run `python -m deeplabcut`. The below functions are available to you in an easy-to-use graphical user interface. While most functionality is available, advanced users might want the additional flexibility that command line interface offers. Read more below. + ```{Hint} 🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ``` @@ -46,6 +47,7 @@ and then please look at the following documentation and the doctrings. Thanks fo To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch "Terminal" (unix/MacOS) on your computer. We assume you have DeepLabCut installed (if not, see Install docs!). Next, launch your conda env (i.e., for example `conda activate DEEPLABCUT`) and then type `ipython`. Then type: + ```python import deeplabcut ``` @@ -91,7 +93,7 @@ the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_projec This set of arguments will create a project directory with the name **++** in the **Working directory** and creates the symbolic links to videos in the **videos** directory. The project directory will have subdirectories: -**dlc-models**, **dlc-models-pytorch**, **labeled-data**, **training-datasets**, and **videos**. All the outputs +**dlc-models**, **dlc-models-pytorch**, **labeled-data**, **training-datasets**, and **videos**. All the outputs generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be curated in separation from other projects. The purpose of the subdirectories is as follows: @@ -111,13 +113,13 @@ saved checkpoint, in case the training was interrupted. are stored in separate subdirectories. Each frame has a filename related to the temporal index within the corresponding video, which allows the user to trace every frame back to its origin. -**training-datasets:** This directory will contain the training dataset used to train the network and metadata, which +**training-datasets:** This directory will contain the training dataset used to train the network and metadata, which contains information about how the training dataset was created. -**videos:** Directory of video links or videos. When **copy\_videos** is set to `False`, this directory contains +**videos:** Directory of video links or videos. When **copy_videos** is set to `False`, this directory contains symbolic links to the videos. If it is set to `True` then the videos will be copied to this directory. The default is `False`. Additionally, if the user wants to add new videos to the project at any stage, the function -**add\_new\_videos** can be used. This will update the list of videos in the project's configuration file. +**add_new_videos** can be used. This will update the list of videos in the project's configuration file. ```python deeplabcut.add_new_videos( @@ -127,7 +129,7 @@ deeplabcut.add_new_videos( ) ``` -*Please note, *Full path of the project configuration file* will be referenced as `config_path` throughout this +\*Please note, *Full path of the project configuration file* will be referenced as `config_path` throughout this protocol. The project directory also contains the main configuration file called *config.yaml*. The *config.yaml* file contains @@ -135,14 +137,17 @@ many important parameters of the project. A complete list of parameters includin Box1. The `create_new_project` step writes the following parameters to the configuration file: *Task*, *scorer*, *date*, -*project\_path* as well as a list of videos *video\_sets*. The first three parameters should **not** be changed. The +*project_path* as well as a list of videos *video_sets*. The first three parameters should **not** be changed. The list of videos can be changed by adding new videos or manually removing videos. ![Box 1 - Single Animal Project Configuration File Glossary](images/box1-single.png) ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_new_project.rst ``` @@ -152,8 +157,8 @@ list of videos can be changed by adding new videos or manually removing videos. DLC Utils -Next, open the **config.yaml** file, which was created during **create\_new\_project**. You can edit this file in any -text editor. Familiarize yourself with the meaning of the parameters (Box 1). You can edit various parameters, in +Next, open the **config.yaml** file, which was created during **create_new_project**. You can edit this file in any +text editor. Familiarize yourself with the meaning of the parameters (Box 1). You can edit various parameters, in particular you **must add the list of *bodyparts* (or points of interest)** that you want to track. You can also set the *colormap* here that is used for all downstream steps (can also be edited at anytime), like labeling GUIs, videos, etc. Here any [matplotlib colormaps](https://matplotlib.org/tutorials/colors/colormaps.html) will do! @@ -161,8 +166,7 @@ Please DO NOT have spaces in the names of bodyparts. **bodyparts:** are the bodyparts of each individual (in the above list). - - ### (C) Select Frames to Label +### (C) Select Frames to Label **CRITICAL:** A good training dataset should consist of a sufficient number of frames that capture the breadth of the behavior. This ideally implies to select the frames from different (behavioral) sessions, different lighting and @@ -180,6 +184,7 @@ The function `extract_frames` extracts frames from all the videos in the project a training dataset. The extracted frames from all the videos are stored in a separate subdirectory named after the video file’s name under the ‘labeled-data’. This function also has various parameters that might be useful based on the user’s need. + ```python deeplabcut.extract_frames( config_path, @@ -189,6 +194,7 @@ deeplabcut.extract_frames( userfeedback=False ) ``` + **CRITICAL POINT:** It is advisable to keep the frame size small, as large frames increase the training and inference time. The cropping parameters for each video can be provided in the config.yaml file (and see below). When running the function extract_frames, if the parameter crop=True, then you will be asked to draw a box within the @@ -217,9 +223,11 @@ However, picking frames is highly dependent on the data and the behavior being s provide all purpose code that extracts frames to create a good training dataset for every behavior and animal. If the user feels specific frames are lacking, they can extract hand selected frames of interest using the interactive GUI provided along with the toolbox. This can be launched by using: + ```python deeplabcut.extract_frames(config_path, "manual") ``` + The user can use the *Load Video* button to load one of the videos in the project configuration file, use the scroll bar to navigate across the video and *Grab a Frame* (or a range of frames, as of version 2.0.5) to extract the frame(s). The user can also look at the extracted frames and e.g. delete frames (from the directory) that are too similar before @@ -230,8 +238,11 @@ reloading the set and then manually annotating them.

### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.extract_frames.rst ``` @@ -243,7 +254,7 @@ The toolbox provides a function **label_frames** which helps the user to easily all the extracted frames using an interactive graphical user interface (GUI). The user should have already named the bodyparts to label (points of interest) in the project’s configuration file by providing a list. The following command invokes the -napari-deeplabcut labelling GUI. Checkout the [napari-deeplabcut docs](file:napari-gui-landing) for +napari-deeplabcut labelling GUI. Checkout the \[napari-deeplabcut docs\](file:napari-gui-landing) for more information about the labelling workflow. ```python @@ -271,7 +282,7 @@ labels to the bodyparts in the config.yaml file. Thereafter, the user can call t 2.0.5+: then a box will pop up and ask the user if they wish to display all parts, or only add in the new labels. Saving the labels after all the images are labelled will append the new labels to the existing labeled dataset. -For more information, checkout the [napari-deeplabcut docs](file:napari-gui-landing) for +For more information, checkout the \[napari-deeplabcut docs\](file:napari-gui-landing) for more information about the labelling workflow. ### (E) Check Annotated Frames @@ -279,9 +290,10 @@ more information about the labelling workflow. OPTIONAL: Checking if the labels were created and stored correctly is beneficial for training, since labeling is one of the most critical parts for creating the training dataset. The DeepLabCut toolbox provides a function ‘check_labels’ to do so. It is used as follows: + ```python deeplabcut.check_labels(config_path, visualizeindividuals=True/False) - ``` +``` For each video directory in labeled-data this function creates a subdirectory with **labeled** as a suffix. Those directories contain the frames plotted with the annotated body parts. The user can double check if the body parts are @@ -289,14 +301,18 @@ labeled correctly. If they are not correct, the user can reload the frames (i.e. around, and click save again. ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.check_labels.rst ``` ```` (create-training-dataset)= + ### (F) Create Training Dataset **CRITICAL POINT:** Only run this step **where** you are going to train the network. If you label on your laptop but @@ -305,10 +321,10 @@ labeled on a Windows machine but train on Linux, this is fine as of 2.0.4 onward saves file sets as both Linux and Windows for you). - If you move your project folder, you must only change the `project_path` (which is done automatically) in the main -config.yaml file - that's it - no need to change the video paths, etc! Your project is fully portable. + config.yaml file - that's it - no need to change the video paths, etc! Your project is fully portable. - Be aware you select your neural network backbone at this stage. As of DLC3+ we support PyTorch (and TensorFlow, but -this will be phased out). + this will be phased out). **OVERVIEW:** This function combines the labeled datasets from all the videos and splits them to create train and test datasets. The training data will be used to train the network, while the test data set will be used for evaluating the @@ -319,7 +335,7 @@ deeplabcut.create_training_dataset(config_path) ``` - OPTIONAL: If the user wishes to benchmark the performance of the DeepLabCut, they can create multiple training -datasets by specifying an integer value to the `num_shuffles`; see the docstring for more details. + datasets by specifying an integer value to the `num_shuffles`; see the docstring for more details. The function creates a new shuffle(s) directory in the **dlc-models-pytorch** directory (**dlc-models** if using Tensorflow), in the current "iteration" directory. @@ -337,9 +353,9 @@ additional data augmentation (beyond our defaults). You can set `net_type`, `det and `augmenter_type` when you call the function. - Networks: ImageNet pre-trained networks OR SuperAnimal pre-trained networks weights will be downloaded, as you -select. You can decide to do transfer-learning (recommended) or "fine-tune" both the backbone and the decoder head. We -suggest seeing our [dedicated documentation on models](dlc3-architectures) for more information ( -or the [this page on selecting models](what-neural-network-should-i-use) for the TensorFlow engine). + select. You can decide to do transfer-learning (recommended) or "fine-tune" both the backbone and the decoder head. We + suggest seeing our [dedicated documentation on models](dlc3-architectures) for more information ( + or the [this page on selecting models](what-neural-network-should-i-use) for the TensorFlow engine). ```{Hint} 🚨 If they do not download (you will see this downloading in the terminal), then you may not have permission to do @@ -350,21 +366,20 @@ the **[docs for more help!](tf-training-tips-and-tricks)**). **DATA AUGMENTATION:** At this stage you can also decide what type of augmentation to use. Once you've called `create_training_dataset`, you can edit the [**pytorch_config.yaml**](dlc3-pytorch-config) file that was created (or for the -TensorFlow engine, the [**pose_cfg.yaml**]( -https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml) file). +TensorFlow engine, the [**pose_cfg.yaml**](https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml) file). - PyTorch Engine: [Albumentations](https://albumentations.ai/docs/) is used for data -augmentation. Look at the [**pytorch_config.yaml**](dlc3-pytorch-config) for more -information about image augmentation options. + augmentation. Look at the [**pytorch_config.yaml**](dlc3-pytorch-config) for more + information about image augmentation options. - TensorFlow Engine: The default augmentation works well for most tasks (as shown on -www.deeplabcut.org), but there are many options, more data augmentation, intermediate -supervision, etc. Here are the available loaders: + www.deeplabcut.org), but there are many options, more data augmentation, intermediate + supervision, etc. Here are the available loaders: - `imgaug`: a lot of augmentation possibilities, efficient code for target map creation & batch sizes >1 supported. - You can set the parameters such as the `batch_size` in the `pose_cfg.yaml` file for the model you are training. This - is the recommended default! + You can set the parameters such as the `batch_size` in the `pose_cfg.yaml` file for the model you are training. This + is the recommended default! - `crop_scale`: our standard DLC 2.0 introduced in Nature Protocols variant (scaling, auto-crop augmentation) - `tensorpack`: a lot of augmentation possibilities, multi CPU support for fast processing, target maps are created - less efficiently than in imgaug, does not allow batch size>1 + less efficiently than in imgaug, does not allow batch size>1 - `deterministic`: only useful for testing, freezes numpy seed; otherwise like default. **MODEL COMPARISON**: You can also test several models by creating the same train/test @@ -393,21 +408,27 @@ deeplabcut.create_training_dataset_from_existing_split( ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_dataset -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_dataset.rst ``` ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_model_comparison -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_model_comparison.rst ``` ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_dataset_from_existing_split -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_dataset_from_existing_split.rst ``` @@ -416,9 +437,11 @@ deeplabcut.create_training_dataset_from_existing_split( ### (G) Train The Network The function ‘train_network’ helps the user in training the network. It is used as follows: + ```python deeplabcut.train_network(config_path) ``` + The set of arguments in the function starts training the network for the dataset created for one specific shuffle. Note that you can change training parameters in the [**pytorch_config.yaml**](dlc3-pytorch-config) file (or **pose_cfg.yaml** for TensorFlow @@ -428,8 +451,9 @@ At user specified iterations during training checkpoints are stored in the subdi *train* under the respective iteration & shuffle directory. ````{admonition} Tips on training models with the PyTorch Engine -:class: dropdown - +--- +class: dropdown +--- Example parameters that one can call: ```python @@ -471,8 +495,9 @@ and how often the weights are stored. We suggest saving every 5 to 25 epochs. ```` ````{admonition} Tips on training models with the TensorFlow Engine -:class: dropdown - +--- +class: dropdown +--- Example parameters that one can call: ```python @@ -518,7 +543,9 @@ data. The bonus, training time is much less!!! ```` ````{admonition} Click the button to see API Docs for train_network -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.train_network.rst ``` @@ -549,34 +576,35 @@ Neuroscience 2018). **Optional parameters:** - `Shuffles: list, optional` - List of integers specifying the shuffle indices of the training dataset. -The default is [1] + The default is [1] - `plotting: bool, optional` - Plots the predictions on the train and test images. The default is `False`; -if provided it must be either `True` or `False` + if provided it must be either `True` or `False` - `show_errors: bool, optional` - Display train and test errors. The default is `True` - `comparisonbodyparts: list of bodyparts, Default is all` - The average error will be computed for those body parts -only (Has to be a subset of the body parts). + only (Has to be a subset of the body parts). - `gputouse: int, optional` - Natural number indicating the number of your GPU (see number in nvidia-smi). If you do not -have a GPU, put None. See: https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries + have a GPU, put None. See: https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries - `pcutoff: float | list[float] | dict[str, float], optional` -(Only applicable when using the PyTorch engine. For TensorFlow, set `pcutoff` in the `config.yaml` file.) -Specifies the cutoff value(s) used to compute evaluation metrics. + (Only applicable when using the PyTorch engine. For TensorFlow, set `pcutoff` in the `config.yaml` file.) + Specifies the cutoff value(s) used to compute evaluation metrics. + - If `None` (default), the cutoff will be loaded from the project configuration. - To apply a single cutoff value to all bodyparts, provide a `float`. - To specify different cutoffs per bodypart, provide either: - A `list[float]`: one value per bodypart, with an additional value for each unique bodypart if applicable. - A `dict[str, float]`: where keys are bodypart names and values are the corresponding cutoff values. -If a bodypart is not included in the provided dictionary, a default `pcutoff` of `0.6` will be used for that bodypart. + If a bodypart is not included in the provided dictionary, a default `pcutoff` of `0.6` will be used for that bodypart. The plots can be customized by editing the **config.yaml** file (i.e., the colormap, scale, marker size (dotsize), and transparency of labels (alphavalue) can be modified). By default each body part is plotted in a different color (governed by the colormap) and the plot labels indicate their source. Note that by default the human labels are plotted as plus (‘+’), DeepLabCut’s predictions either as ‘.’ (for confident predictions with likelihood > p-cutoff) and -’x’ for (likelihood <= `pcutoff`). +’x’ for (likelihood \<= `pcutoff`). The evaluation results for each shuffle of the training dataset are stored in a unique subdirectory in a newly created directory ‘evaluation-results-pytorch’ (‘evaluation-results’ for tensorflow models) in the project directory. @@ -599,11 +627,15 @@ labeled accurately ```python deeplabcut.extract_save_all_maps(config_path, shuffle=shuffle, Indices=[0, 5]) ``` + you can drop "Indices" to run this on all training/testing images (this is slow!) ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.evaluate_network.rst ``` @@ -613,13 +645,16 @@ you can drop "Indices" to run this on all training/testing images (this is slow! The trained network can be used to analyze new videos. Novel/new videos **DO NOT have to be in the config file!**. You can analyze new videos anytime by simply using the following line of code: + ```python deeplabcut.analyze_videos( config_path, ["fullpath/analysis/project/videos/reachingvideo1.avi"], save_as_csv=True ) ``` + There are several other optional inputs, such as: + ```python deeplabcut.analyze_videos( config_path, @@ -633,6 +668,7 @@ deeplabcut.analyze_videos( dynamic=(True, .5, 10) ) ``` + The user can choose a checkpoint for analyzing the videos. For this, the user can enter the corresponding index of the checkpoint to the variable snapshotindex in the config.yaml file. By default, the most recent checkpoint (i.e. last) is used for analyzing the video. @@ -645,8 +681,11 @@ by default. You can also set a destination folder (`destfolder`) for the output you wish to write to. ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.analyze_videos.rst ``` @@ -673,16 +712,20 @@ dynamic: triple containing (state, detectiontreshold, margin) for the next frame (this is why the margin is important and should be set large enough given the movement of the animal). ``` + ### (J) Filter Pose Data -You can also filter the predictions with a median filter (default) or with a [SARIMAX model](https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html), if you wish. This creates a new .h5 file with the ending *_filtered* that you can use in create_labeled_data and/or plot trajectories. +You can also filter the predictions with a median filter (default) or with a [SARIMAX model](https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html), if you wish. This creates a new .h5 file with the ending *\_filtered* that you can use in create_labeled_data and/or plot trajectories. + ```python deeplabcut.filterpredictions( config_path, ["fullpath/analysis/project/videos/reachingvideo1.avi"] ) ``` - An example call: + +An example call: + ```python deeplabcut.filterpredictions( config_path, @@ -693,7 +736,9 @@ deeplabcut.filterpredictions( MAdegree=2 ) ``` - Here are parameters you can modify and pass: + +Here are parameters you can modify and pass: + ```python deeplabcut.filterpredictions( config_path, @@ -707,15 +752,19 @@ deeplabcut.filterpredictions( alpha=0.01 ) ``` - Here is an example of how this can be applied to a video: -

+Here is an example of how this can be applied to a video: + +

### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.filterpredictions.rst ``` @@ -743,8 +792,11 @@ body part detections across frames). Here are example plot outputs on a demo vid

### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.plot_trajectories.rst ``` @@ -755,6 +807,7 @@ body part detections across frames). Here are example plot outputs on a demo vid Additionally, the toolbox provides a function to create labeled videos based on the extracted poses by plotting the labels on top of the frame and creating a video. There are two modes to create videos: FAST and SLOW (but higher quality!). One can use the command as follows to create multiple labeled videos: + ```python deeplabcut.create_labeled_video( config_path, @@ -763,8 +816,10 @@ deeplabcut.create_labeled_video( save_frames = True/False ) ``` - Optionally, if you want to use the filtered data for a video or directory of filtered videos pass `filtered=True`, - i.e.: + +Optionally, if you want to use the filtered data for a video or directory of filtered videos pass `filtered=True`, +i.e.: + ```python deeplabcut.create_labeled_video( config_path, @@ -773,8 +828,10 @@ deeplabcut.create_labeled_video( filtered=True ) ``` + You can also optionally add a skeleton to connect points and/or add a history of points for visualization. To set the "trailing points" you need to pass `trailpoints`: + ```python deeplabcut.create_labeled_video( config_path, @@ -783,11 +840,13 @@ deeplabcut.create_labeled_video( trailpoints=10 ) ``` + To draw a skeleton, you need to first define the pairs of connected nodes (in the `config.yaml` file) and set the skeleton color (in the `config.yaml` file). There is also a GUI to help you do this, use by calling `deeplabcut.SkeletonBuilder(configpath)`! Here is how the `config.yaml` additions/edits should look (for example, on the Openfield demo data we provide): + ```python # Plotting configuration skeleton: @@ -802,7 +861,9 @@ dotsize: 4 alphavalue: 0.5 colormap: jet ``` + Then pass `draw_skeleton=True` with the command: + ```python deeplabcut.create_labeled_video( config_path, @@ -826,7 +887,7 @@ deeplabcut.create_labeled_video( **PRO TIP:** that the **best quality videos** are created when `fastmode=False` is passed. Therefore, when `trailpoints` and `draw_skeleton` are used, we **highly** recommend you also pass `fastmode=False`! -

+

@@ -834,8 +895,11 @@ This function has various other parameters, in particular the user can set the ` `alphavalue` of the labels in **config.yaml** file. ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_labeled_video.rst ``` @@ -844,7 +908,7 @@ This function has various other parameters, in particular the user can set the ` ### Extract "Skeleton" Features: NEW, as of 2.0.7+: You can save the "skeleton" that was applied in `create_labeled_videos` for more computations. -Namely, it extracts length and orientation of each "bone" of the skeleton as defined in the **config.yaml** file. You +Namely, it extracts length and orientation of each "bone" of the skeleton as defined in the **config.yaml** file. You can use the function by: ```python @@ -860,14 +924,18 @@ deeplabcut.analyzeskeleton( ``` ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.analyzeskeleton.rst ``` ```` (active-learning)= + ### (M) Optional Active Learning -> Network Refinement: Extract Outlier Frames While DeepLabCut typically generalizes well across datasets, one might want to optimize its performance in various, @@ -892,6 +960,7 @@ the user can set: ``` outlieralgorithm: "fitting", "jump", or "uncertain" ``` + • `outlieralgorithm="uncertain"`: select frames if the likelihood of a particular or all body parts lies below `p_bound` (note this could also be due to occlusions rather than errors). @@ -901,13 +970,14 @@ pixels from the last frame. • `outlieralgorithm="fitting"`: select frames if the predicted body part location deviates from a state-space model fit to the time series of individual body parts. Specifically, this method fits an Auto Regressive Integrated Moving Average (ARIMA) model to the time series for each body part. Thereby each body part detection with a likelihood smaller than -`p_bound` is treated as missing data. Putative outlier frames are then identified as time points, where the average +`p_bound` is treated as missing data. Putative outlier frames are then identified as time points, where the average body part estimates are at least `epsilon` pixels away from the fits. The parameters of this method are `epsilon`, `p_bound`, the ARIMA parameters as well as the list of body parts to average over (can also be `all`). • `outlieralgorithm="manual"`: manually select outlier frames based on visual inspection from the user. - As an example: +As an example: + ```python deeplabcut.extract_outlier_frames(config_path, ["videofile_path"], outlieralgorithm="manual") ``` @@ -925,16 +995,19 @@ Once enough outlier frames are extracted the refinement GUI can be used to adjus (see below). ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.extract_outlier_frames.rst ``` ```` - ### (N) Refine Labels: Augmentation of the Training Dataset +### (N) Refine Labels: Augmentation of the Training Dataset - Based on the performance of DeepLabCut, four scenarios are possible: +Based on the performance of DeepLabCut, four scenarios are possible: (A) Visible body part with accurate DeepLabCut prediction. These labels do not need any modifications. @@ -951,22 +1024,26 @@ and their corresponding predictions, if any. Here, the GUI will prompt the user as invalid. The labels for extracted putative outlier frames can be refined by opening the GUI: + ```python deeplabcut.refine_labels(config_path) ``` + This will launch a GUI where the user can refine the labels. -Please refer to the [napari-deeplabcut docs](file:napari-gui-landing) for more information about the labelling workflow. +Please refer to the \[napari-deeplabcut docs\](file:napari-gui-landing) for more information about the labelling workflow. After correcting the labels for all the frames in each of the subdirectories, the users should merge the data set to create a new dataset. In this step the iteration parameter in the config.yaml file is automatically updated. + ```python deeplabcut.merge_datasets(config_path) ``` + Once the dataset is merged, the user can test if the merging process was successful by plotting all the labels (Step E). Next, with this expanded training set the user can now create a novel training set and train the network as described in Steps F and G. The training dataset will be stored in the same place as before but under a different `iteration-#` -subdirectory, where the ``#`` is the new value of `iteration` variable stored in the project’s configuration file +subdirectory, where the `#` is the new value of `iteration` variable stored in the project’s configuration file (this is automatically done). Now you can run `create_training_dataset`, then `train_network`, etc. If your original labels were adjusted at all, @@ -977,16 +1054,22 @@ If after training the network generalizes well to the data, proceed to analyze n more data. ### API Docs for deeplabcut.refine_labels + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.refine_labels.rst ``` ```` ### API Docs for deeplabcut.merge_datasets + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.merge_datasets.rst ``` From 054f822a822d36fa84e5872b4360bb0fd8db79f9 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 13:33:55 +0200 Subject: [PATCH 06/86] Docs audit [April 2026]: Run mdformat on all (#3299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs and notebooks audit export tool Add tools/docs_and_notebooks_audit.py: a CLI tool that scans Markdown and Jupyter notebooks for a deeplabcut metadata namespace, validates selected fields (visibility, status, recommendation, last_verified) against enums via pydantic, and exports a CSV audit register. Features include YAML frontmatter and notebook metadata parsing, alias support for recommendation, preservation of human-authored CSV columns across re-runs, configurable include/exclude scan patterns, target filtering (files, dirs, globs), and basic reporting of parse/validation issues. * Ignore tools/docs_audits in docs scan Add tools/docs_audits/** to the scan exclude list in tools/docs_and_notebooks_report_config.yml so the docs & notebooks report skips files in that directory (e.g., generated audit artifacts or temporary outputs). * Ignore docs_audits; include tools MD files Add an exclude pattern (^tools/docs_audits/) to the docs/notebooks pre-commit hook so files under tools/docs_audits/ are skipped. Also add tools/**/*.md to the scan list in tools/docs_and_notebooks_report_config.yml so Markdown files in the tools directory are included in the docs/notebooks report. * Introduce markdown-myst pre-commit hook ## Summary Adds `mdformat` v1.0 as a pre commit hook with the myst plugin. This helps automate formatting of documentation and catch any mistakes in structure or syntax, making docs maintenance easier. ## Scope As a hook with write permissions, it is meant to run locally, not in CI. * Add notes field and 'move' recommendation Add support for human-editable notes and a new Recommendation.MOVE enum. AuditMetadata now includes a notes field and FIELD_SPECS registers notes so notes are read from CSV. merged_row now preserves existing human notes, warns on conflicts between scanned and previous notes, and prefers previous notes when present. build_row no longer unconditionally writes an empty notes value (to avoid clobbering preserved notes). Also removed the file shebang line. * Document Recommendation enum values Add brief inline comments to each member of the Recommendation enum in tools/docs_and_notebooks_audit.py to clarify what each action means for auditors (keep, verify, update, move, merge, archive, remove). This is a documentation-only change and does not alter runtime behavior. * chore(metadata): update docs/notebooks metadata Installation page * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * chore(metadata): update docs/notebooks metadata * Update audit files * chore(metadata): update docs/notebooks metadata * Polish README content and docs metadata Clean up and reorganize README.md: adjust headings and phrasing, remove extraneous blank lines, clarify installation and TensorFlow deprecation wording, add/rename sections (Pretrained Models, Development and Applications, Ecosystem, Code contributors, Funding), comment out outdated course/residency/roadmap links, update community badges and links, and improve news/release notes. Also add brief HTML comments to docs/README.md indicating the root README is used for main documentation and noting frontmatter metadata behavior. * Revise installation docs and update instructions Refactor docs/installation.md: update frontmatter metadata and restructure the installation guide. Broaden supported Python versions (3.10–3.12), clarify conda vs miniconda usage, add `uv` developer install instructions and editable `pip install -e` guidance, and reorganize sections for Conda, pip, Docker, GPU support, troubleshooting, and system/hardware considerations. Update TensorFlow deprecation timeline and GPU/CUDA guidance, improve admonitions/notes formatting, fix anchors/section refs, and add various wording and usability improvements. * docs: clarify and reformat installation guide Large cleanup and reorganization of docs/installation.md: rename heading, fix Markdown/admonition syntax, and normalize code fences. Clarified differences between Miniconda/Anaconda/conda, added a dedicated 'Build a conda environment' step, Windows-specific warnings, and tips for activating and managing environments. Added guidance for launching the GUI, created a simple conda env example, improved GPU/CUDA notes and troubleshooting links, and reformatted numerous paragraphs and images for readability. * Revise UseOverviewGuide content and layout Restructure and update the UseOverviewGuide page: fix markup (e.g. hint directive), add an Introduction and Workflow overview, embed/adjust images, and reorganize sections (What we support → Main modes; Additional learning resources; Usage advice & project types). Clarify installation reference, start/requirements guidance, and what you don't need. Add tips/warnings (recommend single-animal first, Windows admin warning), improve option headings for demos/GUI/terminal, and add brief terminal usage steps and useful links. Remove or comment out outdated/broken link references and tidy copy for clarity. * Update installation docs: GPU/OS guidance Rewrite and clarify installation guidance in docs/installation.md. Rephrase installation bullets (conda recommended, Docker note, GPU performance), fix image HTML closing and caption, and replace a single admonition with a tab-set providing CPU, NVIDIA GPU, and Apple M-chip GPU tabs (including CUDA/cuDNN guidance). Minor wording and link adjustments for clarity and reproducibility. * Clarify and reformat UseOverviewGuide Refines wording and layout in the UseOverviewGuide: changes "What scenario" to "Which scenario", normalizes "Quick start" capitalization, and restructures multi-animal guidance into clearer bullet points. Expands guidance about using multianimal mode for single-animal projects (when a skeleton helps) and warns against treating fixed-position parts (e.g., whiskers) as separate individuals. Consolidates and repositions tutorial links, adds an important note to label identifiable animals consistently, updates the conversion link phrasing, and clarifies the Windows note to state admin is required for certain usage tasks (downloading models/symlinks) but not for installation. * Convert links to Sphinx refs and tidy docs Replace Markdown inline links with Sphinx {ref} cross-references, standardize admonition/class syntax, and clean up spacing and punctuation throughout docs/installation.md. Also normalize casing for the DeepLabCut heading, adjust image/code block indentation, add a MacOS GPU support footnote, and make minor clarity edits to GPU/PyTorch/TensorFlow installation notes and examples. * Fix typos and formatting in installation docs Clean up docs/installation.md: fix an escaped Windows activate path (activate.ps1), remove stray blank lines, and separate/version-check and update encouragement into their own paragraph. Add a "Data compatibility" subsection, rename the system-wide header to "System-wide installation considerations", and make small wording/formatting tweaks (e.g., emphasize "temporarily", reword potential package conflicts, and normalize "very slow"). These changes improve clarity and readability of the installation guide. * Fix markdown code blocks and list numbering Adjust formatting in docs/UseOverviewGuide.md: indent fenced code blocks for proper rendering and normalize the ordered list numbering (use '1.' for sequential steps) for consistency in the instructions. * Remove outdated installation tips links Disable references to the outdated 'installation tips' page in docs/installation.md. Replaced direct links and related guidance with HTML comments, added a note that the git-clone section is the place for editable installs, adjusted the pro-tip wording to point users to the test video, and commented out the 'Additional tips' block. Original content is preserved in comments for review. * Update PROJECT_GUI.md * Clarify Project GUI wording in docs Make minor copy edits to docs/gui/PROJECT_GUI.md for clarity: change "easy-entry point" to "easy entry point", replace "easy-to-deploy GUI interface" with "easy-to-use GUI interface", and rephrase the following sentence to more clearly state that several advanced features are not available in the Project GUI. * Update beginner guide ref * Revise Beginner Guide to focus on GUI Refactor beginners-guide.md to center the guide on the DeepLabCut GUI. Updated the main heading and clarified startup wording (python -m deeplabcut) and project-creation workflow. Removed/replaced redundant installation text with a reference to the installation page and commented out an outdated course link. Added notes recommending the PyTorch engine, improved tips for video selection/copying, added guidance for defining bodyparts and multiple individuals, included a video tutorial GIF, and updated the next-steps reference to the GUI-specific manage-project page. Miscellaneous wording and screenshot tweaks for clarity. * Update install link ref * Refactor labeling guide and napari workflow Restructure and clarify the labeling documentation: reorganized headings and sections, consolidated frame selection guidance (automatic vs manual), and added an example workflow, important/tip admonitions, and a "Next steps" pointer to training/evaluation. Updated phrasing for clarity, fixed formatting (headings, links, and image reference), and replaced a quoted YAML note with unquoted text. These changes improve readability and better integrate the napari-DLC labeling workflow with the rest of the docs. * Clarify GUI config editing in manage-project Revise the manage-project beginner guide to focus on editing the GUI configuration file. Renamed the section, added a file anchor, and reworded the intro to explain config.yaml as the central project record. Introduced a dedicated "Editing the configuration" and a step-by-step walkthrough that consolidates bodyparts and skeleton guidance (including details on entries/IDs), improved bullets and examples, and added a tip and an HTML comment. Updated the link to the labeling guide (file:labeling-gui) and made minor YAML/frontmatter and formatting fixes. * Update GUI training/evaluation guide Revise docs/beginner-guides/Training-Evaluation.md: add RST anchor and restructure headings (Network training, Creating a training set, Starting the training process, Network evaluation, Next steps). Clarify wording (e.g. defaults described as “good” to start), convert tip to RST directive, adjust evaluation section formatting and images, and add reference to the video-analysis GUI section. Also change YAML notes value formatting. * Refactor video analysis guide for GUI Rework the beginner video-analysis doc to focus on the GUI workflow: add a file anchor, rename and restructure headings (Analyzing videos with your trained model, Generating labeled videos, Next steps), reorganize and clarify step-by-step instructions, and update copy. Also remove quoting from the frontmatter notes and add a TODO link comment for future cross-references. * Refine beginner guides and napari usage docs Update several docs to improve formatting, clarity, and links. Convert inline notes to admonition blocks, fix spacing/indentation around images and note blocks, and bold example items for readability (docs/beginner-guides/beginners-guide.md). Clarify labeling guidance and emphasize labeling across multiple videos; update front-matter note to link to napari plugin docs (docs/beginner-guides/labeling.md). Adjust manage-project wording and next-step link to the labeling guide (docs/beginner-guides/manage-project.md). Add a brief napari usage recommendation with a link to the official napari docs (docs/gui/napari/basic_usage.md). These changes aim to make the GUI/napari workflow and labeling guidance clearer for beginners. * Tidy beginner-guides Minor cleanup and reorganization prep for beginner guides: remove an extra closing parenthesis from an image link in Training-Evaluation.md; update frontmatter recommendation from "update" to "move" and simplify notes to indicate moving content to a dedicated GUI section in beginners-guide.md, labeling.md, and manage-project.md; and change "Click on" to "Select" in the labeling workflow example. These edits prepare the docs for consolidation under a GUI section. * Run mdformat on all * mdformat all * Refine PROJECT_GUI docs layout and links Polish docs/gui/PROJECT_GUI.md: rename headings for clarity ("Interactive Project Manager GUI" → "Project Manager GUI", "Get Started:" → "Getting started", "Video Demo" → "User guide" / "Video demos"); replace inline markdown links with Sphinx {ref} cross-references (napari and beginners guide); add an important note linking to the beginners guide and a tip to "Click on the images!". These changes improve consistency with the docs style and surface the step-by-step GUI guide. * Fix link in getting started * mdformat all * docs: update Docker docs formatting and notes Refactor docs/docker.md to improve formatting and clarify guidance. Renamed the section heading, convert several inline notes into MyST admonitions (important/note), wrap the napari-deeplabcut install guidance into an important block, and adjust the GPU reminder into an admonition. Minor rework of the mount/example instructions and commented out a redundant labelling note to reduce duplication and improve readability. * Apply suggestions from code review Credita to @deruyter92 Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> * Separate GPU and cloud bullets; remove link Split the combined GPU/cloud sentence into two separate bullets for clarity. Removed the technical specs (FAQ) link from the GPU item and removed the troubleshooting wiki link at the bottom. Also cleaned up trailing newline/whitespace. * Update README: TF backend, dataset links Simplify and update README text: streamline TensorFlow engine install instructions and add a planned deprecation target (tensorflow backend deprecated in v3.2). Replace prior dataset references with explicit Zenodo DOIs for SuperAnimal-Quadruped and SuperAnimal-TopViewMouse and add a citation to Ye et al. 2024. Clarify that models including AP-10K are available in the API/GUI, and fix minor wording in the funding acknowledgement ("following support"). * Clarify Docker usage and napari limitation Update docs/docker.md to improve clarity and accuracy of Docker guidance. Reworded introduction to explain that DeepLabCut images are available on DockerHub, that Docker requires a local Docker installation, and that containers provide a reproducible, isolated environment for terminal and Jupyter use. Explicitly state the DeepLabCut GUI is not supported in containers and move/strengthen the important note that the napari-deeplabcut plugin cannot be run inside Docker and must be installed locally (e.g. via pip). Clarified that deeplabcut-docker is a lightweight helper that will not disrupt local TensorFlow/PyTorch or other dependencies, and fixed wording/formatting issues. * Clarify training dataset creation steps Add brief guidance in the Training Dataset section to outline key steps (splitting labeled data and creating shuffle folders) so beginners have a clearer workflow before training. Also include a small formatting/whitespace adjustment in the GPU/Colab note. * Clarify labeling progress and color-scheme docs Update docs/gui/napari/advanced_usage.md to improve clarity and usability. Reword the labeling progress note to emphasize that the displayed percentage is a rough estimate and that occluded/hidden keypoints are not counted. Expand and simplify instructions for jumping to a bodypart from the color scheme by breaking into explicit steps and clarifying behavior when the bodypart is already visible. Minor wording/formatting cleanups for readability. * Relocate demo video link; cleanup whitespace Move the demo video link to appear before the warning block and tidy up minor whitespace/trailing-space issues in docs/gui/napari/basic_usage.md. These are formatting-only changes and do not alter substantive content. * Update installation.md * Fix docs formatting, typos and image tags Clean up documentation across multiple files: add quotes to image src attributes, correct typos (e.g. "oher"→"other", "built"→"build", "compartimentalized"→"compartmentalized"), normalize admonition/code-block syntax, adjust cross-reference/link syntax, and make minor wording/grammar improvements. Affected files include docs/README.md, UseOverviewGuide.md, beginner-guides/*, course.md, docker.md, gui/PROJECT_GUI.md, and installation.md. * Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Docs: add external data import recipe Add a new recipe (docs/recipes/external_data_import.md) describing how to convert externally annotated data (CSV/H5) into the DeepLabCut format and how to merge multiple datasets (uses deeplabcut.convertcsv2h5). Update docs/installation.md to use a local Sphinx cross-reference for the Conda section, add the section anchor (sec:installation-using-conda), and fix the uv pip install line to quote the extras ('.[gui,modelzoo,tf]') to avoid shell globbing. Also add a file anchor (file:hardware-requirements)= to docs/recipes/TechHardware.md for cross-references. * Refine wording and links in user guides Small editorial updates to user documentation for clarity and better Sphinx linking. In docs/UseOverviewGuide.md: use inline `help` function wording, rephrase 'jump back in' to 'resume work' for clarity, and replace the 'Option 3' Project Manager GUI link with a Sphinx {ref} cross-reference. In docs/beginner-guides/beginners-guide.md: change the tip to 'Avoid spaces' and emphasize the scorer/experimenter field. These changes improve readability and consistency. * Convert internal docs links to Sphinx refs Replace Markdown-style internal links with Sphinx/MyST cross-reference syntax and adjust anchors/formatting for proper rendering. Updated docs/UseOverviewGuide.md to use {ref}`...` and change the target anchor to sec:important-info-regd-usage, and fixed the user-guide list formatting. Updated docs/gui/PROJECT_GUI.md to use {ref}`Read more here ` in two places. * chore(metadata): update docs/notebooks metadata * Update course.md --------- Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/Governance.md | 7 +- docs/HelperFunctions.md | 33 ++- docs/MISSION_AND_VALUES.md | 33 +-- docs/ModelZoo.md | 67 ++--- docs/Overviewof3D.md | 58 ++-- docs/benchmark.md | 3 +- docs/citation.md | 145 +++++----- docs/convert_maDLC.md | 22 +- docs/dlc-live/deeplabcutlive.md | 2 + docs/dlc-live/dlc-live-gui/index.md | 20 +- .../dlc-live-gui/quickstart/install.md | 17 +- .../cameras_backends/aravis_backend.md | 62 ++--- .../cameras_backends/basler_backend.md | 33 +-- .../cameras_backends/camera_support.md | 24 +- .../cameras_backends/gentl_backend.md | 47 ++-- .../cameras_backends/opencv_backend.md | 31 ++- .../user_guide/misc/misc_landing.md | 1 + .../user_guide/misc/modelzoo_downloads.md | 14 +- .../user_guide/misc/timestamp_format.md | 3 +- .../dlc-live-gui/user_guide/overview.md | 43 +-- docs/docker.md | 2 +- docs/intro.md | 1 + docs/maDLC_UserGuide.md | 251 ++++++++++-------- docs/pytorch/Benchmarking_shuffle_guide.md | 92 ++++--- docs/pytorch/architectures.md | 26 +- docs/pytorch/user_guide.md | 44 ++- docs/pytorch_dlc.md | 31 ++- docs/quick-start/single_animal_quick_guide.md | 24 +- docs/quick-start/tutorial_maDLC.md | 24 +- docs/recipes/BatchProcessing.md | 5 +- docs/recipes/ClusteringNapari.md | 6 +- docs/recipes/DLCMethods.md | 14 +- docs/recipes/MegaDetectorDLCLive.md | 42 +-- docs/recipes/OpenVINO.md | 10 +- docs/recipes/OtherData.md | 13 +- docs/recipes/UsingModelZooPupil.md | 41 +-- docs/recipes/installTips.md | 23 +- docs/recipes/io.md | 15 +- docs/recipes/nn.md | 21 +- docs/recipes/pose_cfg_file_breakdown.md | 149 +++++++---- docs/recipes/post.md | 1 + ...ng_notebooks_into_the_DLC_main_cookbook.md | 155 ++++++----- docs/roadmap.md | 71 ++--- 43 files changed, 1006 insertions(+), 720 deletions(-) diff --git a/docs/Governance.md b/docs/Governance.md index 2ee2b1b172..204d253608 100644 --- a/docs/Governance.md +++ b/docs/Governance.md @@ -4,8 +4,11 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (governance-model)= + # Governance Model of DeepLabCut + (adapted from https://napari.org/stable/community/governance.html) ## Abstract @@ -112,7 +115,7 @@ DeepLabCut uses a “consensus seeking” process for making decisions. The grou tries to find a resolution that has no open objections among core developers. Core developers are expected to distinguish between fundamental objections to a proposal and minor perceived flaws that they can live with, and not hold up the -decision-making process for the latter. If no option can be found without +decision-making process for the latter. If no option can be found without objections, the decision is escalated to the SC, which will itself use consensus seeking to come to a resolution. In the unlikely event that there is still a deadlock, the proposal will move forward if it has the support of a @@ -139,7 +142,7 @@ are made according to the following rules: decision-making process outlined above. - **Changes to this governance model or our mission, vision, and values** - require a dedicated issue on our [issue tracker](https://github.com/DeepLabCut/DeepLabCut/issues) + require a dedicated issue on our [issue tracker](https://github.com/DeepLabCut/DeepLabCut/issues) and follow the decision-making process outlined above, *unless* there is unanimous agreement from core developers on the change in which case it can move forward faster. diff --git a/docs/HelperFunctions.md b/docs/HelperFunctions.md index e651f45b02..05c08f8ad0 100644 --- a/docs/HelperFunctions.md +++ b/docs/HelperFunctions.md @@ -8,26 +8,27 @@ deeplabcut: recommendation: archive notes: I would suggest using API docs over pages like this to avoid drift. The advice below promises updates that are not being made, and the content is already quite outdated. Automating API docs generation and putting usage info for obtaining commands info in ipython in a basic 'evergreen' page would be more sustainable than trying to maintain this page. --- + (helper-functions)= + # Helper & Advanced Optional Function Documentation There are additional functions that are not required, but can be extremely helpful. First off, if you are new to Python, you might not know this handy trick: you can see -ALL the functions in deeplabcut by typing ``deeplabcut.`` then hitting "tab." You will see a massive list! +ALL the functions in deeplabcut by typing `deeplabcut.` then hitting "tab." You will see a massive list!

-Or perhaps you sort of know the name of the function, but not fully, then you can start typing the command, i.e. as in ``deeplabcut.a `` then hit tab: +Or perhaps you sort of know the name of the function, but not fully, then you can start typing the command, i.e. as in `deeplabcut.a ` then hit tab:

- -Now, for any of these functions, you type ``deeplabcut.analyze_videos_converth5_to_csv?`` you get: +Now, for any of these functions, you type `deeplabcut.analyze_videos_converth5_to_csv?` you get: ```text Signature: deeplabcut.analyze_videos_converth5_to_csv(videopath, videotype='.avi') @@ -56,8 +57,7 @@ Only videos with this extension are analyzed. The default is ``.avi`` While some of the names are ridiculously long, we wanted them to be "self-explanatory." Here is a list (that is bound to be continually updated) of currently available helper functions. To see information about any of them, including HOW -to use them, use the ``?`` at the end of the call, as described above. - +to use them, use the `?` at the end of the call, as described above. ```python deeplabcut.analyze_videos_converth5_to_csv @@ -112,18 +112,23 @@ In order to label with epipolar lines, you must complete two additional sets of steps 1-3 in [3D Overview](3D-overview). - Second, you must extract imagr from `camera_1` first; here you would have run the standard `deeplabcut.extract_frames(config_path, userfeedback=True)`, but just extract files from 1 camera. Next, you need to extract matching frames from `camera_2`: + ```python deeplabcut.extract_frames(config_path, mode = 'match', config3d=config_path3d, extracted_cam=0) ``` + You can set `extracted_cam=0` to match all other camera images to the frame numbers in the `camera_1` folder, or change this to match to other cameras. If you `deeplabcut.extract_frames` with `mode='automatic'` before, it shouldn't matter which camera you pick. If you already extracted from both cameras, be warned this will overwrite the images for `camera_2`. - Three, now you can label with epipolar lines: - - Here, label `camera_1` as you would normally, i.e.: - ```python - deeplabcut.label_frames(config_path) - ``` - - Then for `camera_2` (now it will compute the epipolar lines based on camera_1 labels and project them onto the GUI): - ```python - deeplabcut.label_frames(config_path, config3d=config_path3d) - ``` + - Here, label `camera_1` as you would normally, i.e.: + + ```python + deeplabcut.label_frames(config_path) + ``` + + - Then for `camera_2` (now it will compute the epipolar lines based on camera_1 labels and project them onto the GUI): + + ```python + deeplabcut.label_frames(config_path, config3d=config_path3d) + ``` diff --git a/docs/MISSION_AND_VALUES.md b/docs/MISSION_AND_VALUES.md index bc6623a6af..80630ed2fc 100644 --- a/docs/MISSION_AND_VALUES.md +++ b/docs/MISSION_AND_VALUES.md @@ -4,7 +4,9 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (mission-and-values)= + # Mission and Values of DeepLabCut This document is meant to help guide decisions about the future of `DeepLabCut`, be it in terms of @@ -25,7 +27,6 @@ estimation framework that is: - fast (GPU-powered) - scalable (project focused for ease of portability and sharability) - As the project has grown we've turned these original principles into the mission statement and set of values that we described below. @@ -36,44 +37,44 @@ pose estimation for people to use in their daily work** without the need to be a framework. We hope to accomplish this by: - being **easy to use and install**. We are careful in taking on new dependencies, sometimes making them optional, and -aim support a fully (Python) packaged installation that works cross-platform. + aim support a fully (Python) packaged installation that works cross-platform. - being **well-documented** with **comprehensive tutorials and examples**. All functions in our API have thorough -docstrings clarifying expected inputs and outputs, and we maintain a separate -[tutorials and information website](http://deeplabcut.org). + docstrings clarifying expected inputs and outputs, and we maintain a separate + [tutorials and information website](http://deeplabcut.org). - providing **GUI access** to all critical functionality so DeepLabCut can be used by people without coding experience. - being **interactive** and **highly performant** in order to support large data pipelines. - providing a **consistent and stable API** to enable plugin developers to build on top of DeepLabCut without their -code constantly breaking and to enable advanced users to build out sophisticated Python workflows, if needed. + code constantly breaking and to enable advanced users to build out sophisticated Python workflows, if needed. - **ensuring correctness**. We strive for complete test coverage of both the code and GUI, with all code reviewed by a -core developer before being included in the repository. + core developer before being included in the repository. ## Our values - We are **inclusive**. We welcome newcomers who are making their first contribution and strive to grow our most -dedicated contributors into [core developers](https://github.com/orgs/DeepLabCut/teams/core-developers). -We have a [Code of Conduct](https://github.com/DeepLabCut/DeepLabCut/blob/main/CODE_OF_CONDUCT.md) to make DeepLabCut -a welcoming place for all. + dedicated contributors into [core developers](https://github.com/orgs/DeepLabCut/teams/core-developers). + We have a [Code of Conduct](https://github.com/DeepLabCut/DeepLabCut/blob/main/CODE_OF_CONDUCT.md) to make DeepLabCut + a welcoming place for all. - We are **community-engaged**. We respond to feature requests and proposals on our + - [issue tracker](https://github.com/DeepLabCut/DeepLabCut/issues). - We serve **scientific applications** primarily, over “consumer or commercial” pose estimation tools. This often means -prioritizing core functionality support, and rejecting implementations of “flashy” features that have little -scientific value. + prioritizing core functionality support, and rejecting implementations of “flashy” features that have little + scientific value. - We are **domain agnostic** within the sciences. Functionality that is highly specific to particular scientific -domains belongs in plugins, whereas functionality that cuts across many domains and is likely to be widely used belongs -inside DeepLabCut. + domains belongs in plugins, whereas functionality that cuts across many domains and is likely to be widely used belongs + inside DeepLabCut. - We value **education and documentation**. All functions should have docstrings, preferably with examples, and major -functionality should be explained in our [tutorials](http://deeplabcut.org). Core developers can take an active role -in finishing documentation examples. - + functionality should be explained in our [tutorials](http://deeplabcut.org). Core developers can take an active role + in finishing documentation examples. ## Acknowledgements diff --git a/docs/ModelZoo.md b/docs/ModelZoo.md index 9d37486afc..c10220c313 100644 --- a/docs/ModelZoo.md +++ b/docs/ModelZoo.md @@ -4,25 +4,26 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (file:model-zoo)= + # The DeepLabCut Model Zoo! ![image](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/8957c690-4f27-4430-8581-4161fd58d052/68747470733a2f2f696d616765732e73717561726573706163652d63646e2e636f6d2f636f6e74656e742f76312f3537663664353163396637343536366635356563663237312f313631363439323337333730302d50474f41433732494f4236415545343756544a582f6b6531375a77644742546f646449.png?format=450w) - ## 🏠 [Home page](http://modelzoo.deeplabcut.org/) - Started in 2020, expanded in 2022 with PhD student [Shaokai Ye et al.](https://arxiv.org/abs/2203.07436v1), and the first proper [SuperAnimal Foundation Models](#about-the-superanimal-models) published in 2024 🔥, the Model Zoo is four things: - (1) a collection of models that are trained on diverse data across (typically) large datasets, which means you do not need to train models yourself, rather you can use them in your research applications. - (2) a contribution website for community crowd sourcing of expertly labeled keypoints to improve models! You can get involved here: [contrib.deeplabcut.org](https://contrib.deeplabcut.org/). - (3) a no-install DeepLabCut that you can use on ♾[Google Colab](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb), -test our models in 🕸[the browser](https://contrib.deeplabcut.org/), or on our 🤗[HuggingFace](https://huggingface.co/spaces/DeepLabCut/DeepLabCutModelZoo-SuperAnimals) app! + test our models in 🕸[the browser](https://contrib.deeplabcut.org/), or on our 🤗[HuggingFace](https://huggingface.co/spaces/DeepLabCut/DeepLabCutModelZoo-SuperAnimals) app! - (4) new methods to make SuperAnimal Foundation Models that combine data across different labs/datasets, keypoints, animals/species, and use on your data! ## Quick Start: + ``` pip install deeplabcut[gui,modelzoo] ``` @@ -34,52 +35,54 @@ Animal pose estimation is critical in applications ranging from neuroscience to To provide the community with easy access to such high performance models across diverse environments and species, we present a new paradigm for building pre-trained animal pose models -- which we call SuperAnimal models -- and the ability to use them for transfer learning (e.g., fine-tune them if needed). ## SuperAnimal members: -- Models are based on what they are trained on, for example `superanimal_quadruped_x` is trained on [SuperAnimal-Quadruped-80K](https://zenodo.org/records/10619173). Each model class is described below: - +- Models are based on what they are trained on, for example `superanimal_quadruped_x` is trained on [SuperAnimal-Quadruped-80K](https://zenodo.org/records/10619173). Each model class is described below: ### SuperAnimal-Quadruped: - - `superanimal_quadruped_x` models aim to work across a large range of quadruped animals, from horses, dogs, sheep, rodents, to elephants. The camera perspective is orthogonal to the animal ("side view"), and most of the data includes the animals face (thus the front and side of the animal). You will note we have several variants that differ in speed vs. performance, so please do test them out on your data to see which is best suited for your application. Also note we have a "video adaptation" feature, which lets you adapt your data to the model in a self-supervised way. No labeling needed! + - [Please see the full datasheet here](https://zenodo.org/records/10619173) + - [More details on the models (detector, pose estimators)](https://huggingface.co/mwmathis/DeepLabCutModelZoo-SuperAnimal-Quadruped) -- We provide several models: - - `superanimal_quadruped_hrnetw32` (pytorch engine) - - `superanimal_quadruped_hrnetw32` is a top-down model that is paired with a detector. That means it takes a cropped image from an object detector and predicts the keypoints. The object detector is currently a trained [ResNet50-based Faster-RCNN](https://pytorch.org/vision/stable/models/faster_rcnn.html). - - `superanimal_quadruped_dlcrnet` (tensorflow engine) - - `superanimal_quadruped_dlcrnet` is a bottom-up model that predicts all keypoints, then groups them into individuals. This can be faster, but more error prone. - - `superanimal_quadruped` -> This is the same as `superanimal_quadruped_dlcrnet`, this was the old naming and being depreciated. - - For all models, they are automatically downloaded to modelzoo/checkpoints when used. -- Here are example images of what the model is trained on: -![SA_Q](https://user-images.githubusercontent.com/28102185/209957688-954fb616-7750-4521-bb52-20a51c3a7718.png) +- We provide several models: + - `superanimal_quadruped_hrnetw32` (pytorch engine) + - `superanimal_quadruped_hrnetw32` is a top-down model that is paired with a detector. That means it takes a cropped image from an object detector and predicts the keypoints. The object detector is currently a trained [ResNet50-based Faster-RCNN](https://pytorch.org/vision/stable/models/faster_rcnn.html). + - `superanimal_quadruped_dlcrnet` (tensorflow engine) + - `superanimal_quadruped_dlcrnet` is a bottom-up model that predicts all keypoints, then groups them into individuals. This can be faster, but more error prone. + - `superanimal_quadruped` -> This is the same as `superanimal_quadruped_dlcrnet`, this was the old naming and being depreciated. + - For all models, they are automatically downloaded to modelzoo/checkpoints when used. +- Here are example images of what the model is trained on: + ![SA_Q](https://user-images.githubusercontent.com/28102185/209957688-954fb616-7750-4521-bb52-20a51c3a7718.png) ### SuperAnimal-TopViewMouse: +- `superanimal_topviewmouse_x` aims to work across lab mice in different lab settings from a top-view perspective; this is very polar in many behavioral assays in freely moving mice. -- `superanimal_topviewmouse_x` aims to work across lab mice in different lab settings from a top-view perspective; this is very polar in many behavioral assays in freely moving mice. - [Please see the full datasheet here](https://zenodo.org/records/10618947) + - [More details on the models (detector, pose estimators)](https://huggingface.co/mwmathis/DeepLabCutModelZoo-SuperAnimal-TopViewMouse) + - We provide several models: - - `superanimal_topviewmouse_hrnetw32` (pytorch engine) - - `superanimal_topviewmouse_hrnetw32` is a top-down model that is paired with a detector. That means it takes a cropped image from an object detector and predicts the keypoints. The object detector is currently a trained [ResNet50-based Faster-RCNN](https://pytorch.org/vision/stable/models/faster_rcnn.html). - - `superanimal_topviewmouse_dlcrnet` (tensorflow engine) - - `superanimal_topviewmouse_dlcrnet` is a bottom-up model that predicts all keypoints then groups them into individuals. This can be faster, but more error prone. - - `superanimal_topviewmouse` -> This is the same as `superanimal_topviewmouse_dlcrnet`, this was the old naming and being depreciated. - - For all models, they are automatically downloaded to modelzoo/checkpoints when used. -- Here are example images of what the model is trained on: -![SA-TVM](https://user-images.githubusercontent.com/28102185/209957260-c0db72e0-4fdf-434c-8579-34bc5f27f907.png) + - `superanimal_topviewmouse_hrnetw32` (pytorch engine) + - `superanimal_topviewmouse_hrnetw32` is a top-down model that is paired with a detector. That means it takes a cropped image from an object detector and predicts the keypoints. The object detector is currently a trained [ResNet50-based Faster-RCNN](https://pytorch.org/vision/stable/models/faster_rcnn.html). + - `superanimal_topviewmouse_dlcrnet` (tensorflow engine) + - `superanimal_topviewmouse_dlcrnet` is a bottom-up model that predicts all keypoints then groups them into individuals. This can be faster, but more error prone. + - `superanimal_topviewmouse` -> This is the same as `superanimal_topviewmouse_dlcrnet`, this was the old naming and being depreciated. + - For all models, they are automatically downloaded to modelzoo/checkpoints when used. + +- Here are example images of what the model is trained on: + ![SA-TVM](https://user-images.githubusercontent.com/28102185/209957260-c0db72e0-4fdf-434c-8579-34bc5f27f907.png) ### SuperAnimal-Human: - `superanimal_humanbody` models aim to work across human body pose estimation from various camera perspectives and environments. The models are designed to handle different human poses, activities, and lighting conditions commonly found in human motion analysis, sports analysis, and behavioral studies. - - `superanimal_humanbody_rtmpose_x` (pytorch engine) - - `superanimal_humanbody_rtmpose_x` is a top-down model that is paired with a detector pretrained from `torchvision`. That means it takes a cropped image from an object detector and predicts the keypoints. This model uses 17 body parts in the COCO body7 format. - + - `superanimal_humanbody_rtmpose_x` (pytorch engine) + - `superanimal_humanbody_rtmpose_x` is a top-down model that is paired with a detector pretrained from `torchvision`. That means it takes a cropped image from an object detector and predicts the keypoints. This model uses 17 body parts in the COCO body7 format. ### Practical example: Using SuperAnimal models for inference without training. @@ -126,7 +129,6 @@ result = deeplabcut.video_inference_superanimal( df_3d = result[video_path]["df_3d"] ``` - ### Practical example: Using SuperAnimal model bottom up, considering video/animal size. In our work we introduced a spatial-pyramid for smartly rescaling images. Imagine if you frames are much larger than what we trained on, it would be hard for the model to find the animal! Here, you can simply guide the model with the `scale_list`: @@ -148,12 +150,13 @@ deeplabcut.video_inference_superanimal([video_path], ``` ### Practical example: Using transfer learning with superanimal weights. + In the `deeplabcut.train_network` function, the `superanimal_transfer_learning` option plays a pivotal role. If it's set to __True__, it uses a new decoding layer and allows you to use superanimal weights in any project, no matter the number of keypoints. However, if it's set to __False__, you are doing fine-tuning. So, make sure your dataset has the right number of keypoints. Specifically: - * `superanimal_quadruped_x` uses 39 keypoints - * `superanimal_topviewmouse_x` uses 27 keypoints - * `superanimal_humanbody_x` uses 17 keypoints +\* `superanimal_quadruped_x` uses 39 keypoints +\* `superanimal_topviewmouse_x` uses 27 keypoints +\* `superanimal_humanbody_x` uses 17 keypoints ```python import os @@ -191,8 +194,6 @@ Pixel statistics domain shift: The brightness of your video might look very diff This might either result in jittering predictions in the video or fail modes for lab mice videos (if the brightness of the mice is unusual compared to our training dataset). You can use our "video adaptation" model to counter this. - - ### Our longer term perspective ... Via DeepLabCut Model Zoo, we aim to provide plug and play models that do not need any labeling and will just work diff --git a/docs/Overviewof3D.md b/docs/Overviewof3D.md index afb844db38..4351e78f87 100644 --- a/docs/Overviewof3D.md +++ b/docs/Overviewof3D.md @@ -8,7 +8,9 @@ deeplabcut: recommendation: update notes: Contents seem up-to-date as the codebase has not evolved drastically for 3D, but formatting and organization could be improved. Separate basic/advanced sections could help, as well as more admonitions/dropdowns to streamline. --- + (3D-overview)= + # 3D DeepLabCut In this repo we directly support 2-camera based 3D pose estimation. If you want n camera support, plus nicer @@ -18,32 +20,30 @@ link you will find how we optimize 6+ camera DLC output data for cheetahs (and s DLC 3D - ## **ATTENTION: Our code base in this repo assumes you:** A. You have 2D videos and a DeepLabCut network to analyze them as described in the [main documentation](overview). This can be with multiple separate networks for each camera (less recommended), or one network trained on all views - recommended! (See -[Nath*, Mathis* et al., 2019](https://www.biorxiv.org/content/10.1101/476531v1)). We also support multi-animal 3D with this code (please see +[Nath\*, Mathis\* et al., 2019](https://www.biorxiv.org/content/10.1101/476531v1)). We also support multi-animal 3D with this code (please see [Lauer et al. 2022](https://doi.org/10.1038/s41592-022-01443-0)). -B. You are using 2 cameras, in a [stereo configuration](https://github.com/DeepLabCut/DeepLabCut/blob/5ac4c8cb6bcf2314a3abfcf979b8dd170608e094/deeplabcut/pose_estimation_3d/camera_calibration.py#L223), for 3D*. +B. You are using 2 cameras, in a [stereo configuration](https://github.com/DeepLabCut/DeepLabCut/blob/5ac4c8cb6bcf2314a3abfcf979b8dd170608e094/deeplabcut/pose_estimation_3d/camera_calibration.py#L223), for 3D\*. C. You have calibration images taken (see details below!). +### \***If you need more than 2 camera support:** -### ***If you need more than 2 camera support:** Here are other excellent options for you to use that extend DeepLabCut: DLC 3D - **[AcinoSet](https://github.com/African-Robotics-Unit/AcinoSet)**; **n**-camera support with triangulation, extended Kalman filtering, and trajectory optimization -code (see video to the right for a min demo, courtesy of Prof. Patel), plus a GUI to visualize 3D data. It is built to -work directly with DeepLabCut (but currently tailored to cheetah's, thus some coding skills are required at this time). - + code (see video to the right for a min demo, courtesy of Prof. Patel), plus a GUI to visualize 3D data. It is built to + work directly with DeepLabCut (but currently tailored to cheetah's, thus some coding skills are required at this time). - **[anipose.org](https://anipose.readthedocs.io/en/latest/)**; a wrapper for 3D deeplabcut that provides >3 camera support and is built to work directly with -DeepLabCut. You can `pip install anipose` into your DLC conda environment. + DeepLabCut. You can `pip install anipose` into your DLC conda environment. - **Argus, easywand or DLTdv** w/DeepLabCut see https://github.com/backyardbiomech/DLCconverterDLT; this can be used with the the highly popular Argus or DLTdv tools for wand calibration. As of Summer, 2025, [Argus](https://github.com/kilmoretrout/argus_gui) now supports direct import and export of DeepLabCut output files in the GUI with new [workflow documentation](https://github.com/kilmoretrout/argus_gui/blob/master/docs/deeplabcut.md) @@ -61,11 +61,10 @@ DeepLabCut. You can `pip install anipose` into your DLC conda environment. Watch a [DEMO VIDEO](https://youtu.be/Eh6oIGE4dwI) on how to use this code, and check out the Notebook [here](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/JUPYTER/Demo_3D_DeepLabCut.ipynb)! - You will run this function **one** time per project; a project is defined as a given set of cameras and calibration images. You can always analyze new videos within this project. -The function **create\_new\_project\_3d** creates a new project directory specifically for converting the 2D pose to 3D +The function **create_new_project_3d** creates a new project directory specifically for converting the 2D pose to 3D pose, required subdirectories, and a basic 3D project configuration file. Each project is identified by the name of the project (e.g. Task1), name of the experimenter (e.g. YourName), as well as the date at creation. @@ -74,9 +73,11 @@ cameras to be used. Currently, DeepLabCut supports triangulation using 2 cameras in a future version. To start a 3D project type the following in ipython: + ```python deeplabcut.create_new_project_3d("ProjectName", "NameofLabeler", num_cameras=2) ``` + TIP 1: you can also pass `working_directory="Full path of the working directory"` if you want to place this folder somewhere beside the current directory you are working in. If the optional argument `working_directory` is unspecified, the project directory is created in the current working directory. @@ -87,7 +88,7 @@ easy use. Please note that `config_path3d='Full path of the 3D project configura This function will create a project directory with the name **Name of the project+name of the experimenter+date of creation of the project+3d** in the **Working directory**. The project directory will have subdirectories: -**calibration_images**, **camera_matrix**, **corners**, and **undistortion**. All the outputs generated during the +**calibration_images**, **camera_matrix**, **corners**, and **undistortion**. All the outputs generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be curated in separation from other projects. @@ -102,7 +103,7 @@ pickle files contain the intrinsic and extrinsic camera parameters. While the in transformation from 3-D camera's coordinates into the image coordinates, the extrinsic parameters represent a rigid transformation from world coordinate system to the 3-D camera's coordinate system. -**corners:** As a part of camera calibration, the checkerboard pattern is detected in the calibration images and these +**corners:** As a part of camera calibration, the checkerboard pattern is detected in the calibration images and these patterns will be stored in this directory. Each row of the checkerboard grid is marked with a unique color. **undistortion:** In order to check for calibration, the calibration images and the corresponding corner points are @@ -119,9 +120,10 @@ Here is an overview of the calibration and triangulation workflow that follows: (**CRITICAL!**) You must take images of a checkerboard to calibrate your images. Here are example boards you could print and use (mount it on a flat, hard surface!): https://markhedleyjones.com/projects/calibration-checkerboard-collection. + - You must save the image pairs as .jpg files. - They should be named with the **camera-#** as the prefix, i.e. **camera-1-01.jpg** and **camera-2-01.jpg** for the -first pair of images. Please note, this cannot be changed after the project is created. + first pair of images. Please note, this cannot be changed after the project is created. **TIP:** If you want to take a short video (vs. snapping pairs of frames) while you move the checkerboard around, you can use this command inside your conda environment (but outside of ipython!) to convert the video to **.jpg** frames @@ -130,20 +132,20 @@ can use this command inside your conda environment (but outside of ipython!) to ```python ffmpeg -i videoname.mp4 -vframes 20 camera-1-%03d.jpg ``` + - While taking the images: - Keep the orientation of the checkerboard the same and do not rotate it more than 30 degrees. Rotating the - checkerboard circular will change the origin across the frames and may result in incorrect order of detected corners. + checkerboard circular will change the origin across the frames and may result in incorrect order of detected corners. - Cover several distances, and within each distance, cover all parts of the image view (all corners and center). - Use a checkerboard as big as possible, ideally with at least 8x6 squares. - Aim for taking at least 30-70 pair of images, as after corner detection, some of the images might need to be - discarded due to either incorrect corner detection or incorrect order of detected corners. + discarded due to either incorrect corner detection or incorrect order of detected corners. - You can take the images as a series of .jpg images, or a video where you post-hoc pair sync'd frames (see tip - above). - + above). The camera calibration is an **iterative process**, where the user needs to select a set of calibration images where the grid pattern is correctly detected. The function `deeplabcut.calibrate_cameras(config_path)` @@ -179,7 +181,6 @@ Here is what they might look like:

- Once all the set of images has been selected (namely, delete from the folder any bad pairs!) where the corners and their orders are detected correctly, then the two cameras can be calibrated using: @@ -231,15 +232,15 @@ video filename must contain this naming, i.e. this could be named as `rig-1-mous information for the 2D views. - Of critical importance is that you need to input the **same** body part names as in the config.yaml file of the 2D -project. + project. - You must set the snapshot to use inside the 2D config file (default is -1, namely the last training snapshot of the -network). + network). - You need to set a "scorer 3D" name; this will point to the project file and be set in future 3D output file names. - You should define a "skeleton" here as well (note, this is not rigid, it just connects the points in the plotting -step). Not every point needs to be "skeletonized", i.e. these points can be a subset of the full body parts list. The -other points will just be plotted into the 3D space. Here is how the config.yaml looks with some example inputs: + step). Not every point needs to be "skeletonized", i.e. these points can be a subset of the full body parts list. The + other points will just be plotted into the 3D space. Here is how the config.yaml looks with some example inputs: -

+

@@ -257,8 +258,9 @@ deeplabcut.triangulate( filterpredictions=True/False ) ``` -NOTE: Windows users, you must input paths as: ``r`C:\Users\computername\videofolder'`` or -``C:\\Users\\computername\\videofolder'``. + +NOTE: Windows users, you must input paths as: `` r`C:\Users\computername\videofolder' `` or +`C:\\Users\\computername\\videofolder'`. **TIP:** Here are all the parameters you can pass: @@ -293,6 +295,7 @@ save_as_csv: bool, optional track_method: str, optional Method used for tracking: "box" or "ellipse" ``` + The **triangulated file** is now saved under the same directory where the video files reside (or the destination folder you set)! This can be used for future analysis. This step can be run at anytime as you collect new videos, and easily added to your automated analysis pipeline, i.e. such as **replacing** @@ -324,7 +327,7 @@ deeplabcut.create_labeled_video_3d( variables `xlim`, `ylim`, `zlim` and `view`. Your checkerboard_3d.png image which was created above will show you the axis ranges. Here is an example: -

+

@@ -335,6 +338,7 @@ the values, and start again! **Other optional parameters include:** here + ```python videofolder: string Full path of the folder where the videos are stored. Use this if the videos are stored in a different location other than where the triangulation files are stored. By default is ``None`` and therefore looks for video files in the directory where the triangulation file is stored. @@ -377,5 +381,5 @@ dpi: int, optional, default=300 ### If you use this code: -We kindly ask that you cite [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y) **&** [Nath*, Mathis*, et al., 2019](https://doi.org/10.1038/s41596-019-0176-0). If you use 3D +We kindly ask that you cite [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y) **&** [Nath\*, Mathis\*, et al., 2019](https://doi.org/10.1038/s41596-019-0176-0). If you use 3D multi-animal: [Lauer et al. 2022](https://doi.org/10.1038/s41592-022-01443-0). diff --git a/docs/benchmark.md b/docs/benchmark.md index 1b2e9a5d42..a9c3b6fc58 100644 --- a/docs/benchmark.md +++ b/docs/benchmark.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # DeepLabCut benchmark For further information and the leaderboard, see [the official homepage](https://benchmark.deeplabcut.org/). @@ -11,7 +12,7 @@ For further information and the leaderboard, see [the official homepage](https:/ ## High Level API When implementing your own benchmarks, the most important functions are directly accessible -under the ``deeplabcut.benchmark`` package. +under the `deeplabcut.benchmark` package. ```{eval-rst} .. automodule:: deeplabcut.benchmark diff --git a/docs/citation.md b/docs/citation.md index f8a1234ff6..c015514b8c 100644 --- a/docs/citation.md +++ b/docs/citation.md @@ -4,11 +4,11 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # How to Cite DeepLabCut Thank you for using DeepLabCut! Here are our recommendations for citing and documenting your use of DeepLabCut in your Methods section: - If you use this code or data we kindly ask that you please [cite Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y) and, if you use the Python package (DeepLabCut2.x+) please also cite [Nath, Mathis et al, 2019](https://doi.org/10.1038/s41596-019-0176-0). If you utilize the MobileNetV2s or EfficientNets please cite [Mathis, Biasi et al. 2021](https://openaccess.thecvf.com/content/WACV2021/papers/Mathis_Pretraining_Boosts_Out-of-Domain_Robustness_for_Pose_Estimation_WACV_2021_paper.pdf). @@ -24,79 +24,82 @@ DOIs (#ProTip, for helping you find citations for software, check out [CiteAs.or ## Formatted citations: - @article{Mathisetal2018, - title = {DeepLabCut: markerless pose estimation of user-defined body parts with deep learning}, - author = {Alexander Mathis and Pranav Mamidanna and Kevin M. Cury and Taiga Abe and Venkatesh N. Murthy and Mackenzie W. Mathis and Matthias Bethge}, - journal = {Nature Neuroscience}, - year = {2018}, - url = {https://www.nature.com/articles/s41593-018-0209-y}} - - @article{NathMathisetal2019, - title = {Using DeepLabCut for 3D markerless pose estimation across species and behaviors}, - author = {Nath*, Tanmay and Mathis*, Alexander and Chen, An Chi and Patel, Amir and Bethge, Matthias and Mathis, Mackenzie W}, - journal = {Nature Protocols}, - year = {2019}, - url = {https://doi.org/10.1038/s41596-019-0176-0}} - - @InProceedings{Mathis_2021_WACV, - author = {Mathis, Alexander and Biasi, Thomas and Schneider, Steffen and Yuksekgonul, Mert and Rogers, Byron and Bethge, Matthias and Mathis, Mackenzie W.}, - title = {Pretraining Boosts Out-of-Domain Robustness for Pose Estimation}, - booktitle = {Proceedings of the IEEE/CVF Winter Conference on Applications of Computer Vision (WACV)}, - month = {January}, - year = {2021}, - pages = {1859-1868}} - - @article{Lauer2022MultianimalPE, - title={Multi-animal pose estimation, identification and tracking with DeepLabCut}, - author={Jessy Lauer and Mu Zhou and Shaokai Ye and William Menegas and Steffen Schneider and Tanmay Nath and Mohammed Mostafizur Rahman and Valentina Di Santo and Daniel Soberanes and Guoping Feng and Venkatesh N. Murthy and George Lauder and Catherine Dulac and M. Mathis and Alexander Mathis}, - journal={Nature Methods}, - year={2022}, - volume={19}, - pages={496 - 504}} - - @article{Ye2024SuperAnimal, - title={SuperAnimal pretrained pose estimation models for behavioral analysis}, - author={Shaokai Ye and Anastasiia Filippova and Jessy Lauer and Steffen Schneider and Maxime Vidal and and Tian Qiu and Alexander Mathis and Mackenzie W. Mathis}, - journal={Nature Communications}, - year={2024}, - volume={15}} - +``` +@article{Mathisetal2018, + title = {DeepLabCut: markerless pose estimation of user-defined body parts with deep learning}, + author = {Alexander Mathis and Pranav Mamidanna and Kevin M. Cury and Taiga Abe and Venkatesh N. Murthy and Mackenzie W. Mathis and Matthias Bethge}, + journal = {Nature Neuroscience}, + year = {2018}, + url = {https://www.nature.com/articles/s41593-018-0209-y}} + + @article{NathMathisetal2019, + title = {Using DeepLabCut for 3D markerless pose estimation across species and behaviors}, + author = {Nath*, Tanmay and Mathis*, Alexander and Chen, An Chi and Patel, Amir and Bethge, Matthias and Mathis, Mackenzie W}, + journal = {Nature Protocols}, + year = {2019}, + url = {https://doi.org/10.1038/s41596-019-0176-0}} + +@InProceedings{Mathis_2021_WACV, + author = {Mathis, Alexander and Biasi, Thomas and Schneider, Steffen and Yuksekgonul, Mert and Rogers, Byron and Bethge, Matthias and Mathis, Mackenzie W.}, + title = {Pretraining Boosts Out-of-Domain Robustness for Pose Estimation}, + booktitle = {Proceedings of the IEEE/CVF Winter Conference on Applications of Computer Vision (WACV)}, + month = {January}, + year = {2021}, + pages = {1859-1868}} + +@article{Lauer2022MultianimalPE, + title={Multi-animal pose estimation, identification and tracking with DeepLabCut}, + author={Jessy Lauer and Mu Zhou and Shaokai Ye and William Menegas and Steffen Schneider and Tanmay Nath and Mohammed Mostafizur Rahman and Valentina Di Santo and Daniel Soberanes and Guoping Feng and Venkatesh N. Murthy and George Lauder and Catherine Dulac and M. Mathis and Alexander Mathis}, + journal={Nature Methods}, + year={2022}, + volume={19}, + pages={496 - 504}} + +@article{Ye2024SuperAnimal, + title={SuperAnimal pretrained pose estimation models for behavioral analysis}, + author={Shaokai Ye and Anastasiia Filippova and Jessy Lauer and Steffen Schneider and Maxime Vidal and and Tian Qiu and Alexander Mathis and Mackenzie W. Mathis}, + journal={Nature Communications}, + year={2024}, + volume={15}} +``` ### Review & Educational articles: - @article{Mathis2020DeepLT, - title={Deep learning tools for the measurement of animal behavior in neuroscience}, - author={Mackenzie W. Mathis and Alexander Mathis}, - journal={Current Opinion in Neurobiology}, - year={2020}, - volume={60}, - pages={1-11}} - - @article{Mathis2020Primer, - title={A Primer on Motion Capture with Deep Learning: Principles, Pitfalls, and Perspectives}, - author={Alexander Mathis and Steffen Schneider and Jessy Lauer and Mackenzie W. Mathis}, - journal={Neuron}, - year={2020}, - volume={108}, - pages={44-65}} +``` +@article{Mathis2020DeepLT, + title={Deep learning tools for the measurement of animal behavior in neuroscience}, + author={Mackenzie W. Mathis and Alexander Mathis}, + journal={Current Opinion in Neurobiology}, + year={2020}, + volume={60}, + pages={1-11}} + +@article{Mathis2020Primer, + title={A Primer on Motion Capture with Deep Learning: Principles, Pitfalls, and Perspectives}, + author={Alexander Mathis and Steffen Schneider and Jessy Lauer and Mackenzie W. Mathis}, + journal={Neuron}, + year={2020}, + volume={108}, + pages={44-65}} +``` ### Other open-access pre-prints related to our work on DeepLabCut: - @article{MathisWarren2018speed, - author = {Mathis, Alexander and Warren, Richard A.}, - title = {On the inference speed and video-compression robustness of DeepLabCut}, - year = {2018}, - doi = {10.1101/457242}, - publisher = {Cold Spring Harbor Laboratory}, - URL = {https://www.biorxiv.org/content/early/2018/10/30/457242}, - eprint = {https://www.biorxiv.org/content/early/2018/10/30/457242.full.pdf}, - journal = {bioRxiv}} - - +``` +@article{MathisWarren2018speed, + author = {Mathis, Alexander and Warren, Richard A.}, + title = {On the inference speed and video-compression robustness of DeepLabCut}, + year = {2018}, + doi = {10.1101/457242}, + publisher = {Cold Spring Harbor Laboratory}, + URL = {https://www.biorxiv.org/content/early/2018/10/30/457242}, + eprint = {https://www.biorxiv.org/content/early/2018/10/30/457242.full.pdf}, + journal = {bioRxiv}} +``` ## Methods Suggestion: -For body part tracking we used DeepLabCut (version 2.X.X)* [Mathis et al, 2018, Nath et al, 2019, Lauer et al. 2022]. Specifically, we labeled X number of frames taken from X videos/animals (then X% was used for training (default is 95%). We used a X-based neural network (i.e. X = ResNet-50, ResNet-101, MobileNetV2-0.35, MobileNetV2-0.5, MobileNetV2-0.75, MobileNetV2-1***) with default parameters* for X number of training iterations. We validated with X number of shuffles, and found the test error was: X pixels, train: X pixels (image size was X by X). We then used a p-cutoff of X (i.e. 0.9) to condition the X,Y coordinates for future analysis. This network was then used to analyze videos from similar experimental settings. +For body part tracking we used DeepLabCut (version 2.X.X)\* [Mathis et al, 2018, Nath et al, 2019, Lauer et al. 2022]. Specifically, we labeled X number of frames taken from X videos/animals (then X% was used for training (default is 95%). We used a X-based neural network (i.e. X = ResNet-50, ResNet-101, MobileNetV2-0.35, MobileNetV2-0.5, MobileNetV2-0.75, MobileNetV2-1\*\*\*) with default parameters\* for X number of training iterations. We validated with X number of shuffles, and found the test error was: X pixels, train: X pixels (image size was X by X). We then used a p-cutoff of X (i.e. 0.9) to condition the X,Y coordinates for future analysis. This network was then used to analyze videos from similar experimental settings. > Mathis, A. et al. Deeplabcut: markerless pose estimation > of user-defined body parts with deep learning. Nature @@ -106,16 +109,16 @@ For body part tracking we used DeepLabCut (version 2.X.X)* [Mathis et al, 2018, > estimation across species and behaviors. Nature Protocols > 14, 2152–2176 (2019). -*If any defaults were changed in *`pose_config.yaml`*, mention them here. +\*If any defaults were changed in *`pose_config.yaml`*, mention them here. i.e. common things one might change: -* the loader (options are `default`, `imgaug`, `tensorpack`, `deterministic`). -* the `post_dist_threshold` (default is 17 and determines training resolution). -* optimizer: do you use the default `SGD` or `ADAM`? -*** here, you could add additional citations. -If you use ResNets, consider citing Insafutdinov et al 2016 & He et al 2016. If you use the MobileNetV2s consider citing Mathis et al 2019, and Sandler et al, 2018. +- the loader (options are `default`, `imgaug`, `tensorpack`, `deterministic`). +- the `post_dist_threshold` (default is 17 and determines training resolution). +- optimizer: do you use the default `SGD` or `ADAM`? +\*\*\* here, you could add additional citations. +If you use ResNets, consider citing Insafutdinov et al 2016 & He et al 2016. If you use the MobileNetV2s consider citing Mathis et al 2019, and Sandler et al, 2018. > Mathis, A. et al. Pretraining boosts out-of-domain robustness for pose estimation > arXiv 1909.11229 (2019) diff --git a/docs/convert_maDLC.md b/docs/convert_maDLC.md index 14e697c719..3eff9b10cf 100644 --- a/docs/convert_maDLC.md +++ b/docs/convert_maDLC.md @@ -4,12 +4,13 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (convert-maDLC)= + # How to convert a pre-2.2 project for use with DeepLabCut 2.2 or later DLC! - If you have a pre-2.2 project (`labeled-data`) with a **single animal** that you want to use with a multianimal project in DLC 2.2 or later, i.e. use your older data to now train the new multi-task deep neural network, here is what you need to do. @@ -23,7 +24,7 @@ need to do.

- After `task, scorer, date, project_path` please add the following (i.e. in the image above, you would start adding -below line 6) Note, the ordering isn't important but useful to keep consistent with the template: + below line 6) Note, the ordering isn't important but useful to keep consistent with the template: ```python multianimalproject: true @@ -32,18 +33,21 @@ uniquebodyparts: [] multianimalbodyparts: identity: false/true ``` + - Now, please name the animal you have a new name under individuals, i.e.: + ```python individuals: - mouse1 ``` - `"uniquebodyparts: []` can stay blank, unless you have other items labeled you want to estimate (consider these as -similar to bodyparts in pre-2.2); i.e. corners of a box, etc. All unique bodyparts should not be connected to the -multianimal bodyparts in the skeleton you will eventually make. See "advanced option" below. + similar to bodyparts in pre-2.2); i.e. corners of a box, etc. All unique bodyparts should not be connected to the + multianimal bodyparts in the skeleton you will eventually make. See "advanced option" below. - Please move your "bodyparts:" to "multianimalbodyparts:" (bodypart names must stay the same!) These are the parts -that will always be interconnected fully! + that will always be interconnected fully! + ```python multianimalbodyparts: - snout @@ -51,9 +55,11 @@ multianimalbodyparts: - rightear - tailbase ``` + then you can set `bodyparts: MULTI!` (3) Save the config.yaml (be sure to double check for spacing or typos first!) and then run: + ```python deeplabcut.convert2_maDLC(path_config_file, userfeedback=True) ``` @@ -64,9 +70,11 @@ saved for you under a new file named `CollectedData_ ...singleanimal.h5` and `.c (4) We strongly recommend to first run check_labels and verify that the conversion was as expected before creating a multianimal training dataset. For instance, you can load this project `config.yaml` in the Project Manager GUI and check labels then create a multi-animal training set with + ```python deeplabcut.create_multianimaltraining_dataset(path_config_file) ``` + to begin training. **Advanced option:** You can also assign former `bodyparts` to either `uniquebodyparts` or `multianimalbodyparts` @@ -77,16 +85,20 @@ Example: Imagine you had a project with the moon and a rocket with two parts lab Now you want to use this former project (labeled-data) and work on a new dataset (videos) with one moon but multiple (3) rockets. Then convert it as follows: + ``` individuals: [rocket1, rocket2, rocket3] uniquebodyparts: [moon] multianimalbodyparts: [rocket_tip,rocket_bottom] skeleton: [[[rocket_tip,rocket_bottom]]] ``` + In the unusual case, that your data also has multiple moons (e.g. is now carried out around Jupiter), but one rocket: + ``` individuals: [Io, Europa, Ganymede, Callisto] uniquebodyparts: [rocket_tip,rocket_bottom] multianimalbodyparts: [moon] ``` + Note you can use the single object tracker for this situation. What if you have multiple moons and rockets? diff --git a/docs/dlc-live/deeplabcutlive.md b/docs/dlc-live/deeplabcutlive.md index 1d4b38d9ff..819c4eac98 100644 --- a/docs/dlc-live/deeplabcutlive.md +++ b/docs/dlc-live/deeplabcutlive.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (deeplabcut-live)= + # Running DeepLabCut models in real-time We provide two additional packages that allow you to record and stream camera data and run DeepLabCut models in real-time. diff --git a/docs/dlc-live/dlc-live-gui/index.md b/docs/dlc-live/dlc-live-gui/index.md index 8f82588b2d..27ea5c7d0e 100644 --- a/docs/dlc-live/dlc-live-gui/index.md +++ b/docs/dlc-live/dlc-live-gui/index.md @@ -3,6 +3,7 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + # DeepLabCut-live-GUI A graphical application for **real-time pose estimation with DeepLabCut** using one or more cameras. @@ -20,7 +21,7 @@ This GUI is designed for **scientists and experimenters** who want to preview, r Please be aware of the {ref}`sec:dlclivegui-index-limitations` ``` ---- +______________________________________________________________________ ## Description @@ -34,16 +35,17 @@ Please be aware of the {ref}`sec:dlclivegui-index-limitations` - **Optional processor plugins** to extend behavior (e.g. remote control, triggers) The application is built with **PySide6 (Qt)** and is intended for interactive experimental use rather than offline batch processing. + ### Typical workflow 1. **Install** the application and required camera backends -2. **Configure cameras** (single or multi-camera) -3. **Select a DeepLabCut Live model** -4. **Start preview** and verify frame rate -5. **Run pose inference** on a selected camera -6. **Record video** (optionally with overlays) +1. **Configure cameras** (single or multi-camera) +1. **Select a DeepLabCut Live model** +1. **Start preview** and verify frame rate +1. **Run pose inference** on a selected camera +1. **Record video** (optionally with overlays) - With **organized results** by session and run Each of these steps is covered in the *{doc}`Quickstart `* @@ -55,8 +57,10 @@ and *{doc}`User Guide `* sections of this documentation. - Experimentalists running real-time tracking - Anyone who wants a **GUI-first** workflow for DeepLabCut Live ---- +______________________________________________________________________ + (sec:dlclivegui-index-limitations)= + ## Current limitations Before getting started, be aware of the following constraints: @@ -71,7 +75,7 @@ Before getting started, be aware of the following constraints: - **Performance** depends on camera resolution, frame rate, GPU availability, and codec choice - Expect bottlenecks with heavy models, multiple high-resolution cameras, or CPU-only inference. ---- +______________________________________________________________________ ## Feedback, issues, and contributions diff --git a/docs/dlc-live/dlc-live-gui/quickstart/install.md b/docs/dlc-live/dlc-live-gui/quickstart/install.md index a9f0ccc228..ff9a009ca9 100644 --- a/docs/dlc-live/dlc-live-gui/quickstart/install.md +++ b/docs/dlc-live/dlc-live-gui/quickstart/install.md @@ -3,6 +3,7 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + # Installation This page explains how to install **DeepLabCut-live-GUI** for interactive, real‑time pose estimation. @@ -13,7 +14,7 @@ We support various installation methods, including `uv` and `mamba`/`conda`. If you feel confident you meet the requirements and you just want to get started quickly, see the {ref}`sec:dlclivegui-install-quickstart` section below. ``` ---- +______________________________________________________________________ ## System requirements @@ -25,11 +26,11 @@ If you feel confident you meet the requirements and you just want to get started ### OS support -| OS | PyTorch | TensorFlow | Notes & recommendations | -| -- | ------- | ---------- | ----- | -| Windows | ✅ | ❌ | Limited TensorFlow support due to lack of official Windows builds for Python 3.11+ onwards | -| Linux | ✅ | ✅ | Full support for both backends | -| macOS | ✅ | ⚠️ | PyTorch MPS support is improving but still has limitations; TensorFlow only supports CPU on macOS | +| OS | PyTorch | TensorFlow | Notes & recommendations | +| ------- | ------- | ---------- | ------------------------------------------------------------------------------------------------- | +| Windows | ✅ | ❌ | Limited TensorFlow support due to lack of official Windows builds for Python 3.11+ onwards | +| Linux | ✅ | ✅ | Full support for both backends | +| macOS | ✅ | ⚠️ | PyTorch MPS support is improving but still has limitations; TensorFlow only supports CPU on macOS | ### Hardware requirements @@ -54,8 +55,10 @@ If you use an OpenCV-compatible camera (e.g. USB webcam, OBS virtual camera), yo - **TensorFlow** (for backwards compatibility with existing models) - A working camera backend (see *{ref}`file:dlclivegui-camera-support`*) ---- +______________________________________________________________________ + (sec:dlclivegui-install-quickstart)= + ## Quickstart (recommended defaults) ```bash diff --git a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend.md b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend.md index 9cacbe8bb4..e51fb670e8 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-camera-aravis-backend)= + # Aravis backend The Aravis backend provides support for GenICam-compatible cameras using the @@ -14,7 +16,7 @@ Support for Aravis in the GUI is currently experimental. Please report issues on GitHub to help improve this backend. ``` ---- +______________________________________________________________________ ## Features @@ -61,7 +63,7 @@ dependencies such as `gobject-introspection` and `cairo`. ```` ````` ---- +______________________________________________________________________ ## Basic configuration @@ -79,7 +81,7 @@ Select the Aravis backend either in the GUI or via configuration: } ``` ---- +______________________________________________________________________ ## Camera selection @@ -115,7 +117,7 @@ The backend may automatically populate additional read-only identity fields used internally and set by the GUI. ``` ---- +______________________________________________________________________ ## Full properties and advanced configuration @@ -128,13 +130,13 @@ the settings used by the GUI and configuration files. These values are accessible directly in the GUI and are shared for all backends. ``` -| Property | Type | Description | -|--------|------|-------------| -| `width` | int | Requested image width (optional) | -| `height` | int | Requested image height (optional) | -| `fps` | float | Target acquisition frame rate | -| `exposure` | float | Exposure time in microseconds | -| `gain` | float | Camera gain value | +| Property | Type | Description | +| ---------- | ----- | --------------------------------- | +| `width` | int | Requested image width (optional) | +| `height` | int | Requested image height (optional) | +| `fps` | float | Target acquisition frame rate | +| `exposure` | float | Exposure time in microseconds | +| `gain` | float | Camera gain value | ### Common Aravis properties @@ -142,12 +144,12 @@ These values are accessible directly in the GUI and are shared for all backends. These properties are specific to the Aravis backend and must be set manually in the configuration file. ``` -| Property | Type | Default | Description | -|--------|------|---------|-------------| -| `device_id` | string | — | Explicit Aravis device ID (overrides index) | -| `pixel_format` | string | `Mono8` | Requested pixel format | -| `timeout` | int | `2000000` | Frame timeout in microseconds | -| `n_buffers` | int | `10` | Number of streaming buffers | +| Property | Type | Default | Description | +| -------------- | ------ | --------- | ------------------------------------------- | +| `device_id` | string | — | Explicit Aravis device ID (overrides index) | +| `pixel_format` | string | `Mono8` | Requested pixel format | +| `timeout` | int | `2000000` | Frame timeout in microseconds | +| `n_buffers` | int | `10` | Number of streaming buffers | ### Pixel format @@ -277,7 +279,7 @@ Adjust frame timeout for slower cameras or congested networks: (5 seconds = 5,000,000 microseconds) ---- +______________________________________________________________________ ## Troubleshooting @@ -287,8 +289,8 @@ Adjust frame timeout for slower cameras or congested networks: ```bash arv-tool-0.8 -l ``` -2. Check power, cabling, and network configuration -3. Ensure sufficient permissions for USB or network devices +1. Check power, cabling, and network configuration +1. Ensure sufficient permissions for USB or network devices ### Timeout errors @@ -304,19 +306,19 @@ Adjust frame timeout for slower cameras or congested networks: ``` - Try a simpler format such as `Mono8` ---- +______________________________________________________________________ ## Comparison with GenTL backend -| Feature | Aravis | GenTL | -| ------- | ------ | ----- | -| Best Platform | Linux | Windows | -| Camera Support | GenICam / GigE | Vendor GenTL | -| Installation | System packages | Vendor CTI files | -| Auto-detection | Yes | Yes | -| Performance | Excellent | Excellent | +| Feature | Aravis | GenTL | +| -------------- | --------------- | ---------------- | +| Best Platform | Linux | Windows | +| Camera Support | GenICam / GigE | Vendor GenTL | +| Installation | System packages | Vendor CTI files | +| Auto-detection | Yes | Yes | +| Performance | Excellent | Excellent | ---- +______________________________________________________________________ ## Example configuration @@ -339,7 +341,7 @@ Adjust frame timeout for slower cameras or congested networks: } ``` ---- +______________________________________________________________________ ## Resources diff --git a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend.md b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend.md index 7bd5b7097b..1350ec64f8 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-basler-backend)= + # Basler backend The Basler backend provides support for Basler cameras using the official **pylon SDK** through the **pypylon** Python bindings. @@ -14,7 +16,7 @@ Download the official pylon SDK from Basler and install the `pypylon` Python pac This backend requires the optional `pypylon` dependency. If `pypylon` is not installed, the backend will be unavailable. ``` ---- +______________________________________________________________________ ## Features & design @@ -24,7 +26,7 @@ This backend requires the optional `pypylon` dependency. If `pypylon` is not ins - Configurable exposure, gain, frame rate, and resolution. - Frames are converted to **BGR (8-bit)** for consistency with other GUI backends. ---- +______________________________________________________________________ ## Installation @@ -67,7 +69,7 @@ pip install pypylon # OR uv pip install pypylon `pypylon` is the official Python wrapper for the Basler pylon Camera Software Suite ---- +______________________________________________________________________ ## Basic configuration @@ -85,7 +87,7 @@ Select the Basler backend in the GUI or via configuration: } ``` ---- +______________________________________________________________________ ## Camera selection @@ -121,9 +123,9 @@ The backend supports a stable identity field `device_id` (serial number). When p How selection works: 1. If `properties.basler.device_id` is set, the backend selects the device with a matching serial number. -2. Otherwise, the backend uses `index`. +1. Otherwise, the backend uses `index`. ---- +______________________________________________________________________ ## Full properties and advanced configuration @@ -159,7 +161,7 @@ After a successful open, the backend may populate the following read-only conven These fields are managed automatically and are not required to configure the backend. ---- +______________________________________________________________________ ### Exposure and gain @@ -181,7 +183,7 @@ Example: } ``` ---- +______________________________________________________________________ ### Frame rate (FPS) @@ -189,7 +191,7 @@ Example: - The backend attempts to enable `AcquisitionFrameRateEnable` when available, then sets `AcquisitionFrameRate`. - The backend reads back the **actual FPS** (if available) and exposes it via telemetry. ---- +______________________________________________________________________ ### Resolution handling @@ -198,7 +200,7 @@ Resolution is only changed when explicitly requested. Priority order for requesting a resolution: 1. `width` + `height` (GUI fields) -2. `properties.basler.resolution` (namespaced override) +1. `properties.basler.resolution` (namespaced override) If no resolution is provided (or if width/height are `0`), the backend preserves the camera’s default configuration. @@ -208,7 +210,7 @@ Increment and range constraints: - The backend snaps requested values down to the nearest valid increment (best-effort) and clamps to min/max. - A warning is logged if the requested and applied resolutions differ. ---- +______________________________________________________________________ ### Pixel format and color conversion @@ -218,7 +220,7 @@ To provide a consistent frame format across backends, the Basler backend convert Internally, it uses a pypylon `ImageFormatConverter` configured for `PixelType_BGR8packed`. ---- +______________________________________________________________________ ### Device discovery @@ -231,7 +233,7 @@ The backend can enumerate devices without opening them and returns (best-effort) Note that availability and richness of fields depend on camera transport and SDK support. ---- +______________________________________________________________________ ## Troubleshooting @@ -246,7 +248,6 @@ Note that availability and richness of fields depend on camera transport and SDK pip install pypylon ``` - ### No cameras detected - Verify the Basler pylon runtime is installed and your camera is visible in Basler tooling. @@ -256,7 +257,7 @@ Note that availability and richness of fields depend on camera transport and SDK If you request a resolution that violates camera constraints (min/max or increment), the backend will snap/clamp to valid values and log a warning. ---- +______________________________________________________________________ ## Example configuration @@ -279,7 +280,7 @@ If you request a resolution that violates camera constraints (min/max or increme } ``` ---- +______________________________________________________________________ ## Resources diff --git a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support.md b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support.md index a3b7e1c440..007a8e0ac3 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-camera-support)= + # Camera support DeepLabCut-live-GUI supports multiple camera backends for different platforms and camera types: @@ -12,10 +14,10 @@ DeepLabCut-live-GUI supports multiple camera backends for different platforms an 1. {ref}`OpenCV ` - "Universal" webcam and USB camera support *(all platforms)* - Expect some limitations in camera control and performance -2. {ref}`GenTL ` - Industrial cameras via GenTL producers *(Windows, Linux)* - - Requires vendor-provided CTI files -3. {ref}`Aravis ` - GenICam/GigE Vision cameras *(Linux, experimental on macOS)* -4. {ref}`Basler ` - Basler cameras via pypylon *(all platforms)* +1. {ref}`GenTL ` - Industrial cameras via GenTL producers *(Windows, Linux)* + - Requires vendor-provided CTI files +1. {ref}`Aravis ` - GenICam/GigE Vision cameras *(Linux, experimental on macOS)* +1. {ref}`Basler ` - Basler cameras via pypylon *(all platforms)* ## Backend selection @@ -87,10 +89,10 @@ Install vendor-provided camera drivers and SDK. CTI files are typically in: ## Backend comparison -| Feature | OpenCV | GenTL | Aravis | Basler (pypylon) | -|---------|--------|-------|--------|------------------| -| Exposure control | No | Yes | Yes | Yes | -| Gain control | No | Yes | Yes | Yes | -| Windows | ✅ | ✅ | ❌ | ✅ | -| Linux | ✅ | ✅ | ✅ | ✅ | -| macOS | ✅ | ❌ | ⚠️ | ✅ | +| Feature | OpenCV | GenTL | Aravis | Basler (pypylon) | +| ---------------- | ------ | ----- | ------ | ---------------- | +| Exposure control | No | Yes | Yes | Yes | +| Gain control | No | Yes | Yes | Yes | +| Windows | ✅ | ✅ | ❌ | ✅ | +| Linux | ✅ | ✅ | ✅ | ✅ | +| macOS | ✅ | ❌ | ⚠️ | ✅ | diff --git a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend.md b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend.md index 84a53aed1a..721ab4ac30 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend.md @@ -3,6 +3,7 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + # GenTL backend The GenTL backend provides support for **GenICam / GenTL** compatible cameras using the **Harvesters** Python library (a GenTL consumer). @@ -16,7 +17,7 @@ Support for GenTL in the GUI is currently experimental. Please report issues on GitHub to help improve this backend. ``` ---- +______________________________________________________________________ ## Features & design @@ -38,7 +39,7 @@ Please report issues on GitHub to help improve this backend. - `RGB8` → BGR - Non-8-bit frames → scaled down to 8-bit (per-frame scaling) ---- +______________________________________________________________________ ## Installation @@ -75,7 +76,7 @@ If you have multiple producers installed, separate entries with: Many vendor installers set `GENICAM_GENTL64_PATH` automatically. If your camera is not discovered, explicitly set the variable (or provide `cti_file` / `cti_files` in configuration as described below). ``` ---- +______________________________________________________________________ ## Basic configuration @@ -99,7 +100,7 @@ Select the GenTL backend in the GUI or via configuration: } ``` ---- +______________________________________________________________________ ## CTI / producer configuration @@ -118,20 +119,24 @@ By default, the backend will **discover** and **try to load all available** GenT CTI locations are resolved in this order: 1. **Namespace explicit CTIs** (`properties.gentl`): + - `properties.gentl.cti_files` - `properties.gentl.cti_file` Behavior depends on the persisted source marker `properties.gentl.cti_files_source`: - If `cti_files_source == "user"` (or missing/unknown): + - Treated as a **user override** - **strict**: missing paths cause `open()` to raise - If `cti_files_source == "auto"`: + - Treated as an **auto-discovered cache** - If cached paths are stale/missing, `open()` will **fall back to discovery** automatically -2. **Discovery** (auto): +1. **Discovery** (auto): + - environment: `GENICAM_GENTL64_PATH` / `GENICAM_GENTL32_PATH` - optional: `properties.gentl.cti_search_paths` (glob patterns) - optional: `properties.gentl.cti_dirs` (extra directories; non-recursive) @@ -224,7 +229,7 @@ After `open()` (success or failure), the backend writes: These fields are intended for UI troubleshooting and do not normally need manual edits. ---- +______________________________________________________________________ ## Camera selection and stable identity @@ -264,9 +269,9 @@ Prefer `properties.gentl.device_id`, which is persisted automatically after a su The backend selects a device in this order: 1. Exact match of `device_id` against computed IDs for discovered devices -2. If `device_id` starts with `serial:`, match by exact serial number, then (if needed) substring -3. Legacy serial keys (`serial_number` / `serial`) if present (exact then substring) -4. Fallback to `index` +1. If `device_id` starts with `serial:`, match by exact serial number, then (if needed) substring +1. Legacy serial keys (`serial_number` / `serial`) if present (exact then substring) +1. Fallback to `index` If a serial substring matches **multiple** cameras, an “ambiguous” error is raised. @@ -274,7 +279,7 @@ If a serial substring matches **multiple** cameras, an “ambiguous” error is The backend updates `settings.index` to the selected device’s current index to improve UI stability. ``` ---- +______________________________________________________________________ ### Automated rebind (index changes, reconnects) @@ -288,9 +293,9 @@ When the UI restarts (or devices re-enumerate), the backend can **rebind setting Matching strategy: 1. Exact match on computed `device_id` -2. Fallback: treat stored value as a serial-like substring and match the first serial containing it +1. Fallback: treat stored value as a serial-like substring and match the first serial containing it ---- +______________________________________________________________________ ## Camera settings @@ -302,7 +307,7 @@ These settings are shared across backends and configurable in the GUI: - `exposure` (float): exposure time; `<= 0` means do not set - `gain` (float): gain value; `<= 0` means do not set ---- +______________________________________________________________________ ## Full properties and advanced configuration @@ -341,7 +346,7 @@ Probe / telemetry: - `cti_files_loaded` (list[string]): populated automatically after open - `cti_files_failed` (list[object]): populated automatically after open; each entry has `cti` and `error` ---- +______________________________________________________________________ ### Pixel format @@ -355,7 +360,7 @@ Frames are normalized to **BGR (8-bit)**: - `RGB8` is converted to BGR - Higher bit-depth images are scaled to 8-bit based on the frame’s max value (per frame) ---- +______________________________________________________________________ ### Exposure and gain @@ -370,7 +375,7 @@ Best-effort behavior (depends on producer + camera GenApi implementation): If nodes are missing or read-only, the backend logs a warning and continues. ---- +______________________________________________________________________ ### Frame rate (FPS) @@ -385,7 +390,7 @@ If `fps` is set to a non-zero value: The backend also tries to read back `ResultingFrameRate` for GUI telemetry (`actual_fps`). ---- +______________________________________________________________________ ### Resolution handling @@ -397,7 +402,7 @@ Resolution is applied **only when explicitly requested** (either `width+height`, If no resolution is specified, the device’s current/default configuration is preserved. ---- +______________________________________________________________________ ### Streaming and probe mode @@ -414,7 +419,7 @@ If `properties.gentl.fast_start` is `true`: This is intended for capability probing and faster startup of probe workers. ---- +______________________________________________________________________ ## Troubleshooting @@ -457,7 +462,7 @@ If you pinned CTIs as a user override and paths no longer exist, `open()` will f - Inspect available formats via vendor tools or by checking `PixelFormat.symbolics` - Try a simpler format such as `Mono8` ---- +______________________________________________________________________ ## Example configuration @@ -483,7 +488,7 @@ If you pinned CTIs as a user override and paths no longer exist, `open()` will f } ``` ---- +______________________________________________________________________ ## Resources diff --git a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend.md b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend.md index df58205f5b..18b0d7cbf9 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-opencv-backend)= + # OpenCV backend The OpenCV backend provides camera support via `cv2.VideoCapture`. @@ -15,7 +17,7 @@ Due to lack of standardization across OpenCV backends, exposure and gain control **Other settings may not always behave as expected due to driver and backend limitations.** ``` ---- +______________________________________________________________________ ## Features & design @@ -32,7 +34,7 @@ Due to lack of standardization across OpenCV backends, exposure and gain control - Mismatch handling is configurable (warn/strict/accept). - Optional MJPG (Windows) and explicit FOURCC requests. ---- +______________________________________________________________________ ## Dependencies information @@ -41,7 +43,7 @@ as part of the core DeepLabCut-Live-GUI package, so **no additional installation `cv2-enumerate-cameras` is also installed by default to provide camera enumeration support for this backend and make device selection more robust. ---- +______________________________________________________________________ ## Basic configuration @@ -64,7 +66,7 @@ Notes: - If `width`/`height` are omitted or set to `0`, the backend keeps the camera’s default mode. - OpenCV may ignore FPS and resolution requests depending on driver/backend. ---- +______________________________________________________________________ ## Camera selection configuration @@ -107,11 +109,11 @@ Example: Selection priority in `open()`: 1. `properties.opencv.device_id` (stable ID) -2. `properties.opencv.device_name` (substring match) -3. `properties.opencv.device_vid` + `device_pid` -4. `index` fallback +1. `properties.opencv.device_name` (substring match) +1. `properties.opencv.device_vid` + `device_pid` +1. `index` fallback ---- +______________________________________________________________________ ## Advanced configuration @@ -165,7 +167,7 @@ Codec policy: - `fourcc` (string | null): explicit FOURCC request, overrides `prefer_mjpg`. - Examples: `MJPG`, `YUY2`, `NV12`, `H264`, `XRGB`, `BGR3` ---- +______________________________________________________________________ ### Resolution and FPS behavior @@ -183,7 +185,7 @@ Codec policy: - If `fps > 0`, the backend attempts to set `CAP_PROP_FPS` best-effort. - Many drivers return `0.0` for FPS even when streaming successfully; this is normal for some OpenCV backends. ---- +______________________________________________________________________ ### Device discovery and rebind @@ -204,7 +206,7 @@ If enumeration is not available, `discover_devices()` returns `None` so the fact If `properties.opencv.device_id` (or VID/PID/name) exists, `rebind_settings()` attempts to map the saved identity to the current index and refresh stored fields. ---- +______________________________________________________________________ ## Troubleshooting @@ -228,7 +230,6 @@ Try: } ``` - ### Slow open on Windows (MSMF) If MSMF is selected and opening is slow, consider setting: @@ -249,6 +250,7 @@ If you request a resolution that the driver cannot apply, you may see warnings. On Windows, MJPG can reduce USB bandwidth and improve FPS for some webcams. - Enable MJPG attempt: + ```json { "camera": { @@ -261,6 +263,7 @@ On Windows, MJPG can reduce USB bandwidth and improve FPS for some webcams. ``` - Or force a specific FOURCC: + ```json { "camera": { @@ -272,7 +275,7 @@ On Windows, MJPG can reduce USB bandwidth and improve FPS for some webcams. } ``` ---- +______________________________________________________________________ ## Example configuration @@ -299,7 +302,7 @@ On Windows, MJPG can reduce USB bandwidth and improve FPS for some webcams. } ``` ---- +______________________________________________________________________ ## Notes and limitations diff --git a/docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md b/docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md index 40f8fa7d00..6ebe0d0a81 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md @@ -3,6 +3,7 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + # Additional resources In this section, you can find additional resources related to the GUI and DLC-live, including: diff --git a/docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md b/docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md index 1cd04b34d9..9a64875687 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-pretrained-models)= + # Pre-trained models This page explains how to programmatically download and export **pre-trained, GUI-compatible** models from the DeepLabCut Model Zoo using the `dlclive.modelzoo` API, and convert them for use in DLC-live and by extension, the GUI. @@ -25,7 +27,7 @@ The example below is intended for the PyTorch engine. If you are using **TensorFlow models**, you will typically point the GUI to a DLC model *.pb file* instead of a model *.pth/.pt file*. ``` ---- +______________________________________________________________________ ## Quick start @@ -65,10 +67,10 @@ assert TORCH_CONFIG["checkpoint"].exists(), "Export failed" What this does: 1. Creates the destination directory if needed. -2. Downloads the correct model snapshot (weights) for the specified `super_animal` + `model_name`. -3. Writes a **single `.pt` export file** containing the model config and weights. +1. Downloads the correct model snapshot (weights) for the specified `super_animal` + `model_name`. +1. Writes a **single `.pt` export file** containing the model config and weights. ---- +______________________________________________________________________ ## API reference @@ -84,7 +86,7 @@ Behavior: - If `export_path` already exists, the function **skips** exporting (and emits a warning). - If `detector_name` is provided, it downloads and exports a top-down model with the detector weights as well. ---- +______________________________________________________________________ ## What gets saved in the exported `.pt` @@ -117,7 +119,7 @@ export_modelzoo_model( print(f"Exported model zoo checkpoint to: {export_path}") ``` ---- +______________________________________________________________________ ## In the future diff --git a/docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md b/docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md index e7aed2612e..edd0ff9c21 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md @@ -3,7 +3,9 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + (file:dlclivegui-timestamp-format)= + # Video timestamp format When recording videos, the application automatically saves frame timestamps to a JSON file alongside the video file. @@ -17,7 +19,6 @@ please refer to the {ref}`sec:dlclivegui-recording-paths-info` section. For a video file named `recording_2025-10-23_143052.mp4`, the timestamp file will be: - ``` recording_2025-10-23_143052.mp4_timestamps.json ``` diff --git a/docs/dlc-live/dlc-live-gui/user_guide/overview.md b/docs/dlc-live/dlc-live-gui/user_guide/overview.md index 521b872dda..e94186a47d 100644 --- a/docs/dlc-live/dlc-live-gui/user_guide/overview.md +++ b/docs/dlc-live/dlc-live-gui/user_guide/overview.md @@ -3,13 +3,14 @@ deeplabcut: last_metadata_updated: '2026-03-17' ignore: false --- + # GUI overview DeepLabCut-live-GUI (`dlclivegui`) is a **PySide6-based desktop application** for running real-time DeepLabCut pose estimation experiments with **one or multiple cameras**, optional **processor plugins**, and **video recording** (with or without overlays). This page gives you a **guided tour of the main window**, explains the **core workflow**, and introduces the key concepts used throughout the user guide. ---- +______________________________________________________________________ ## Main window at a glance @@ -23,15 +24,15 @@ When you first launch the application, you will see the main window with three p - A **Video panel** (right) showing the live preview (single or tiled multi-camera) - A **Stats area** (below the video) summarizing camera, inference, and recorder performance -:::{figure} ../_static/images/main_window_100226.png +:::\{figure} ../\_static/images/main_window_100226.png :alt: Screenshot of the main window :width: 100% :align: center - The main window on startup, showing the Controls panel (left), Video panel (right), and Stats area (below video). +The main window on startup, showing the Controls panel (left), Video panel (right), and Stats area (below video). ::: ---- +______________________________________________________________________ ## Intended workflow @@ -41,23 +42,30 @@ as well as pick a model for pose inference. To start running an experiment, the typical workflow is: 1. **Configure Cameras** + - Use **Configure Cameras…** to select one or more cameras and their parameters. - See {ref}`file:dlclivegui-camera-support` for details on supported camera backends and troubleshooting. -2. **Start Preview** +1. **Start Preview** + - Click **Start Preview** to begin streaming all selected configured cameras. - If multiple cameras are active, the preview becomes a **tiled view**. -3. **Start Pose Inference** *(when ready)* +1. **Start Pose Inference** *(when ready)* + - Choose a **Model file**, optionally a DLC-live **Processor**[^processor-footnote], select the **Inference Camera**, then click **Start pose inference**. + + - Toggle **Display pose predictions** to show or hide pose estimation overlays. -4. **Start Recording** *(when ready)* +1. **Start Recording** *(when ready)* + - Choose an **Output directory**, session/run naming options, and encoding settings, then click **Start recording**. - Recording includes **all active cameras** in multi-camera mode in separate files. -5. **Stop** +1. **Stop** + - Use **Stop Preview**, **Stop pose inference**, and/or **Stop recording** as needed. ```{note} @@ -66,7 +74,7 @@ Pose inference requires the camera preview to be running. If you start pose inference while the preview is stopped, the GUI will automatically start the preview first. ``` ---- +______________________________________________________________________ ## Main control panel @@ -104,7 +112,7 @@ In multi-camera mode, pose inference runs on **one selected camera at a time** ( even though preview and recording may include multiple cameras. ``` ---- +______________________________________________________________________ ### DLCLive settings @@ -129,6 +137,7 @@ Find more information here if needed: {ref}`deeplabcut-live`. - **Start pose inference / Stop pose inference** The button indicates inference state: + - *Initializing DLCLive!* → Model loading - *DLCLive running!* → Inference active @@ -138,7 +147,7 @@ Find more information here if needed: {ref}`deeplabcut-live`. - **Processor Status** Displays processor-specific status information when available. ---- +______________________________________________________________________ ### Recording @@ -150,6 +159,7 @@ See {ref}`file:dlclivegui-timestamp-format` for details. ``` (sec:dlclivegui-recording-paths-info)= + #### Recording output options - **Output directory**: Base directory for all recordings @@ -179,7 +189,7 @@ You can hover over the preview path to see the full path, and click to copy it t - **Record video with overlays** Include pose predictions and/or bounding boxes directly in the recorded video. - :::{danger} + :::\{danger} This **cannot be easily undone** once the recording is saved. Use with caution if you want to preserve **raw footage** intact. @@ -195,7 +205,6 @@ Frame size must remain constant for a recording session. If the recorder is conf - Stop the recorder and start a new recording after fixing the frame size ``` - ```{note} Frames are converted automatically for encoding: @@ -204,7 +213,7 @@ Frames are converted automatically for encoding: - Frames are made contiguous in memory before being passed to the encoder. ``` ---- +______________________________________________________________________ ### Visualization settings @@ -222,7 +231,7 @@ To adjust the bounding box intuitively, hover over a coordinate field (`x0`, `y0 and drag horizontally. ``` ---- +______________________________________________________________________ ## Video Panel and Stats @@ -244,7 +253,7 @@ Three continuously updated sections: Stats text can be selected and copied directly from the GUI ``` ---- +______________________________________________________________________ ## Menu bar actions @@ -287,7 +296,7 @@ Configuration files store camera configurations, model paths, recording options, - **Ctrl+Shift+S**: Save configuration as... - **Ctrl+Q**: Quit application ---- +______________________________________________________________________ ## Configuration and Persistence diff --git a/docs/docker.md b/docs/docker.md index a2d539b1c0..2ce3a2c59f 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -57,7 +57,7 @@ $ deeplabcut-docker bash If you have GPUs on your machine and want to use them to train models, you need to pass the `--gpus all` argument to `deeplabcut-docker`: -``` bash +```bash $ deeplabcut-docker bash --gpus all ``` ```` diff --git a/docs/intro.md b/docs/intro.md index cab6f4b183..c731cba264 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -4,4 +4,5 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + Please see the main [READ ME!](https://deeplabcut.github.io/DeepLabCut/README.html) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 4e79c41358..99641a59b1 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -8,7 +8,9 @@ deeplabcut: recommendation: verify notes: Could use a small formatting pass. Contents are 4-5y old in some places, recommend to review for accuracy. --- + (multi-animal-userguide)= + # DeepLabCut for Multi-Animal Projects This document should serve as the user guide for maDLC, @@ -16,17 +18,18 @@ and it is here to support the scientific advances presented in [Lauer et al. 202 Note, we strongly encourage you to use the [Project Manager GUI](project-manager-gui) when you first start using multi-animal mode. Each tab is customized for multi-animal when you create or load a multi-animal project. As long as you follow the recommendations within the GUI, you should be good to go! -````{versionadded} 3.0.0 +```{versionadded} 3.0.0 PyTorch is now available as a deep learning engine for pose estimation models, along with new model architectures! For more information about moving from TensorFlow to PyTorch (if you're already familiar with DeepLabCut & the TensorFlow engine), check out [the PyTorch user guide](dlc3-user-guide). If you're just starting out with DeepLabCut, we suggest you use the PyTorch backend. -```` +``` ## How to think about using maDLC: You should think of maDLC being **four** parts. + - (1) Curate annotation data that allows you to learn a model to track the objects/animals of interest. - (2) Create a high-quality pose estimation model. - (3) Track in space and time, i.e., assemble bodyparts to detected objects/animals and link across time. This step performs assembly and tracking (comprising first local tracking and then tracklet stitching by global reasoning). @@ -52,9 +55,11 @@ Then follow the tabs! It might be useful to read the following, however, so you ```{Hint} 🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ``` - Please read more [here](https://deeplabcut.github.io/DeepLabCut/docs/docker.html), and in our Nature Protocols paper [here](https://www.nature.com/articles/s41596-019-0176-0). And, see our [troubleshooting wiki](https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips). -Open an ``ipython`` session and import the package by typing in the terminal: +Please read more [here](https://deeplabcut.github.io/DeepLabCut/docs/docker.html), and in our Nature Protocols paper [here](https://www.nature.com/articles/s41596-019-0176-0). And, see our [troubleshooting wiki](https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips). + +Open an `ipython` session and import the package by typing in the terminal: + ```python ipython import deeplabcut @@ -76,17 +81,19 @@ deeplabcut.create_new_project( ) ``` -Tip: if you want to place the project folder somewhere specific, please also pass : ``working_directory = "FullPathOftheworkingDirectory"`` +Tip: if you want to place the project folder somewhere specific, please also pass : `working_directory = "FullPathOftheworkingDirectory"` + +- Note, if you are a linux/macOS user the path should look like: `["/home/username/yourFolder/video1.mp4"]`; if you are a Windows user, it should look like: `[r"C:\username\yourFolder\video1.mp4"]` +- Note, you can also put `config_path = ` in front of the above line to create the path to the config.yaml that is used in the next step, i.e. `config_path=deeplabcut.create_project(...)`) + - If you do not, we recommend setting a variable so this can be easily used! Once you run this step, the config_path is printed for you once you run this line, so set a variable for ease of use, i.e. something like: -- Note, if you are a linux/macOS user the path should look like: ``["/home/username/yourFolder/video1.mp4"]``; if you are a Windows user, it should look like: ``[r"C:\username\yourFolder\video1.mp4"]`` -- Note, you can also put ``config_path = `` in front of the above line to create the path to the config.yaml that is used in the next step, i.e. ``config_path=deeplabcut.create_project(...)``) - - If you do not, we recommend setting a variable so this can be easily used! Once you run this step, the config_path is printed for you once you run this line, so set a variable for ease of use, i.e. something like: ```python config_path = '/thefulloutputpath/config.yaml' ``` - - just be mindful of the formatting for Windows vs. Unix, see above. -This set of arguments will create a project directory with the name **Name of the project+name of the experimenter+date of creation of the project** in the **Working directory** and creates the symbolic links to videos in the **videos** directory. The project directory will have subdirectories: **dlc-models**, **dlc-models-pytorch**, **labeled-data**, **training-datasets**, and **videos**. All the outputs generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be curated in separation from other projects. The purpose of the subdirectories is as follows: +- just be mindful of the formatting for Windows vs. Unix, see above. + +This set of arguments will create a project directory with the name **Name of the project+name of the experimenter+date of creation of the project** in the **Working directory** and creates the symbolic links to videos in the **videos** directory. The project directory will have subdirectories: **dlc-models**, **dlc-models-pytorch**, **labeled-data**, **training-datasets**, and **videos**. All the outputs generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be curated in separation from other projects. The purpose of the subdirectories is as follows: **dlc-models** and **dlc-models-pytorch** have a similar structure: the first contains files for the TensorFlow engine while the second contains files for the PyTorch engine. @@ -103,9 +110,9 @@ saved checkpoint, in case the training was interrupted. **labeled-data:** This directory will store the frames used to create the training dataset. Frames from different videos are stored in separate subdirectories. Each frame has a filename related to the temporal index within the corresponding video, which allows the user to trace every frame back to its origin. -**training-datasets:** This directory will contain the training dataset used to train the network and metadata, which contains information about how the training dataset was created. +**training-datasets:** This directory will contain the training dataset used to train the network and metadata, which contains information about how the training dataset was created. -**videos:** Directory of video links or videos. When **copy\_videos** is set to ``False``, this directory contains symbolic links to the videos. If it is set to ``True`` then the videos will be copied to this directory. The default is ``False``. Additionally, if the user wants to add new videos to the project at any stage, the function **add\_new\_videos** can be used. This will update the list of videos in the project's configuration file. Note: you neither need to use this folder for videos, nor is it required for analyzing videos (they can be anywhere). +**videos:** Directory of video links or videos. When **copy_videos** is set to `False`, this directory contains symbolic links to the videos. If it is set to `True` then the videos will be copied to this directory. The default is `False`. Additionally, if the user wants to add new videos to the project at any stage, the function **add_new_videos** can be used. This will update the list of videos in the project's configuration file. Note: you neither need to use this folder for videos, nor is it required for analyzing videos (they can be anywhere). ```python deeplabcut.add_new_videos( @@ -115,7 +122,7 @@ deeplabcut.add_new_videos( ) ``` -*Please note, *Full path of the project configuration file* will be referenced as ``config_path`` throughout this protocol. +\*Please note, *Full path of the project configuration file* will be referenced as `config_path` throughout this protocol. You can also use annotated data from single-animal projects, by converting those files. There are docs for this: [convert single to multianimal annotation data](convert-maDLC) @@ -123,8 +130,11 @@ There are docs for this: [convert single to multianimal annotation data](convert ![Box 1 - Multi Animal Project Configuration File Glossary](images/box1-multi.png) ### API Docs + ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_new_project.rst ``` @@ -132,7 +142,7 @@ There are docs for this: [convert single to multianimal annotation data](convert ### (B) Configure the Project -Next, open the **config.yaml** file, which was created during **create\_new\_project**. +Next, open the **config.yaml** file, which was created during **create_new_project**. You can edit this file in any text editor. Familiarize yourself with the meaning of the parameters (Box 1). You can edit various parameters, in particular you **must add the list of *individuals* and *bodyparts* (or points of interest)**. @@ -140,7 +150,7 @@ parameters (Box 1). You can edit various parameters, in particular you **must ad You can also set the *colormap* here that is used for all downstream steps (can also be edited at anytime), like labeling GUIs, videos, etc. Here any [matplotlib colormaps](https://matplotlib.org/tutorials/colors/colormaps.html) will do! -An easy way to programmatically edit the config file at any time is to use the function **edit\_config**, which takes the full path of the config file to edit and a dictionary of key–value pairs to overwrite. +An easy way to programmatically edit the config file at any time is to use the function **edit_config**, which takes the full path of the config file to edit and a dictionary of key–value pairs to overwrite. ```python import deeplabcut @@ -181,7 +191,7 @@ identity: True/False **Individuals:** are names of "individuals" in the annotation dataset. These should/can be generic (e.g. mouse1, mouse2, etc.). These individuals are comprised of the same bodyparts defined by `multianimalbodyparts`. For annotation in the GUI and training, it is important that all individuals in each frame are labeled. Thus, keep in mind that you need to set individuals to the maximum number in your labeled-data set, .i.e., if there is (even just one frame) with 17 animals then the list should be `- indv1` to `- indv17`. Note, once trained if you have a video with more or less animals, that is fine - you can have more or less animals during video analysis! -**Identity:** If you can tell the animals apart, i.e., one might have a collar, or a black marker on the tail of a mouse, then you should label these individuals consistently (i.e., always label the mouse with the black marker as "indv1", etc). If you have this scenario, please set `identity: True` in your `config.yaml` file. If you have 4 black mice, and you truly cannot tell them apart, then leave this as `false`. +**Identity:** If you can tell the animals apart, i.e., one might have a collar, or a black marker on the tail of a mouse, then you should label these individuals consistently (i.e., always label the mouse with the black marker as "indv1", etc). If you have this scenario, please set `identity: True` in your `config.yaml` file. If you have 4 black mice, and you truly cannot tell them apart, then leave this as `false`. **Multianimalbodyparts:** are the bodyparts of each individual (in the above list). @@ -248,7 +258,9 @@ directory) that are too similar before reloading the set and then manually annot them. ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.extract_frames.rst ``` @@ -304,7 +316,7 @@ which then also uses temporal information to link across the video frames. Note, we also highly recommend that you use more bodyparts that you might otherwise have (see the example below). -For more information, checkout the [napari-deeplabcut docs](file:napari-gui-landing) for +For more information, checkout the \[napari-deeplabcut docs\](file:napari-gui-landing) for more information about the labelling workflow. ### (E) Check Annotated Frames @@ -315,7 +327,7 @@ is one of the most critical parts for creating the training dataset. The DeepLab ```python deeplabcut.check_labels(config_path, visualizeindividuals=True/False) - ``` +``` **maDeepLabCut:** you can check and plot colors per individual or per body part, just set the flag `visualizeindividuals=True/False`. Note, you can run this twice in both states to see both images. @@ -326,7 +338,9 @@ deeplabcut.check_labels(config_path, visualizeindividuals=True/False) For each video directory in labeled-data this function creates a subdirectory with **labeled** as a suffix. Those directories contain the frames plotted with the annotated body parts. The user can double check if the body parts are labeled correctly. If they are not correct, the user can reload the frames (i.e. `deeplabcut.label_frames`), move them around, and click save again. ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.check_labels.rst ``` @@ -336,8 +350,7 @@ For each video directory in labeled-data this function creates a subdirectory wi At this point, you'll need to select your neural network type. -For the **PyTorch engine**, please see [the PyTorch Model Architectures]( -dlc3-architectures) for options. +For the **PyTorch engine**, please see [the PyTorch Model Architectures](dlc3-architectures) for options. For the **TensorFlow engine**, please see Lauer et al. 2021 for options. Multi-animal models will use `imgaug`, ADAM optimization, our new DLCRNet, and batch training. We @@ -345,8 +358,7 @@ suggest keeping these defaults at this time. At this step, the ImageNet pre-trai networks (i.e. ResNet-50) weights will be downloaded. If they do not download (you will see this downloading in the terminal, then you may not have permission to do so ( something we have seen with some Windows users - see the **[ -WIKI troubleshooting for more help!]( -https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips)**). +WIKI troubleshooting for more help!](https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips)**). Then run: @@ -355,43 +367,41 @@ deeplabcut.create_training_dataset(config_path) ``` - The set of arguments in the function will shuffle the combined labeled dataset and split it to create train and test -sets. The subdirectory with suffix ``iteration#`` under the directory **training-datasets** stores the dataset and meta -information, where the ``#`` is the value of ``iteration`` variable stored in the project’s configuration file (this number -keeps track of how often the dataset was refined). + sets. The subdirectory with suffix `iteration#` under the directory **training-datasets** stores the dataset and meta + information, where the `#` is the value of `iteration` variable stored in the project’s configuration file (this number + keeps track of how often the dataset was refined). - OPTIONAL: If the user wishes to benchmark the performance of the DeepLabCut, they can create multiple -training datasets by specifying an integer value to the `num_shuffles`; see the docstring for more details. + training datasets by specifying an integer value to the `num_shuffles`; see the docstring for more details. - Each iteration of the creation of a training dataset will create several files, which -is used by the feature detectors, and a ``.pickle`` file that contains the meta -information about the training dataset. This also creates two subdirectories within -**dlc-models-pytorch** (**dlc-models** for the TensorFlow engine) called ``test`` and -``train``, and these each have a configuration file called pose_cfg.yaml. Specifically, -the user can edit the **pytorch_config.yaml** (**pose_cfg.yaml** for TensorFlow engine) -within the **train** subdirectory before starting the training. These configuration -files contain meta information with regard to the parameters of the feature detectors. -Key parameters are listed in Box 2. + is used by the feature detectors, and a `.pickle` file that contains the meta + information about the training dataset. This also creates two subdirectories within + **dlc-models-pytorch** (**dlc-models** for the TensorFlow engine) called `test` and + `train`, and these each have a configuration file called pose_cfg.yaml. Specifically, + the user can edit the **pytorch_config.yaml** (**pose_cfg.yaml** for TensorFlow engine) + within the **train** subdirectory before starting the training. These configuration + files contain meta information with regard to the parameters of the feature detectors. + Key parameters are listed in Box 2. **DATA AUGMENTATION:** At this stage you can also decide what type of augmentation to use. Once you've called `create_training_dataset`, you can edit the [**pytorch_config.yaml**](dlc3-pytorch-config) file that was created (or for the -TensorFlow engine, the [**pose_cfg.yaml**]( -https://github.com/DeepLabCut/DeepLabCut/blob/master/deeplabcut/pose_cfg.yaml) file). +TensorFlow engine, the [**pose_cfg.yaml**](https://github.com/DeepLabCut/DeepLabCut/blob/master/deeplabcut/pose_cfg.yaml) file). - PyTorch Engine: [Albumentations](https://albumentations.ai/docs/) is used for data -augmentation. Look at the [**pytorch_config.yaml**](dlc3-pytorch-config) for more -information about image augmentation options. + augmentation. Look at the [**pytorch_config.yaml**](dlc3-pytorch-config) for more + information about image augmentation options. - TensorFlow Engine: The default augmentation works well for most tasks (as shown on -www.deeplabcut.org), but there are many options, more data augmentation, intermediate -supervision, etc. Only `imgaug` augmentation is available for multi-animal projects. + www.deeplabcut.org), but there are many options, more data augmentation, intermediate + supervision, etc. Only `imgaug` augmentation is available for multi-animal projects. -[A Primer on Motion Capture with Deep Learning: Principles, Pitfalls, and Perspectives]( -https://www.cell.com/neuron/pdf/S0896-6273(20)30717-0.pdf), details the advantage of +[A Primer on Motion Capture with Deep Learning: Principles, Pitfalls, and Perspectives](), details the advantage of augmentation for a worked example (see Fig 8). TL;DR: use imgaug and use the symmetries of your data! Importantly, image cropping as previously done with `deeplabcut.cropimagesandlabels` in multi-animal projects -is now part of the augmentation pipeline. In other words, image crops are no longer stored in labeled-data/..._cropped +is now part of the augmentation pipeline. In other words, image crops are no longer stored in labeled-data/...\_cropped folders. Crop size still defaults to (400, 400); if your images are very large (e.g. 2k, 4k pixels), consider increasing the crop size, but be aware unless you have a strong GPU (24 GB memory or more), you will hit memory errors. You can lower the batch size, but this may affect performance. In addition, one can specify a crop sampling strategy: crop centers can either be taken at random over the image (`uniform`) or the annotated keypoints (`keypoints`); with a focus on regions of the scene with high body part density (`density`); last, combining `uniform` and `density` for a `hybrid` balanced strategy (this is the default strategy). Note that both parameters can be easily edited prior to training in the **pose_cfg.yaml** configuration file. @@ -424,21 +434,27 @@ deeplabcut.create_training_dataset_from_existing_split( ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_dataset -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_dataset.rst ``` ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_model_comparison -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_model_comparison.rst ``` ```` ````{admonition} Click the button to see API Docs for deeplabcut.create_training_dataset_from_existing_split -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_training_dataset_from_existing_split.rst ``` @@ -459,8 +475,9 @@ At user specified iterations during training checkpoints are stored in the subdi *train* under the respective iteration & shuffle directory. ````{admonition} Tips on training models with the PyTorch Engine -:class: dropdown - +--- +class: dropdown +--- Example parameters that one can call: ```python @@ -502,8 +519,9 @@ and how often the weights are stored. We suggest saving every 5 to 25 epochs. ```` ````{admonition} Tips on training models with the TensorFlow Engine -:class: dropdown - +--- +class: dropdown +--- Example parameters that one can call: ```python @@ -552,7 +570,9 @@ data. The bonus, training time is much less!!! ```` ````{admonition} Click the button to see API Docs for train_network -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.train_network.rst ``` @@ -564,22 +584,23 @@ It is important to evaluate the performance of the trained network. This perform measured by computing two metrics: - **Average root mean square error** (RMSE) between the manual labels and the ones -predicted by your trained DeepLabCut model. The RMSE is proportional to the mean average -Euclidean error (MAE) between the manual labels and the ones predicted by DeepLabCut. -The MAE is displayed for all pairs and only likely pairs (>p-cutoff). This helps to -exclude, for example, occluded body parts. One of the strengths of DeepLabCut is that -due to the probabilistic output of the scoremap, it can, if sufficiently trained, also -reliably report if a body part is visible in a given frame. (see discussions of finger -tips in reaching and the Drosophila legs during 3D behavior in [Mathis et al, 2018]). + predicted by your trained DeepLabCut model. The RMSE is proportional to the mean average + Euclidean error (MAE) between the manual labels and the ones predicted by DeepLabCut. + The MAE is displayed for all pairs and only likely pairs (>p-cutoff). This helps to + exclude, for example, occluded body parts. One of the strengths of DeepLabCut is that + due to the probabilistic output of the scoremap, it can, if sufficiently trained, also + reliably report if a body part is visible in a given frame. (see discussions of finger + tips in reaching and the Drosophila legs during 3D behavior in [Mathis et al, 2018]). - **Mean Average Precision** (mAP) and **Mean Average Recall** (mAR) for the individuals -predicted by your trained DeepLabCut model. This metric describes the precision of your -model, based on a considered definition of what a correct detection of an individual is. -It isn't as useful for single-animal models, as RMSE does a great job of evaluating your -model in that case. + predicted by your trained DeepLabCut model. This metric describes the precision of your + model, based on a considered definition of what a correct detection of an individual is. + It isn't as useful for single-animal models, as RMSE does a great job of evaluating your + model in that case. ```{admonition} A more detailed description of mAP and mAR -:class: dropdown - +--- +class: dropdown +--- For multi-animal pose estimation, multiple predictions can be made for each image. We want to get some idea of the proportion of correct predictions among all predictions that are made. @@ -610,7 +631,7 @@ deeplabcut.evaluate_network(config_path, Shuffles=[1], plotting=True) 🎥 [VIDEO TUTORIAL AVAILABLE!](https://www.youtube.com/watch?v=bgfnz1wtlpo) -Setting ``plotting`` to True plots all the testing and training frames with the manual and predicted labels; these will +Setting `plotting` to True plots all the testing and training frames with the manual and predicted labels; these will be colored by body part type by default. They can alternatively be colored by individual by passing `plotting="individual"`. The user should visually check the labeled test (and training) images that are created in the ‘evaluation-results’ directory. Ideally, DeepLabCut labeled unseen (test images) according to the user’s required accuracy, and the average train @@ -621,34 +642,35 @@ also be larger than the training error due to human variability (in labeling, se **Optional parameters:** - `Shuffles: list, optional` - List of integers specifying the shuffle indices of the training dataset. -The default is [1] + The default is [1] - `plotting: bool | str, optional` - Plots the predictions on the train and test images. The default is `False`; -if provided it must be either `True`, `False`, `"bodypart"`, or `"individual"`. + if provided it must be either `True`, `False`, `"bodypart"`, or `"individual"`. - `show_errors: bool, optional` - Display train and test errors. The default is `True` - `comparisonbodyparts: list of bodyparts, Default is all` - The average error will be computed for those body parts -only (Has to be a subset of the body parts). + only (Has to be a subset of the body parts). - `gputouse: int, optional` - Natural number indicating the number of your GPU (see number in nvidia-smi). If you do not -have a GPU, put None. See: https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries + have a GPU, put None. See: https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries - `pcutoff: float | list[float] | dict[str, float], optional` -(Only applicable when using the PyTorch engine. For TensorFlow, set `pcutoff` in the `config.yaml` file.) -Specifies the cutoff value(s) used to compute evaluation metrics. + (Only applicable when using the PyTorch engine. For TensorFlow, set `pcutoff` in the `config.yaml` file.) + Specifies the cutoff value(s) used to compute evaluation metrics. + - If `None` (default), the cutoff will be loaded from the project configuration. - To apply a single cutoff value to all bodyparts, provide a `float`. - To specify different cutoffs per bodypart, provide either: - A `list[float]`: one value per bodypart, with an additional value for each unique bodypart if applicable. - A `dict[str, float]`: where keys are bodypart names and values are the corresponding cutoff values. -If a bodypart is not included in the provided dictionary, a default `pcutoff` of `0.6` will be used for that bodypart. + If a bodypart is not included in the provided dictionary, a default `pcutoff` of `0.6` will be used for that bodypart. The plots can be customized by editing the **config.yaml** file (i.e., the colormap, scale, marker size (dotsize), and transparency of labels (alpha-value) can be modified). By default each body part is plotted in a different color (governed by the colormap) and the plot labels indicate their source. Note that by default the human labels are plotted as plus (‘+’), DeepLabCut’s predictions either as ‘.’ (for confident predictions with likelihood > `pcutoff`) and -’x’ for (likelihood <= `pcutoff`). +’x’ for (likelihood \<= `pcutoff`). The evaluation results for each shuffle of the training dataset are stored in a unique subdirectory in a newly created directory ‘evaluation-results-pytorch’ (or @@ -666,7 +688,9 @@ and the points of interest are labeled accurately • consider labeling additional images and make another iteration of the training data set ````{admonition} Click the button to see API Docs for evaluate_network -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.evaluate_network.rst ``` @@ -689,7 +713,7 @@ You can drop "Indices" to run this on all training/testing images (this is very ### (I) Analyze new Videos -````{versionadded} 3.0.0 +```{versionadded} 3.0.0 With the addition of conditional top-down models in DeepLabCut 3.0, it's now possible to track individuals directly **during video analysis**. If you choose to train any model with a name that starts with `ctd_`, you'll be able to call `deeplabcut.analyze_videos` @@ -697,7 +721,7 @@ with `ctd_tracking=True`. To learn more about tracking with CTD, see the [ `COLAB_BUCTD_and_CTD_tracking`]( https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_BUCTD_and_CTD_tracking.ipynb) COLAB notebook. -```` +``` **-------------------- DECISION POINT -------------------** @@ -737,9 +761,10 @@ are far apart for most edges), then go forward!!! If this does not look good, we recommend extracting and labeling more frames (even from more videos). Try to label close interactions of animals for best performance. Once you label more, you can create a new training set and train. You can either: + 1. extract more frames manually from existing or new videos and label as when initially building the training data set, or -2. let DeepLabCut find frames where keypoints were poorly detected and automatically extract those for you. All you need is -to run: +1. let DeepLabCut find frames where keypoints were poorly detected and automatically extract those for you. All you need is + to run: ```python deeplabcut.find_outliers_in_raw_data(config_path, pickle_file, video_file) @@ -748,21 +773,21 @@ deeplabcut.find_outliers_in_raw_data(config_path, pickle_file, video_file) where pickle_file is the `_full.pickle` one obtains after video analysis. Flagged frames will be added to your collection of images in the corresponding labeled-data folders for you to label. - ### Animal Assembly and Tracking across frames After pose estimation, now you perform assembly and tracking. -````{versionadded} v2.2.0 +```{versionadded} v2.2.0 *NEW* in 2.2 is a novel data-driven way to set the optimal skeleton and assembly metrics, so this no longer requires user input. The metrics, in case you do want to edit them, can be found in the `inference_cfg.yaml` file. -```` +``` ### Optimized Animal Assembly + Video Analysis: + Please note that **novel videos DO NOT need to be added to the config.yaml file**. You can simply have a folder elsewhere on your computer and pass the video folder (then it -will analyze all videos of the specified type (i.e. ``videotype='.mp4'``), or pass the +will analyze all videos of the specified type (i.e. `videotype='.mp4'`), or pass the path to the **folder** or exact video(s) you wish to analyze: ```python @@ -800,29 +825,27 @@ max_age: 100 min_hits: 3 ``` - - **IMPORTANT POINT FOR SUPERVISED IDENTITY TRACKING** +- **IMPORTANT POINT FOR SUPERVISED IDENTITY TRACKING** - If the network has been trained to learn the animals' identities (i.e., you set `identity=True` in config.yaml before training) this information can be leveraged both during: (i) animal assembly, where body parts are grouped based on the animal they are predicted to belong to (affinity between pairs of keypoints is no longer considered in that case); and (ii) animal tracking, where identity only can be utilized in place of motion trackers to form tracklets. + If the network has been trained to learn the animals' identities (i.e., you set `identity=True` in config.yaml before training) this information can be leveraged both during: (i) animal assembly, where body parts are grouped based on the animal they are predicted to belong to (affinity between pairs of keypoints is no longer considered in that case); and (ii) animal tracking, where identity only can be utilized in place of motion trackers to form tracklets. To use this ID information, simply pass: + ```python deeplabcut.convert_detections2tracklets(..., identity_only=True) ``` - **Note:** If only one individual is to be assembled and tracked, assembly and tracking are skipped, and detections are treated as in single-animal projects; i.e., it is the keypoints with highest confidence that are kept and accumulated over frames to form a single, long tracklet. No action is required from users, this is done automatically. - **Animal assembly and tracking quality** can be assessed via `deeplabcut.utils.make_labeled_video.create_video_from_pickled_tracks`. This function provides an additional diagnostic tool before moving on to refining tracklets. - If animal assemblies do not look pretty, an alternative to the outlier search described above is to pass the `_assemblies.pickle` to `find_outliers_in_raw_data` in place of the `_full.pickle`. This will focus the outlier search on unusual assemblies (i.e., animal skeletons that were oddly reconstructed). This may be a bit more sensitive with crowded scenes or frames where animals interact closely. Note though that at that stage it is likely preferable anyway to carry on with the remaining steps, and extract outliers from the final h5 file as was customary in single animal projects. - -**Next, tracklets are stitched to form complete tracks with: +\*\*Next, tracklets are stitched to form complete tracks with: ```python deeplabcut.stitch_tracklets( @@ -848,21 +871,27 @@ In such cases, file columns will default to dummy animal names (ind1, ind2, ..., ### API Docs ````{admonition} Click the button to see API Docs for analyze_videos -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.analyze_videos.rst ``` ```` ````{admonition} Click the button to see API Docs for convert_detections2tracklets -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.convert_detections2tracklets.rst ``` ```` ````{admonition} Click the button to see API Docs for stitch_tracklets -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.stitch_tracklets.rst ``` @@ -892,14 +921,15 @@ If you use the GUI (or otherwise), here are some settings to consider: maDLC -*note, setting `max_gap=0` can be used to fill in all frames across the video; otherwise, 1-n is the # of frames you want to fill in, i.e. maybe you want to fill in short gaps of 5 frames, but 15 frames indicates another issue, etc. You can test this in the GUI very easy by editing the value and then re-launch pop-up GUI. +\*note, setting `max_gap=0` can be used to fill in all frames across the video; otherwise, 1-n is the # of frames you want to fill in, i.e. maybe you want to fill in short gaps of 5 frames, but 15 frames indicates another issue, etc. You can test this in the GUI very easy by editing the value and then re-launch pop-up GUI. If you fill in gaps, they will be associated to an ultra low probability, 0.01, so you are aware this is not the networks best estimate, this is the human-override! Thus, if you create a video, you need to set your pcutoff to 0 if you want to see these filled in frames. [Read more here!](functionDetails.md#madeeplabcut-critical-point---assemble--refine-tracklets) Short demo: -

+ +

@@ -908,13 +938,17 @@ Short demo: Firstly, Here are some tips for scaling up your video analysis, including looping over many folders for batch processing: https://github.com/DeepLabCut/DeepLabCut/wiki/Batch-Processing-your-Analysis You can also filter the predicted bodyparts by: + ```python deeplabcut.filterpredictions(config_path,['/fullpath/project/videos/reachingvideo1.avi']) ``` -Note, this creates a file with the ending filtered.h5 that you can use for further analysis. This filtering step has many parameters, so please see the full docstring by typing: ``deeplabcut.filterpredictions?`` + +Note, this creates a file with the ending filtered.h5 that you can use for further analysis. This filtering step has many parameters, so please see the full docstring by typing: `deeplabcut.filterpredictions?` ````{admonition} Click the button to see API Docs -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.filterpredictions.rst ``` @@ -924,31 +958,37 @@ Note, this creates a file with the ending filtered.h5 that you can use for furth - **NOTE :bulb::mega::** Before you create a video, you should set what threshold to use for plotting. This is set in the `config.yaml` file as `pcutoff` - if you have a well trained network, this should be high, i.e. set it to `0.8` or higher! IF YOU FILLED IN GAPS, you need to set this to `0` to "see" the filled in parts. - - You can also determine a good `pcutoff` value by looking at the likelihood plot created during `plot_trajectories`: Plot the outputs: + ```python deeplabcut.plot_trajectories(config_path,['/fullpath/project/videos/reachingvideo1.avi'],filtered = True) ``` Create videos: + ```python deeplabcut.create_labeled_video(config_path, [videos], videotype='avi', shuffle=1, trainingsetindex=0, filtered=False, fastmode=True, save_frames=False, keypoints_only=False, Frames2plot=None, displayedbodyparts='all', displayedindividuals='all', codec='mp4v', outputframerate=None, destfolder=None, draw_skeleton=False, trailpoints=0, displaycropped=False, color_by='bodypart', track_method='') ``` + - **NOTE :bulb::mega::** You have a lot of options in terms of video plotting (quality, display type, etc). We recommend checking the docstring! (more details [here](functionDetails.md#i-video-analysis-and-plotting-results)) ````{admonition} Click the button to see API Docs for plot_trajectories -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.plot_trajectories.rst ``` ```` ````{admonition} Click the button to see API Docs for create_labeled_video -:class: dropdown +--- +class: dropdown +--- ```{eval-rst} .. include:: ./api/deeplabcut.create_labeled_video.rst ``` @@ -977,13 +1017,16 @@ help(deeplabcut.nameofthefunction) You can always exit an conda environment and easily jump back into a project by simply: Linux/MacOS formatting example: + ``` source activate yourdeeplabcutEnvName ipython or pythonw import deeplabcut config_path ='/home/yourprojectfolder/config.yaml' ``` + Windows formatting example: + ``` activate yourdeeplabcutEnvName ipython @@ -995,13 +1038,13 @@ Now, you can run any of the functions described in this documentation. # Getting help with maDLC: -- If you have a detailed question about how to use the code, or you hit errors that are not "bugs" but you want code assistance, please post on the [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) +- If you have a detailed question about how to use the code, or you hit errors that are not "bugs" but you want code assistance, please post on the [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) - If you have a quick, short question that fits a "chat" format: -[![Gitter](https://badges.gitter.im/DeepLabCut/community.svg)](https://gitter.im/DeepLabCut/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + [![Gitter](https://badges.gitter.im/DeepLabCut/community.svg)](https://gitter.im/DeepLabCut/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - If you want to share some results, or see others: -[![Twitter Follow](https://img.shields.io/twitter/follow/DeepLabCut.svg?label=DeepLabCut&style=social)](https://x.com/DeepLabCut) + [![Twitter Follow](https://img.shields.io/twitter/follow/DeepLabCut.svg?label=DeepLabCut&style=social)](https://x.com/DeepLabCut) - If you have a code bug report, please create an issue and show the minimal code to reproduce the error: https://github.com/DeepLabCut/DeepLabCut/issues diff --git a/docs/pytorch/Benchmarking_shuffle_guide.md b/docs/pytorch/Benchmarking_shuffle_guide.md index 81802cf164..42f93777a6 100644 --- a/docs/pytorch/Benchmarking_shuffle_guide.md +++ b/docs/pytorch/Benchmarking_shuffle_guide.md @@ -6,8 +6,9 @@ deeplabcut: visibility: online status: viable recommendation: move - notes: "Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends." + notes: Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends. --- + # DeepLabCut Benchmarking - User Guide ## Reasoning for benchmarking models in DLC (across DLC versions and architectures) @@ -52,45 +53,59 @@ dlc-project ### Creating a shuffle Creating a new shuffle with the same train/test split as an existing one: + ### In the DeepLabCut GUI + 1. Front page > Load project > Open project folder > choose *config.yaml* -2. Select *'Create training dataset'* tab -3. Tick *Use an existing data split* option - - ![create_from_existing]() -4. Click 'View existing shuffles': - - This is used to view the indices of shuffles created for a project to determine which index is available to assign to a new shuffle. - - The elements described in this window are: - - train_fraction: The fraction of the dataset used for training. - - index: The index of the shuffle. - - split: The data split for the shuffle. The integer value on its own does not -hold any meaning, but this "split" value indicates which shuffles have the same split -(as their results can then be compared) - - engine: Whether it is a PyTorch or TensorFlow shuffle - - ![view_existing_sh]() -5. Choose the index of the training shuffle to replicate. Let us assume we want -to replicate the train-test split from OpenfieldOct30-trainset95shuffle3, in which -`split: 3`. In this case, we insert in the *'From shuffle'* menu - - ![choose_existing_index]() -6. To create this new dataset, set the shuffle option to an un-used shuffle -(here 4) - - ![choose_new_index]() -7. Click *'Create training dataset'* and move on to *'train network'*. Shuffle should be -set to the new shuffle entered at the previous step (in this case, 4) - - ![create_from_existing]() -8. To view/edit the specifications of the model you created, you can go to `pytoch_config.yaml` file at: - ``` - dlc-project - | - |___ dlc-models-pytorch - |__ iterationX - |__ shuffleX - |__ pytorch_config.yaml - ``` + +1. Select *'Create training dataset'* tab + +1. Tick *Use an existing data split* option + + ![create_from_existing](assets/img1.png) + +1. Click 'View existing shuffles': + + - This is used to view the indices of shuffles created for a project to determine which index is available to assign to a new shuffle. + - The elements described in this window are: + - train_fraction: The fraction of the dataset used for training. + + - index: The index of the shuffle. + + - split: The data split for the shuffle. The integer value on its own does not + hold any meaning, but this "split" value indicates which shuffles have the same split + (as their results can then be compared) + + - engine: Whether it is a PyTorch or TensorFlow shuffle + + ![view_existing_sh](assets/img2.png) + +1. Choose the index of the training shuffle to replicate. Let us assume we want + to replicate the train-test split from OpenfieldOct30-trainset95shuffle3, in which + `split: 3`. In this case, we insert in the *'From shuffle'* menu + + ![choose_existing_index](assets/img3.png) + +1. To create this new dataset, set the shuffle option to an un-used shuffle + (here 4) + + ![choose_new_index](assets/img4.png) + +1. Click *'Create training dataset'* and move on to *'train network'*. Shuffle should be + set to the new shuffle entered at the previous step (in this case, 4) + + ![create_from_existing](assets/img5.png) + +1. To view/edit the specifications of the model you created, you can go to `pytoch_config.yaml` file at: + + ``` + dlc-project + | + |___ dlc-models-pytorch + |__ iterationX + |__ shuffleX + |__ pytorch_config.yaml + ``` ### In Code @@ -127,6 +142,7 @@ Once trained we can evaluate our model using ```python deeplabcut.evaluate_network(config, Shuffles=[4], snapshotindex="all") ``` + Now, we can compare performances with peace of mind! ### Good practices: naming shuffles created from existing ones diff --git a/docs/pytorch/architectures.md b/docs/pytorch/architectures.md index a6cefbe586..c2511aaefb 100644 --- a/docs/pytorch/architectures.md +++ b/docs/pytorch/architectures.md @@ -7,7 +7,9 @@ deeplabcut: status: viable recommendation: keep --- + (dlc3-architectures)= + # DeepLabCut 3.0 - PyTorch Model Architectures ## Introduction @@ -32,42 +34,48 @@ Several architectures are currently implemented in DeepLabCut PyTorch (more will and you can add more easily in our new model registry). Also check out the explanations of bottom-up/top-down below. **ResNets** + - Adapted from [He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2016.](https://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html) and [Insafutdinov, Eldar et al. "DeeperCut: A Deeper, Stronger, and Faster Multi-Person Pose Estimation Model". European Conference on Computer Vision (ECCV) 2016.] - Current bottom-up variants are `resnet_50`, `resnet_101` - Current top-down variants are `top_down_resnet_101`, `top_down_resnet_50` **HRNet** + - Adapted from [Wang, Jingdong, et al. "Deep high-resolution representation learning for visual recognition." IEEE transactions on pattern analysis and machine intelligence 43.10 (2020): 3349-3364.](https://arxiv.org/abs/1908.07919) - Current variants are `hrnet_w18`, `hrnet_w32`, `hrnet_w48`, - Current top-down variants are `top_down_hrnet_w18`, `top_down_hrnet_w32`, `top_down_hrnet_w48` - Slower but typically more powerful than ResNets **DEKR** + - Adapted from [Geng, Zigang et al. "Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression." Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2021.](https://openaccess.thecvf.com/content/CVPR2021/papers/Geng_Bottom-Up_Human_Pose_Estimation_via_Disentangled_Keypoint_Regression_CVPR_2021_paper.pdf) - This model is a bottom-up model using HRNet as a backbone. It learns to predict the center of each animal, and predicts the offset between each animal center and their keypoints - Current variants that are implemented (from smallest to largest): `dekr_w18`, `dekr_w32`, `dekr_w48` - Note, this is a powerful multi-animal model but very heavy (slow) **BUCTD** + - Adapted from [Zhou\*, Stoffl\*, Mathis, Mathis. "Rethinking Pose Estimation in Crowds: Overcoming the Detection Information Bottleneck and Ambiguity." Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV). 2023](https://openaccess.thecvf.com/content/ICCV2023/papers/Zhou_Rethinking_Pose_Estimation_in_Crowds_Overcoming_the_Detection_Information_Bottleneck_ICCV_2023_paper.pdf) - [![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rethinking-pose-estimation-in-crowds/pose-estimation-on-crowdpose)](https://paperswithcode.com/sota/pose-estimation-on-crowdpose?p=rethinking-pose-estimation-in-crowds) - This is a top-performing multi-animal method that combines the strengths of bottom-up and top-down approaches, and delivers exceptional performance on humans too (which are also animals) - It can be used with a diverse set of architectures. Current variants are: `ctd_coam_w32`, `ctd_coam_w48`/`ctd_coam_w48_human`, `ctd_prenet_hrnet_w32`, `ctd_prenet_hrnet_w48`, `ctd_prenet_rtmpose_s`, `ctd_prenet_rtmpose_m`, `ctd_prenet_rtmpose_x`/`ctd_prenet_rtmpose_x_human` **DLCRNet** + - From [Lauer, Zhou, et al. "Multi-animal pose estimation, identification and tracking with DeepLabCut." Nature Methods 19.4 (2022): 496-504.](https://www.nature.com/articles/s41592-022-01443-0) - This model uses a multi-scale variant of a ResNet as a backbone, and part-affinity fields to assemble individuals - Variants: `dlcrnet_stride16_ms5`, `dlcrnet_stride32_ms5` **RTMPose** + - From [Jiang, Tao et al. "RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose"](https://arxiv.org/abs/2303.07399) - Top-down pose estimation model using a fast CSPNeXt backbone with a SimCC-style head - Variants: `rtmpose_s`, `rtmpose_m`, `rtmpose_x` **AnimalTokenPose** -- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024](https://arxiv.org/abs/2203.07436) - - One variant is implemented as: `animal_tokenpose_base` for video inference only (we don't support directly training this within deeplabcut) +- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024\](https://arxiv.org/abs/2203.07436) +- One variant is implemented as: `animal_tokenpose_base` for video inference only (we don't support directly training this within deeplabcut) ## Information on Single Animal Models @@ -97,8 +105,7 @@ The first approach, **bottom-up** pose estimation, starts by detecting bodyparts image before figuring out how they belong together (i.e., which keypoints belong to the same animal). -![Schema representing the bottom-up approach to pose estimation]( -assets/bottom-up-approach.png) +![Schema representing the bottom-up approach to pose estimation](assets/bottom-up-approach.png) ### Backbones with Part-Affinity Fields @@ -116,8 +123,7 @@ model (an object detector) is used to localize every animal present in the image its bounding box. Then, the pose for each animal is determined by predicting bodyparts in each bounding box. The pose estimation -![Schema representing the top-down approach to pose estimation]( -assets/top-down-approach.png) +![Schema representing the top-down approach to pose estimation](assets/top-down-approach.png) The top-down approach tends to be more accurate in less crowded scenes, as the pose model only needs to process the pixels related to a single animal. However, in more @@ -129,27 +135,23 @@ The bottom-up approach does not have this ambiguïty, and also has the advantage only needing to run a pose estimation model, instead of needing to run an object detector first. However, grouping keypoints is a difficult problem. - Hence any single-animal model can be transformed into a top-down, multi-animal model. To do so, simply prefix `top_down` to your single-animal model name. Currently, the following detectors are available: `ssdlite`, `fasterrcnn_mobilenet_v3_large_fpn`, `fasterrcnn_resnet50_fpn_v2`. - -### Hybrid, Bottom-up (BU) plus a ``conditioned" Top-down (CTD) +### Hybrid, Bottom-up (BU) plus a \`\`conditioned" Top-down (CTD) A new approach to pose estimation, named bottom-up conditioned top-down (or **BUCTD**), was introduced in [Zhou, Stoffl, Mathis, Mathis. "Rethinking Pose Estimation in Crowds: Overcoming the Detection Information Bottleneck and Ambiguity." Proceedings of the -IEEE/CVF International Conference on Computer Vision (ICCV). 2023]( -https://openaccess.thecvf.com/content/ICCV2023/papers/Zhou_Rethinking_Pose_Estimation_in_Crowds_Overcoming_the_Detection_Information_Bottleneck_ICCV_2023_paper.pdf) +IEEE/CVF International Conference on Computer Vision (ICCV). 2023](https://openaccess.thecvf.com/content/ICCV2023/papers/Zhou_Rethinking_Pose_Estimation_in_Crowds_Overcoming_the_Detection_Information_Bottleneck_ICCV_2023_paper.pdf) . It's a hybrid two-stage approach leveraging the strengths of the bottom-up and top-down approaches to overcome the ambiguïty introduced through bounding boxes. Instead of using an object detection model to localize individuals, it uses a bottom-up pose estimation model. The predictions made by the bottom-up model are given as proposals (or _conditions_) to the pose estimation model. This is illustrated in the figure below. In modern language, one could state that CTD models are "pose-promptable". - ![BUCTD](https://github.com/amathislab/BUCTD/raw/main/media/BUCTD_fig1.png) Zhou, Mu, et al. *"Rethinking pose estimation in crowds: overcoming the detection information bottleneck and ambiguity."* Proceedings of the IEEE/CVF diff --git a/docs/pytorch/user_guide.md b/docs/pytorch/user_guide.md index d4e5e6f2e9..6cae1df0dd 100644 --- a/docs/pytorch/user_guide.md +++ b/docs/pytorch/user_guide.md @@ -4,7 +4,9 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (dlc3-user-guide)= + # DeepLabCut 3.0 - PyTorch User Guide ## Using DeepLabCut 3.0 @@ -21,10 +23,9 @@ already labeled data by simply switching the engine (and thereby also compare performance). In short, expect a boost 🔥. In short, PyTorch models can be trained in any DeepLabCut project. If you have a project -already made, simply add a new key to your project `config.yaml` file specifying +already made, simply add a new key to your project `config.yaml` file specifying `engine: pytorch`. Then any new training dataset that will be created will be a PyTorch -model (see [Creating Shuffles and Model Configuration]( -#Creating-Shuffles-and-Model-Configuration)) to learn more about training PyTorch +model (see [Creating Shuffles and Model Configuration](#Creating-Shuffles-and-Model-Configuration)) to learn more about training PyTorch models. To train Tensorflow models again, you can set `engine: tensorflow`. ### Installation @@ -53,7 +54,7 @@ maximum number of `iterations`. An epoch is a single pass through the training d which means your model has seen each training image exactly once. - So if you have 64 training images for your network, an epoch is 64 iterations with batch -size 1 (or 32 iterations with batch size 2, 16 with batch size 4, etc.). + size 1 (or 32 iterations with batch size 2, 16 with batch size 4, etc.). ## API @@ -73,28 +74,25 @@ from deeplabcut.pose_estimation_pytorch import available_models print(available_models()) ``` - - ### Development State and Road Map 🚧 The table below describes the DeepLabCut API methods that have been implemented for the PyTorch engine, as well as indications which options are not yet implemented, and which parameters are not valid for the DLC 3.0 PyTorch API. - -| API Method | Implemented | Parameters not yet implemented | Parameters invalid for pytorch | -|--------------------------------|:-----------:|-----------------------------------------------------------------------------------------------------|-----------------------------------------------------| -| `train_network` | 🟢 | | `maxiters`, `saveiters`, `allow_growth`, `autotune` | -| `return_train_network_path` | 🟢 | | | -| `evaluate_network` | 🟢 | | | -| `return_evaluate_network_data` | 🔴 | | `TFGPUinference`, `allow_growth` | -| `analyze_videos` | 🟠 | `greedy`, `calibrate`, `window_size` | | -| `create_tracking_dataset` | 🟢 | | | -| `analyze_time_lapse_frames` | 🟢 | the name has changed to `analyze_images` to better reflect what it actually does (no video needed) | | -| `convert_detections2tracklets` | 🟠 | `greedy`, `calibrate`, `window_size` | | -| `extract_maps` | 🟢 | | | -| `visualize_scoremaps` | 🟢 | | | -| `visualize_locrefs` | 🟢 | | | -| `visualize_paf` | 🟢 | | | -| `extract_save_all_maps` | 🟢 | | | -| `export_model` | 🟢 | | | +| API Method | Implemented | Parameters not yet implemented | Parameters invalid for pytorch | +| ------------------------------ | :---------: | -------------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| `train_network` | 🟢 | | `maxiters`, `saveiters`, `allow_growth`, `autotune` | +| `return_train_network_path` | 🟢 | | | +| `evaluate_network` | 🟢 | | | +| `return_evaluate_network_data` | 🔴 | | `TFGPUinference`, `allow_growth` | +| `analyze_videos` | 🟠 | `greedy`, `calibrate`, `window_size` | | +| `create_tracking_dataset` | 🟢 | | | +| `analyze_time_lapse_frames` | 🟢 | the name has changed to `analyze_images` to better reflect what it actually does (no video needed) | | +| `convert_detections2tracklets` | 🟠 | `greedy`, `calibrate`, `window_size` | | +| `extract_maps` | 🟢 | | | +| `visualize_scoremaps` | 🟢 | | | +| `visualize_locrefs` | 🟢 | | | +| `visualize_paf` | 🟢 | | | +| `extract_save_all_maps` | 🟢 | | | +| `export_model` | 🟢 | | | diff --git a/docs/pytorch_dlc.md b/docs/pytorch_dlc.md index 50890c3440..b46b30a507 100644 --- a/docs/pytorch_dlc.md +++ b/docs/pytorch_dlc.md @@ -6,25 +6,26 @@ deeplabcut: visibility: orphaned status: viable recommendation: move - notes: "Unclear why this is unlisted in TOC; recommend updating and moving to PyTorch section." + notes: Unclear why this is unlisted in TOC; recommend updating and moving to PyTorch section. --- + # DeepLabCut: PyTorch API ## Modules - [data](https://github.com/nastya236/DLCdev/blob/69005057eeac3c1492712863303f8268cee776e6/deeplabcut/pose_estimation_pytorch/data/project.py#L7): -The `deeplabcut.pose_estimations_pytorch.data` package contains all code for pytorch -dataset creation and test/train splitting. + The `deeplabcut.pose_estimations_pytorch.data` package contains all code for pytorch + dataset creation and test/train splitting. - `Project` class provides train and test splitting and converts dataset to required - format. For instance, to [COCO]() format. + format. For instance, to [COCO](<>) format. - `PoseTrainDataset` class is a [torch.utils.Dataset](https://pytorch.org/docs/stable/data.html) class, which converts raw - images and keypoints to a tensor dataset for training and evaluation. + images and keypoints to a tensor dataset for training and evaluation. - [models](https://github.com/nastya236/DLCdev/blob/69005057eeac3c1492712863303f8268cee776e6/deeplabcut/pose_estimation_pytorch/data/models): -The `deeplabcut.pose_estimations_pytorch.models` package contains all related to -building a model with `backbone`, `neck` (optional) and `head`. + The `deeplabcut.pose_estimations_pytorch.models` package contains all related to + building a model with `backbone`, `neck` (optional) and `head`. - [train_module](https://github.com/nastya236/DLCdev/blob/69005057eeac3c1492712863303f8268cee776e6/deeplabcut/pose_estimation_pytorch/data/models): -The `deeplabcut.pose_estimations_pytorch.train_module` contains all classes for model -training and validation. + The `deeplabcut.pose_estimations_pytorch.train_module` contains all classes for model + training and validation. ## API @@ -38,6 +39,7 @@ PyTorch or Tensorflow project should be created. ### Creating a Training Dataset To create a training dataset for a DeepLabCut PyTorch model, simply call: + ```python import deeplabcut deeplabcut.create_training_dataset( @@ -57,6 +59,7 @@ Proceedings of the IEEE/CVF conference on computer vision and pattern recognitio 2021.) and Tokenpose (Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.). The choices of `net_type` that will create PyTorch training sets are: + - `"dekr_16"` - `"dekr_32"` - `"dekr_48"` @@ -68,14 +71,17 @@ Note that Tokenpose models cannot currently be used with projects that contain u keypoints. ### Training the network + Training a PyTorch model is done in a very similar manner as a tensorflow model, though currently the PyTorch API needs to be called directly: + ```python import deeplabcut.pose_estimation_pytorch.apis as api api.train_network(config_path, shuffle=1, trainingsetindex=0) ``` **Parameters** + ``` config : path to the yaml config file of the project shuffle : index of the shuffle we want to train on @@ -105,13 +111,16 @@ detector_path: if resuming training of a top down model, used to specify the det ``` ### Evaluating the network + As for training, the main difference is the need to call the API directly. + ```python import deeplabcut.pose_estimation_pytorch.apis as api api.evaluate_network(config_path, shuffle=1, trainingsetindex="all") ``` **Parameters** + ``` config: path to the project's config file shuffles: Iterable of integers specifying the shuffle indices to evaluate. @@ -137,6 +146,7 @@ batch_size: the batch size to use for evaluation ``` ### Analyzing novel videos + One big difference between the PyTorch and Tensorflow implementations comes in the way animal assembly happens (for multi-animal models). While in Tensorflow, assembly was a separate step that needed to be done from the keypoints, in the PyTorch version it's @@ -144,6 +154,7 @@ integrated directly into the models. From an API standpoint, that does not chang Again, the PyTorch API needs to be invoked directly (it also has the `auto_track` option). + ```python import deeplabcut.pose_estimation_pytorch.apis as api api.analyze_videos(config_path, ["/fullpath/project/videos/test.mp4"], videotype=".mp4") @@ -151,6 +162,7 @@ api.analyze_videos(config_path, ["/fullpath/project/videos/test.mp4"], videotype The PyTorch detections need to be converted to tracklets using the PyTorch API, but then the original tracklet stitching can be used. + ```python import deeplabcut import deeplabcut.pose_estimation_pytorch.apis as api @@ -167,6 +179,7 @@ deeplabcut.stitch_tracklets( ``` Creating labeled videos can then be called in exactly the same way as before. + ```python import deeplabcut deeplabcut.create_labeled_video( diff --git a/docs/quick-start/single_animal_quick_guide.md b/docs/quick-start/single_animal_quick_guide.md index 5f88c9b126..96af3d0921 100644 --- a/docs/quick-start/single_animal_quick_guide.md +++ b/docs/quick-start/single_animal_quick_guide.md @@ -6,77 +6,93 @@ deeplabcut: visibility: online status: viable recommendation: archive - notes: "This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving." + notes: This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving. --- + # QUICK GUIDE to single Animal Training: + **The main steps to take you from project creation to analyzed videos:** Open ipython in the terminal: + ``` ipython ``` Import DeepLabCut: + ``` import deeplabcut ``` Create a new project: + ``` deeplabcut.create_new_project("project_name", "experimenter", ["path of video 1", "path of video2", ..]) ``` Set a config_path variable for ease of use + go edit this file!: + ``` config_path = "yourdirectory/project_name/config.yaml" ``` Extract frames: + ``` deeplabcut.extract_frames(config_path) ``` Label frames: + ``` deeplabcut.label_frames(config_path) ``` -Check labels [OPTIONAL]: +Check labels \[OPTIONAL\]: + ``` deeplabcut.check_labels(config_path) ``` Create training dataset: + ``` deeplabcut.create_training_dataset(config_path) ``` Train the network: + ``` deeplabcut.train_network(config_path) ``` Evaluate the trained network: + ``` deeplabcut.evaluate_network(config_path) ``` - Video analysis: +Video analysis: + ``` deeplabcut.analyze_videos(config_path, ["path of video 1", "path of video2", ..]) ``` -Filter predictions [OPTIONAL]: +Filter predictions \[OPTIONAL\]: + ``` deeplabcut.filterpredictions(config_path, ["path of video 1", "path of video2", ..]) ``` Plot results (trajectories): + ``` deeplabcut.plot_trajectories(config_path, ["path of video 1", "path of video2", ..], filtered=True) ``` Create a video: + ``` deeplabcut.create_labeled_video(config_path, ["path of video 1", "path of video2", ..], filtered=True) ``` diff --git a/docs/quick-start/tutorial_maDLC.md b/docs/quick-start/tutorial_maDLC.md index adf8dda979..000b6d0c02 100644 --- a/docs/quick-start/tutorial_maDLC.md +++ b/docs/quick-start/tutorial_maDLC.md @@ -7,6 +7,7 @@ deeplabcut: status: viable recommendation: keep --- + # Multi-animal pose estimation with DeepLabCut: A 5-minute tutorial ## GUI: @@ -16,11 +17,13 @@ Full graphical user interface: just follow the tabs in the GUI! `python -m deepl ## Terminal: **Import deeplabcut** + ```python import deeplabcut ``` **(1) Create a project** + ```python project_name = "cutemice" experimenter = "teamdlc" @@ -33,17 +36,20 @@ config_path = deeplabcut.create_new_project( copy_videos=True, ) ``` -> **_NOTE:_** Make sure to specify the absolute path to the video file(s). + +> **_NOTE:_** Make sure to specify the absolute path to the video file(s). > It is quickly obtained on Windows with ⇧ Shift+Right click and `Copy as path`, > and on Mac with ⌥ Option+Right click and `Copy as Pathname`. > Ubuntu users only need to copy the file and its path gets added to the clipboard. -> Next, you can set a variable for the config_path: 'Full path of the project configuration file*' +> Next, you can set a variable for the config_path: 'Full path of the project configuration file\*' **(2) Edit the config.ymal file to set up your project** + > **_NOTE:_** Here is were you will define your key point names and animal IDs. Also you can change the default # of frames to extract for the next step. **(3) Extract video frames to annotate** + ```python deeplabcut.extract_frames( config_path, @@ -52,15 +58,17 @@ deeplabcut.extract_frames( userfeedback=False, ) ``` + > **_NOTE:_** try to extract a few frames from many videos vs. a lot of frames from one video! **(4) Annotate Frames** + ```python deeplabcut.label_frames(config_path) ``` - **(5) Visually check annotated frames** + ```python deeplabcut.check_labels( config_path, @@ -69,6 +77,7 @@ deeplabcut.check_labels( ``` **(6) Create the training dataset** + ```python deeplabcut.create_multianimaltraining_dataset( config_path, @@ -98,6 +107,7 @@ deeplabcut.train_network( ``` **(8) Evaluate the network** + ```python deeplabcut.evaluate_network( config_path, @@ -106,6 +116,7 @@ deeplabcut.evaluate_network( ``` **(9) Analyze a video (extracts detections and association costs)** + ```python deeplabcut.analyze_videos( config_path, @@ -113,10 +124,11 @@ deeplabcut.analyze_videos( auto_track=True, ) ``` -> **_NOTE:_** `auto_track=True` will complete steps 10-11 for you automatically so you get the "final" H5 file. Use the below steps if you need to change the parameters of tracking based on your dataset. +> **_NOTE:_** `auto_track=True` will complete steps 10-11 for you automatically so you get the "final" H5 file. Use the below steps if you need to change the parameters of tracking based on your dataset. **(10) Spatial and (locally) temporal grouping: Track body part assemblies frame-by-frame** + ```python deeplabcut.convert_detections2tracklets( config_path, @@ -125,8 +137,8 @@ deeplabcut.convert_detections2tracklets( ) ``` - **(11) Reconstruct full animal trajectories (tracks from tracklets)** + ```python deeplabcut.stitch_tracklets( config_path, @@ -136,8 +148,8 @@ deeplabcut.stitch_tracklets( ) ``` - **(12) Create a pretty video output** + ```python deeplabcut.create_labeled_video( config_path, diff --git a/docs/recipes/BatchProcessing.md b/docs/recipes/BatchProcessing.md index 279433eceb..574cebd431 100644 --- a/docs/recipes/BatchProcessing.md +++ b/docs/recipes/BatchProcessing.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Automate training and video analysis: Batch Processing ## Tips for working with DLC networks: @@ -78,7 +79,8 @@ for subfolder in subfolders: #this would be January, February etc. in the upper ## Now, what about training over multiple Projects Make your labmates happy by helping run everyone's projects! We use this for workshops, but can easily be adapted for your needs. Here is an example script. You can copy/paste into a file and end with ".py" to make it a python script. -``` + +```` #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -138,3 +140,4 @@ for project in Projects[model]: cfg["project_path"] = previous_path deeplabcut.auxiliaryfunctions.write_config(config, cfg) ``` +```` diff --git a/docs/recipes/ClusteringNapari.md b/docs/recipes/ClusteringNapari.md index bb7faf41c9..aec07fcf39 100644 --- a/docs/recipes/ClusteringNapari.md +++ b/docs/recipes/ClusteringNapari.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Clustering in the napari-DeepLabCut GUI To increase model performance, one can find the errors in the user-defined label (or in output H5 files after video @@ -43,7 +44,6 @@ Your contributions and suggestions are welcomed, so test the This #cookbook recipe aims to show a usecase of **clustering in napari** and is contributed by 2022 DLC AI Resident [Sabrina Benas](https://x.com/Sabrineiitor) 💜. - ## Detect Outliers to Refine Labels ### Open `napari` and the `DeepLabCut plugin` @@ -51,7 +51,6 @@ This #cookbook recipe aims to show a usecase of **clustering in napari** and is Then open your `CollectedData_.h5` file. We used the Horse-30 dataset, presented in [Mathis, Biasi et al. WACV 2022](http://horse10.deeplabcut.org/), as our demo and development set. Here is an example of what it should look like: - DLC ### Clustering @@ -85,7 +84,7 @@ If you want to change the clustering method, you can modify the file [kmeans.py](https://github.com/DeepLabCutAIResidency/napari-deeplabcut/blob/cluster1/src/napari_deeplabcut/kmeans.py) ``` -::::{important} +::::\{important} You have to keep the way the file is opened (pandas dataframe) and the output has to be the cluster points, the points colors in the cluster colors and the frame names (in this order). :::: @@ -98,3 +97,4 @@ colors in the cluster colors and the frame names (in this order). - Next, we will support the machine-labeled.h5 files for full active learning support. Happy Hacking! +``` diff --git a/docs/recipes/DLCMethods.md b/docs/recipes/DLCMethods.md index b3710b7d55..0e13f1b65e 100644 --- a/docs/recipes/DLCMethods.md +++ b/docs/recipes/DLCMethods.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # How to write a DLC Methods Section **Pose estimation using DeepLabCut** @@ -11,19 +12,20 @@ deeplabcut: For body part tracking we used DeepLabCut (version 3.X.X) [Mathis et al, 2018, Nath et al, 2019]. Specifically, we labeled X number of frames taken from X videos/animals (then X% was used for training (default is 95%). We used a X-based neural network (i.e., X = ResNet-50, ResNet-101, MobileNetV2-0.35, MobileNetV2-0.5, MobileNetV2-0.75, -MobileNetV2-1, EfficientNet ..X, dlcrnet_ms5, cspnext_s, dekr_w32, rtmpose_s, etc.)*** with default parameters* for X +MobileNetV2-1, EfficientNet ..X, dlcrnet_ms5, cspnext_s, dekr_w32, rtmpose_s, etc.)\*\*\* with default parameters\* for X number of training iterations. We validated with X number of shuffles, and found the test error was: X pixels, train: X pixels (image size was X by X). We then used a p-cutoff of X (i.e. 0.9) to condition the X,Y coordinates for future analysis. This network was then used to analyze videos from similar experimental settings. -*If any defaults were changed in *`pose_config.yaml`*, mention them. +\*If any defaults were changed in *`pose_config.yaml`*, mention them. i.e. common things one might change: -* the loader (options are `default`, `imgaug`, `tensorpack`, `deterministic`). -* the `post_dist_threshold` (default is 17 and determines training resolution). -* optimizer: do you use the default `SGD` or `ADAM`? -*** here, you could add additional citations. +- the loader (options are `default`, `imgaug`, `tensorpack`, `deterministic`). +- the `post_dist_threshold` (default is 17 and determines training resolution). +- optimizer: do you use the default `SGD` or `ADAM`? + +\*\*\* here, you could add additional citations. If you use ResNets, consider citing Insafutdinov et al 2016 & He et al 2016. If you use the MobileNetV2s consider citing Mathis et al 2021, and Sandler et al, 2018. If you use DLCRNet, please cite Lauer et al, 2021. > Mathis, A. et al. Deeplabcut: markerless pose estimation diff --git a/docs/recipes/MegaDetectorDLCLive.md b/docs/recipes/MegaDetectorDLCLive.md index 3f216e5ba3..662f752334 100644 --- a/docs/recipes/MegaDetectorDLCLive.md +++ b/docs/recipes/MegaDetectorDLCLive.md @@ -7,20 +7,19 @@ deeplabcut: status: outdated recommendation: archive --- + # 💚 MegaDetector+DeepLabCut 💜 -[DeepLabCut-Live](https://github.com/DeepLabCut/DeepLabCut-live) is an open source and free real-time package from DeepLabCut that allows for real-time, low-latency pose estimation. [The DeepLabCut-ModelZoo](http://modelzoo.deeplabcut.org/) is our growing collection of pretrained animal models for rapid deployment; no training is typically required to use these models. MegaDetector is a free open software trained to detect animals, people, and vehicles from camera trap images. Check [here](https://github.com/microsoft/CameraTraps/blob/main/megadetector.md) for further information. +[DeepLabCut-Live](https://github.com/DeepLabCut/DeepLabCut-live) is an open source and free real-time package from DeepLabCut that allows for real-time, low-latency pose estimation. [The DeepLabCut-ModelZoo](http://modelzoo.deeplabcut.org/) is our growing collection of pretrained animal models for rapid deployment; no training is typically required to use these models. MegaDetector is a free open software trained to detect animals, people, and vehicles from camera trap images. Check [here](https://github.com/microsoft/CameraTraps/blob/main/megadetector.md) for further information. In this #cookbook recipe, we show you how to use MegaDetector to detect animals and run DeepLabCut-Live (using ModelZoo models) to get the pose estimation. This doc is contributed by 2022 DLC AI Resident [Nirel Kadzo](https://github.com/Kadzon) 💜! ## What is MegaDetector? - DLC +DLC MegaDetector detects an animal and generates a bounding box around the animal. Thanks to [Sara Beery](https://beerys.github.io/) for visiting the #DLCAIResidents in the summer of 2022 to tell us more about this amazing project. An example result is shown: - - ## DeepLabCut-Live DeepLabCut-Live! is a real-time package for running DeepLabCut. However, you can also use it as a lighter-weight @@ -29,9 +28,9 @@ as we do here. To read more, check out the [docs](deeplabcut-live). ### MegaDetector meets DeepLabCut -The combination of MegaDetector and DeepLabCut now enables animal pose estimation on animal-bounded images. Here is an example of the `full_macaque` model, which is from MacaquePose. Model contributed by Jumpei Matsumoto, at the Univ of Toyama. See their paper for many details [here](https://www.biorxiv.org/content/10.1101/2020.07.30.229989v2). If you use this model, please [cite their paper](https://doi.org/10.3389/fnbeh.2020.581154). +The combination of MegaDetector and DeepLabCut now enables animal pose estimation on animal-bounded images. Here is an example of the `full_macaque` model, which is from MacaquePose. Model contributed by Jumpei Matsumoto, at the Univ of Toyama. See their paper for many details [here](https://www.biorxiv.org/content/10.1101/2020.07.30.229989v2). If you use this model, please [cite their paper](https://doi.org/10.3389/fnbeh.2020.581154). - DLC +DLC # 🤗 HuggingFace App @@ -41,35 +40,36 @@ Let's get into the details of how to use the App: 1. Click on this link to be redirected to the [MegaDetector+DeepLabCut application](https://huggingface.co/spaces/DeepLabCut/MegaDetector_DeepLabCut) on **Hugging Face**. -2. Upload your image on the *Input Image* section or drag and drop. +1. Upload your image on the *Input Image* section or drag and drop. -3. Choose the features for your image +1. Choose the features for your image - DLC +DLC -- ``Select MegaDetector model`` lets you choose between md_v5a and md_v5b, you can find out more about them [here](https://github.com/microsoft/CameraTraps/releases). They run on YOLOv5 which makes it 3x-4x faster than prior versions. +- `Select MegaDetector model` lets you choose between md_v5a and md_v5b, you can find out more about them [here](https://github.com/microsoft/CameraTraps/releases). They run on YOLOv5 which makes it 3x-4x faster than prior versions. -- ``Select DeepLabCut Model`` choose the relevant ModelZoo model closest to the image you uploaded. The selected model will run on the image to predict the keypoints on the animal. +- `Select DeepLabCut Model` choose the relevant ModelZoo model closest to the image you uploaded. The selected model will run on the image to predict the keypoints on the animal. ```{hint} To get close to accurate keypoints in your model, the animal you upload into the interface should have the animal model listed in "Select DeepLabCut Model" panel. ``` -- ``Run DLClive`` checkbox allows you to run DeepLabCut-Live directly on the image without MegaDetector. However, MegaDetector often simplifies the pose estimation by blocking out the pixels outside the bounding box. But no harm to run it (just might be slower), test it out for yourself ;) +- `Run DLClive` checkbox allows you to run DeepLabCut-Live directly on the image without MegaDetector. However, MegaDetector often simplifies the pose estimation by blocking out the pixels outside the bounding box. But no harm to run it (just might be slower), test it out for yourself ;) -- ``Set confidence threshold for animal detections`` in the example above, the confidence threshold is set for 0.8, this means MegaDetector will put a bounding box if it is >0.8 sure it is an animal. The image displayed has a 0.94 confidence level. +- `Set confidence threshold for animal detections` in the example above, the confidence threshold is set for 0.8, this means MegaDetector will put a bounding box if it is >0.8 sure it is an animal. The image displayed has a 0.94 confidence level. -- ``Set confidence threshold for keypoints`` suggests how confident the model is about predicting the accurate key points on the animal. This is displayed by the opacity of the coloured keypoints on the animal. +- `Set confidence threshold for keypoints` suggests how confident the model is about predicting the accurate key points on the animal. This is displayed by the opacity of the coloured keypoints on the animal. -- ``Set marker size, Set font size, Select keypoiny label font`` are design specs you can choose for yourself - we all love pretty plots! +- `Set marker size, Set font size, Select keypoiny label font` are design specs you can choose for yourself - we all love pretty plots! 4. Once set and you are satisfied with the image and features, submit the image. The expected output will display your input image: with the animal(s) surrounded by a bounding box (if used), the tracked keypoints, and the labels. A downloadable `JSON` file with the markings as shown below: - DLC +DLC - Image from [Scientific American](https://www.scientificamerican.com/article/dogs-personalities-arent-determined-by-their-breed/). +Image from [Scientific American](https://www.scientificamerican.com/article/dogs-personalities-arent-determined-by-their-breed/). All information seen on the output image is recorded on the **Download JSON file**. The snippet below is commented on to give you an overall understanding of what the code means 😀 + ``` { "date": "2022-08-26", @@ -98,7 +98,6 @@ All information seen on the output image is recorded on the **Download JSON file } ``` - ```{hint} To experiment with more camera trap images, check out [Lila Science!](https://lila.science/) ``` @@ -109,21 +108,22 @@ Examples have also been added to the Hugging Face interface where you can try ou We encourage you to try out and experiment on your camera trap or other animal images. Indeed, we found it is not only limited to camera trap images you can test it out with photos taken from your camera. Have a look at a 🦊picture Mackenzie took in Geneva and used the MegaDetector+DeepLabCut [Hugging Face](huggingface.co). - DLC +DLC Or these lil' cuties 🐶🐶🙀🐶 outside a restaurant. - DLC +DLC ```{note} DLC-Live allows you to process videos and frames in bulk, however the current release of MegaDetetctor+DeepLabCut-Live allows you to process one image at a time. But stay tuned for further releases, we are just getting started ;) ``` - ### Developer Mode: + To run it locally you can `git clone` the repository on your terminal and explore MegaDetector+DeepLabCut for yourself :) In your terminal run each line: + ```bash git clone https://huggingface.co/spaces/DeepLabCut/MegaDetector_DeepLabCut diff --git a/docs/recipes/OpenVINO.md b/docs/recipes/OpenVINO.md index 06bcbba3b5..97388ce53e 100644 --- a/docs/recipes/OpenVINO.md +++ b/docs/recipes/OpenVINO.md @@ -4,18 +4,20 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Intel OpenVINO backend -::::{warning} +::::\{warning} This feature is currently implemented for TensorFlow-based models only. :::: DeepLabCut provides an option to run deep learning model with [OpenVINO](https://github.com/openvinotoolkit/openvino) backend. To enable OpenVINO in your pipeline, use `use_openvino` flag of `analyze_videos` method with one of string values indicating device: -* ```"CPU"``` - Use CPU. This is a default value. -* ```"GPU"``` - Use GPU (requires OpenCL to be installed). First launch might take some time for kernels initialization. -* ```"MULTI:CPU,GPU"``` - Use CPU and GPU simultaneously. In most cases this option provides the best efficiency. + +- `"CPU"` - Use CPU. This is a default value. +- `"GPU"` - Use GPU (requires OpenCL to be installed). First launch might take some time for kernels initialization. +- `"MULTI:CPU,GPU"` - Use CPU and GPU simultaneously. In most cases this option provides the best efficiency. ```python def analyze_videos( diff --git a/docs/recipes/OtherData.md b/docs/recipes/OtherData.md index 21efb74f49..fcdb097535 100644 --- a/docs/recipes/OtherData.md +++ b/docs/recipes/OtherData.md @@ -4,10 +4,10 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- -# How to use data labeled outside of DeepLabCut -- and/or if you merge projects across scorers (see below): +# How to use data labeled outside of DeepLabCut +- and/or if you merge projects across scorers (see below): ## Using data labeled elsewhere: @@ -17,9 +17,10 @@ Here is a guide to do this via the ".csv" route: (the pandas array route is iden **Step 1**: create a project as describe in the user guide: https://github.com/DeepLabCut/DeepLabCut/blob/main/docs/UseOverviewGuide.md#create-a-new-project -**Step 2**: edit the ``config.yaml`` file to include the body part names, please take care that spelling, spacing, and capitalization are IDENTICAL to the "labeled data body part names". +**Step 2**: edit the `config.yaml` file to include the body part names, please take care that spelling, spacing, and capitalization are IDENTICAL to the "labeled data body part names". **Step 3**: Please inspect the excel formatted sheet (.csv) from our [demo project](https://github.com/DeepLabCut/DeepLabCut/tree/main/examples/Reaching-Mackenzie-2018-08-30/labeled-data/reachingvideo1) + - i.e. this file: https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/Reaching-Mackenzie-2018-08-30/labeled-data/reachingvideo1/CollectedData_Mackenzie.csv **Step 4**: Edit the .csv file such that it contains the X, Y pixel coordinates, the body part names, the scorer name as well as the relative path to the image: e.g. /labeled-data/somefolder/img017.jpg @@ -28,12 +29,12 @@ Then make sure the scorer name, and body parts are the same in the config.yaml f Also add for each folder a video to the `video_set` in the config.yaml file. This can also be a dummy variable, but should be e.g. C://somefolder.avi if the folder is called somefolder. See demo config.yaml file for proper formatting. -**Step 5**: When you are done, run ``deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')`` +**Step 5**: When you are done, run `deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')` - - The scorer name must be identical to the input name for experimenter that you used when you created the project. This will automatically update "Mackenzie" to your name in the example demo notebook. +- The scorer name must be identical to the input name for experimenter that you used when you created the project. This will automatically update "Mackenzie" to your name in the example demo notebook. ## If you merge projects: **Step 1**: rename the CSV files to be the target name. -**Step 2**: run and pass the target name ``deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')``. This will overwrite the H5 file so the data is all merged under the target name. +**Step 2**: run and pass the target name `deeplabcut.convertcsv2h5('path_to_config.yaml', scorer= 'experimenter')`. This will overwrite the H5 file so the data is all merged under the target name. diff --git a/docs/recipes/UsingModelZooPupil.md b/docs/recipes/UsingModelZooPupil.md index 2b906ad755..175fcf8671 100644 --- a/docs/recipes/UsingModelZooPupil.md +++ b/docs/recipes/UsingModelZooPupil.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Using ModelZoo models on your own datasets

Animal behavior has to be analyzed with painstaking accuracy. Therefore, animal pose estimation has been @@ -27,22 +28,20 @@ This model was contributed by Jim McBurney-Lin at University of California River The model was trained on images of C57/B6J mice eyes, and also then augmented with mouse eye data from the Mathis Lab at EPFL. +DLC - DLC - - DLC - -| Landmark_Number | Landmark_Name | Description| -| --- | --- | --- | -| 1 | Lpupil | Left aspect of pupil | -| 2 | LDpupil | Left/dorsal aspect of pupil | -| 3 | Dpupil | Dorsal aspect of pupil | -| 4 | DRpupil | Dorsal/Right aspect of pupil | -| 5 | Rpupil | Right aspect of pupil | -| 6 | RVpupil | Right/ventral aspect of pupil | -| 7 | Vpupil | Ventral aspect of pupil | -| 8 | VLpupil | Ventral/left aspect of pupil | +DLC +| Landmark_Number | Landmark_Name | Description | +| --------------- | ------------- | ----------------------------- | +| 1 | Lpupil | Left aspect of pupil | +| 2 | LDpupil | Left/dorsal aspect of pupil | +| 3 | Dpupil | Dorsal aspect of pupil | +| 4 | DRpupil | Dorsal/Right aspect of pupil | +| 5 | Rpupil | Right aspect of pupil | +| 6 | RVpupil | Right/ventral aspect of pupil | +| 7 | Vpupil | Ventral aspect of pupil | +| 8 | VLpupil | Ventral/left aspect of pupil | Since we would like to evaluate the models performance on out-of-domain data, we will analyze pigeon pupils. For more discussions and work on so-called out-of-domain data, see @@ -80,14 +79,14 @@ and a video tutorial on how to use the ModelZoo on Google Colab. IMAGE ALT TEXT -```{hint} +````{hint} You are happy with the model and want to go on analyzing further videos on your local machine or you want to refine the model for your specific usecase? ```html !zip -r /content/file.zip /content/pigeon_modelZoo-nessi-2022-08-22 from google.colab import files files.download("/content/file.zip") -``` +```` ### Analyze Videos at Your Local Machine @@ -101,7 +100,7 @@ Check [here](how-to-install) for the instructions for the DeepLabCut installatio To initialize a new project directory with a pre-trained model from the DeepLabCut ModelZoo, run the code below. -::::{warning} +::::\{warning} This method is currently implemented for Tensorflow only, Pytorch compatibility is coming soon. :::: @@ -124,7 +123,7 @@ deeplabcut.create_pretrained_project( ) ``` -::::{important} +::::\{important} Your videos should be cropped around the eye for better model accuracy! 👁🐭 :::: @@ -156,6 +155,7 @@ deeplabcut.add_new_videos( extract_frames=False ) ``` + The `deeplabcut.extract_outlier_frames` function will check for outliers and ask your feedback on whether to extract these outliers frames. ```python @@ -169,26 +169,29 @@ deeplabcut.extract_outlier_frames( automatic=True ) ``` + The `deeplabcut.refine_labels` function starts the GUI which allows you to refine the outlier frames manually. You should load the outlier frames directory and corresponding `.h5` file from the previous model. It will ask you to define the `likelihood` threshold: labels under the threshold should be refined at this stage. After refining, you should combine these data with your previous model's data set and create a new training data set. + ```python deeplabcut.refine_labels("/pathofproject/config.yaml") deeplabcut.merge_datasets("/pathofproject/config.yaml") deeplabcut.create_training_dataset("/pathofproject/config.yaml") ``` + Before starting the training of your model, there is one last step left: editing the `init_weights` parameter in your `pose_cfg.yaml` file. Go to your project and check the latest snapshot (e.g., `snapshot-610000`) of your model in `dlc-models/train` directory. Edit the value of the `init_weights` key in the `pose_cfg.yaml` file and start to re-train your model! - `init_weights: pathofyourproject\dlc-models\iteration-0\DLCFeb31-trainset95shuffle1\train\snapshot-610000` ```python deeplabcut.train_network("/pathofproject/config.yaml", shuffle=1, saveiters=25000) ``` + ```{hint} Check this video for model refining!

diff --git a/docs/recipes/installTips.md b/docs/recipes/installTips.md index a76b7ace45..4d4e21456b 100644 --- a/docs/recipes/installTips.md +++ b/docs/recipes/installTips.md @@ -6,9 +6,11 @@ deeplabcut: visibility: online status: outdated recommendation: archive - notes: "Should be removed in favor of the main installation guide." + notes: Should be removed in favor of the main installation guide. --- + (installation-tips)= + # Installation Tips ## How to use the latest updates directly from GitHub @@ -18,6 +20,7 @@ We often update the master deeplabcut code base on GitHub, and then ~1 a month w ### Method 1: If you want to *use* the latest, you can use pip and add the specific tags, such as `gui`, etc. by modifying and running: + ``` pip install --upgrade 'git+https://github.com/deeplabcut/deeplabcut.git#egg=deeplabcut[gui]' ``` @@ -63,6 +66,7 @@ Then, you can see what version you have with `deeplabcut.__version__` If you make changes, you can also then utilize our test scripts. Run the desired test script found here (you will need to git clone first): https://github.com/DeepLabCut/DeepLabCut/blob/master/examples/. i.e., for example: + ``` # Testing with the PyTorch engine python testscript_pytorch_multi_animal.py @@ -71,7 +75,6 @@ python testscript_pytorch_multi_animal.py python testscript_tensorflow_multi_animal.py ``` - ## Installation on Ubuntu 18.04 LTS ### Here are our tips for an easy installation. This is done on a fresh computer installation (Ubuntu 18.04 LTS) @@ -88,7 +91,8 @@ then, download CUDA 10 from here: https://developer.nvidia.com/cuda-downloads an wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run sudo sh cuda_10.1.243_418.87.00_linux.run ``` - with the exception that I also (afterwards): + +with the exception that I also (afterwards): ``` sudo add-apt-repository ppa:graphics-drivers/ppa @@ -105,13 +109,16 @@ gcc --version ``` output: + ``` gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE ``` + Then: + ``` sudo apt install nvidia-cuda-toolkit gcc-7 ``` @@ -151,6 +158,7 @@ sudo apt-get -y install cuda ``` Then: + ``` sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update @@ -166,6 +174,7 @@ re-open terminal and check gcc version: `gcc --version` output: + ```python gcc --version gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 @@ -173,6 +182,7 @@ Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ``` + Then finish installation: `sudo apt install nvidia-cuda-toolkit gcc-9` @@ -216,6 +226,7 @@ sudo apt-get install \ gnupg \ lsb-release ``` + add key: `curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg` ``` @@ -223,7 +234,9 @@ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ``` + Then: + ``` sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io @@ -235,6 +248,7 @@ some clean up: now you can run `sudo docker run hello-world` and get: + ``` Hello from Docker! This message shows that your installation appears to be working correctly. @@ -271,6 +285,7 @@ and run: `bash Anaconda3-2021.05-Linux-x86_64.sh` and you get: + ```python Welcome to Anaconda3 2021.05 @@ -310,9 +325,11 @@ failed CondaEnvException: Pip failed ``` + You can either: remove conda env: `conda remove --name DEEPLABCUT --all`, open the DLC-GPU.yaml file (any text editor!) and change `deeplabcut[gui]` to `deeplabcut`. Then run: `conda env create -f DEEPLABCUT.yaml` again... then you will get: + ```python Successfully uninstalled decorator-5.0.9 diff --git a/docs/recipes/io.md b/docs/recipes/io.md index 66d101dce7..e78d2436d3 100644 --- a/docs/recipes/io.md +++ b/docs/recipes/io.md @@ -4,9 +4,11 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Input/output manipulations with DeepLabCut ## Analyzing very large videos in chunks + Analyzing hour-long videos may take a while, but the task can be conveniently broken down into the analysis of smaller video clips: @@ -28,32 +30,43 @@ The issue can present itself during those steps and you have to carefully review To tackle this issue, the easiest solution might be to re-encode the video, this will not only help with corruption but can also – if you choose so – compress the video without perceivable loss of quality. Common package used for video processing is FFmpeg which you can use from the terminal inside your DEEPLABCUT environment (without going into iPython). There are number of video codecs that can be used to re-encode your video and if you want to keep the video in the same container (`.avi`, `.mp4`, `.ts` etc.) you should check which codec allows encoding to a certain container. For instance, for `.avi` it will be MJPEG and for `.mp4` H264 and H265. To re-encode your video, simply use: + ``` ffmpeg -i "path_to_video" -c:v codec_name "output_path" ``` + For instance, to re-encode to `.mp4` format with compression use: + ``` ffmpeg -i "path_to_video" -c:v h264 -crf 18 -preset fast "output_path" ``` + `-crf` is a quality-size tradeoff from 0 to 63 with 0 being highest quality but lowest compression. Ideally you’d want to use values between 18-23 for similar visual quality to the original. `-preset` is a quality-speed tradeoff. Higher values give you faster encoding but will result in bigger filesizes and/or worse quality. For `.avi` files you want to change the codec and the quality metric, since `crf` is used by H264/265 and not MJPEG. For instance, the encoding with some compression would be: + ``` ffmpeg -i "path_to_video" -c:v mjpeg -q:v 10 "output_path" ``` + `-q:v` is a quality metric with values ranging from 1 to 31 with reasonable values being around 10. If you want to compress all your recordings for easier storage or moving to cloud storage, you can use a for loop that will go through all videos in a directory that are in a certain container. Let’s say we want to transcode our `.avi` videos to `.mp4` and make them smaller without quality loss. Note, that the loop has be run from inside the folder the videos are in: + ``` for %i in (*.avi) do ffmpeg -i "%i" -c:v libx265 -preset fast -crf 18 "%~ni.mp4" ``` + This command will re-encode all of your videos into an `.mp4` container and save them with the same name as the original (without overwriting them). Additionally, ffmpeg allows you to also crop or rescale the videos for possible improvement in inference speed further down the line in DLC workflow. To either crop or rescale you need to use `-filter:v` parameter after which you’d add either `"crop=Xsize:Ysize:Xstart:Ystart"` for cropping or -`"scale=Xsize:Ysize"` for rescale. Note that when using “scale” the values how be a result of integer division of the original video size. If you want to keep the aspect ratio, you can simply set either X or Y to `-1` and only give one of the or you can use `“scale=iw/2:ih/2”` which will simply make the video 2 times smaller in both dimensions. For instance, if you have a videos at 1920x1080 resolution and want to rescale it to 960x540 for faster inference while also reencoding from `.avi` and doing some compression in a loop, the command would be something like this: +`"scale=Xsize:Ysize"` for rescale. Note that when using “scale” the values how be a result of integer division of the original video size. If you want to keep the aspect ratio, you can simply set either X or Y to `-1` and only give one of the or you can use `“scale=iw/2:ih/2”` which will simply make the video 2 times smaller in both dimensions. For instance, if you have a videos at 1920x1080 resolution and want to rescale it to 960x540 for faster inference while also reencoding from `.avi` and doing some compression in a loop, the command would be something like this: + ``` for %i in (*.avi) do ffmpeg -i "%i" -c:v libx265 -preset fast -crf 18 -filter:v "scale= iw/2:ih/2" "%~ni.mp4" ``` + If audio is not a necessary in the videos you can also save some space by requesting specifically for the encoder to not encode any audio stream by adding `-an` just before specifying output filename, like so: + ``` for %i in (*.avi) do ffmpeg -i "%i" -c:v libx265 -preset fast -crf 18 -filter:v "scale= iw/2:ih/2" -an "%~ni.mp4" ``` diff --git a/docs/recipes/nn.md b/docs/recipes/nn.md index b002dd6b14..07351311d9 100644 --- a/docs/recipes/nn.md +++ b/docs/recipes/nn.md @@ -4,7 +4,9 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (tf-training-tips-and-tricks)= + # Model training tips & tricks ## TensorFlow Engine: Limiting a GPU's memory consumption @@ -26,6 +28,7 @@ sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) ``` (tf-custom-image-augmentation)= + ## Using custom image augmentation Image augmentation is the process of artificially expanding the training set @@ -37,16 +40,13 @@ by DeepLabCut, default values can be readily overwritten prior to training. See augmentation variables defined in the: - PyTorch Engine: [docs for the `pytorch_config.yaml` file](dlc3-pytorch-config) -- TensorFlow Engine: [default pose_cfg.yaml file]( -https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml#L23-L74) +- TensorFlow Engine: [default pose_cfg.yaml file](https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml#L23-L74) -For the single-animal TensorFlow models, [you have several options]( -https://deeplabcut.github.io/DeepLabCut/docs/standardDeepLabCut_UserGuide.html#f-create-training-dataset-s-and-selection-of-your-neural-network) +For the single-animal TensorFlow models, [you have several options](https://deeplabcut.github.io/DeepLabCut/docs/standardDeepLabCut_UserGuide.html#f-create-training-dataset-s-and-selection-of-your-neural-network) for image augmentation when calling `create_training_dataset` An in-depth tutorial on image augmentation and training hyperparameters can be found [ -here]( -https://deeplabcut.github.io/DeepLabCut/docs/recipes/pose_cfg_file_breakdown.html). +here](https://deeplabcut.github.io/DeepLabCut/docs/recipes/pose_cfg_file_breakdown.html). ## Evaluating intermediate (and all) snapshots @@ -55,6 +55,7 @@ the highest performance. Therefore, you should analyze ALL snapshots, and select best. Put 'all' in the snapshots section of the `config.yaml` to do this. (what-neural-network-should-i-use)= + ## What neural network should I use? (Trade offs, speed performance, and considerations) You always select the network type when you create a training data set: i.e., standard @@ -76,7 +77,8 @@ where to start. **TL;DR - your best performance for most everything is ResNet-50; MobileNetV2-1 is much faster, needs less memory on your GPU to train and nearly as accurate.** -*** +______________________________________________________________________ + ### ResNets: In Mathis et al. 2018 we benchmarked three networks: **ResNet-50, ResNet-101, and @@ -143,8 +145,7 @@ red - read more here: https://arxiv.org/abs/1909.11229) ### When should I use an EfficientNet? Built with inverse residual blocks like MobileNets, but more powerful than ResNets, due -to optimal depth/width/resolution scaling, [EfficientNet]( -https://arxiv.org/abs/1905.11946) are an excellent choice if you want speed and +to optimal depth/width/resolution scaling, [EfficientNet](https://arxiv.org/abs/1905.11946) are an excellent choice if you want speed and performance. They do require more careful handling though! Especially for small datasets, you will need to tune the batch size and learning rates. So, we suggest these for more advanced users, or those willing to run experiments to find the best settings. @@ -162,4 +163,4 @@ that is generated in create_training_dataset) with different models. Here, as of we have a **new** function that lets you do this easily. Instead of using `create_training_dataset` you will run `create_training_model_comparison` (see the docstrings by `deeplabcut.create_training_model_comparison?` or run the Project Manager -GUI - `deeplabcut.launch_dlc()`- for assistance. +GUI - `deeplabcut.launch_dlc()`- for assistance. diff --git a/docs/recipes/pose_cfg_file_breakdown.md b/docs/recipes/pose_cfg_file_breakdown.md index 881ccb6f4d..4452f1935f 100644 --- a/docs/recipes/pose_cfg_file_breakdown.md +++ b/docs/recipes/pose_cfg_file_breakdown.md @@ -4,9 +4,10 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # The `pose_cfg.yaml` Guideline Handbook -::::{warning} +::::\{warning} The following is specific to Tensorflow-based models. To read the equivalent explanations for Pytorch-based models, click [here](dlc3-pytorch-config) :::: @@ -16,13 +17,17 @@ click [here](dlc3-pytorch-config) When you train, evaluate, and run inference with a neural network there are hyperparatmeters you must consider. While DLC attempts to set the "globally good for everyone" parameters, you might want to change them. Therefore, in this recipe we will review the pose config parameters related to neural network models' and the related data augmentation! # 1. What is the *pose_cfg.yml* file? + + - The `pose_cfg.yaml` file offers easy access to a range of training parameters that the user may want or have to adjust depending on the used dataset and task. - You will find the file in the dlc-models > test and train sub-directories. There is also a button in the GUI to directly open this file. - This recipe is aimed at giving an average user an intuition on those hyperparameters and situations in which addressing them can be useful. # 2. Quick start: full parameter list TOC + + - [2. Full parameter list](#2-full-parameter-list) - [2.1 Training Hyperparameters](#21-training-hyperparameters) - [2.1.A `max_input_size` and `min_input_size`](#21a-max_input_size-and-min_input_size) @@ -46,24 +51,32 @@ When you train, evaluate, and run inference with a neural network there are hype - [References](#references) + ## 2.1 Training Hyperparameters + ### 2.1.A `max_input_size` and `min_input_size` + The default values are `1500` and `64`, respectively. 💡Pro-tip:💡 + - change `max_input_size` when the resolution of the video is higher than 1500x1500 or when `scale_jitter_up` will possibly go over that value - change `min_input_size` when the resolution of the video is smaller than 64x64 or when `scale_jitter_lo` will possibly go below that value + ### 2.1.B `global_scale` + The default value is `0.8`. It's the most basic, first scaling that happens to all images in the training queue. 💡Pro-tip:💡 + - With images that are low resolution or lack detail, it may be beneficial to increase the `global_scale` to 1, to keep the original size and retain as much information as possible. ### 2.1.C `batch_size` + The default for single animal projects is 1, and for maDLC projects it's `8`. It's the number of frames used per training iteration. @@ -71,46 +84,57 @@ The default for single animal projects is 1, and for maDLC projects it's `8`. It In both cases, you can increase the batchsize up to the limit of your GPU memory and train for a lower number of iterations. The relationship between the number of iterations and `batch_size` is not linear, so `batch_size: 8` doesn't mean you can train for 8x less iterations, but like with every training, plateauing loss can be treated as an indicator of reaching optimal performance. 💡Pro-tip:💡 + - Having a higher `batch_size` can be beneficial in terms of models' generalization -___________________________________________________________________________________ +______________________________________________________________________ Values mentioned above and the augmentation parameters are often intuitive, and knowing our own data, we are able to decide on what will and won't be beneficial. Unfortunately, not all hyperparameters are this simple or intuitive. Two parameters that might require some tuning on challenging datasets are `pafwidth` and `pos_dist_thresh`. + ### 2.1.D `pos_dist_thresh` + The default value is `17`. It's the size of a window within which detections are considered positive training samples, meaning they tell the model that it's going in the right direction. + ### 2.1.E `pafwidth` + The default value is `20`. PAF stands for part affinity fields. It is a method of learning associations between pairs of bodyparts by preserving the location and orientation of the limb (the connection between two keypoints). This learned part affinity helps in proper animal assembly, making the model less prone to associating bodyparts of one individual with those of another. [1](#ref1) ## 2.2 Data augmentation parameters + In the simplest form, we can think of data augmentation as something similar to imagination or dreaming. Humans imagine different scenarios based on experience, ultimately allowing us to better understand our world. [2, 3, 4](#references) Similarly, we train our models to different types of "imagined" scenarios, which we limit to the foreseeable ones, so we ultimately get a robust model that can more likely handle new data and scenes. Classes of data augmentations, characterized by their nature, are given by: + - [**Geometric transformations**](#geometric) - 1. [`scale_jitter_lo` and `scale_jitter_up`](#scale_jitter) - 2. [`rotation`](#rot) - 3. [`rotratio`](#rotratio) - 4. [`mirror`](#mirror) - 5. [`crop size`](#crop_size) - 6. [`crop ratio`](#crop_ratio) - 7. [`max shift`](#max_shift) - 8. [`crop sampling`](#crop_sampling) + 1. [`scale_jitter_lo` and `scale_jitter_up`](#scale_jitter) + 1. [`rotation`](#rot) + 1. [`rotratio`](#rotratio) + 1. [`mirror`](#mirror) + 1. [`crop size`](#crop_size) + 1. [`crop ratio`](#crop_ratio) + 1. [`max shift`](#max_shift) + 1. [`crop sampling`](#crop_sampling) - [**Kernel transformations**](#kernel) - 9. [`sharpening` and `sharpen_ratio`](#sharp) - 10. [`edge_enhancement`](#edge) + 9\. [`sharpening` and `sharpen_ratio`](#sharp) + 10\. [`edge_enhancement`](#edge) + ### Geometric transformations + **Geometric transformations** such as *flipping*, *rotating*, *translating*, *cropping*, *scaling*, and *injecting noise*, which are very good for positional biases present in the training data. + ### 2.2.1 `scale_jitter_lo` and `scale_jitter_up` + *Scale jittering* resizes an image within a given resize range. This allows the model to learn from different sizes of objects in the scene, therefore increasing its robustness to generalize, especially on newer scenes or object sizes. The image below, retrieved from [3](#ref3), illustrates the difference between two scale jittering methods. @@ -118,21 +142,27 @@ The image below, retrieved from [3](#ref3), illustrates the difference between t During training, each image is randomly scaled within the range `[scale_jitter_lo, scale_jitter_up]` to augment training data. The default values for these two parameters are: + - `scale_jitter_lo = 0.5` - `scale_jitter_up = 1.25` 💡Pro-tips:💡 + - ⭐⭐⭐ If the target animal/s do not have an incredibly high variance in size throughout the video (e.g., jumping or moving towards the static camera), keeping the **default** values **unchanged** will give just enough variability in the data for the model to generalize better ✅ - ⭐⭐However, you may want to adjust these parameters if you want your model to: + - handle new data with possibly **larger (25% bigger than original)** animal subjects ➡️ in this scenario, increase the value of *scale_jitter_up* - handle new data with possibly **smaller (50% smaller than the original)** animal subjects ➡️ in this scenario, decrease the value of *scale_jitter_lo* - **generalize well in new set-ups/environments** with minimal to no pre-training - ⚠️ But as a consequence, **training time will take longer**.😔🕒 + ⚠️ But as a consequence, **training time will take longer**.😔🕒 + - ⭐If you have a fully static camera set-up and the sizes of the animals do not vary much, you may also try to **shorten** this range to **reduce training time**.😃🕒(⚠️ but, as a consequence, your model might only fit your data and not generalize well) + ### 2.1.2 `rotation` + *Rotation augmentations* are done by rotating the image right or left on an axis between $1^{\circ}$ and $359^{\circ}$. The safety of rotation augmentations is heavily determined by the rotation degree parameter. Slight rotations such as between $+1^{\circ}$ and $+20^{\circ}$ or $-1^{\circ}$ to $-20^{\circ}$ is generally an acceptable range. Keep in mind that as the rotation degree increases, the precision of the label placement can decrease The image below, retrieved from [2](#ref2), illustrates the difference between the different rotation degrees. @@ -142,22 +172,29 @@ The image below, retrieved from [2](#ref2), illustrates the difference between t During training, each image is rotated $+/-$ the `rotation` degree parameter set. By default, this parameter is set to `25`, which means that the images are augmented with a $+25^{\circ}$ rotation of itself and a $-25^{\circ}$ degree rotation of itself. Should you want to opt out of this augmentation, set the rotation value to `False`. 💡Pro-tips:💡 + - ⭐If you have labelled all the possible rotations of your animal/s, keeping the **default** value **unchanged** is **enough** ✅ - However, you may want to adjust this parameter if you want your model to: + - handle new data with new rotations of the animal subjects - handle the possibly unlabelled rotations of your minimally-labeled data - But as a consequence, the more you increase the rotation degree, the more the original keypoint labels may not be preserved + ### 2.2.3 `rotratio` (rotation ratio) + This parameter in the DLC module is given by the percentage of sampled data to be augmented from your training data. The default value is set to `0.4` or $40\%$. This means that there is a $40\%$ chance that images within the current batch will be rotated. 💡Pro-tip:💡 + - ⭐ Generally, keeping the **default** value **unchanged** is **enough** ✅ + ### 2.2.4 `fliplr` (or a horizontal flip) + **Mirroring**, otherwise called **horizontal axis fipping**, is much more common than flipping the vertical axis. This augmentation is one of the easiest to implement and has proven useful on datasets such as CIFAR-10 and ImageNet. However, on datasets involving text recognition, such as MNIST or SVHN, this is not a label-preserving transformation. The image below is an illustration of this property (shown on the right-most column). @@ -168,62 +205,78 @@ This parameter randomly flips an image horizontally to augment training data. By default, this parameter is set to `False` especially on poses with mirror symmetric joints (for example, so the left hand and right hand are not swapped). 💡Pro-tip:💡 + - ⭐ If you work with labels with symmetric joints, keep the **default** value **unchanged** - unless the dataset is biased (animal moves mostly in one direction, but sometimes in the opposite)✅ - Keeping the default value to `False` will work well in most cases. - ### 2.2.5 `crop_size` - Cropping consists of removing unwanted pixels from the image, thus selecting a part of the image and discarding the rest, reducing the size of the input. - In DeepLabCut *pose_config.yaml* file, by default, `crop_size` is set to (`400,400`), width, and height, respectively. This means it will cut out parts of an image of this size. +### 2.2.5 `crop_size` - 💡Pro-tip:💡 - - If your images are very large, you could consider increasing the crop size. However, be aware that you'll need a strong GPU, or you will hit memory errors! - - If your images are very small, you could consider decreasing the crop size. +Cropping consists of removing unwanted pixels from the image, thus selecting a part of the image and discarding the rest, reducing the size of the input. + +In DeepLabCut *pose_config.yaml* file, by default, `crop_size` is set to (`400,400`), width, and height, respectively. This means it will cut out parts of an image of this size. + +💡Pro-tip:💡 - - ### 2.2.6 `crop_ratio` - Also, the number of frames to be cropped is defined by the variable `cropratio`, which is set to `0.4` by default. That means that there is a $40\%$ the images within the current batch will be cropped. By default, this value works well. +- If your images are very large, you could consider increasing the crop size. However, be aware that you'll need a strong GPU, or you will hit memory errors! +- If your images are very small, you could consider decreasing the crop size. - - ### 2.2.7 `max_shift` + - The crop shift between each cropped image is defined by `max_shift` variable, which explains the max relative shift to the position of the crop centre. By default is set to `0.4`, which means it will be displaced 40% max from the center to not apply identical cropping each time the same image is encountered during training - this is especially important for `density` and `hybrid` cropping methods. +### 2.2.6 `crop_ratio` - The image below is modified from - [2](#references). +Also, the number of frames to be cropped is defined by the variable `cropratio`, which is set to `0.4` by default. That means that there is a $40\%$ the images within the current batch will be cropped. By default, this value works well. - + - - ### 2.2.8 `crop_sampling` - Likewise, there are different cropping sampling methods (`crop_sampling`), we can use depending on how our image looks like. +### 2.2.7 `max_shift` - 💡Pro-tips💡 - - For highly crowded scenes, `hybrid` and `density` approaches will work best. - - `uniform` will take out random parts of the image, disregarding the annotations completely - - 'keypoint' centers on a random keypoint and crops based on that location - might be best in preserving the whole animal (if reasonable `crop_size` is used) +The crop shift between each cropped image is defined by `max_shift` variable, which explains the max relative shift to the position of the crop centre. By default is set to `0.4`, which means it will be displaced 40% max from the center to not apply identical cropping each time the same image is encountered during training - this is especially important for `density` and `hybrid` cropping methods. - - ### Kernel transformations - Kernel filters are very popular in image processing to sharpen and blur images. Intuitively, blurring an image might increase the motion blur resistance during testing. Otherwise, sharpening for data enhancement could result in capturing more detail on objects of interest. +The image below is modified from +[2](#references). - - ### 2.2.9 `sharpening` and `sharpenratio` - In DeepLabCut *pose_config.yaml* file, by default, `sharpening` is set to `False`, but if we want to use this type of data augmentation, we can set it `True` and specify a value for `sharpenratio`, which by default is set to `0.3`. Blurring is not defined in the *pose_config.yaml*, but if the user finds it convenient, it can be added to the data augmentation pipeline. + - The image below is modified from - [2](#references). + - +### 2.2.8 `crop_sampling` - - ### 2.2.10 `edge` - Concerning sharpness, we have an additional parameter, `edge` enhancement, which enhances the edge contrast of an image to improve its apparent sharpness. Likewise, by default, this parameter is set `False`, but if you want to include it, you just need to set it `True`. +Likewise, there are different cropping sampling methods (`crop_sampling`), we can use depending on how our image looks like. +💡Pro-tips💡 + +- For highly crowded scenes, `hybrid` and `density` approaches will work best. +- `uniform` will take out random parts of the image, disregarding the annotations completely +- 'keypoint' centers on a random keypoint and crops based on that location - might be best in preserving the whole animal (if reasonable `crop_size` is used) + + + +### Kernel transformations + +Kernel filters are very popular in image processing to sharpen and blur images. Intuitively, blurring an image might increase the motion blur resistance during testing. Otherwise, sharpening for data enhancement could result in capturing more detail on objects of interest. + + + +### 2.2.9 `sharpening` and `sharpenratio` + +In DeepLabCut *pose_config.yaml* file, by default, `sharpening` is set to `False`, but if we want to use this type of data augmentation, we can set it `True` and specify a value for `sharpenratio`, which by default is set to `0.3`. Blurring is not defined in the *pose_config.yaml*, but if the user finds it convenient, it can be added to the data augmentation pipeline. + +The image below is modified from +[2](#references). + + + + + +### 2.2.10 `edge` + +Concerning sharpness, we have an additional parameter, `edge` enhancement, which enhances the edge contrast of an image to improve its apparent sharpness. Likewise, by default, this parameter is set `False`, but if you want to include it, you just need to set it `True`. # References -
    + +
    1. Cao, Z., Simon, T., Wei, S. E., & Sheikh, Y. (2017). Realtime multi-person 2d pose estimation using part affinity fields. In Proceedings of the IEEE conference on Computer Vision and Pattern Recognition (pp. 7291-7299).https://openaccess.thecvf.com/content_cvpr_2017/html/Cao_Realtime_Multi-Person_2D_CVPR_2017_paper.html
    2. Mathis, A., Schneider, S., Lauer, J., & Mathis, M. W. (2020). A Primer on Motion Capture with Deep Learning: Principles, Pitfalls, and Perspectives. In Neuron (Vol. 108, Issue 1, pp. 44-65). https://doi.org/10.1016/j.neuron.2020.09.017
    3. Ghiasi, G., Cui, Y., Srinivas, A., Qian, R., Lin, T.-Y., Cubuk, E. D., Le, Q. V., & Zoph, B. (2020). Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation (Version 2). arXiv. https://doi.org/10.48550/ARXIV.2012.07177
    4. diff --git a/docs/recipes/post.md b/docs/recipes/post.md index 1ebdf09ec5..bdf486fdf9 100644 --- a/docs/recipes/post.md +++ b/docs/recipes/post.md @@ -4,6 +4,7 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + # Some data processing recipes! ## Flagging frames with abnormal bodypart distances diff --git a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md index 2efd55b858..c7018507ee 100644 --- a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md +++ b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md @@ -8,31 +8,37 @@ deeplabcut: recommendation: verify notes: Sligthly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo. --- + # Publishing Notebooks into the Main DLC Cookbook + ### Your Recipe Guide to Contributing to the DLC Cookbook ## Introduction + Hey there, DLC enthusiast! 🌟 Ready to sprinkle your magic into the main DLC cookbook? Whether you're introducing a zesty new dish or giving an old one a twist, this guide's got your back. We'll walk you through how to publish a new notebook or spice up an existing one in the DLC cookbook. Let's get cooking! 🍲📘 ## Preliminary Checks + ### Check Existing Recipes or Tutorials - - **Search and Review**: Before you start writing a new recipe, go through the existing DLC Jupyter book to ensure there isn't a tutorial or recipe that covers the topic you have in mind. - - **Expand Existing Content**: If your content is related to an existing topic, like I/O manipulations, consider expanding or refining that section instead of creating an entirely new recipe. This ensures that the Jupyter book remains concise and that related information is found in one place. - - **Locate and Review**: Navigate to the particular recipe or tutorial you wish to update in the DLC Jupyter book. - - **Consider Minor vs. Major Changes**: If you're adding a new section or significantly altering the current content, it might be worth noting the changes at the beginning or end of the recipe for clarity. - - **Maintain Consistency**: Ensure your updates adhere to the current style, tone, and structure of the existing content to maintain a seamless reading experience. +- **Search and Review**: Before you start writing a new recipe, go through the existing DLC Jupyter book to ensure there isn't a tutorial or recipe that covers the topic you have in mind. +- **Expand Existing Content**: If your content is related to an existing topic, like I/O manipulations, consider expanding or refining that section instead of creating an entirely new recipe. This ensures that the Jupyter book remains concise and that related information is found in one place. + - **Locate and Review**: Navigate to the particular recipe or tutorial you wish to update in the DLC Jupyter book. + - **Consider Minor vs. Major Changes**: If you're adding a new section or significantly altering the current content, it might be worth noting the changes at the beginning or end of the recipe for clarity. + - **Maintain Consistency**: Ensure your updates adhere to the current style, tone, and structure of the existing content to maintain a seamless reading experience. ## Structure of a Recipe - When crafting your recipe, adhere to the following structure: - - **Introduction**: Begin with an introductory paragraph that highlights the importance and relevance of the recipe. This sets the stage and gives readers context. - - **Examples/Workflow**: Provide step-by-step instructions or a workflow, supported by examples. This makes it easy for readers to understand and follow along. +When crafting your recipe, adhere to the following structure: - - **Conclusion**: Conclude with a summary or highlight the key takeaways of your recipe. You can also provide references or further reading. +- **Introduction**: Begin with an introductory paragraph that highlights the importance and relevance of the recipe. This sets the stage and gives readers context. +- **Examples/Workflow**: Provide step-by-step instructions or a workflow, supported by examples. This makes it easy for readers to understand and follow along. + +- **Conclusion**: Conclude with a summary or highlight the key takeaways of your recipe. You can also provide references or further reading. Now, let's dive into the process of contributing your content to the DLC Jupyter book. + ## Steps 1. **Set-up your local environment.** You need `deeplabcut[docs]` installed: @@ -44,107 +50,118 @@ Now, let's dive into the process of contributing your content to the DLC Jupyter This command installs DeepLabCut along with the dependencies required to build the documentation. 2. **Fork the DLC Repository**: - - Go to the DeepLabCut GitHub repository: [https://github.com/DeepLabCut/DeepLabCut](https://github.com/DeepLabCut/DeepLabCut) + - Go to the DeepLabCut GitHub repository: [https://github.com/DeepLabCut/DeepLabCut](https://github.com/DeepLabCut/DeepLabCut) - Click on the `Fork` button on the top-right corner of the page. This will create a copy of the repository in your own GitHub account. -3. **Clone your forked repository**: + +1. **Clone your forked repository**: + - Navigate to your forked repo on GitHub. - Click the `Code` button and copy the URL. - Clone the repository to your local machine: + ``` git clone [REPO_URL] ``` -4. **Create a new branch**: + +1. **Create a new branch**: It's a good practice to create a new branch for each new feature or change: + ``` cd [YOUR_REPO_DIRECTORY] git checkout -b my-new-notebook ``` -5. **Create a new notebook** or **update an existing one**. + +1. **Create a new notebook** or **update an existing one**. + - **Creating a new notebook** - - **Choose Your Topic Wisely:** Before you start, make sure your topic fits the DLC Jupyter book's theme and brings value to its readers. A novel topic or a unique twist on an existing topic can be particularly impactful. - - **Craft with Care:** Remember, your notebook will be a reference for many. Begin with an engaging introduction, followed by well-structured content, and wrap it up with a conclusion. - - **Interactive Elements:** One of the strengths of Jupyter notebooks is the ability to combine code, visuals, and narrative. Use interactive plots, widgets, or any other tools that enhance the content and make it engaging. - - **Save Regularly:** Jupyter auto-saves your work, but it's a good habit to manually save your notebook frequently, especially after making significant changes. - - **Naming Convention:** Name your notebook in a way that reflects its content and is consistent with other notebook titles in the DLC Jupyter book. This makes it easier for readers to understand the topic at a glance. + - **Choose Your Topic Wisely:** Before you start, make sure your topic fits the DLC Jupyter book's theme and brings value to its readers. A novel topic or a unique twist on an existing topic can be particularly impactful. + - **Craft with Care:** Remember, your notebook will be a reference for many. Begin with an engaging introduction, followed by well-structured content, and wrap it up with a conclusion. + - **Interactive Elements:** One of the strengths of Jupyter notebooks is the ability to combine code, visuals, and narrative. Use interactive plots, widgets, or any other tools that enhance the content and make it engaging. + - **Save Regularly:** Jupyter auto-saves your work, but it's a good habit to manually save your notebook frequently, especially after making significant changes. + - **Naming Convention:** Name your notebook in a way that reflects its content and is consistent with other notebook titles in the DLC Jupyter book. This makes it easier for readers to understand the topic at a glance. - **Updating an existing notebook** - - Navigate to the location of the existing recipe within the directory: - ``` - [YOUR_REPO_DIRECTORY]/docs/recipes/ - ``` - - Open the corresponding Jupyter notebook (.ipynb file) you wish to update. - - Make the necessary changes or additions to the content. - - Save the notebook once your updates are finalized. - - Proceed to **Step 6** *(Proofreading)* and **9** *(Testing the documentation)* (skip Steps 7 and 8). -6. **Proofread:** Double check for spelling and grammatical errors by using Jupyter notebook's spellcheck extension called `spellchecker` (or your preferred spell-checker). + - Navigate to the location of the existing recipe within the directory: + ``` + [YOUR_REPO_DIRECTORY]/docs/recipes/ + ``` + - Open the corresponding Jupyter notebook (.ipynb file) you wish to update. + - Make the necessary changes or additions to the content. + - Save the notebook once your updates are finalized. + - Proceed to **Step 6** *(Proofreading)* and **9** *(Testing the documentation)* (skip Steps 7 and 8). + +1. **Proofread:** Double check for spelling and grammatical errors by using Jupyter notebook's spellcheck extension called `spellchecker` (or your preferred spell-checker). + ``` jupyter nbextension enable spellchecker/main ``` + Once installed, restart your notebook, and when you load your notebook again, you will see the incorrectly spelled words highlighted in red. -7. **Add your notebook** to the recipe directory at `[YOUR_REPO_DIRECTORY]/docs/recipes/` - - Navigate to the appropriate directory where the Jupyter notebooks are stored for the Jupyter book. - - Add your Jupyter notebook (.ipynb file) to this directory. +1. **Add your notebook** to the recipe directory at `[YOUR_REPO_DIRECTORY]/docs/recipes/` - To copy via terminal: + - Navigate to the appropriate directory where the Jupyter notebooks are stored for the Jupyter book. + - Add your Jupyter notebook (.ipynb file) to this directory. - - Unix-based OS users + To copy via terminal: - ``` - cp [YOUR_NOTEBOOK_FILENAME].ipynb [YOUR_REPO_DIRECTORY]/docs/recipes - ``` + - Unix-based OS users - - WinOS users: - ``` - copy new_recipe.ipynb [YOUR_REPO_DIRECTORY]\docs\recipes + ``` + cp [YOUR_NOTEBOOK_FILENAME].ipynb [YOUR_REPO_DIRECTORY]/docs/recipes + ``` - ``` + - WinOS users: -8. **Update `[YOUR_REPO_DIRECTORY]/_toc.yml`** by adding under the *Tutorials & Cookbook* section a **new line** containing the path to your notebook. This creates a link to your notebook on the main DLC book sidebar. + ``` + copy new_recipe.ipynb [YOUR_REPO_DIRECTORY]\docs\recipes - * For example: - ``` - - file: docs/recipes/[YOUR_NOTEBOOK_FILENAME] - ``` + ``` -9. **Test the documentation:** +1. **Update `[YOUR_REPO_DIRECTORY]/_toc.yml`** by adding under the *Tutorials & Cookbook* section a **new line** containing the path to your notebook. This creates a link to your notebook on the main DLC book sidebar. - - Build your notebook into the DLC recipe book - ``` - jupyter book build [YOUR_REPO_DIRECTORY] - ``` - - Once build is successful, the newly built book can be accessed at `[YOUR_REPO_DIRECTORY]/_build/html/`. - - Open `index.html` and check whether your notebook was rendered properly and if the links are working. + - For example: + ``` + - file: docs/recipes/[YOUR_NOTEBOOK_FILENAME] + ``` -10. **Commit your changes:** - When everything is a-okay, commit your changes to your branch. If not, edit your file and go to back to step 1. +1. **Test the documentation:** - ``` - git add [YOUR_NOTEBOOK_FILENAME] - git commit -m "Added a new notebook about [YOUR_TOPIC]" - ``` + - Build your notebook into the DLC recipe book + ``` + jupyter book build [YOUR_REPO_DIRECTORY] + ``` + - Once build is successful, the newly built book can be accessed at `[YOUR_REPO_DIRECTORY]/_build/html/`. + - Open `index.html` and check whether your notebook was rendered properly and if the links are working. -11. **Push your branch to your fork:** +1. **Commit your changes:** + When everything is a-okay, commit your changes to your branch. If not, edit your file and go to back to step 1. - ``` - git push origin my-new-notebook - ``` + ``` + git add [YOUR_NOTEBOOK_FILENAME] + git commit -m "Added a new notebook about [YOUR_TOPIC]" + ``` + +1. **Push your branch to your fork:** + ``` + git push origin my-new-notebook + ``` -12. **Submit a Pull Request (PR):** +1. **Submit a Pull Request (PR):** - - Go to your forked repository on GitHub. - - You'll likely see a message prompting you to create a pull request from your recently pushed branch. Click `Compare & pull request`. - - Fill out the PR form with a descriptive title and comments describing your notebook. This will help the maintainers understand the context and purpose of your notebook. - - Click `Create pull request`. + - Go to your forked repository on GitHub. + - You'll likely see a message prompting you to create a pull request from your recently pushed branch. Click `Compare & pull request`. + - Fill out the PR form with a descriptive title and comments describing your notebook. This will help the maintainers understand the context and purpose of your notebook. + - Click `Create pull request`. -13. **Make Necessary Changes**: The DeepLabCut maintainers will then review your PR and provide feedback. If changes are required, make the necessary changes on your local branch, commit them, and push the branch again. The PR will automatically update. +1. **Make Necessary Changes**: The DeepLabCut maintainers will then review your PR and provide feedback. If changes are required, make the necessary changes on your local branch, commit them, and push the branch again. The PR will automatically update. -14. **🎉PR Approval:🎉** Once your PR is approved, the maintainers will merge it into the main repository. Your notebook will then be a part of the DeepLabCut Jupyter book! Yay! +1. **🎉PR Approval:🎉** Once your PR is approved, the maintainers will merge it into the main repository. Your notebook will then be a part of the DeepLabCut Jupyter book! Yay! Remember to always check the [DLC contributing guidelines](https://github.com/DeepLabCut/DeepLabCut/blob/main/CONTRIBUTING.md). - ## Wrap-Up 🎉 + Alright! 🌟 By now, you've got the playbook to jazz up the DeepLabCut Jupyter book. Remember, it's not just about cooking up new recipes but also spicing up the old ones. Dive in, have fun, and let's make this book a flavor-packed feast for all DLC enthusiasts out there. High-five for joining the party! 🙌🎈 diff --git a/docs/roadmap.md b/docs/roadmap.md index 04228cb56e..eb56139f14 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -4,57 +4,64 @@ deeplabcut: last_metadata_updated: '2026-03-06' ignore: false --- + (dev-roadmap)= -## A development roadmap for DeepLabCut +## A development roadmap for DeepLabCut 📢 ⏳ 🚧 **General Enhancements:** + - [ ] DeepLabCut PyTorch & Model Zoo --> DLC 3.0 🔥 -- [X] DLC-CookBook v0.1 -- [X] DLC BLog for releases and user-highlights -- [X] New Docker containers into main repo / linked to Docker hub and repo(s) +- [x] DLC-CookBook v0.1 +- [x] DLC BLog for releases and user-highlights +- [x] New Docker containers into main repo / linked to Docker hub and repo(s) - [ ] 3D >2 camera support --> better 3D in PyTorch version 🔥 **General NN Improvements:** -- [X] EfficientNet backbones added (currently SOTA on ImageNet). https://openaccess.thecvf.com/content/WACV2021/html/Mathis_Pretraining_Boosts_Out-of-Domain_Robustness_for_Pose_Estimation_WACV_2021_paper.html https://github.com/DeepLabCut/DeepLabCut/commit/96da2cacf837a9b84ecdeafb50dfb4a93b402f33 -- [X] New multi-fusion multi-scale networks; DLCRNet_ms5 + +- [x] EfficientNet backbones added (currently SOTA on ImageNet). https://openaccess.thecvf.com/content/WACV2021/html/Mathis_Pretraining_Boosts_Out-of-Domain_Robustness_for_Pose_Estimation_WACV_2021_paper.html https://github.com/DeepLabCut/DeepLabCut/commit/96da2cacf837a9b84ecdeafb50dfb4a93b402f33 +- [x] New multi-fusion multi-scale networks; DLCRNet_ms5 - [ ] BUCTD Integration, see ICCV 2023 paper at https://arxiv.org/abs/2306.07879 **deeplabcut 2.2: multi-animal pose estimation and tracking with DeepLabCut** -- [X] alpha testing complete (early May 2020) -- [X] beta release: 2.2.b5 on 5 / 22 / 20 :smile: -- [X] beta release: 2.2b8 released 9/2020 :smile: -- [X] beta release 2.2b9 (rolled into 2.1.9 --> candidate release, slotted for Oct 2020) -- [X] 2.2rc1 -- [X] 2.2rc2 -- [X] 2.2rc3 -- [X] Manuscript Lauer et al 2021 https://www.biorxiv.org/content/10.1101/2021.04.30.442096v1 -- [X] full 2.2 stable release + +- [x] alpha testing complete (early May 2020) +- [x] beta release: 2.2.b5 on 5 / 22 / 20 :smile: +- [x] beta release: 2.2b8 released 9/2020 :smile: +- [x] beta release 2.2b9 (rolled into 2.1.9 --> candidate release, slotted for Oct 2020) +- [x] 2.2rc1 +- [x] 2.2rc2 +- [x] 2.2rc3 +- [x] Manuscript Lauer et al 2021 https://www.biorxiv.org/content/10.1101/2021.04.30.442096v1 +- [x] full 2.2 stable release **real-time module with DEMO for how to set up on your camera system, integration with our [Camera Control Software]**(https://github.com/AdaptiveMotorControlLab/Camera_Control) -- [X] Integration with Bonsai completed! See: https://github.com/bonsai-rx/deeplabcut -- [X] Integration with Auto-pi-lot. See: https://auto-pi-lot.com/ -- [X] DeepLabCut-live! released Aug 5th, 2020: preprint & code: https://www.biorxiv.org/content/10.1101/2020.08.04.236422v1 -- [X] DeepLabCut-live! published in eLife + +- [x] Integration with Bonsai completed! See: https://github.com/bonsai-rx/deeplabcut +- [x] Integration with Auto-pi-lot. See: https://auto-pi-lot.com/ +- [x] DeepLabCut-live! released Aug 5th, 2020: preprint & code: https://www.biorxiv.org/content/10.1101/2020.08.04.236422v1 +- [x] DeepLabCut-live! published in eLife **DeepLabCut Model Zoo: a collection of pretrained models for plug-in-play DLC and community crowd-sourcing.** -- [X] BETA release with 2.1.8b0: https://www.mackenziemathislab.org/deeplabcut -- [X] full release with 2.1.8.1 https://www.mackenziemathislab.org/deeplabcut -- [X] Manuscript forthcoming! --> see arXiv https://arxiv.org/abs/2203.07436 -- [X] new models added; horse, cheetah -- [X] TopView_Mouse model -- [X] Quadruped model + +- [x] BETA release with 2.1.8b0: https://www.mackenziemathislab.org/deeplabcut +- [x] full release with 2.1.8.1 https://www.mackenziemathislab.org/deeplabcut +- [x] Manuscript forthcoming! --> see arXiv https://arxiv.org/abs/2203.07436 +- [x] new models added; horse, cheetah +- [x] TopView_Mouse model +- [x] Quadruped model - [ ] contribution module - [ ] PyTorch Model zoo code **DeepLabCut GUI and DeepLabCut-core:** -- [X] to make DLC more modular, we will move core functions to https://github.com/DeepLabCut/DeepLabCut-core -- [X] DLC-core depreciated, and core is now simply `pip install deeplabcut` GUI is with `pip install deeplabcut[gui]` -- [X] new GUI for DeepLabCut; due to extended issues with wxPython, we will be moving to release a napari plugin https://github.com/napari/napari -- [X] New project management GUI -- [X] tensorflow 2.2 support in DeepLabCut-core: https://github.com/DeepLabCut/DeepLabCut/issues/601 -- [X] DeepLabCut-Core to be depreciated; TF2 will go into main repo. -- [X] TF2 support while also maintaining TF1 support until 2022. + +- [x] to make DLC more modular, we will move core functions to https://github.com/DeepLabCut/DeepLabCut-core +- [x] DLC-core depreciated, and core is now simply `pip install deeplabcut` GUI is with `pip install deeplabcut[gui]` +- [x] new GUI for DeepLabCut; due to extended issues with wxPython, we will be moving to release a napari plugin https://github.com/napari/napari +- [x] New project management GUI +- [x] tensorflow 2.2 support in DeepLabCut-core: https://github.com/DeepLabCut/DeepLabCut/issues/601 +- [x] DeepLabCut-Core to be depreciated; TF2 will go into main repo. +- [x] TF2 support while also maintaining TF1 support until 2022. - [ ] Web-based GUI for labeling --> Colab training pipeline for users (full no-install DLC) From 56c57bb8d25f29bf7204987b85baa254346a6087 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 14:04:21 +0200 Subject: [PATCH 07/86] Fix conflicts --- _toc.yml | 28 +- docs/gui/napari/advanced_usage.md | 2 +- docs/gui/napari/basic_usage.md | 4 +- docs/gui/napari/tracking/basic_usage.md | 353 +++++++++++++++++++++++ docs/images/napari/tracking/controls.png | Bin 0 -> 18444 bytes 5 files changed, 371 insertions(+), 16 deletions(-) create mode 100644 docs/gui/napari/tracking/basic_usage.md create mode 100644 docs/images/napari/tracking/controls.png diff --git a/_toc.yml b/_toc.yml index 6bb51801ff..51d3935a78 100644 --- a/_toc.yml +++ b/_toc.yml @@ -13,20 +13,20 @@ parts: - file: docs/recipes/installTips - file: docs/docker -- caption: Main User Guides - chapters: - - file: docs/standardDeepLabCut_UserGuide - - file: docs/maDLC_UserGuide - - file: docs/Overviewof3D - - file: docs/HelperFunctions - -- caption: Graphical User Interfaces (GUIs) - chapters: - - file: docs/gui/PROJECT_GUI - - file: docs/gui/napari_GUI - sections: - - file: docs/gui/napari/basic_usage - - file: docs/gui/napari/advanced_usage + - caption: GUI workflow + chapters: + - file: docs/gui/PROJECT_GUI + - file: docs/beginner-guides/beginners-guide + sections: + - file: docs/beginner-guides/manage-project + - file: docs/beginner-guides/labeling + - file: docs/beginner-guides/Training-Evaluation + - file: docs/beginner-guides/video-analysis + - file: docs/gui/napari_GUI + sections: + - file: docs/gui/napari/basic_usage + - file: docs/gui/napari/advanced_usage + - file: docs/gui/napari/tracking/basic_usage - caption: DLC3 PyTorch Specific Docs chapters: diff --git a/docs/gui/napari/advanced_usage.md b/docs/gui/napari/advanced_usage.md index 3ce04c4d5d..6e380c3257 100644 --- a/docs/gui/napari/advanced_usage.md +++ b/docs/gui/napari/advanced_usage.md @@ -9,7 +9,7 @@ deeplabcut: (file:napari-dlc-advanced-features)= -# napari-DLC - Advanced features +# Advanced features napari-DLC provides several additional features to enhance the annotation experience. diff --git a/docs/gui/napari/basic_usage.md b/docs/gui/napari/basic_usage.md index 5e126b0727..1bddf910cf 100644 --- a/docs/gui/napari/basic_usage.md +++ b/docs/gui/napari/basic_usage.md @@ -9,7 +9,7 @@ deeplabcut: (file:napari-dlc-basic-usage)= -# napari-DLC - Basic usage +# Basic usage `napari-deeplabcut` is a napari plugin for keypoint annotation and label refinement. It can be used either as part of the DeepLabCut GUI or as a standalone annotation tool. @@ -63,6 +63,8 @@ If you drag and drop a compatible labeled-data folder, the widget opens automati To familiarize yourself with napari, we recommend checking out the [official napari documentation and tutorials](https://napari.org/stable/usage.html). ``` +(sec:napari-dlc-basic-workflow)= + ## Recommended basic labeling workflow The simplest way to **start labeling** is: diff --git a/docs/gui/napari/tracking/basic_usage.md b/docs/gui/napari/tracking/basic_usage.md new file mode 100644 index 0000000000..6580f1942c --- /dev/null +++ b/docs/gui/napari/tracking/basic_usage.md @@ -0,0 +1,353 @@ +--- +deeplabcut: + last_metadata_updated: '2026-05-08' + last_verified: '2026-05-08' + verified_for: 3.0.0rc14 + ignore: false + last_content_updated: '2026-05-08' +--- + +# Automated annotation with point tracking + +```{seealso} +For basic usage of the annotation plugin, see {ref}`file:napari-dlc-basic-usage` for the recommended workflow. +``` + +```{note} +The plugin relies on third-party open-source tracking models. +Please see {ref}`sec:napari-tracking-models-attribution` at the end of this page for information about the tracking models used in the plugin and their citation information. +``` + +## Overview + +The **Tracking Controls** widget is designed to help automate DeepLabCut annotation workflows: + +1. Manually annotate a small set of keypoints on a *reference frame*. +1. Use a point tracking model to propagate those keypoints forward and/or backward in time. +1. Inspect, refine, delete, and merge tracked results before exporting them back to DeepLabCut. + +> **Tracking is intended to accelerate annotation, and cannot replace manual review.** + +## Requirements + +```{tip} +We recommend **having a GPU available for tracking**, as it can be computationally intensive and slow on CPU. +Expect longer processing times on CPU, especially for longer videos or larger tracking ranges. +``` + +### In napari + +```{important} +Before using tracking, you must: + +- Load a **video** or **extracted frames** as an `Image` layer with time as the first dimension. + - For DLC-integrated workflows, the **easiest starting point is often to drag-and-drop one of the `labeled-data` folders from your DLC project**. + - See {ref}`sec:napari-dlc-basic-workflow` for more details on how to prepare your data and annotations before tracking. +- Ensure you have a **Points** layer containing DeepLabCut-style keypoints. + - If annotating from scratch, drag-and-drop the `config.yaml` file from your DLC project to create a new Points layer with the correct metadata. + - If loading a folder which already contains a `CollectedData_*.h5` file, the plugin will automatically create a Points layer with the existing annotations. +- Annotate at least one frame with valid keypoints. +- Tracking is most useful on temporally continuous image sequences or videos. + +See the workflow guides below for more details of the tracking process. +``` + +### In your Python environment + +**Skip this if you have already installed PyTorch or DeepLabCut** + +```{important} +**By default, installing the `[tracking]` extra alone will not enable GPU support.** +Check the [official PyTorch installation guide](https://pytorch.org/get-started/locally/) for GPU support and installation instructions for your system. +``` + +If you do not have PyTorch installed, or if you are using the plugin without the DeepLabCut package installed, install with: + +```bash +pip install napari-deeplabcut[tracking] +``` + +## User interface + + + +```{figure} ../../../images/napari/tracking/controls.png +--- +name: tracking-controls +caption: Tracking Controls widget with annotated keypoints and tracking results. +--- +Tracking Controls widget with annotated keypoints and tracking results. +``` + +### Showing the widget + +Use: + +> Plugins -> napari-deeplabcut -> Tracking controls + +### 1. Model selection + +| Control | Description | +| --------------- | ------------------------------------------------------- | +| **Tracker** | Selects the tracking backend from `AVAILABLE_TRACKERS`. | +| **Info button** | Hover to see tracker-specific details. | + + + +```{note} +Available models may depend on your installation and optional dependencies. +``` + +### 2. Layer selection + +| Control | Description | +| ------------- | -------------------------------------------------------- | +| **Keypoints** | Points layer containing manually annotated DLC keypoints | +| **Video** | Image layer containing the video to track | + +The widget automatically updates based on layer changes. + +### 3. Reference frame selection + +- The **Current** spinbox always reflects the viewer's current time index. +- This frame is used as the **query frame** for tracking. + - The model generates tracking predictions from the keypoints present on this frame and uses them as seeds to track forward and/or backward in time. + +```{note} +Only keypoints present on the selected reference frame are used to initialize a tracking run. +Neighboring frames or frames later in the video are never considered for initialization, even if they contain keypoints. +``` + +### 4. Frame range controls + +Tracking range can be specified **relative** or **absolute** to the reference frame. + +#### Backward (left) + +- Slider: relative negative offset +- `<< Abs`: absolute frame index +- `<< Rel`: relative frame offset + +#### Forward (right) + +- Slider: relative positive offset +- `Abs >>`: absolute frame index +- `Rel >>`: relative frame offset + +Changing the current frame updates the valid forward/backward range automatically. + +### 5. Tracking actions + +| Button | Action | +| ------ | ----------------------------- | +| ◀ | Track backward | +| ◀◀ | Track backward to first frame | +| ▶ | Track forward | +| ▶▶ | Track forward to last frame | +| ⟳ | Track both directions | +| ■ | Stop tracking | + +```{note} +Tracking runs in the background. You can continue navigating the viewer and editing layers while it runs; results will appear as a new layer once tracking is complete. +``` + +## Keyboard shortcuts + +Most tracking functions have keyboard shortcuts for easier usage. + +```{tip} +You can see shortcuts and their status using: +> Help -> Show napari-dlc shortcuts + +This is only available if the Keypoint controls widget has been opened at least once. +``` + +## Tracking results + +```{tip} +**Being able to tell which results originate from which layer is very important for effectively using the plugin.** +- Layers can be toggled (visible/invisible) with `V` by default or by clicking the eye icon next to the layer name in the layer list. +- Grid mode (toggled with `Ctrl+G` by default) can also help visually separate different layers and their results. +``` + +Each tracking run creates a **new Points layer**: + +- Named automatically (`[Tracking v] Ref. layer name - t - Tracker name`) + - `XX` refers to the iteration number (if multiple tracking runs are performed from the same reference layer and model) + - `T` refers to the reference frame index used to generate the tracking result +- **Visually distinct from manual annotations**: + - Cross symbol + - Slight transparency + - Green border + +```{note} +The original annotation layer is never modified by tracking. +To incorporate tracking results into your annotation data, use the merge workflow described below. +``` + +```{important} +If you run into accessibility issues with the default visualization style, please [open an issue](https://github.com/DeepLabCut/napari-deeplabcut/issues). +We would be happy to expand settings and provide more customization options if requested. +``` + +## Refinement and saving tools + +```{danger} +There is **currently no undo option**. Any **deletion or merging action you perform on layers is irreversible**, so we recommend keeping track of your layers and using visibility toggles to compare before and after merge results. + +Overwrite warnings will be shown where relevant. +``` + +### Deleting tracked points in future frames + +**Tracking results are often satisfactory for a certain number of frames, then start to drift or produce errors.** +For example, a tracked point may start following the background instead of the intended body part, or jump to a different body part or individual. +Because of this sometimes unavoidable drift, we provide a way to delete future tracked points while keeping the current frame intact. + +1. Select a tracking result Points layer. + - This action is always disabled for the original annotation layer. +1. Select one or more points on the **current frame**. +1. Click **Delete selected points in future frames**. + +Only *exact identity matches* in future frames are removed. + +```{important} +Points on the current frame are preserved so you can correct them and re-run tracking. +``` + +This allows you to run tracking, and iteratively progress through the frames, correcting keypoints as you go, and merging the final results back into the original annotation layer when you are satisfied, see below for more details on merging. + +### Merging tracked points + +The **Merge tracked points** workflow allows you to: + +- Combine multiple tracking passes +- Decide how to handle overlaps or conflicts +- Produce a clean final annotation layer + +This is especially useful when tracking was run from multiple reference frames. +There are several merge options available to help you achieve the desired result: + +- **Fill missing only**: Existing keypoints are always preserved. Missing keypoints in frames are filled with tracked results. + - Intended for merging final tracking results into the original annotation layer. +- **Overwrite existing target points**: Tracked keypoints overwrite existing ones in the target layer. + - Intended for replacing poor tracking results with a new, updated tracking pass. + +```{important} +Tracking result layers are intermediate working layers. +To save results back into the DeepLabCut project, first merge tracked points into a standard DLC annotation layer, then save that final annotation layer. +Tracking layers will be saved as CSVs, which are not compatible with DLC project annotations and will not be written back to the `CollectedData_*.h5` workflow. +``` + +## Workflow example + +### Loading and annotating from scratch + +1. Create a DeepLabCut project and add the videos to label. +1. Extract frames from the videos. + - Currently implemented trackers prefer continuous video frames. We recommend avoiding large gaps in frames ("jumpy" video), which can make tracking more difficult. + - For this reason, you may want to run tracking on the original video, then extract frames with tracking/refined annotations directly. +1. Go to the `labeled-data` folder, then drag-and-drop a folder with extracted frames into napari. + - This creates an Image layer with the frames. +1. Drag-and-drop the `config.yaml` file from your DLC project into napari. + - This creates an empty Points layer with the correct DLC metadata, ready for annotation. +1. Annotate keypoints on a reference frame. + +> Go to {ref}`sec:tracking-workflow-guides`. + +### Loading and annotating from existing DLC annotations + +1. Go to the `labeled-data` folder, then drag-and-drop a subfolder with extracted frames into napari. + - This creates an Image layer with the frames. + - Existing annotations from the `CollectedData_*.h5` file are loaded as a Points layer. +1. Inspect existing annotations, select a reference frame, and refine keypoints if needed. + +> Go to {ref}`sec:tracking-workflow-guides`. + +(sec:tracking-workflow-guides)= + +### Tracking + +1. Open the Tracking Controls widget (`Plugins -> napari-deeplabcut -> Tracking controls`). +1. Go to the desired reference frame, with annotated keypoints visible. +1. Select the forward/backward tracking range using the sliders and track forward/backward, or track to the beginning/end of the video using the seek buttons. +1. Inspect the tracking results. + - You can use **Show trajectories** in the Keypoint Controls dock widget to visualize the trajectories of tracked points across frames, which can help identify where tracking starts to drift. + - The plot is filtered by selected keypoints, so you can select a subset of points to inspect their trajectories more closely. +1. If there are problematic points: + 1. On the frame where tracking starts to drift, select the problematic point(s) and click **Delete selected points in future frames** to remove incorrect tracking results while preserving the tracked point(s) on the current frame. + 1. Refine the keypoint(s) on the current frame by correcting their position. + 1. Re-run tracking from that frame to propagate the correction forward or backward in time. +1. Merge the new tracking result back into the previous tracking layer when appropriate (for example, using **Overwrite existing target points**). +1. Repeat until satisfied with the tracking result, then merge into the original annotation layer using **Fill missing only** to preserve your original annotations and only add tracked keypoints in frames where you do not yet have manual annotations. +1. **Save the final DLC annotation layer** (usually the original annotation layer after merging). + - Tracking result layers are intermediate working layers and are not written back directly as DLC project annotations. + - **Saving the final merged annotation layer is the step that writes back to the DLC project folder and updates the `CollectedData_*.h5` workflow.** + +```{note} +The **Show trails** feature is currently not available for tracking result layers. Please [open an issue](https://github.com/DeepLabCut/napari-deeplabcut/issues) if this is something you would like to see in the future. +``` + +## Troubleshooting + +### No keypoints found on reference frame + +Ensure that: + +- **The correct Points layer is selected in the tracking controls dropdown menu.** +- You are on the intended frame. +- Points exist exactly on that frame index. + +### Tracking buttons do nothing + +Check that: + +- A video layer is selected. +- A keypoint layer is selected. +- Tracking is not already running. + +(sec:napari-tracking-models-attribution)= + +## Models information and citation info + +### CoTracker3 + +> CoTracker is a fast transformer-based model that can track any point in a video. It brings to tracking some of the benefits of OpticalFlow. + +- [Link to GitHub repository](https://github.com/facebookresearch/co-tracker) +- [Citation information](https://github.com/facebookresearch/co-tracker#citing-cotracker) + +```{admonition} Empirical observations +--- +class: tip +--- +This information is based on our own testing and experience with the model. +Please share any feedback or insights you have with us! + +- **Strengths:** fast on GPU, can output 10-100 frames of satisfactory tracking results, depending on difficulty. +- **Limitations:** strong preference for continuous video frames; struggles with large gaps in frame indices (for example, automated DLC frame extraction via clustering, or uniform extraction with a large step size). + Consider running tracking on the original video, then extracting frames with tracking/refined annotations directly. +``` + +## Limitations and future directions + +### Important considerations + +- As correcting labels can be time-consuming, annotating by hand may sometimes be faster than running tracking and heavily correcting its results. + - The benefits are mostly for long, continuous videos with many frames to annotate, where tracking can save time by propagating annotations across many frames at once. + - In very high-variability or very challenging videos, annotating by hand may still be more efficient than running tracking and correcting its results, especially if you only have a few frames to annotate. +- Manual curation is still essential for good tracking results, and the tracking models do not fully replace the need for manual annotation. +- In practice, a mix of hand-labeled hard frames and tracked easy frames should often works best. +- Be mindful of training set imbalance: if you flood your training set with easy frames that are well tracked, and only have a few hand-picked frames with rare or difficult poses, your model may not learn to generalize well to those challenging poses. + +#### Future features + +- We currently only provide CoTracker3 as a model. It is, however, relatively easy to add new models to the plugin via the registry; feel free to ask if you would like to contribute a model or see a specific model added. +- Generic napari saves or exports of tracking result layers are not part of the recommended DeepLabCut workflow. Tracking result layers are intermediate working layers; to preserve results in a DLC project-compatible way, merge them into a standard annotation layer and save that layer. +- If there is demand, we may add support for saving and loading tracking layers as separate files in the DLC project folder. +- If you have ideas for specific refinement tools, shortcuts, or other features that would be useful to add to the plugin, please share them with us. + +## Getting help and providing feedback + +- [GitHub issues](https://github.com/DeepLabCut/napari-deeplabcut/issues): for bug reports, feature requests, or general questions. We welcome your feedback and contributions. +- [Discussion forum](https://forum.image.sc/tag/deeplabcut): for general discussion, questions, and sharing your work with the community. We also provide troubleshooting help and guidance here, but may open an issue for actual bugs or feature requests directly on GitHub, as well as request more information there. diff --git a/docs/images/napari/tracking/controls.png b/docs/images/napari/tracking/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..682f8e59e619c77cd8cd37b2b61f23c57c1d05fd GIT binary patch literal 18444 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 Date: Wed, 27 May 2026 14:05:20 +0200 Subject: [PATCH 08/86] Fix conflicts --- _toc.yml | 208 +++++++++++++-------------- docs/gui/index.md | 10 ++ docs/maDLC_UserGuide.md | 2 +- docs/notebooks/extra.md | 1 + docs/notebooks/main_demos.md | 1 + docs/notebooks/your_data.md | 1 + docs/pytorch/index.md | 1 + docs/recipes/index.md | 1 + docs/standardDeepLabCut_UserGuide.md | 2 +- 9 files changed, 113 insertions(+), 114 deletions(-) create mode 100644 docs/gui/index.md create mode 100644 docs/notebooks/extra.md create mode 100644 docs/notebooks/main_demos.md create mode 100644 docs/notebooks/your_data.md create mode 100644 docs/pytorch/index.md create mode 100644 docs/recipes/index.md diff --git a/_toc.yml b/_toc.yml index 51d3935a78..72037c82de 100644 --- a/_toc.yml +++ b/_toc.yml @@ -2,125 +2,109 @@ format: jb-book root: README parts: -- caption: Getting Started - chapters: - - file: docs/UseOverviewGuide - - file: docs/course + - caption: Getting started + chapters: + - file: docs/UseOverviewGuide + - file: docs/installation + sections: + - file: docs/recipes/installTips + - file: docs/docker + - file: docs/quick-start/index + sections: + - file: docs/quick-start/single_animal_quick_guide + - file: docs/quick-start/tutorial_maDLC -- caption: Installation - chapters: - - file: docs/installation - - file: docs/recipes/installTips - - file: docs/docker + - caption: Main workflows overview + chapters: + - file: docs/standardDeepLabCut_UserGuide + - file: docs/maDLC_UserGuide + - file: docs/Overviewof3D - caption: GUI workflow chapters: - file: docs/gui/PROJECT_GUI - - file: docs/beginner-guides/beginners-guide - sections: - - file: docs/beginner-guides/manage-project - - file: docs/beginner-guides/labeling - - file: docs/beginner-guides/Training-Evaluation - - file: docs/beginner-guides/video-analysis - file: docs/gui/napari_GUI + - file: docs/gui/index sections: - - file: docs/gui/napari/basic_usage - - file: docs/gui/napari/advanced_usage - - file: docs/gui/napari/tracking/basic_usage - -- caption: DLC3 PyTorch Specific Docs - chapters: - - file: docs/pytorch/user_guide.md - - file: docs/pytorch/pytorch_config.md - - file: docs/pytorch/architectures.md - -- caption: Quick Start Tutorials - chapters: - - file: docs/quick-start/single_animal_quick_guide - - file: docs/quick-start/tutorial_maDLC - -- caption: "🚀 Beginner's Guide to DeepLabCut" - chapters: - - file: docs/beginner-guides/beginners-guide - - file: docs/beginner-guides/manage-project - - file: docs/beginner-guides/labeling - - file: docs/beginner-guides/Training-Evaluation - - file: docs/beginner-guides/video-analysis - -- caption: "🚀 Main Demo Notebooks" - chapters: - - file: examples/COLAB/COLAB_DEMO_SuperAnimal - - file: examples/COLAB/COLAB_DEMO_mouse_openfield - - file: examples/COLAB/COLAB_3miceDemo - - file: examples/COLAB/COLAB_HumanPose_with_RTMPose - -- caption: "🚀 Notebooks For Your Data" - chapters: - - file: examples/COLAB/COLAB_YOURDATA_SuperAnimal - - file: examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis - - file: examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis - -- caption: "🚀 Special Feature Demos" - chapters: - - file: examples/COLAB/COLAB_transformer_reID - - file: examples/COLAB/COLAB_BUCTD_and_CTD_tracking - - file: examples/JUPYTER/Demo_3D_DeepLabCut - - file: examples/COLAB/COLAB_DLC_ModelZoo - -- caption: "🧑‍🍳 Cookbook (detailed helper guides)" - chapters: - - file: docs/convert_maDLC - - file: docs/recipes/OtherData - - file: docs/recipes/io - - file: docs/recipes/nn - - file: docs/recipes/post - - file: docs/recipes/BatchProcessing - - file: docs/recipes/DLCMethods - - file: docs/recipes/ClusteringNapari - - file: docs/recipes/OpenVINO - - file: docs/recipes/flip_and_rotate - - file: docs/recipes/pose_cfg_file_breakdown - - file: docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook - -- caption: Hardware Tips - chapters: - - file: docs/recipes/TechHardware - -- caption: DeepLabCut-Live! - chapters: - - file: docs/dlc-live/deeplabcutlive - - file: docs/dlc-live/dlc-live-gui/index - sections: - - file: docs/dlc-live/dlc-live-gui/quickstart/install - - file: docs/dlc-live/dlc-live-gui/user_guide/overview - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support + - file: docs/beginner-guides/beginners-guide + sections: + - file: docs/beginner-guides/manage-project + - file: docs/beginner-guides/labeling + - file: docs/beginner-guides/Training-Evaluation + - file: docs/beginner-guides/video-analysis + + - caption: Notebooks & Demos + chapters: + - file: docs/notebooks/main_demos sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing + - file: examples/COLAB/COLAB_DEMO_SuperAnimal + - file: examples/COLAB/COLAB_DEMO_mouse_openfield + - file: examples/COLAB/COLAB_3miceDemo + - file: examples/COLAB/COLAB_HumanPose_with_RTMPose + - file: docs/notebooks/your_data sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format - -- caption: "🦄 DeepLabCut Model Zoo" - chapters: - - file: docs/ModelZoo - - file: docs/recipes/UsingModelZooPupil - -- caption: DeepLabCut Benchmarking - chapters: - - file: docs/benchmark - - file: docs/pytorch/Benchmarking_shuffle_guide - -- caption: "Mission & Contribute" - chapters: - - file: docs/MISSION_AND_VALUES - - file: docs/roadmap - - file: docs/Governance - - file: CONTRIBUTING + - file: examples/COLAB/COLAB_YOURDATA_SuperAnimal + - file: examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis + - file: examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis + - file: docs/notebooks/extra + sections: + - file: examples/COLAB/COLAB_transformer_reID + - file: examples/COLAB/COLAB_BUCTD_and_CTD_tracking + - file: examples/JUPYTER/Demo_3D_DeepLabCut + - file: examples/COLAB/COLAB_DLC_ModelZoo -- caption: Citations for DeepLabCut - chapters: - - file: docs/citation + - caption: Advanced, Performance & Live + chapters: + - file: docs/pytorch/index + sections: + - file: docs/pytorch/user_guide.md + - file: docs/pytorch/pytorch_config.md + - file: docs/pytorch/architectures.md + - file: docs/pytorch/Benchmarking_shuffle_guide + - file: docs/benchmark + - file: docs/ModelZoo + sections: + - file: docs/recipes/UsingModelZooPupil + - file: docs/dlc-live/deeplabcutlive + - file: docs/dlc-live/dlc-live-gui/index + sections: + - file: docs/dlc-live/dlc-live-gui/quickstart/install + - file: docs/dlc-live/dlc-live-gui/user_guide/overview + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support + sections: + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing + sections: + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format + - file: docs/recipes/TechHardware + + - caption: Additional guides (Recipes) + chapters: + - file: docs/recipes/index + sections: + - file: docs/HelperFunctions + - file: docs/convert_maDLC + - file: docs/recipes/OtherData + - file: docs/recipes/io + - file: docs/recipes/nn + - file: docs/recipes/post + - file: docs/recipes/BatchProcessing + - file: docs/recipes/DLCMethods + - file: docs/recipes/ClusteringNapari + - file: docs/recipes/OpenVINO + - file: docs/recipes/flip_and_rotate + - file: docs/recipes/pose_cfg_file_breakdown + - file: docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook + - file: docs/course + + - caption: Project & Community + chapters: + - file: docs/MISSION_AND_VALUES + - file: docs/roadmap + - file: docs/Governance + - file: CONTRIBUTING + - file: docs/citation diff --git a/docs/gui/index.md b/docs/gui/index.md new file mode 100644 index 0000000000..7219999f91 --- /dev/null +++ b/docs/gui/index.md @@ -0,0 +1,10 @@ +# GUIde + +```{toctree} +--- +maxdepth: 2 +caption: GUI Workflows & Beginner Guides +--- + docs/gui/PROJECT_GUI + docs/gui/napari_GUI +``` diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 99641a59b1..5ca4fc31e4 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -11,7 +11,7 @@ deeplabcut: (multi-animal-userguide)= -# DeepLabCut for Multi-Animal Projects +# Multi-animal projects This document should serve as the user guide for maDLC, and it is here to support the scientific advances presented in [Lauer et al. 2022](https://doi.org/10.1038/s41592-022-01443-0). diff --git a/docs/notebooks/extra.md b/docs/notebooks/extra.md new file mode 100644 index 0000000000..127406c582 --- /dev/null +++ b/docs/notebooks/extra.md @@ -0,0 +1 @@ +# Additional features notebooks diff --git a/docs/notebooks/main_demos.md b/docs/notebooks/main_demos.md new file mode 100644 index 0000000000..789d47b336 --- /dev/null +++ b/docs/notebooks/main_demos.md @@ -0,0 +1 @@ +# Demo notebooks diff --git a/docs/notebooks/your_data.md b/docs/notebooks/your_data.md new file mode 100644 index 0000000000..3ec1e2fc59 --- /dev/null +++ b/docs/notebooks/your_data.md @@ -0,0 +1 @@ +# Notebooks for your data diff --git a/docs/pytorch/index.md b/docs/pytorch/index.md new file mode 100644 index 0000000000..efc258222a --- /dev/null +++ b/docs/pytorch/index.md @@ -0,0 +1 @@ +# PyTorch backend guide diff --git a/docs/recipes/index.md b/docs/recipes/index.md new file mode 100644 index 0000000000..fcc04aec04 --- /dev/null +++ b/docs/recipes/index.md @@ -0,0 +1 @@ +# Additional guides diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 8d6847c5f5..914d85d08e 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -11,7 +11,7 @@ deeplabcut: (single-animal-userguide)= -# DeepLabCut User Guide (for single animal projects) +# Single animal projects This document covers single/standard DeepLabCut use. If you have a complicated multi-animal scenario (i.e., they look the same), then please see our [maDLC user guide](multi-animal-userguide). From 5976b2c51e0a8d16217fe051df8713bb807036f7 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 14:06:44 +0200 Subject: [PATCH 09/86] Fix conflicts --- _toc.yml | 54 ++++++++++++++++++++++--------------------- docs/recipes/index.md | 2 +- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/_toc.yml b/_toc.yml index 72037c82de..495a9110c0 100644 --- a/_toc.yml +++ b/_toc.yml @@ -7,7 +7,7 @@ parts: - file: docs/UseOverviewGuide - file: docs/installation sections: - - file: docs/recipes/installTips + # - file: docs/recipes/installTips - file: docs/docker - file: docs/quick-start/index sections: @@ -23,15 +23,31 @@ parts: - caption: GUI workflow chapters: - file: docs/gui/PROJECT_GUI + - file: docs/beginner-guides/beginners-guide + sections: + - file: docs/beginner-guides/manage-project + - file: docs/beginner-guides/labeling + - file: docs/beginner-guides/Training-Evaluation + - file: docs/beginner-guides/video-analysis - file: docs/gui/napari_GUI - - file: docs/gui/index sections: - - file: docs/beginner-guides/beginners-guide + - file: docs/gui/napari/basic_usage + - file: docs/gui/napari/advanced_usage + - file: docs/dlc-live/dlc-live-gui/index + sections: + - file: docs/dlc-live/dlc-live-gui/quickstart/install + - file: docs/dlc-live/dlc-live-gui/user_guide/overview + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support sections: - - file: docs/beginner-guides/manage-project - - file: docs/beginner-guides/labeling - - file: docs/beginner-guides/Training-Evaluation - - file: docs/beginner-guides/video-analysis + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing + sections: + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format + - caption: Notebooks & Demos chapters: @@ -55,6 +71,10 @@ parts: - caption: Advanced, Performance & Live chapters: + - file: docs/ModelZoo + sections: + - file: docs/recipes/UsingModelZooPupil + - file: docs/dlc-live/deeplabcutlive - file: docs/pytorch/index sections: - file: docs/pytorch/user_guide.md @@ -62,24 +82,6 @@ parts: - file: docs/pytorch/architectures.md - file: docs/pytorch/Benchmarking_shuffle_guide - file: docs/benchmark - - file: docs/ModelZoo - sections: - - file: docs/recipes/UsingModelZooPupil - - file: docs/dlc-live/deeplabcutlive - - file: docs/dlc-live/dlc-live-gui/index - sections: - - file: docs/dlc-live/dlc-live-gui/quickstart/install - - file: docs/dlc-live/dlc-live-gui/user_guide/overview - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support - sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing - sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format - file: docs/recipes/TechHardware - caption: Additional guides (Recipes) @@ -99,7 +101,7 @@ parts: - file: docs/recipes/flip_and_rotate - file: docs/recipes/pose_cfg_file_breakdown - file: docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook - - file: docs/course + # - file: docs/course - caption: Project & Community chapters: diff --git a/docs/recipes/index.md b/docs/recipes/index.md index fcc04aec04..195e8987fc 100644 --- a/docs/recipes/index.md +++ b/docs/recipes/index.md @@ -1 +1 @@ -# Additional guides +# The DeepLabCut Cookbook From b52abbfc90037bccfa4c4f2c7dc8c6df4d42b4b4 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 14:08:35 +0200 Subject: [PATCH 10/86] Fix conflicts --- _toc.yml | 61 ++++++++++--------- docs/beginner-guides/beginners-guide.md | 2 +- docs/installation.md | 4 +- docs/pytorch/Benchmarking_shuffle_guide.md | 4 +- docs/pytorch/architectures.md | 2 +- docs/pytorch/index.md | 2 +- docs/pytorch/pytorch_config.md | 2 +- docs/pytorch/user_guide.md | 8 ++- docs/quick-start/index.md | 4 ++ docs/quick-start/single_animal_quick_guide.md | 2 + docs/quick-start/tutorial_maDLC.md | 2 + docs/recipes/TechHardware.md | 4 ++ 12 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 docs/quick-start/index.md diff --git a/_toc.yml b/_toc.yml index 495a9110c0..42bd4e9522 100644 --- a/_toc.yml +++ b/_toc.yml @@ -9,10 +9,10 @@ parts: sections: # - file: docs/recipes/installTips - file: docs/docker - - file: docs/quick-start/index - sections: - - file: docs/quick-start/single_animal_quick_guide - - file: docs/quick-start/tutorial_maDLC + # - file: docs/quick-start/index + # sections: + # - file: docs/quick-start/single_animal_quick_guide + # - file: docs/quick-start/tutorial_maDLC - caption: Main workflows overview chapters: @@ -33,35 +33,21 @@ parts: sections: - file: docs/gui/napari/basic_usage - file: docs/gui/napari/advanced_usage - - file: docs/dlc-live/dlc-live-gui/index - sections: - - file: docs/dlc-live/dlc-live-gui/quickstart/install - - file: docs/dlc-live/dlc-live-gui/user_guide/overview - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support - sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing - sections: - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads - - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format - caption: Notebooks & Demos chapters: + - file: docs/notebooks/your_data + sections: + - file: examples/COLAB/COLAB_YOURDATA_SuperAnimal + - file: examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis + - file: examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis - file: docs/notebooks/main_demos sections: - file: examples/COLAB/COLAB_DEMO_SuperAnimal - file: examples/COLAB/COLAB_DEMO_mouse_openfield - file: examples/COLAB/COLAB_3miceDemo - file: examples/COLAB/COLAB_HumanPose_with_RTMPose - - file: docs/notebooks/your_data - sections: - - file: examples/COLAB/COLAB_YOURDATA_SuperAnimal - - file: examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis - - file: examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis - file: docs/notebooks/extra sections: - file: examples/COLAB/COLAB_transformer_reID @@ -69,18 +55,35 @@ parts: - file: examples/JUPYTER/Demo_3D_DeepLabCut - file: examples/COLAB/COLAB_DLC_ModelZoo - - caption: Advanced, Performance & Live + - caption: DeepLabCut 3.0 - PyTorch guides chapters: - - file: docs/ModelZoo - sections: - - file: docs/recipes/UsingModelZooPupil - - file: docs/dlc-live/deeplabcutlive - file: docs/pytorch/index sections: - file: docs/pytorch/user_guide.md - file: docs/pytorch/pytorch_config.md - file: docs/pytorch/architectures.md - file: docs/pytorch/Benchmarking_shuffle_guide + + - caption: Advanced, Performance & Live + chapters: + - file: docs/ModelZoo + sections: + - file: docs/recipes/UsingModelZooPupil + - file: docs/dlc-live/deeplabcutlive + - file: docs/dlc-live/dlc-live-gui/index + sections: + - file: docs/dlc-live/dlc-live-gui/quickstart/install + - file: docs/dlc-live/dlc-live-gui/user_guide/overview + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/camera_support + sections: + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/opencv_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/basler_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/aravis_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/cameras_backends/gentl_backend + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing + sections: + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads + - file: docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format - file: docs/benchmark - file: docs/recipes/TechHardware @@ -88,6 +91,7 @@ parts: chapters: - file: docs/recipes/index sections: + - file: docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook - file: docs/HelperFunctions - file: docs/convert_maDLC - file: docs/recipes/OtherData @@ -100,7 +104,6 @@ parts: - file: docs/recipes/OpenVINO - file: docs/recipes/flip_and_rotate - file: docs/recipes/pose_cfg_file_breakdown - - file: docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook # - file: docs/course - caption: Project & Community diff --git a/docs/beginner-guides/beginners-guide.md b/docs/beginner-guides/beginners-guide.md index ecc1a4afd4..93d5df6187 100644 --- a/docs/beginner-guides/beginners-guide.md +++ b/docs/beginner-guides/beginners-guide.md @@ -11,7 +11,7 @@ deeplabcut: (file:beginners-guide)= -# Using the DeepLabCut GUI +# Project Manager GUI - Step by step DLC LIVE! diff --git a/docs/installation.md b/docs/installation.md index 73890d523c..8d90485155 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -4,8 +4,8 @@ deeplabcut: last_metadata_updated: '2026-04-21' ignore: false visibility: online - status: outdated - recommendation: update + status: viable + recommendation: move notes: Could be moved to a core/installation folder for clarity. last_verified: '2026-04-21' verified_for: 3.0.0rc14 diff --git a/docs/pytorch/Benchmarking_shuffle_guide.md b/docs/pytorch/Benchmarking_shuffle_guide.md index 42f93777a6..1d587c9550 100644 --- a/docs/pytorch/Benchmarking_shuffle_guide.md +++ b/docs/pytorch/Benchmarking_shuffle_guide.md @@ -6,10 +6,10 @@ deeplabcut: visibility: online status: viable recommendation: move - notes: Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends. + notes: Useful and well-written, but it could be better grouped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat in between the two backends. --- -# DeepLabCut Benchmarking - User Guide +# Benchmarking user guide ## Reasoning for benchmarking models in DLC (across DLC versions and architectures) diff --git a/docs/pytorch/architectures.md b/docs/pytorch/architectures.md index c2511aaefb..71ace606ca 100644 --- a/docs/pytorch/architectures.md +++ b/docs/pytorch/architectures.md @@ -10,7 +10,7 @@ deeplabcut: (dlc3-architectures)= -# DeepLabCut 3.0 - PyTorch Model Architectures +# Model architectures ## Introduction diff --git a/docs/pytorch/index.md b/docs/pytorch/index.md index efc258222a..7d609e2c82 100644 --- a/docs/pytorch/index.md +++ b/docs/pytorch/index.md @@ -1 +1 @@ -# PyTorch backend guide +# PyTorch backend guides diff --git a/docs/pytorch/pytorch_config.md b/docs/pytorch/pytorch_config.md index a4c33cd8fb..e9aee9fbab 100644 --- a/docs/pytorch/pytorch_config.md +++ b/docs/pytorch/pytorch_config.md @@ -11,7 +11,7 @@ deeplabcut: (dlc3-pytorch-config)= -# The PyTorch Configuration file +# Configuration file reference The `pytorch_config.yaml` file specifies the configuration for your PyTorch pose models, from the model architecture to which optimizer will be used for training, how training diff --git a/docs/pytorch/user_guide.md b/docs/pytorch/user_guide.md index 6cae1df0dd..7762705ed5 100644 --- a/docs/pytorch/user_guide.md +++ b/docs/pytorch/user_guide.md @@ -7,7 +7,7 @@ deeplabcut: (dlc3-user-guide)= -# DeepLabCut 3.0 - PyTorch User Guide +# What is new in DeepLabCut 3.0 ## Using DeepLabCut 3.0 @@ -74,7 +74,9 @@ from deeplabcut.pose_estimation_pytorch import available_models print(available_models()) ``` -### Development State and Road Map 🚧 + + + diff --git a/docs/quick-start/index.md b/docs/quick-start/index.md new file mode 100644 index 0000000000..52fea9f414 --- /dev/null +++ b/docs/quick-start/index.md @@ -0,0 +1,4 @@ +# Quick start guides + +- Single animal: {ref}`file:single-animal-quick-start` +- Multi-animal: {ref}`file:multi-animal-quick-start` diff --git a/docs/quick-start/single_animal_quick_guide.md b/docs/quick-start/single_animal_quick_guide.md index 96af3d0921..16b68873cc 100644 --- a/docs/quick-start/single_animal_quick_guide.md +++ b/docs/quick-start/single_animal_quick_guide.md @@ -9,6 +9,8 @@ deeplabcut: notes: This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving. --- +(file:single-animal-quick-start)= + # QUICK GUIDE to single Animal Training: **The main steps to take you from project creation to analyzed videos:** diff --git a/docs/quick-start/tutorial_maDLC.md b/docs/quick-start/tutorial_maDLC.md index 000b6d0c02..e33fe44bc7 100644 --- a/docs/quick-start/tutorial_maDLC.md +++ b/docs/quick-start/tutorial_maDLC.md @@ -8,6 +8,8 @@ deeplabcut: recommendation: keep --- +(file:multi-animal-quick-start)= + # Multi-animal pose estimation with DeepLabCut: A 5-minute tutorial ## GUI: diff --git a/docs/recipes/TechHardware.md b/docs/recipes/TechHardware.md index e8f7059e8c..d4b8be3a87 100644 --- a/docs/recipes/TechHardware.md +++ b/docs/recipes/TechHardware.md @@ -3,6 +3,10 @@ deeplabcut: last_content_updated: '2026-02-10' last_metadata_updated: '2026-03-06' ignore: false + visibility: online + status: outdated + recommendation: update + notes: Useful but needs to be updated and clarified. --- (file:hardware-requirements)= From 0ca05e020e5808d161c03739c5ccb162f7ef46ea Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 14:21:09 +0200 Subject: [PATCH 11/86] Revert lost changes --- _toc.yml | 2 +- docs/quick-start/index.md | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/_toc.yml b/_toc.yml index 42bd4e9522..7dc4f5faac 100644 --- a/_toc.yml +++ b/_toc.yml @@ -33,7 +33,7 @@ parts: sections: - file: docs/gui/napari/basic_usage - file: docs/gui/napari/advanced_usage - + - file: docs/gui/napari/tracking/basic_usage - caption: Notebooks & Demos chapters: diff --git a/docs/quick-start/index.md b/docs/quick-start/index.md index 52fea9f414..f05057b8a7 100644 --- a/docs/quick-start/index.md +++ b/docs/quick-start/index.md @@ -1,3 +1,14 @@ +--- +deeplabcut: + ignore: false + visibility: online + status: viable + recommendation: keep + last_metadata_updated: '2026-05-12' + last_verified: '2026-05-12' + verified_for: 3.0.0rc14 +--- + # Quick start guides - Single animal: {ref}`file:single-animal-quick-start` From 49bf6243ea217f5b37daa39b9ef3883aae7b061e Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 12:09:20 +0200 Subject: [PATCH 12/86] Fix TOC entry and update guide title Move beginners-guide into the GUI workflow sections in _toc.yml so it appears under the GUI chapter, and update the document heading in docs/beginner-guides/beginners-guide.md from "Project Manager GUI - Step by step" to "Setting up a new project" for clearer wording. --- _toc.yml | 2 +- docs/beginner-guides/beginners-guide.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_toc.yml b/_toc.yml index 7dc4f5faac..2ab75f8ce5 100644 --- a/_toc.yml +++ b/_toc.yml @@ -23,8 +23,8 @@ parts: - caption: GUI workflow chapters: - file: docs/gui/PROJECT_GUI - - file: docs/beginner-guides/beginners-guide sections: + - file: docs/beginner-guides/beginners-guide - file: docs/beginner-guides/manage-project - file: docs/beginner-guides/labeling - file: docs/beginner-guides/Training-Evaluation diff --git a/docs/beginner-guides/beginners-guide.md b/docs/beginner-guides/beginners-guide.md index 93d5df6187..9637651f6b 100644 --- a/docs/beginner-guides/beginners-guide.md +++ b/docs/beginner-guides/beginners-guide.md @@ -11,7 +11,7 @@ deeplabcut: (file:beginners-guide)= -# Project Manager GUI - Step by step +# Setting up a new project DLC LIVE! From a99bf1cb3409aa59cbfea3e7cce25712984cda40 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 12:03:34 +0200 Subject: [PATCH 13/86] Documentation: Migrate dlc-utils docs page Add docs/dlc-utils/index.md describing DeepLabCut-Utils community contributions, example scripts, tool links, maintainers, and legacy notes, ported over from https://github.com/DeepLabCut/DLCutils/blob/master/README.md. Also update _toc.yml to include the new page --- _toc.yml | 1 + docs/dlc-utils/index.md | 162 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 docs/dlc-utils/index.md diff --git a/_toc.yml b/_toc.yml index 2ab75f8ce5..f2c8d55403 100644 --- a/_toc.yml +++ b/_toc.yml @@ -105,6 +105,7 @@ parts: - file: docs/recipes/flip_and_rotate - file: docs/recipes/pose_cfg_file_breakdown # - file: docs/course + - file: docs/dlc-utils/index - caption: Project & Community chapters: diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md new file mode 100644 index 0000000000..0bd0934865 --- /dev/null +++ b/docs/dlc-utils/index.md @@ -0,0 +1,162 @@ +# DeepLabCut-Utils: Community contributions + +[![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) + +```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572296495650-Y4ZTJ2XP2Z9XF1AD74VW/ke17ZwdGBToddI8pDm48kMulEJPOrz9Y8HeI7oJuXxR7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z5QPOohDIaIeljMHgDF5CVlOqpeNLcJ80NK65_fV7S1UZiU3J6AN9rgO1lHw9nGbkYQrCLTag1XBHRgOrY8YAdXW07ycm2Trb21kYhaLJjddA/DLC_logo_blk-01.png?format=1000w +--- +alt: DLC Utils +width: 350px +align: right +--- +``` + +This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/AlexEMG/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! + +```{caution} +Please direct inquiries to the **contributors/code maintainers of that code**. Note that the software(s) are provided "as is", without warranty of any kind, express. +The DeepLabCut team is not responsible for the maintenance of these packages, and cannot guarantee that they will work with present & future versions of DeepLabCut. +``` + +## Example scripts for scaling up your DLC analysis & training + +These two scripts illustrate how to train, test, and analyze videos for multiple projects automatically (`scale_training_and_evaluation.py`) and how to analyze videos that are organized in subfolders automatically (`scale_analysis_oversubfolders.py`). Feel free to adjust them for your needs! + +- [Code: `scale_analysis_oversubfolders.py`](https://github.com/DeepLabCut/DLCutils/tree/master/SCALE_YOUR_ANALYSIS/scale_analysis_oversubfolders.py) +- [Code: `scale_training_and_evaluation.py`](https://github.com/DeepLabCut/DLCutils/blob/master/SCALE_YOUR_ANALYSIS/scale_training_and_evaluation.py) + +Contributed by [Alexander Mathis](https://github.com/AlexEMG) + +## Using your DLC outputs, loading, simple ROI analysis, visualization examples + +### Time spent of a body part in a particular region of interest (ROI) + +You can compute time spent in particular ROIs in frames. This demo Jupyter Notebook shows you how to load the outputs of DLC and perform the analysis (plus other plotting functions): + +- [Code: `Demo_loadandanalyzeDLCdata.ipynb`](https://github.com/DeepLabCut/DLCutils/blob/master/Demo_loadandanalyzeDLCdata.ipynb) +- [Code: `time_in_each_roi.py`](https://github.com/DeepLabCut/DLCutils/blob/master/time_in_each_roi.py) + +Contributed by [Federico Claudi](https://github.com/FedeClaudi) and Jupyter Notebook from [Alexander Mathis](https://github.com/AlexEMG) + +### DeepLabCut-Display GUI + +Open and view data to understand pose estimation errors and trends. Filter data by likelihood threshold. + +- [Code: `DeepLabCut-Display`](https://github.com/jakeshirey/DeepLabCut-Display) + +Contributed by [Jacob Shirey](https://github.com/jakeshirey) + +### A GUI-based ROI tool for time spent of a body part in a defined region of interest + +- [Code: `DLC_ROI_tool`](https://github.com/PolarBean/DLC_ROI_tool) + +Contributed by [Harry Carey](https://github.com/PolarBean) + +### Linear transformation and scaling of DLC output data (`transform_and_scale`) + +This package is designed for anyone who wants to know where a tracked marker is within a reference frame (i.e. behavioral context). DeepLabCut outputs coordinates in relation to the field of view of the recorded video. With this tool, these coordinates can be linearly transformed and scaled to the reference frame of the behavioral context, meaning that the output coordinates are distances [cm] to a corner of the behavioral context, instead of distances [px] to a corner of the video field of view. + +- [Code: `transform_and_scale`](https://github.com/DeepLabCut/DLCutils/tree/master/transform_and_scale/) +- [Tutorial: `transform_and_scale_tutorial.ipynb`](https://github.com/DeepLabCut/DLCutils/tree/master/transform_and_scale/transform_and_scale_tutorial.ipynb) + +Contributed by [Michael Schellenberger](https://github.com/MSchellenberger) + +## Clustering tools (using the output of DLC) + +### Identifying Behavioral Structure from Deep Variational Embeddings of Animal Motion + +- [Paper](https://www.biorxiv.org/content/10.1101/2020.05.14.095430) +- [Code: `VAME`](https://github.com/LINCellularNeuroscience/VAME) + +### Behavior clustering with MotionMapper + +- Adapted from [MotionMapper](https://github.com/gordonberman/MotionMapper) +- [Code: `DLC_2_MotionMapper`](https://github.com/DeepLabCut/DLCutils/tree/master/DLC_2_MotionMapper) + +Contributed by [Mackenzie Mathis](https://github.com/MMathisLab) + +### Behavior clustering with B-SOiD + +B-SOiD: An Open Source Unsupervised Algorithm for Discovery of Spontaneous Behaviors \<-- you can use the outputs of DLC to feed directly into B-SOiD (in MATLAB). + +- [Paper](https://www.biorxiv.org/content/10.1101/770271v1.abstract) +- [Code: `B-SOiD`](https://github.com/YttriLab/B-SOiD) + +## Machine-learning helper packages (using the output of DLC) + +### Behavior analysis with machine learning in R (`ETH-DLCAnalyzer`) + +Deep learning based behavioral analysis enables high precision rodent tracking and is capable of outperforming commercial solutions. Oliver Sturman, Lukas von Ziegler, Christa Schläppi, Furkan Akyol, Benjamin Grewe, Johannes Bohacek + +- [Paper](https://www.biorxiv.org/content/10.1101/2020.01.21.913624v1) +- [Code: `DLCAnalyzer`](https://github.com/ETHZ-INS/DLCAnalyzer) + +### Behavior analysis with machine learning classifiers (SIMBA) + +A pipeline for using pose estimation (i.e. DeepLabCut) then behavioral annotation and generation of supervised machine-learning-based classifiers. \<-- you can use the outputs of DLC to feed directly into SIMBA (in Python). + +Code written by: [Simon Nilsson](https://github.com/sronilsson) (please direct use questions to Simon). + +- [Paper](https://www.biorxiv.org/content/10.1101/2020.04.19.049452v2) +- [Code: `simba`](https://github.com/sgoldenlab/simba) + +## 3D DeepLabCut helper packages + +### A wrapper package for DeepLabCut 2.0 for 3D videos (`anipose`) + +- [Code: `anipose`](https://github.com/lambdaloop/anipose) + +Maintainer: [Pierre Karashchuk](https://github.com/lambdaloop) + +### 3D reconstruction with EasyWand/Argus DLT system with DeepLabCut data + +Written by [Brandon Jackson](https://github.com/haliaetus13), post our DLC workshop in Jan 2020: + +A small set of utilities that allow conversion between the data storage formats of DeepLabCut (DLC) and one of the DLT-based 3D tracking systems: either Ty Hedrick's DigitizingTools in MATLAB, or the Python-based Argus. These functions should allow you to use data previously digitized in a DLT system to create the files needed to train a DLC model, and to import DLC-tracked points back into a DLT 3D calibration to reconstruct 3D points. + +- [Code: `DLCconverterDLT`](https://github.com/haliaetus13/DLCconverterDLT) + +### Pupil Tracking + +- From Tom Vaissie - tvaissie@scripps.edu +- Please see the [README.txt file](https://github.com/DeepLabCut/DLCutils/tree/master/pupilTracking) for details; this code makes the video in case study 7 [http://www.mousemotorlab.org/deeplabcut/](http://www.mousemotorlab.org/deeplabcut/). + +### Using DeepLabCut for USB-CGPIO feedback + +- [Paper](https://www.biorxiv.org/content/early/2018/11/28/482349) +- [Code: `DeepCutRealTime`](https://github.com/bf777/DeepCutRealTime) + +Maintainer: [Brandon Forys](https://github.com/bf777) + +## Legacy utility functions (no longer required in DLC 2+) + +```{warning} +These utilities are marked as legacy and are no longer required in DLC 2+. +``` + +### DLC 1 to DLC 2 conversion code + +This code allows you to import the labeled data from DLC 1 to DLC 2 projects. Note, it is not streamlined and should be used with care. + +- [Conversion scripts (`conversion_scripts_LEGACY`)](https://github.com/DeepLabCut/DLCutils/tree/master/conversion_scripts_LEGACY) + +Contributed by [Alexander Mathis](https://github.com/AlexEMG) + +### Running project created on Windows on Colaboratory + +```{note} +**UPDATE:** as of DeepLabCut 2.0.4 onwards you no longer need to use this code! You can simply create the training set on the cloud and it will automatically convert your project for you. +``` + +- This solves a path problem when creating a project and annotating data on Windows (see [issue #172](https://github.com/AlexEMG/DeepLabCut/issues/172)). This functionality will be included in a later version of DLC 2 (DONE!) +- [Conversion scripts (`conversion_scripts_LEGACY`)](https://github.com/DeepLabCut/DLCutils/tree/master/conversion_scripts_LEGACY) + +*Usage:* change in lines 70 and 71 of [`convertWin2Unix.py`](https://github.com/DeepLabCut/DLCutils/tree/master/conversion_scripts_LEGACY/convertWin2Unix.py) + +```python +basepath='/content/drive/My Drive/DeepLabCut/examples/' +projectname='Reaching-Mackenzie-2018-08-30' +``` + +then run this script on Colaboratory after uploading your labeled data to the drive. Thereby it will be converted to Unix format, then create a training set (with DeepLabCut) and proceed as usual... + +Contributed by [Alexander Mathis](https://github.com/AlexEMG) From 9ca6dc2d23aa925410b23803022fbdfe5a155c16 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 12:07:00 +0200 Subject: [PATCH 14/86] chore(metadata): update docs/notebooks metadata --- docs/dlc-utils/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index 0bd0934865..432c5c149e 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -1,3 +1,11 @@ +--- +deeplabcut: + last_metadata_updated: '2026-05-06' + last_verified: '2026-05-06' + verified_for: 3.0.0rc14 + ignore: false +--- + # DeepLabCut-Utils: Community contributions [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) From 0b46e0ad9d043e371f50dfefd483264e6ae5312b Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 14:51:12 +0200 Subject: [PATCH 15/86] Fix repo link in utils --- docs/dlc-utils/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index 432c5c149e..05b24822dc 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -18,7 +18,7 @@ align: right --- ``` -This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/AlexEMG/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! +This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/DeepLabCut/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! ```{caution} Please direct inquiries to the **contributors/code maintainers of that code**. Note that the software(s) are provided "as is", without warranty of any kind, express. From 88ec90b32a0ecc1fe035d076add7ce0bace1e439 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 14:53:49 +0200 Subject: [PATCH 16/86] Change utils section name --- docs/dlc-utils/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index 05b24822dc..a4747f7869 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -6,7 +6,7 @@ deeplabcut: ignore: false --- -# DeepLabCut-Utils: Community contributions +# DeepLabCut-Utils - Community contributions [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) From 55cf4f9d58f87deacef510ef0ea096ddba2b4b05 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 13:41:13 +0200 Subject: [PATCH 17/86] Add XROMM+DeepLabCut local integration guide Add docs/dlc-utils/XROMM/usage.md describing the local 3-repo XROMM workflow with XROMM_DLCTools, DeepLabCut, and xmalab. Covers recommended sibling checkout layout, DeepLabCut's role in the workflow, developer setup (uv sync --group dev/dlc), example validation and end-to-end commands to run the baseline harness, and a compatibility note about lite-mode importability when GUI deps are unavailable. Co-Authored-By: homfunc_ <4338462+homfunc@users.noreply.github.com> --- _toc.yml | 2 ++ docs/dlc-utils/XROMM/usage.md | 64 +++++++++++++++++++++++++++++++++++ docs/dlc-utils/index.md | 22 +++++++++++- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 docs/dlc-utils/XROMM/usage.md diff --git a/_toc.yml b/_toc.yml index f2c8d55403..3c369280c3 100644 --- a/_toc.yml +++ b/_toc.yml @@ -106,6 +106,8 @@ parts: - file: docs/recipes/pose_cfg_file_breakdown # - file: docs/course - file: docs/dlc-utils/index + sections: + - file: docs/dlc-utils/XROMM/usage - caption: Project & Community chapters: diff --git a/docs/dlc-utils/XROMM/usage.md b/docs/dlc-utils/XROMM/usage.md new file mode 100644 index 0000000000..f581ce61f8 --- /dev/null +++ b/docs/dlc-utils/XROMM/usage.md @@ -0,0 +1,64 @@ +(file:xamalab-dlc-integration)= + +# XROMM + DeepLabCut local integration + +These notes describe how this repository is used in the local 3-repo XROMM workflow together with `../XROMM_DLCTools` and `../xmalab`. + +> Contributed by [@homfunc](https://github.com/homfunc) + +## 1) Expected local layout + +Recommended sibling checkout layout: + +- `XROMM_DLCTools/` +- `DeepLabCut/` +- `xmalab/` + `XROMM_DLCTools/pyproject.toml` maps its optional `dlc` dependency group to this repository through `tool.uv.sources`. + +## 2) DeepLabCut’s role in the workflow + +Within the integrated workflow, DeepLabCut provides: + +- project creation / dataset generation support +- video analysis / prediction entrypoints +- the local import target used by `XROMM_DLCTools` +- synthetic smoke coverage through the baseline harness + The current local integration suite also uses this repo to verify that the newer workflow service in `XROMM_DLCTools` still interoperates with a sibling DeepLabCut checkout. + +## 3) Local setup for this repo + +Standard developer setup: + +```bash +uv sync --group dev +``` + +When working from `../XROMM_DLCTools`, enable the sibling import path there with: + +```bash +uv sync --group dlc +``` + +## 4) Integration validation from XROMM_DLCTools + +Run these commands from `../XROMM_DLCTools`: + +```bash +uv run python scripts/baseline_harness.py --scenario deeplabcut_repo_smoke --output-dir baseline_artifacts/deeplabcut_smoke --deeplabcut-repo ../DeepLabCut +``` + +Full multi-repo suite: + +```bash +uv run python scripts/baseline_harness.py --scenario all --output-dir baseline_artifacts/integration_all --deeplabcut-repo ../DeepLabCut --xmalab-repo ../xmalab +``` + +True end-to-end local workflow scenario: + +```bash +uv run python scripts/baseline_harness.py --scenario phase3_local_workflow_e2e --output-dir baseline_artifacts/e2e_local_workflow --deeplabcut-repo ../DeepLabCut --xmalab-repo ../xmalab +``` + +## 5) Compatibility notes + +The local workflow integration path expects this repo to remain importable in “lite mode” when GUI dependencies are unavailable, and relies on the public `deeplabcut` import surface plus the synthetic project helpers under `examples/utils.py`. diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index a4747f7869..10f805e5f3 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -18,7 +18,14 @@ align: right --- ``` -This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/DeepLabCut/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! +The DeepLabCut-Utils repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/DeepLabCut/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! + +```{admonition} DLC-Utils +--- +class: tip +--- +[Link to repository](https://github.com/DeepLabCut/DLCutils) +``` ```{caution} Please direct inquiries to the **contributors/code maintainers of that code**. Note that the software(s) are provided "as is", without warranty of any kind, express. @@ -34,6 +41,19 @@ These two scripts illustrate how to train, test, and analyze videos for multiple Contributed by [Alexander Mathis](https://github.com/AlexEMG) +## Using DLC + XROMM_DLCTools + xmalab + +> Contributed by [@homfunc](https://github.com/homfunc) + +The DeepLabCut repository can also be used as a sibling checkout together with: + +- `../XROMM_DLCTools` +- `../xmalab` + +In that local layout, `XROMM_DLCTools` uses the optional `dlc` dependency group to import this checkout directly, and its baseline harness runs both a DeepLabCut smoke scenario and a broader end-to-end local workflow integration scenario. + +See {ref}`file:xamalab-dlc-integration` for the local integration notes and exact commands. + ## Using your DLC outputs, loading, simple ROI analysis, visualization examples ### Time spent of a body part in a particular region of interest (ROI) From 45d761a3cc3b20594bdb6b8ed042004f93574090 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 15:17:29 +0200 Subject: [PATCH 18/86] Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/dlc-utils/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index a4747f7869..aa0e6ba283 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -21,7 +21,7 @@ align: right This repository contains various scripts as well as links to other packages related to [DeepLabCut](https://github.com/DeepLabCut/DeepLabCut). Feel free to contribute your own analysis methods, and perhaps some short notebook of how to use it. Thanks! ```{caution} -Please direct inquiries to the **contributors/code maintainers of that code**. Note that the software(s) are provided "as is", without warranty of any kind, express. +Please direct inquiries to the **contributors/code maintainers of that code**. Note that the software(s) are provided "as is", without warranty of any kind, express or implied. The DeepLabCut team is not responsible for the maintenance of these packages, and cannot guarantee that they will work with present & future versions of DeepLabCut. ``` From c37cbb6ba3245c6d687f9bfd500f681d4fb682b4 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 15:18:17 +0200 Subject: [PATCH 19/86] Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/dlc-utils/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index aa0e6ba283..43a46fe4fe 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -84,7 +84,7 @@ Contributed by [Mackenzie Mathis](https://github.com/MMathisLab) ### Behavior clustering with B-SOiD -B-SOiD: An Open Source Unsupervised Algorithm for Discovery of Spontaneous Behaviors \<-- you can use the outputs of DLC to feed directly into B-SOiD (in MATLAB). +B-SOiD is an open source unsupervised algorithm for discovery of spontaneous behaviors, and you can use the outputs of DLC to feed directly into B-SOiD in MATLAB. - [Paper](https://www.biorxiv.org/content/10.1101/770271v1.abstract) - [Code: `B-SOiD`](https://github.com/YttriLab/B-SOiD) From eab7e60444b57334f67bfe3fab8fdb5b00967817 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 15:18:33 +0200 Subject: [PATCH 20/86] Fix capitalization Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/dlc-utils/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dlc-utils/index.md b/docs/dlc-utils/index.md index 43a46fe4fe..58f3a23402 100644 --- a/docs/dlc-utils/index.md +++ b/docs/dlc-utils/index.md @@ -98,9 +98,9 @@ Deep learning based behavioral analysis enables high precision rodent tracking a - [Paper](https://www.biorxiv.org/content/10.1101/2020.01.21.913624v1) - [Code: `DLCAnalyzer`](https://github.com/ETHZ-INS/DLCAnalyzer) -### Behavior analysis with machine learning classifiers (SIMBA) +### Behavior analysis with machine learning classifiers (SimBA) -A pipeline for using pose estimation (i.e. DeepLabCut) then behavioral annotation and generation of supervised machine-learning-based classifiers. \<-- you can use the outputs of DLC to feed directly into SIMBA (in Python). +A pipeline for using pose estimation (i.e. DeepLabCut) then behavioral annotation and generation of supervised machine-learning-based classifiers. \<-- you can use the outputs of DLC to feed directly into SimBA (in Python). Code written by: [Simon Nilsson](https://github.com/sronilsson) (please direct use questions to Simon). From f1122b4e86498f33d31e47d31d024ff8a0b4991b Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 24 Apr 2026 10:19:06 +0200 Subject: [PATCH 21/86] Update README: revise TF installation instructions --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 746bdebf28..3c2ca193cc 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,9 @@ pip install --pre "deeplabcut[gui]" or `pip install --pre "deeplabcut"` (headless version with PyTorch)! -To use the TensorFlow (TF) engine: you'll need to run `pip install "deeplabcut[gui,tf]"` or `pip install "deeplabcut[tf]"` (headless version with TF). -We aim to deprecate the tensorflow backend in version 3.2 (release date TBD). +To use the TensorFlow (TF) engine: you'll need to run `pip install "deeplabcut[gui,tf]"` or `pip install "deeplabcut[tf]"` (headless version with TF). Alternatively, we also offer more targeted optional TensorFlow installs for specific CUDA setups, e.g. `deeplabcut[tf-cu11]` or `deeplabcut[tf-cu12]`. Please refer to our [installation instructions](https://deeplabcut.github.io/DeepLabCut/docs/installation.html) for more detailed information on Python version, CUDA compatibility, etc. +We aim to **deprecate the tensorflow backend** in version 3.2 (release date TBD). -We recommend using our conda file, see [here](https://github.com/DeepLabCut/DeepLabCut/blob/main/conda-environments/README.md) or the [`deeplabcut-docker` package](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker). # Documentation: The DeepLabCut Process From 40391ca48b797937dfd9f55dbd4d68f27b48033d Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 24 Apr 2026 10:19:39 +0200 Subject: [PATCH 22/86] Update installTips recipe: remove apple-mchips --- docs/recipes/installTips.md | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/docs/recipes/installTips.md b/docs/recipes/installTips.md index 4d4e21456b..fe75d885d3 100644 --- a/docs/recipes/installTips.md +++ b/docs/recipes/installTips.md @@ -350,41 +350,6 @@ Activate! `conda activate DEEPLABCUT` and then run: `conda install -c conda-forg Then run `python -m deeplabcut` which launches the DLC GUI. -## DeepLabCut MacOS M-chip installation environment instructions: - -This only assumes you have anaconda installed. Use the `DEEPLABCUT_M1.yaml` conda file -if you have a newer MacBook (with an M1, M2, M3, M4 chip or more later), and follow -these steps: - -(1) git clone the deeplabcut cut repo: - -```bash -git clone https://github.com/DeepLabCut/DeepLabCut.git -``` - -(2) in the program terminal run: `cd DeepLabCut/conda-environments` - -(3) Then, run: - -```bash -conda env create -f DEEPLABCUT.yaml -``` - -(4) Finally, activate your environment and to launch DLC with the GUI - -```bash -conda activate DEEPLABCUT -python -m deeplabcut -``` - -The GUI will open. Of course, you can also run DeepLabCut in headless mode. - -If **you want to use the TensorFlow engine**, you'll need to install the `apple_mchips` -extra with DeepLabCut. You can do so by running: - -```bash -pip install deeplabcut[apple_mchips] -``` ## How to confirm that your GPU is being used by DeepLabCut From 5ad2e3a0f76e7da7c11f8f9e85aa2a7afd8ea209 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 24 Apr 2026 10:33:47 +0200 Subject: [PATCH 23/86] Update tech/hardware docs: recommend WSL for windows. --- docs/recipes/TechHardware.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/recipes/TechHardware.md b/docs/recipes/TechHardware.md index d4b8be3a87..e79c8f3565 100644 --- a/docs/recipes/TechHardware.md +++ b/docs/recipes/TechHardware.md @@ -46,9 +46,9 @@ The software is very robust to track data from any camera (cell phone cameras, g **For the TensorFlow Engine:** You will need [TensorFlow](https://www.tensorflow.org/). We used version 1.0 in the paper, later versions also work with the provided code (we -tested **TensorFlow versions 1.0 to 1.15, and 2.0 to 2.12 (2.10 for Windows)**; we -recommend TF2.12 for MacOS/Ubuntu and 2.10 for Windows) for Python 3.10 with GPU -support. +tested **TensorFlow versions 1.0 to 1.15, and 2.0 to 2.18**); we +recommend TF2.12 for Python 3.10 with GPU support. Note that native GPU support for Windows was dropped after TF version 2.10. We recommend Windows users to install [the Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) if they want to keep GPU support with TensorFlow. + To note, is it possible to run DeepLabCut on your CPU, but it will be VERY slow (see: [Mathis & Warren](https://www.biorxiv.org/content/early/2018/10/30/457242)). However, this is the preferred path if you want to test From d6c1fafa85b932451ba11ad63f3012be4a0433da Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 24 Apr 2026 11:38:47 +0200 Subject: [PATCH 24/86] Update docs: installation instructions --- docs/installation.md | 64 ++++++++++++++++++++++++++++++------ docs/recipes/TechHardware.md | 3 +- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 8d90485155..bdef596d20 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -55,7 +55,7 @@ python -c "import torch; print(torch.cuda.is_available())" ``` ```` -- If you're familiar with the command line and want TensorFlow support, look {ref}`below ` for a fresh installation on Linux and makes it possible to use the GPU with both PyTorch and TensorFlow. +- If you're familiar with the command line and want TensorFlow support, look {ref}`below `. (sec:installation-using-conda)= @@ -87,7 +87,7 @@ class: dropdown Please note, which CUDA you install depends on what version of PyTorch you want to use. So, please check {ref}`sec:install-gpu-support` below carefully. **Note, DeepLabCut is up to date with the latest CUDA and PyTorch!** ``` ```{tab-item} Apple M-chip GPU - Be sure to install miniconda, and your GPU will be used by default. + Install miniconda and use the standard `DEEPLABCUT.yaml` conda environment — PyTorch will use your Apple GPU via Metal automatically. For TensorFlow, add the `tf` extra after install (see {ref}`TensorFlow Support `). More tips are on the {ref}`installation tips ` page. ``` ```` @@ -167,11 +167,49 @@ As of June 2024 we have a PyTorch Engine backend and we will be deprecating the TensorFlow backend by version 3.2 latest (TBD). Currently, if you want to use TensorFlow, you need to run `pip install deeplabcut[tf]` in order to install the correct version of -TensorFlow in your conda env. -Please note, we will be providing bug fixes, but we will -not be supporting new TensorFlow versions beyond 2.10 (Windows), and 2.12 for other OS. +TensorFlow in your conda env. Please note, we will be providing bug fixes, but we will +not be supporting new TensorFlow versions beyond version 2.18. + +Installing TensorFlow manually and getting it to have access to the GPU can be a bit tricky. +However, we try to simplify the installation procedure via optional dependencies. + +A specific note for **Windows users**: TensorFlow’s own docs state that **native Windows GPU** support +ended after **2.10**. We recommend Windows users to install [The Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) +if they want GPU support. + +**Installation via the `tf` optional dependencies** +We recommend installing DeepLabCut with TensorFlow by specifying one of the 'extra's': `tf`, `tf-cu11` or `tf-cu12`. E.g, + +``` +pip install deeplabcut[tf] +``` + +This table provides a more detailed summary on the available extras: + +| Extra | Version | Python | GPU backend | Role (summary) | +|--------------|-----------------------------|-------------|--------------------------|-----------------------------------------------------------------------------| +| tf | 2.12–2.18 (Python-dependent)| 3.10-3.12 | CUDA (Linux); Metal (macOS) | Default TensorFlow stack for most users. | +| tf-cu11 | 2.14 | 3.10 / 3.11 | CUDA 11.8 | Pinned TF for CUDA 11.x-era stack | +| tf-cu12 | 2.18 | 3.10-3.12 | CUDA 12.5 | Pinned TF for CUDA 12.x-era stack | +| tf-latest | 2.18+ | 3.10-3.12 | CUDA 12.5+ | (Not recommended!) Newest TensorFlow ≥ 2.18 | +| apple_mchips | 2.12 - 2.18 | 3.10-3.12 | macOS Metal | (Not recommended!) Legacy extra; installs `tensorflow` + `tensorflow-metal`. Prefer `tf` instead. | + + +Note that TensorFlow and PyTorch may try to install competing CUDA-toolkit dependencies. +This is addressed in the listed extras by capping the PyTorch version to match the CUDA requirements. +In case you experience problems with the above installation, you can try to let TensorFlow install their own CUDA-toolkit libraries. +Please run the following installation command (in Linux), replacing with your TensorFlow version (see table above). +Note that this may break PyTorch functionality. +``` +pip install "tensorflow[and-cuda]==" +``` + + +**Advanced manual setup (Linux):** +if you do **not** use `deeplabcut[tf]`, you must align the following dependencies yourself: +`tensorflow`, `tensorpack`, `tf-keras` / Keras, `tf-slim`, CUDA, the NVIDIA **driver**, +and **PyTorch** yourself. -Installing TensorFlow and getting it to have access to the GPU can be a bit tricky. Check TensorFlow's [compatibility matrix](https://www.tensorflow.org/install/source#gpu) to know which version of CUDA and cuDNN you should install. @@ -247,16 +285,20 @@ Recommended for users who want to modify the code, or want to be up-to-date with ```bash uv venv -p 3.12 -uv pip install -e '.[gui,modelzoo]' # Change optional install as needed +uv pip install -e '.[gui]' # Change optional installs as needed source .venv/bin/activate # or & .venv\Scripts\activate.ps1 on Windows ``` +- Add **`modelzoo`** for SuperAnimal models: `uv pip install -e '.[gui,modelzoo]'`. +- Add **`tf`** (or `tf-cu11` / `tf-cu12` as appropriate) for the TensorFlow training engine — see {ref}`TensorFlow Support `. + ### `pip` If you already have a local environment, everything you need to use the project manager GUI, train and/or build custom models within DeepLabCut (i.e., use our source code and our dependencies) can be installed with `pip install 'deeplabcut[gui]'` (for GUI support w/PyTorch) or without the gui: `pip install 'deeplabcut'`. -- If you **cloned the repo** and want to make edits to the code locally, navigate to the cloned repo folder and run `pip install -e .[gui,modelzoo,tf]` to install the package in "editable" mode, which allows you to make changes to the code and have those changes reflected when you import the package. +- If you **cloned the repo** and want to make edits to the code locally, navigate to the cloned repo folder and run `pip install -e .[gui]` to install the package in "editable" mode, which allows you to make changes to the code and have those changes reflected when you import the package. - If you want to use the SuperAnimal models, then please use `pip install 'deeplabcut[gui,modelzoo]'`. +- If you need the **TensorFlow** training engine, add the **`tf`** extra (or `tf-cu11` / `tf-cu12` as appropriate): `pip install 'deeplabcut[tf]'` — see {ref}`TensorFlow Support `. ### Docker @@ -334,8 +376,10 @@ Here we provide notes on how to install and check your GPU use with TensorFlow, ### Notes -- **As of version 3.0+ we moved to PyTorch. The last supported version of TensorFlow is - 2.10 (for Windows users) and 2.12 for others**. Support will not be provided for future versions. +- **As of version 3.0+ the default engine is PyTorch.** TensorFlow remains optional via + `pip install "deeplabcut[tf]"` and related extras; **version ranges are defined in + `pyproject.toml`** (typically TensorFlow **2.12+** on supported Python versions). Upstream, **native + Windows GPU** for TensorFlow stopped after **2.10**. We advise Windows users to install [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). We do not guarantee every future TensorFlow release for all platforms. - Please be mindful different versions of TensorFlow require different CUDA versions. diff --git a/docs/recipes/TechHardware.md b/docs/recipes/TechHardware.md index e79c8f3565..429927316a 100644 --- a/docs/recipes/TechHardware.md +++ b/docs/recipes/TechHardware.md @@ -15,7 +15,7 @@ deeplabcut: ## Quick summary -[On our install page](tech-considerations-during-install) +On our {ref}`install page ` we highlight that for GPU computing through standard installation you need a NVIDIA GPU, with at least 8 GB of memory. If you have an Intel or AMD GPU, and are on windows, there is an alternative method of installation available which is shown on the [installation tips page](installation-tips) under "How to install Deeplabcut for Intel and AMD GPUs". Note, some info is repeated here, and will be updated as systems and hardware changes. @@ -49,7 +49,6 @@ We used version 1.0 in the paper, later versions also work with the provided cod tested **TensorFlow versions 1.0 to 1.15, and 2.0 to 2.18**); we recommend TF2.12 for Python 3.10 with GPU support. Note that native GPU support for Windows was dropped after TF version 2.10. We recommend Windows users to install [the Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) if they want to keep GPU support with TensorFlow. - To note, is it possible to run DeepLabCut on your CPU, but it will be VERY slow (see: [Mathis & Warren](https://www.biorxiv.org/content/early/2018/10/30/457242)). However, this is the preferred path if you want to test DeepLabCut on your own computer/data before purchasing a GPU, with the added benefit of From 9aed7e6c3c1b16adfbd79124a42991e2e08ab7cd Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 22 May 2026 16:21:52 +0200 Subject: [PATCH 25/86] docs audit 2026: update docker and deeplabcut-docker documentation --- docs/docker.md | 60 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/docs/docker.md b/docs/docker.md index 2ce3a2c59f..afb635935a 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -1,6 +1,6 @@ --- deeplabcut: - last_content_updated: '2025-04-15' + last_content_updated: '2026-05-22' last_metadata_updated: '2026-03-06' ignore: false visibility: online @@ -28,7 +28,26 @@ Advanced users can directly head to [DockerHub](https://hub.docker.com/r/deeplab $ pip install deeplabcut-docker ``` -on your machine (in any environment). deeplabcut-docker is just a lightweight package for setting up the Docker environment and it will *not* disrupt your installation of TensorFlow, PyTorch or any other dependencies. The Docker container itself is completely isolated from your existing software installation! +on your machine (in any environment). `deeplabcut-docker` is just a lightweight package for setting up the Docker environment and it will *not* disrupt your existing software installation. The Docker container itself is completely isolated from your local environment! + +## Available images + +The following images are published to [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut). All images come with Python 3.11 and CUDA pre-installed. + +| Tag | Description | +| ---------------------------------------------------- | -------------------------------------- | +| `deeplabcut/deeplabcut:latest` | Default runtime image for terminal use | +| `deeplabcut/deeplabcut:latest-jupyter` | Jupyter Notebook server | +| `deeplabcut/deeplabcut:-core-cuda` | Versioned runtime image | +| `deeplabcut/deeplabcut:-jupyter-cuda` | Versioned Jupyter image | + +By default `deeplabcut-docker` pulls the `latest` / `latest-jupyter` tag. To select a specific DeepLabCut or CUDA version, set the `DLC_VERSION` and `CUDA_VERSION` environment variables: + +```bash +DLC_VERSION=3.0.0 CUDA_VERSION=12.4 deeplabcut-docker bash --gpus all +``` + +To use a completely custom image instead of the default tags, pass `--image repo:tag`. Make sure the image supports Jupyter notebooks when using `deeplabcut-docker notebook`. ## Usage modes @@ -79,11 +98,42 @@ $ deeplabcut-docker notebook which will start a Jupyter notebook server. Follow the terminal instructions to open the notebook, by entering `http://127.0.0.1:8888` in your favorite browser. When prompted for a password, use `deeplabcut`, which is the pre-set option in the container. -The DeepLabCut version in this container is equivalent to the one you install with `pip install deeplabcut[gui]`. This means that you can start the DeepLabCut GUI with the appropriate commands in your notebook! +The container comes with `deeplabcut[modelzoo,wandb]` pre-installed. Note that the DeepLabCut GUI is not available inside the container. + +```{warning} +The Jupyter image uses a fixed default access token (`deeplabcut`) that is publicly known. +Anyone who can reach port 8888 on your machine can execute arbitrary code in the container. +Do not expose port 8888 to the internet (e.g. via a cloud VM's firewall or a public `0.0.0.0` +binding without a reverse proxy). +For local use, bind the port to localhost only (e.g. `-p 127.0.0.1:8888:8888`) and use SSH +port forwarding to access the server remotely (see below). +To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. +``` + +### Jupyter Notebooks on remote servers + +Sometimes you want to run Jupyter Notebooks on a remote server and connect from your local +browser. This requires SSH port forwarding. For general guidance see +[this StackOverflow post](https://stackoverflow.com/a/69244262) or the +[Jupyter Notebook docs](https://jupyter-notebook.readthedocs.io/en/4.x/public_server.html). + +With `deeplabcut-docker` and `DLC_NOTEBOOK_PORT`, this is straightforward: + +```bash +# Example: remote port XXXX=8889, local port YYYY=8890 + +# 1. Connect to your server with port forwarding +ssh -L localhost:8890:localhost:8889 you@your-server + +# 2. On the remote server, launch the container +DLC_NOTEBOOK_PORT=8889 deeplabcut-docker notebook --gpus all + +# 3. Open http://127.0.0.1:8890 in your local browser +``` ### Advanced usage -Advanced users and developers can visit the [`/docker` subdirectory](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker) in the DeepLabCut codebase on Github. We provide Dockerfiles for all images, along with build instructions there. +Advanced users and developers can visit the [`/docker` subdirectory](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker) in the DeepLabCut codebase on GitHub. It contains a single multi-stage Dockerfile covering all images, along with build instructions. ## Prerequisites (if you don't have Docker installed already) @@ -125,4 +175,4 @@ We dropped GUI support in 2.3.5+ due to too many numerous issues supporting them When running containers on Linux, in some systems it might be necessary to run `host +local:docker` before starting the image via `deeplabcut-docker`. -If you encounter errors while using the images, please open an issue in the DeepLabCut repo---especially the `deeplabcut-docker` is still in its alpha version, and we appreciate user feedback to make the tool robust to use across many operating systems! +If you encounter errors while using the images, please open an issue in the DeepLabCut repo. We appreciate user feedback to make the tool robust across many operating systems! From 2713d8643369cf5a1a643b6a41587d2b02e04857 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Fri, 22 May 2026 16:25:27 +0200 Subject: [PATCH 26/86] chore(metadata): update docs/notebooks metadata --- docs/docker.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/docker.md b/docs/docker.md index afb635935a..d1b9fe4719 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -1,11 +1,12 @@ --- deeplabcut: last_content_updated: '2026-05-22' - last_metadata_updated: '2026-03-06' + last_metadata_updated: '2026-05-22' ignore: false visibility: online - status: review_needed - recommendation: verify + status: viable + last_verified: '2026-05-22' + verified_for: 3.0.0 --- (docker-containers)= From 8fd60de74075305db8d7eb20dde3c24474659b12 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Tue, 26 May 2026 14:54:32 +0200 Subject: [PATCH 27/86] Update Docker docs: clarify modes, mounts, and warnings Refine docs/docker.md: clarify available usage modes (terminal vs Jupyter Notebook), fix napari-deeplabcut sentence wrapping, replace the generic note about mounting with a clearer admonition showing example docker -v mounts (read/write and read-only), change the Jupyter warning block to a danger block and emphasize the security risk of the default notebook token, and make small formatting/heading adjustments for readability. --- docs/docker.md | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/docs/docker.md b/docs/docker.md index d1b9fe4719..a0413effe7 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -19,8 +19,8 @@ In a Docker container, DeepLabCut can be used from the terminal, or with Jupyter The approach requires a local installation of [Docker / Docker Desktop](https://www.docker.com/), and is meant for users who need strict reproducibility, an isolated environment, or server-based automation. ```{important} -The napari-deeplabcut plugin **cannot be run in a Docker container**. To label -your data, please {ref}`install napari-deeplabcut ` in a local, non-dockerized environment, e.g. using pip: `pip install napari-deeplabcut` . +The napari-deeplabcut plugin **cannot be run in a Docker container**. +To label your data, please {ref}`install napari-deeplabcut ` in a local, non-dockerized environment, e.g. using pip: `pip install napari-deeplabcut` . ``` Advanced users can directly head to [DockerHub](https://hub.docker.com/r/deeplabcut/deeplabcut) and use the provided images there. To get started with using the images, we however also provide a helper tool, `deeplabcut-docker`, which makes the transition to docker images particularly convenient; to install the tool, run @@ -52,19 +52,36 @@ To use a completely custom image instead of the default tags, pass `--image repo ## Usage modes -With `deeplabcut-docker`, you can use the images in two modes. +With `deeplabcut-docker`, you can use the images in two modes: terminal mode and Jupyter Notebook mode. ```{note} -1. When running any of the following commands first, it can take some time to complete (a few minutes, depending on your internet connection), since it downloads the Docker image in the background. If you do not see any errors in your terminal, assume that everything is working fine! Subsequent runs of the command will be faster. -2. For any mode below, you might want to set which directory is the base, namely, so you can have read/write (or read-only access). Here is how to do so: - If you want to mount the whole directory could e.g., pass - `deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT` - (which will mount the full directory into the container in read/write mode) - If read-only access is enough, `deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT:ro` +When running any of the following commands first, it can take some time to complete (a few minutes, depending on your internet connection), since it downloads the Docker image in the background. If you do not see any errors in your terminal, assume that everything is working fine! Subsequent runs of the command will be faster. ``` +````{admonition} Choosing which directory to mount in the container +--- +class: tip dropdown +--- +For any mode below, you might want to set which directory is the base, so you can +have read/write or read-only access. + +If you want to mount the whole directory, you could e.g. pass: + +```bash +deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT +``` + +This will mount the full directory into the container in read/write mode. + +If read-only access is enough: + +```bash +deeplabcut-docker bash -v /home/mackenzie/DEEPLABCUT:/home/mackenzie/DEEPLABCUT:ro +``` +```` + ### Terminal mode You can run the light version of DeepLabCut and open a terminal by running @@ -101,9 +118,11 @@ which will start a Jupyter notebook server. Follow the terminal instructions to The container comes with `deeplabcut[modelzoo,wandb]` pre-installed. Note that the DeepLabCut GUI is not available inside the container. -```{warning} +```{danger} The Jupyter image uses a fixed default access token (`deeplabcut`) that is publicly known. -Anyone who can reach port 8888 on your machine can execute arbitrary code in the container. + +**Anyone who can reach port 8888 on your machine can execute arbitrary code in the container.** + Do not expose port 8888 to the internet (e.g. via a cloud VM's firewall or a public `0.0.0.0` binding without a reverse proxy). For local use, bind the port to localhost only (e.g. `-p 127.0.0.1:8888:8888`) and use SSH @@ -111,7 +130,7 @@ port forwarding to access the server remotely (see below). To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. ``` -### Jupyter Notebooks on remote servers +#### Jupyter Notebooks on remote servers Sometimes you want to run Jupyter Notebooks on a remote server and connect from your local browser. This requires SSH port forwarding. For general guidance see @@ -134,7 +153,8 @@ DLC_NOTEBOOK_PORT=8889 deeplabcut-docker notebook --gpus all ### Advanced usage -Advanced users and developers can visit the [`/docker` subdirectory](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker) in the DeepLabCut codebase on GitHub. It contains a single multi-stage Dockerfile covering all images, along with build instructions. +Advanced users and developers can visit the [`/docker` subdirectory](https://github.com/DeepLabCut/DeepLabCut/tree/main/docker) in the DeepLabCut codebase on GitHub. +It contains a single multi-stage Dockerfile covering all images, along with build instructions. ## Prerequisites (if you don't have Docker installed already) From a9fd24294d92cfee4564da9ac326b8cf91b888b1 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Wed, 27 May 2026 10:08:03 +0200 Subject: [PATCH 28/86] Add comment on NOTEBOOK_TOKEN --- docs/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docker.md b/docs/docker.md index a0413effe7..04e3bd2dae 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -127,7 +127,7 @@ Do not expose port 8888 to the internet (e.g. via a cloud VM's firewall or a pub binding without a reverse proxy). For local use, bind the port to localhost only (e.g. `-p 127.0.0.1:8888:8888`) and use SSH port forwarding to access the server remotely (see below). -To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. +To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. You can pass an empty string to disable token-authentication. ``` #### Jupyter Notebooks on remote servers From aa30b8172c7c76917eee521cfd22fd9f610e540d Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Wed, 27 May 2026 10:15:44 +0200 Subject: [PATCH 29/86] Apply suggestion from @deruyter92 --- docs/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docker.md b/docs/docker.md index 04e3bd2dae..c632a75602 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -127,7 +127,7 @@ Do not expose port 8888 to the internet (e.g. via a cloud VM's firewall or a pub binding without a reverse proxy). For local use, bind the port to localhost only (e.g. `-p 127.0.0.1:8888:8888`) and use SSH port forwarding to access the server remotely (see below). -To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. You can pass an empty string to disable token-authentication. +To use a custom token, pass `-e NOTEBOOK_TOKEN=` to `docker run`. You can pass an empty string to disable token-authentication: `-e NOTEBOOK_TOKEN=`. ``` #### Jupyter Notebooks on remote servers From 2a45c4857d705e38dab50153614cee29f3c850ae Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 7 May 2026 13:28:29 +0200 Subject: [PATCH 30/86] minor fixes superanimal demo notebook --- examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb | 23 +++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb b/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb index 935d7bad59..eb4833773a 100644 --- a/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb @@ -191,7 +191,7 @@ "\n", "# Build the pattern\n", "# This uses '*' to allow for any characters between the fixed parts\n", - "pattern = f\"{basename}*{superanimal_name}*{detector_name}*{model_name}*_labeled_after_adapt.mp4\"\n", + "pattern = f\"{basename}*{superanimal_name}*{model_name}*{detector_name}*_labeled_after_adapt.mp4\"\n", "\n", "# Search for matching files\n", "matches = list(directory.glob(pattern))\n", @@ -199,16 +199,17 @@ "# Choose the first match if it exists\n", "labeled_video_path = matches[0] if matches else None\n", "\n", - "view_video = open(labeled_video_path, \"rb\").read()\n", - "\n", - "data_url = \"data:video/mp4;base64,\" + b64encode(view_video).decode()\n", - "HTML(\n", - " f\"\"\"\n", - "\n", - "\"\"\"\n", - ")" + "if labeled_video_path is not None:\n", + " view_video = open(labeled_video_path, \"rb\").read()\n", + "\n", + " data_url = \"data:video/mp4;base64,\" + b64encode(view_video).decode()\n", + " HTML(\n", + " f\"\"\"\n", + " \n", + " \"\"\"\n", + " )" ] } ], From e84b3b1006594e15576070191095574c3687bbd7 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 7 May 2026 13:49:41 +0200 Subject: [PATCH 31/86] minor adjustments openfield demo notebook --- examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb b/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb index 1cb74fcb46..9783b6e6c5 100644 --- a/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb +++ b/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb @@ -25,7 +25,12 @@ "\n", "![alt text](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559935526258-KFYZC8BDHK01ZIDPNVIX/mouse_skel_trail.gif?format=450w)\n", "\n", - "Demo supporting: Nath\\*, Mathis\\* et al. *Using DeepLabCut for markerless3D pose estimation during behavior across species. Nature Protocols, 2019 \n", + "Demo supporting: \n", + "> Nath, T., Mathis, A., Chen, A. C., Patel, A., Bethge, M., & Mathis, M. W. (2019). \n", + "> **Using DeepLabCut for 3D markerless pose estimation across species and behaviors.** \n", + "> *Nature Protocols, 14*(7), 2152–2176. \n", + "> https://doi.org/10.1038/s41596-019-0176-0\n", + "\n", "\n", "This notebook demonstrates the necessary steps to use DeepLabCut on our demo data. We provide a sub-set of the mouse data from Mathis et al, 2018 Nature Neuroscience.\n", "\n", @@ -96,7 +101,7 @@ "id": "XymV_Hnlp1OJ" }, "source": [ - "### PLEASE, click \"restart runtime\" from the output above before proceeding!" + "### NOTE click \"restart runtime\" from the output above before proceeding!" ] }, { From 4ec0a980682291340b8b9694114176634f3af854 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 7 May 2026 14:08:51 +0200 Subject: [PATCH 32/86] minor updates to multianimal (3 mice) demo notebook --- examples/COLAB/COLAB_3miceDemo.ipynb | 65 ++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/examples/COLAB/COLAB_3miceDemo.ipynb b/examples/COLAB/COLAB_3miceDemo.ipynb index 75c741ad40..2b22d77c69 100644 --- a/examples/COLAB/COLAB_3miceDemo.ipynb +++ b/examples/COLAB/COLAB_3miceDemo.ipynb @@ -21,7 +21,7 @@ "\n", "https://github.com/DeepLabCut/DeepLabCut\n", "\n", - "Note: this Colab notebook was written to accompany the Nature Methods publication [_Multi-animal pose estimation, identification and tracking with DeepLabCut_](https://www.nature.com/articles/s41592-022-01443-0) with the TensorFlow engine. To learn about DeepLabCut 3.0+ and the PyTorch engine, you can check out our other notebooks (such as [`COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb`](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb)).\n", + "**Note**: this Colab notebook was written to accompany the Nature Methods publication [_Multi-animal pose estimation, identification and tracking with DeepLabCut_](https://www.nature.com/articles/s41592-022-01443-0) with the TensorFlow engine, using DeepLabCut version 2.2.1. To learn about DeepLabCut 3.0+ and the PyTorch engine, you can check out our other notebooks (such as [`COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb`](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb)).\n", "\n", "## This notebook illustrates how to use COLAB for a multi-animal DeepLabCut (maDLC) Demo 3 mouse project:\n", "\n", @@ -36,7 +36,8 @@ "- a quick guide to maDLC: https://deeplabcut.github.io/DeepLabCut/docs/quick-start/tutorial_maDLC.html\n", "- a demo COLAB for how to use maDLC on your own data: https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb\n", "\n", - "### To get started, please go to \"Runtime\" ->\"change runtime type\"->select \"Python3\", and then select \"GPU\"" + "### To get started, please go to \"Runtime\" ->\"change runtime type\"->select \"Python3\", and then select \"GPU\"\n", + "Note that DeepLabCut version 2.2.1 requires Python < 3.10 and no longer runs on Google Colab. You can still run it locally in a Python 3.8 environment. In Google Colab, use a more recent TensorFlow-enabled version of DeepLabCut than can be installed with Python 3.12 (e.g. **DeepLabCut version 3.0**, which supports both PyTorch and TensorFlow)." ] }, { @@ -45,8 +46,8 @@ "metadata": {}, "outputs": [], "source": [ - "# Install the correct (older) version of DeepLabCut\n", - "!pip install \"deeplabcut[tf]\"" + "# Install DeepLabCut 3.0 (for Google Colab with Python 3.12)\n", + "!pip install --pre \"deeplabcut[tf]<3.1\"" ] }, { @@ -71,11 +72,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "id": "PusLdqbqJi60" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading demo-me-2021-07-14.zip...\n" + ] + } + ], "source": [ "# Download our demo project:\n", "from io import BytesIO\n", @@ -111,7 +120,29 @@ "metadata": { "id": "odYrU3o8BSAr" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Jaap\\miniconda\\envs\\sbxJaap\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "module 'tensorflow' has no attribute 'compat'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 9\u001b[39m\n\u001b[32m 6\u001b[39m config_path = os.path.join(project_path, \u001b[33m\"\u001b[39m\u001b[33mconfig.yaml\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 7\u001b[39m video = os.path.join(project_path, \u001b[33m\"\u001b[39m\u001b[33mvideos\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mvideocompressed1.mp4\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m \u001b[43mdlc\u001b[49m\u001b[43m.\u001b[49m\u001b[43manalyze_videos\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfig_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 11\u001b[39m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mvideo\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m \u001b[49m\u001b[43mshuffle\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[43mvideotype\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmp4\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43mauto_track\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdlc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mEngine\u001b[49m\u001b[43m.\u001b[49m\u001b[43mTF\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 16\u001b[39m \n\u001b[32m 17\u001b[39m \u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\Projects\\DLC-Jaap\\deeplabcut\\compat.py:913\u001b[39m, in \u001b[36manalyze_videos\u001b[39m\u001b[34m(config, videos, videotype, shuffle, trainingsetindex, gputouse, save_as_csv, in_random_order, destfolder, batchsize, cropping, TFGPUinference, dynamic, modelprefix, robust_nframes, allow_growth, use_shelve, auto_track, n_tracks, animal_names, calibrate, identity_only, use_openvino, engine, **torch_kwargs)\u001b[39m\n\u001b[32m 905\u001b[39m engine = get_shuffle_engine(\n\u001b[32m 906\u001b[39m _load_config(config),\n\u001b[32m 907\u001b[39m trainingsetindex=trainingsetindex,\n\u001b[32m 908\u001b[39m shuffle=shuffle,\n\u001b[32m 909\u001b[39m modelprefix=modelprefix,\n\u001b[32m 910\u001b[39m )\n\u001b[32m 912\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m engine == Engine.TF:\n\u001b[32m--> \u001b[39m\u001b[32m913\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m analyze_videos\n\u001b[32m 915\u001b[39m kwargs = {}\n\u001b[32m 916\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m use_openvino \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \u001b[38;5;66;03m# otherwise default comes from tensorflow API\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~\\Projects\\DLC-Jaap\\deeplabcut\\pose_estimation_tensorflow\\__init__.py:20\u001b[39m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtensorflow\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtf\u001b[39;00m\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m _tf_legacy\n\u001b[32m---> \u001b[39m\u001b[32m20\u001b[39m \u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompat\u001b[49m.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n\u001b[32m 22\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mconfig\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m *\n\u001b[32m 23\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mcore\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mevaluate\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m *\n", + "\u001b[31mAttributeError\u001b[39m: module 'tensorflow' has no attribute 'compat'" + ] + } + ], "source": [ "import os\n", "\n", @@ -121,7 +152,14 @@ "config_path = os.path.join(project_path, \"config.yaml\")\n", "video = os.path.join(project_path, \"videos\", \"videocompressed1.mp4\")\n", "\n", - "dlc.analyze_videos(config_path, [video], shuffle=0, videotype=\"mp4\", auto_track=False)" + "dlc.analyze_videos(\n", + " config_path,\n", + " [video],\n", + " shuffle=0,\n", + " videotype=\"mp4\",\n", + " auto_track=False,\n", + " engine=dlc.Engine.TF,\n", + ")" ] }, { @@ -268,7 +306,16 @@ "name": "python3" }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" } }, "nbformat": 4, From 34dde4a17b4bad87debd4eef1201a9d371d206b5 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 7 May 2026 14:20:33 +0200 Subject: [PATCH 33/86] minor updates yourdata superanimal notebook --- examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb index 7e77e835d2..68dd18a79c 100644 --- a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb @@ -180,6 +180,7 @@ " \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"]\n", ")\n", "\n", + "\n", "# @markdown ---\n", "# @markdown What is the maximum number of animals you expect to have in an image\n", "max_individuals = 3 # @param {type:\"slider\", min:1, max:30, step:1}" From 23045752148671da3a9b6221124cf171e1d58488 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Thu, 7 May 2026 16:14:06 +0200 Subject: [PATCH 34/86] fix colab 3 mice Demo: write missing metadata.yaml --- examples/COLAB/COLAB_3miceDemo.ipynb | 53 ++++++++++------------------ 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/examples/COLAB/COLAB_3miceDemo.ipynb b/examples/COLAB/COLAB_3miceDemo.ipynb index 2b22d77c69..2d3a5b71c4 100644 --- a/examples/COLAB/COLAB_3miceDemo.ipynb +++ b/examples/COLAB/COLAB_3miceDemo.ipynb @@ -21,7 +21,14 @@ "\n", "https://github.com/DeepLabCut/DeepLabCut\n", "\n", - "**Note**: this Colab notebook was written to accompany the Nature Methods publication [_Multi-animal pose estimation, identification and tracking with DeepLabCut_](https://www.nature.com/articles/s41592-022-01443-0) with the TensorFlow engine, using DeepLabCut version 2.2.1. To learn about DeepLabCut 3.0+ and the PyTorch engine, you can check out our other notebooks (such as [`COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb`](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb)).\n", + "This Colab notebook was written to accompany the Nature Methods publication \n", + "> Lauer, J., Zhou, M., Ye, S., Menegas, W., Schneider, S., Nath, T., Rahman, M. M., Di Santo, V., Soberanes, D., Feng, G., Murthy, V. N., Lauder, G., Dulac, C., Mathis, M. W., & Mathis, A. (2022). \n", + "> **Multi-animal pose estimation, identification and tracking with DeepLabCut.** \n", + "> *Nature Methods, 19*(4), 496–504. \n", + "> https://doi.org/10.1038/s41592-022-01443-0\n", + "\n", + "\n", + " **Note:** The paper used DeepLabCut version 2.2.1 for Python 3.8 with the TensorFlow engine. Since this Python version is no longer supported on Google Colab, this notebook uses a more recent version of DeepLabCut (namely, 3.0.x), which still supports TensorFlow. To learn about DeepLabCut 3.0+ and the PyTorch engine, you can check out our other notebooks (such as [`COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb`](https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb)).\n", "\n", "## This notebook illustrates how to use COLAB for a multi-animal DeepLabCut (maDLC) Demo 3 mouse project:\n", "\n", @@ -72,22 +79,15 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "id": "PusLdqbqJi60" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading demo-me-2021-07-14.zip...\n" - ] - } - ], + "outputs": [], "source": [ "# Download our demo project:\n", "from io import BytesIO\n", + "from pathlib import Path\n", "from zipfile import ZipFile\n", "\n", "import requests\n", @@ -101,6 +101,13 @@ " with requests.get(file[\"links\"][\"self\"], stream=True) as r:\n", " with ZipFile(BytesIO(r.content)) as zf:\n", " zf.extractall(path=\"/content\")\n", + " # Fix missing metadata.yaml\n", + " data_dir = Path(\"/content/demo-me-2021-07-14/training-datasets/iteration-0/UnaugmentedDataSet_demoJul14\")\n", + " data_dir.mkdir(parents=True, exist_ok=True)\n", + " (data_dir / \"metadata.yaml\").write_text(\n", + " \"\\nshuffles:\\n demoJul14-trainset95shuffle0:\\n train_fraction: 0.95\\n index: 0\\n\"\n", + " \" split: 1\\n engine: TensorFlow\\n\"\n", + " )\n", "else:\n", " raise ValueError(f\"The URL {url_record} could not be reached.\")" ] @@ -120,29 +127,7 @@ "metadata": { "id": "odYrU3o8BSAr" }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\Jaap\\miniconda\\envs\\sbxJaap\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "module 'tensorflow' has no attribute 'compat'", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 9\u001b[39m\n\u001b[32m 6\u001b[39m config_path = os.path.join(project_path, \u001b[33m\"\u001b[39m\u001b[33mconfig.yaml\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 7\u001b[39m video = os.path.join(project_path, \u001b[33m\"\u001b[39m\u001b[33mvideos\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mvideocompressed1.mp4\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m \u001b[43mdlc\u001b[49m\u001b[43m.\u001b[49m\u001b[43manalyze_videos\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43mconfig_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 11\u001b[39m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mvideo\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m \u001b[49m\u001b[43mshuffle\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[43mvideotype\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mmp4\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43mauto_track\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdlc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mEngine\u001b[49m\u001b[43m.\u001b[49m\u001b[43mTF\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 16\u001b[39m \n\u001b[32m 17\u001b[39m \u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\Projects\\DLC-Jaap\\deeplabcut\\compat.py:913\u001b[39m, in \u001b[36manalyze_videos\u001b[39m\u001b[34m(config, videos, videotype, shuffle, trainingsetindex, gputouse, save_as_csv, in_random_order, destfolder, batchsize, cropping, TFGPUinference, dynamic, modelprefix, robust_nframes, allow_growth, use_shelve, auto_track, n_tracks, animal_names, calibrate, identity_only, use_openvino, engine, **torch_kwargs)\u001b[39m\n\u001b[32m 905\u001b[39m engine = get_shuffle_engine(\n\u001b[32m 906\u001b[39m _load_config(config),\n\u001b[32m 907\u001b[39m trainingsetindex=trainingsetindex,\n\u001b[32m 908\u001b[39m shuffle=shuffle,\n\u001b[32m 909\u001b[39m modelprefix=modelprefix,\n\u001b[32m 910\u001b[39m )\n\u001b[32m 912\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m engine == Engine.TF:\n\u001b[32m--> \u001b[39m\u001b[32m913\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m analyze_videos\n\u001b[32m 915\u001b[39m kwargs = {}\n\u001b[32m 916\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m use_openvino \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \u001b[38;5;66;03m# otherwise default comes from tensorflow API\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~\\Projects\\DLC-Jaap\\deeplabcut\\pose_estimation_tensorflow\\__init__.py:20\u001b[39m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtensorflow\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mtf\u001b[39;00m\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m _tf_legacy\n\u001b[32m---> \u001b[39m\u001b[32m20\u001b[39m \u001b[43mtf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompat\u001b[49m.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n\u001b[32m 22\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mconfig\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m *\n\u001b[32m 23\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mdeeplabcut\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpose_estimation_tensorflow\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mcore\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mevaluate\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m *\n", - "\u001b[31mAttributeError\u001b[39m: module 'tensorflow' has no attribute 'compat'" - ] - } - ], + "outputs": [], "source": [ "import os\n", "\n", From 0a96b34896ec85feb2cd80c34a3d708cd12842fe Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Mon, 11 May 2026 14:37:30 +0200 Subject: [PATCH 35/86] Colab superanimal notebook fix param widget --- examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb index 68dd18a79c..4f9706ca1d 100644 --- a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb @@ -23,6 +23,7 @@ "\n", "This notebook demos how to use our SuperAnimal models within DeepLabCut 3.0! Please read more in [Ye et al. Nature Communications 2024](https://www.nature.com/articles/s41467-024-48792-2) about the available SuperAnimal models, and follow along below!\n", "\n", + "\n", "### **Let's get going: install the latest version of DeepLabCut into COLAB:**\n", "\n", "*Also, be sure you are connected to a GPU: go to menu, click Runtime > Change Runtime Type > select \"GPU\"*\n" @@ -176,9 +177,7 @@ "# @markdown SuperAnimal Configurations\n", "superanimal_name = \"superanimal_topviewmouse\" # @param [\"superanimal_topviewmouse\", \"superanimal_quadruped\"]\n", "model_name = \"hrnet_w32\" # @param [\"hrnet_w32\", \"resnet_50\"]\n", - "detector_name = (\n", - " \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"]\n", - ")\n", + "detector_name = \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"] # fmt: skip # noqa: E501\n", "\n", "\n", "# @markdown ---\n", @@ -277,9 +276,7 @@ "# @markdown SuperAnimal Configurations\n", "superanimal_name = \"superanimal_topviewmouse\" # @param [\"superanimal_topviewmouse\", \"superanimal_quadruped\"]\n", "model_name = \"hrnet_w32\" # @param [\"hrnet_w32\", \"resnet_50\"]\n", - "detector_name = (\n", - " \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"]\n", - ")\n", + "detector_name = \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"] # fmt: skip # noqa: E501\n", "\n", "# @markdown ---\n", "# @markdown What is the maximum number of animals you expect to have in an image\n", @@ -453,9 +450,7 @@ "# @markdown SuperAnimal Configurations\n", "superanimal_name = \"superanimal_topviewmouse\" # @param [\"superanimal_topviewmouse\", \"superanimal_quadruped\"]\n", "model_name = \"hrnet_w32\" # @param [\"hrnet_w32\", \"resnet_50\"]\n", - "detector_name = (\n", - " \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"]\n", - ")" + "detector_name = \"fasterrcnn_resnet50_fpn_v2\" # @param [\"fasterrcnn_resnet50_fpn_v2\", \"fasterrcnn_mobilenet_v3_large_fpn\"] # fmt: skip # noqa: E501" ] }, { @@ -1177,7 +1172,7 @@ "last_metadata_updated": "2026-03-06" }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "benchmarking", "language": "python", "name": "python3" }, @@ -1191,7 +1186,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.10.19" }, "widgets": { "application/vnd.jupyter.widget-state+json": { From 09dee594284118d81adfa708c19659607eea1396 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Mon, 11 May 2026 14:52:13 +0200 Subject: [PATCH 36/86] update citation & link single-animal notebook --- ..._YOURDATA_TrainNetwork_VideoAnalysis.ipynb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb index 00049863f8..dfaf48589a 100644 --- a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb @@ -36,12 +36,12 @@ "\n", "This notebook demonstrates the necessary steps to use DeepLabCut for your own project.\n", "\n", - "This shows the most simple code to do so, but many of the functions have additional features, so please check out the overview & the protocol paper!\n", + "This shows the most simple code to do so, but many of the functions have additional features, so please check out the [documentation](https://deeplabcut.github.io/DeepLabCut/docs/standardDeepLabCut_UserGuide.html) & the protocol paper!\n", "\n", - "Nath\\*, Mathis\\* et al.: Using DeepLabCut for markerless pose estimation during behavior across species. Nature Protocols, 2019.\n", - "\n", - "\n", - "Paper: https://www.nature.com/articles/s41596-019-0176-0\n", + "> Nath, T., Mathis, A., Chen, A. C., Patel, A., Bethge, M., & Mathis, M. W. (2019). \n", + "> **Using DeepLabCut for 3D markerless pose estimation across species and behaviors.** \n", + "> *Nature Protocols, 14*(7), 2152–2176. \n", + "> https://doi.org/10.1038/s41596-019-0176-0\n", "\n", "Pre-print: https://www.biorxiv.org/content/biorxiv/early/2018/11/24/476531.full.pdf\n" ] @@ -418,18 +418,13 @@ "last_metadata_updated": "2026-03-06" }, "kernelspec": { - "display_name": "Python 3.8.12 ('dlc')", + "display_name": "benchmarking", "language": "python", "name": "python3" }, "language_info": { "name": "python", - "version": "3.8.12" - }, - "vscode": { - "interpreter": { - "hash": "70cad038f2bddb56e8a0ba66c48b76ebce20579892bf83e71733a81977e3ceea" - } + "version": "3.10.19" } }, "nbformat": 4, From 8b01adb3ef6cf8c3a6dbb9186d88d2a7763188fc Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Mon, 11 May 2026 15:05:30 +0200 Subject: [PATCH 37/86] chore(metadata): update docs/notebooks metadata --- examples/COLAB/COLAB_3miceDemo.ipynb | 6 ++++-- examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb | 6 ++++-- examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb | 6 ++++-- examples/COLAB/COLAB_DLC_ModelZoo.ipynb | 6 ++++-- examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb | 6 ++++-- .../COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb | 6 ++++-- .../COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb | 4 +++- 7 files changed, 27 insertions(+), 13 deletions(-) diff --git a/examples/COLAB/COLAB_3miceDemo.ipynb b/examples/COLAB/COLAB_3miceDemo.ipynb index 2d3a5b71c4..2429991c1b 100644 --- a/examples/COLAB/COLAB_3miceDemo.ipynb +++ b/examples/COLAB/COLAB_3miceDemo.ipynb @@ -283,8 +283,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2026-02-10", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-05-07", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "kernelspec": { "display_name": "Python 3", diff --git a/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb b/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb index eb4833773a..1acd927b05 100644 --- a/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb @@ -220,8 +220,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2025-06-30", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-05-07", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "gpuClass": "standard", "kernelspec": { diff --git a/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb b/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb index 9783b6e6c5..f05eec33c1 100644 --- a/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb +++ b/examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb @@ -317,8 +317,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2025-09-16", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-05-07", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "kernelspec": { "display_name": "Python [default]", diff --git a/examples/COLAB/COLAB_DLC_ModelZoo.ipynb b/examples/COLAB/COLAB_DLC_ModelZoo.ipynb index 3a48250c18..ead5dab059 100644 --- a/examples/COLAB/COLAB_DLC_ModelZoo.ipynb +++ b/examples/COLAB/COLAB_DLC_ModelZoo.ipynb @@ -291,8 +291,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2025-10-02", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-03-30", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "gpuClass": "standard", "kernelspec": { diff --git a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb index 4f9706ca1d..e07d5073bd 100644 --- a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb @@ -1168,8 +1168,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2025-09-10", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-05-11", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "kernelspec": { "display_name": "benchmarking", diff --git a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb index dfaf48589a..5fa846aa9d 100644 --- a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb @@ -414,8 +414,10 @@ }, "deeplabcut": { "ignore": false, - "last_content_updated": "2025-09-16", - "last_metadata_updated": "2026-03-06" + "last_content_updated": "2026-05-11", + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "kernelspec": { "display_name": "benchmarking", diff --git a/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb b/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb index 08633839fb..433b0e8a11 100644 --- a/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb @@ -532,7 +532,9 @@ "deeplabcut": { "ignore": false, "last_content_updated": "2026-02-10", - "last_metadata_updated": "2026-03-06" + "last_metadata_updated": "2026-05-11", + "last_verified": "2026-05-11", + "verified_for": "3.0.0rc14" }, "kernelspec": { "display_name": "Python 3", From becebcae8238ec53c6da13db97a436230edb475f Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Mon, 11 May 2026 15:17:04 +0200 Subject: [PATCH 38/86] restore unrelated metadata fields --- examples/COLAB/COLAB_3miceDemo.ipynb | 11 +---------- examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb | 5 ++--- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/examples/COLAB/COLAB_3miceDemo.ipynb b/examples/COLAB/COLAB_3miceDemo.ipynb index 2429991c1b..f040cce509 100644 --- a/examples/COLAB/COLAB_3miceDemo.ipynb +++ b/examples/COLAB/COLAB_3miceDemo.ipynb @@ -293,16 +293,7 @@ "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.14" + "name": "python" } }, "nbformat": 4, diff --git a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb index e07d5073bd..78df4f6bc8 100644 --- a/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb @@ -23,7 +23,6 @@ "\n", "This notebook demos how to use our SuperAnimal models within DeepLabCut 3.0! Please read more in [Ye et al. Nature Communications 2024](https://www.nature.com/articles/s41467-024-48792-2) about the available SuperAnimal models, and follow along below!\n", "\n", - "\n", "### **Let's get going: install the latest version of DeepLabCut into COLAB:**\n", "\n", "*Also, be sure you are connected to a GPU: go to menu, click Runtime > Change Runtime Type > select \"GPU\"*\n" @@ -1174,7 +1173,7 @@ "verified_for": "3.0.0rc14" }, "kernelspec": { - "display_name": "benchmarking", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1188,7 +1187,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.19" + "version": "3.10.13" }, "widgets": { "application/vnd.jupyter.widget-state+json": { From 0cabbcbb0e2c65122c7b1aa936dda917912bed43 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter Date: Tue, 12 May 2026 11:27:26 +0200 Subject: [PATCH 39/86] Add notes to metadata where required --- examples/COLAB/COLAB_3miceDemo.ipynb | 3 ++- .../COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb | 3 ++- .../COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/COLAB/COLAB_3miceDemo.ipynb b/examples/COLAB/COLAB_3miceDemo.ipynb index f040cce509..5a79c32f26 100644 --- a/examples/COLAB/COLAB_3miceDemo.ipynb +++ b/examples/COLAB/COLAB_3miceDemo.ipynb @@ -286,7 +286,8 @@ "last_content_updated": "2026-05-07", "last_metadata_updated": "2026-05-11", "last_verified": "2026-05-11", - "verified_for": "3.0.0rc14" + "verified_for": "3.0.0rc14", + "notes": "This notebook is a demo for the TensorFlow-based pipeline described in the Nature Methods publication (https://doi.org/10.1038/s41592-022-01443-0). However, the corresponding DeepLabCut version does not run anymore on Colab (which requires Python >= 3.11). The notebook has been adapted to use the latest TensorFlow-enabled version of DeepLabCut (namely, 3.0), which supports both PyTorch and TensorFlow." }, "kernelspec": { "display_name": "Python 3", diff --git a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb index 5fa846aa9d..bf905df7b4 100644 --- a/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb @@ -417,7 +417,8 @@ "last_content_updated": "2026-05-11", "last_metadata_updated": "2026-05-11", "last_verified": "2026-05-11", - "verified_for": "3.0.0rc14" + "verified_for": "3.0.0rc14", + "notes": "This notebook demos the primary generic/PyTorch API for single-animal DeepLabCut projects. Note that it is a bit outdated and may need revisions after dropping TensorFlow support. Also it does not reflect any of the planned refactors currently in the works (e.g. structured configs, keypoints)." }, "kernelspec": { "display_name": "benchmarking", diff --git a/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb b/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb index 433b0e8a11..702612b8e4 100644 --- a/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb +++ b/examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb @@ -53,7 +53,7 @@ "source": [ "## First, go to \"Runtime\" ->\"change runtime type\"->select \"Python3\", and then select \"GPU\"\n", "\n", - "As the COLAB environments were updated to CUDA 12.X and Python 3.11, we need to install DeepLabCut and TensorFlow in a distinct way to get TensorFlow to connect to the GPU." + "Note: Colab uses Python 3.12, which is not supported by older versions of DeepLabCut. We need to install a recent DeepLabCut version." ] }, { @@ -534,7 +534,8 @@ "last_content_updated": "2026-02-10", "last_metadata_updated": "2026-05-11", "last_verified": "2026-05-11", - "verified_for": "3.0.0rc14" + "verified_for": "3.0.0rc14", + "notes": "This notebook demos the primary generic/PyTorch API for multi-animal DeepLabCut (maDLC) projects. Note that it may need revisions after dropping TensorFlow support. And does not reflect any of the planned refactors currently in the works (e.g. structured configs, keypoints)." }, "kernelspec": { "display_name": "Python 3", From ec87edabc19243daacdc892a36764d58ec4574ee Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:00:44 +0200 Subject: [PATCH 40/86] chore(metadata): update docs/notebooks metadata --- docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md index c7018507ee..428e938c59 100644 --- a/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md +++ b/docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md @@ -6,7 +6,7 @@ deeplabcut: visibility: online status: review_needed recommendation: verify - notes: Sligthly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo. + notes: Slightly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo. --- # Publishing Notebooks into the Main DLC Cookbook From 3f6d268c3031f671a9e751cb1e9fb4b14dcefaac Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:00:54 +0200 Subject: [PATCH 41/86] Update audit_metadata.csv --- .../docs_audits/april-2026/audit_metadata.csv | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/docs_audits/april-2026/audit_metadata.csv b/tools/docs_audits/april-2026/audit_metadata.csv index 2a89a1285a..237226cf50 100644 --- a/tools/docs_audits/april-2026/audit_metadata.csv +++ b/tools/docs_audits/april-2026/audit_metadata.csv @@ -5,10 +5,10 @@ docs/MISSION_AND_VALUES.md,md,true,,,,,,,,, docs/ModelZoo.md,md,true,,,,,,,,, docs/Overviewof3D.md,md,true,online,review_needed,update,,,,"Contents seem up-to-date as the codebase has not evolved drastically for 3D, but formatting and organization could be improved. Separate basic/advanced sections could help, as well as more admonitions/dropdowns to streamline.",, docs/README.md,md,true,,,,,,,,, -docs/UseOverviewGuide.md,md,true,online,viable,keep,2026-04-27,,,,, +docs/UseOverviewGuide.md,md,true,,,,,,,,, docs/beginner-guides/Training-Evaluation.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, -docs/beginner-guides/beginners-guide.md,md,true,online,outdated,update,,,,"While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed.",, -docs/beginner-guides/labeling.md,md,true,online,viable,update,,,,"Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow.",, +docs/beginner-guides/beginners-guide.md,md,true,online,outdated,move,,,,"While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed.",, +docs/beginner-guides/labeling.md,md,true,online,viable,move,,,,"Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow.",, docs/beginner-guides/manage-project.md,md,true,online,viable,move,,,,"It seems the beginner guide section is more of a GUI step-by-step. As such, it should be moved to the GUI section, and merged/integrated with the contents there. The content is useful, but making it clear that this is for the GUI would reduce the confusion of a beginner guide being in fact rather central GUI use instructions.",, docs/beginner-guides/video-analysis.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, docs/benchmark.md,md,true,,,,,,,,, @@ -27,17 +27,28 @@ docs/dlc-live/dlc-live-gui/user_guide/misc/misc_landing.md,md,true,,,,,,,,, docs/dlc-live/dlc-live-gui/user_guide/misc/modelzoo_downloads.md,md,true,,,,,,,,, docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md,md,true,,,,,,,,, docs/dlc-live/dlc-live-gui/user_guide/overview.md,md,true,,,,,,,,, +docs/dlc-utils/XROMM/usage.md,md,false,,,,,,,,, +docs/dlc-utils/index.md,md,true,,,,2026-05-06,,,,, docs/docker.md,md,true,online,review_needed,verify,,,,,, docs/gui/PROJECT_GUI.md,md,true,online,review_needed,update,,,,"While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commmands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide.",, -docs/gui/napari_GUI.md,md,true,online,outdated,archive,,,,Being updated in a separate PR (#3280),, -docs/installation.md,md,true,online,outdated,update,2026-04-21,,,Could be moved to a core/installation folder for clarity.,, +docs/gui/index.md,md,false,,,,,,,,, +docs/gui/napari/advanced_usage.md,md,true,,,,2026-04-09,,,,, +docs/gui/napari/basic_usage.md,md,true,,,,2026-04-09,,,,, +docs/gui/napari/tracking/basic_usage.md,md,true,,,,2026-05-08,,,,, +docs/gui/napari_GUI.md,md,true,online,outdated,archive,2026-04-09,,,Being updated in a separate PR (#3280),, +docs/installation.md,md,true,online,viable,move,2026-04-21,,,Could be moved to a core/installation folder for clarity.,, docs/intro.md,md,true,,,,,,,,, docs/maDLC_UserGuide.md,md,true,online,review_needed,verify,,,,"Could use a small formatting pass. Contents are 4-5y old in some places, recommend to review for accuracy.",, +docs/notebooks/extra.md,md,false,,,,,,,,, +docs/notebooks/main_demos.md,md,false,,,,,,,,, +docs/notebooks/your_data.md,md,false,,,,,,,,, docs/pytorch/Benchmarking_shuffle_guide.md,md,true,online,viable,move,,,,"Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends.",, docs/pytorch/architectures.md,md,true,online,viable,keep,,,,,, +docs/pytorch/index.md,md,false,,,,,,,,, docs/pytorch/pytorch_config.md,md,true,online,review_needed,verify,,,,"Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update.",, docs/pytorch/user_guide.md,md,true,,,,,,,,, docs/pytorch_dlc.md,md,true,orphaned,viable,move,,,,Unclear why this is unlisted in TOC; recommend updating and moving to PyTorch section.,, +docs/quick-start/index.md,md,true,online,viable,keep,2026-05-12,,,,, docs/quick-start/single_animal_quick_guide.md,md,true,online,viable,archive,,,,"This is a bit stuck between minimal guide and quick start, as the lack of explanations makes it more into a catalogue of commands (which is an API docs responsibility), and a proper quick start guide that gives users a proper sense of the workflow. This should either be expanded greatly or simply archived. For simplicity, I recommend archiving.",, docs/quick-start/tutorial_maDLC.md,md,true,online,viable,keep,,,,,, docs/recipes/BatchProcessing.md,md,true,,,,,,,,, @@ -46,9 +57,11 @@ docs/recipes/DLCMethods.md,md,true,,,,,,,,, docs/recipes/MegaDetectorDLCLive.md,md,true,orphaned,outdated,archive,,,,,, docs/recipes/OpenVINO.md,md,true,,,,,,,,, docs/recipes/OtherData.md,md,true,,,,,,,,, -docs/recipes/TechHardware.md,md,true,,,,,,,,, +docs/recipes/TechHardware.md,md,true,online,outdated,update,,,,Useful but needs to be updated and clarified.,, docs/recipes/UsingModelZooPupil.md,md,true,,,,,,,,, +docs/recipes/external_data_import.md,md,true,,,,2026-05-22,,,,, docs/recipes/flip_and_rotate.ipynb,ipynb,true,,,,,,,,, +docs/recipes/index.md,md,false,,,,,,,,, docs/recipes/installTips.md,md,true,online,outdated,archive,,,,Should be removed in favor of the main installation guide.,, docs/recipes/io.md,md,true,,,,,,,,, docs/recipes/nn.md,md,true,,,,,,,,, From e476569ff024abc6545cfaef95e6953629a00648 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:05:56 +0200 Subject: [PATCH 42/86] Filter docs/notebooks changes by path Update GitHub Actions docs_and_notebooks_checks workflow to only consider changed .md and .ipynb files that live under docs/, tools/, examples/COLAB/, or examples/JUPYTER/. This adds an extra grep filter before sorting, so checks are not triggered by markdown/notebook files outside the intended directories. The output still writes the unique changed paths to tmp/docs_nb_checks/changed_docs.txt. This is to ignore README,md at the top leve, which cannot have a frontmatter, but include all else --- .github/workflows/docs_and_notebooks_checks.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs_and_notebooks_checks.yml b/.github/workflows/docs_and_notebooks_checks.yml index d671223769..5e36962123 100644 --- a/.github/workflows/docs_and_notebooks_checks.yml +++ b/.github/workflows/docs_and_notebooks_checks.yml @@ -47,8 +47,9 @@ jobs: fi git diff --name-only --diff-filter=ACMR "$base" "$head" \ - | { grep -iE '\.(md|ipynb)$' || true; } \ - | sort -u > tmp/docs_nb_checks/changed_docs.txt + | { grep -iE '\.(md|ipynb)$' || true; } \ + | { grep -E '^(docs/|tools/|examples/COLAB/|examples/JUPYTER/)' || true; } \ + | sort -u > tmp/docs_nb_checks/changed_docs.txt count=$(wc -l < tmp/docs_nb_checks/changed_docs.txt | tr -d ' ') echo "count=$count" >> "$GITHUB_OUTPUT" From bed77ce033900c24dc22991e176b179c40154e79 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:10:44 +0200 Subject: [PATCH 43/86] Add missing force-overwrite-notes option to CSV export Introduce a force_overwrite_notes option to allow scanned notes to replace existing CSV notes. Updated merged_row to accept a force_overwrite_notes flag (default False) and to prefer scanned notes when it's set; added propagation through export_csv; and added a CLI flag --force-overwrite-notes with help text. Conflict handling now prints a warning and indicates when force overwrite is used. This enables bulk updates of notes while preserving the previous default behavior of keeping manually curated notes. --- tools/docs_and_notebooks_audit.py | 43 ++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/tools/docs_and_notebooks_audit.py b/tools/docs_and_notebooks_audit.py index a8c7e355e7..e4dbc0b861 100644 --- a/tools/docs_and_notebooks_audit.py +++ b/tools/docs_and_notebooks_audit.py @@ -446,19 +446,32 @@ def load_existing_rows(csv_path: Path) -> tuple[dict[str, dict[str, str]], list[ return rows, extra_columns -def merged_row(base: dict[str, Any], previous: dict[str, str] | None, extra_columns: Iterable[str]) -> dict[str, Any]: +def merged_row( + base: dict[str, Any], + previous: dict[str, str] | None, + extra_columns: Iterable[str], + force_overwrite_notes: bool = False, +) -> dict[str, Any]: row = dict(base) if previous: prev_notes = (previous.get("notes") or "").strip() scanned_notes = (row.get("notes") or "").strip() + if prev_notes and scanned_notes and prev_notes != scanned_notes: print(f"WARNING: Notes conflict for {row['path']}:") print(f"- Previous: {prev_notes}") print(f"- Scanned: {scanned_notes}") - print("Preserving previous notes and ignoring scanned notes.") - # Preserve human notes if present, otherwise keep scanned notes - row["notes"] = prev_notes if prev_notes else scanned_notes + + if force_overwrite_notes: + print("Force overwrite enabled; using scanned notes.") + else: + print("Preserving previous notes and ignoring scanned notes.") + + if force_overwrite_notes: + row["notes"] = scanned_notes + else: + row["notes"] = prev_notes if prev_notes else scanned_notes for col in extra_columns: row[col] = previous.get(col, "") if previous else "" @@ -492,7 +505,12 @@ def build_row(repo_root: Path, path: Path) -> dict[str, Any]: def export_csv( - repo_root: Path, include: list[str], exclude: list[str], out_path: Path, targets: list[str] | None + repo_root: Path, + include: list[str], + exclude: list[str], + out_path: Path, + targets: list[str] | None, + force_overwrite_notes: bool = False, ) -> int: candidates = iter_candidate_paths(repo_root, include, exclude, targets=targets) existing_rows, extra_columns = load_existing_rows(out_path) @@ -501,7 +519,7 @@ def export_csv( for path in candidates: base = build_row(repo_root, path) previous = existing_rows.get(base["path"]) - rows.append(merged_row(base, previous, extra_columns)) + rows.append(merged_row(base, previous, extra_columns, force_overwrite_notes=force_overwrite_notes)) fieldnames = list(GENERATED_COLUMNS) + [c for c in extra_columns if c not in GENERATED_COLUMNS] @@ -536,6 +554,15 @@ def main(argv: Sequence[str] | None = None) -> int: "directories, and glob patterns (e.g. docs/page.md, docs/gui/, 'docs/**/*.md')." ), ) + parser.add_argument( + "--force-overwrite-notes", + action="store_true", + help=( + "By default, if a record already exists in the CSV and has notes, those notes are preserved even if the " + "scanned metadata contains notes. This flag forces the scanned notes to overwrite existing notes, " + "which can be useful for bulk updates but may lead to loss of manually curated information." + ), + ) args = parser.parse_args(list(argv) if argv is not None else None) repo_root = find_repo_root(Path(args.root)) @@ -545,7 +572,9 @@ def main(argv: Sequence[str] | None = None) -> int: if not out_path.is_absolute(): out_path = repo_root / out_path - return export_csv(repo_root, include, exclude, out_path, targets=args.targets) + return export_csv( + repo_root, include, exclude, out_path, targets=args.targets, force_overwrite_notes=args.force_overwrite_notes + ) if __name__ == "__main__": From 41de5dbdefb6eacffe1a35b830ada10a0bf799ef Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:10:49 +0200 Subject: [PATCH 44/86] Update audit_metadata.csv --- .../docs_audits/april-2026/audit_metadata.csv | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/docs_audits/april-2026/audit_metadata.csv b/tools/docs_audits/april-2026/audit_metadata.csv index 237226cf50..d809f7ec6d 100644 --- a/tools/docs_audits/april-2026/audit_metadata.csv +++ b/tools/docs_audits/april-2026/audit_metadata.csv @@ -6,11 +6,11 @@ docs/ModelZoo.md,md,true,,,,,,,,, docs/Overviewof3D.md,md,true,online,review_needed,update,,,,"Contents seem up-to-date as the codebase has not evolved drastically for 3D, but formatting and organization could be improved. Separate basic/advanced sections could help, as well as more admonitions/dropdowns to streamline.",, docs/README.md,md,true,,,,,,,,, docs/UseOverviewGuide.md,md,true,,,,,,,,, -docs/beginner-guides/Training-Evaluation.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, -docs/beginner-guides/beginners-guide.md,md,true,online,outdated,move,,,,"While it could seem like a useful page for beginners, duplicating installation instructions is not ideal for maintenance. This is also mixing installation/setup with a GUI guide, which should be in its own section/page. This puts into question the reason of existence of this page, as it would end up being two links to different sections. I would rather have well-made, accurate installation and GUI guides, and if there are beginner-relevant information that really cannot fit into those, then we can have a 'beginner's guide' that links to those and has the extra info. I would suggest reviewing whether this style of docs should remain at all, but if we want to keep them revising the approach may be needed.",, -docs/beginner-guides/labeling.md,md,true,online,viable,move,,,,"Useful content, a note is that this should be better integrated with the napari plugin docs, making the workflow transition from DLC GUI -> napari viewer -> back to DLC GUI more seamless so as to confuse users less. This will need a bit of restructuring, as napari-DLC docs are also standalone from the main GUI. Finding a good linking strategy would help. Perhaps breaking napari-DLC docs into install/setup, basic usage, *labeling workflow* (new) and advanced usage would allow to do this cleanly, as it would separate the standalone plugin operation from the DLC-GUI integrated workflow, yet retaining a single source for napari-DLC labeling workflow.",, -docs/beginner-guides/manage-project.md,md,true,online,viable,move,,,,"It seems the beginner guide section is more of a GUI step-by-step. As such, it should be moved to the GUI section, and merged/integrated with the contents there. The content is useful, but making it clear that this is for the GUI would reduce the confusion of a beginner guide being in fact rather central GUI use instructions.",, -docs/beginner-guides/video-analysis.md,md,true,online,viable,move,,,,"As mentioned on oher beginner-guides/ docs, this should be part of the GUI section.",, +docs/beginner-guides/Training-Evaluation.md,md,true,online,viable,move,,,,"As mentioned on other beginner-guides/ docs, this should be part of the GUI section.",, +docs/beginner-guides/beginners-guide.md,md,true,online,outdated,move,,,,Move to GUI section.,, +docs/beginner-guides/labeling.md,md,true,online,viable,move,,,,Move to GUI section. Updated to link directly to the napari plugin docs. Making the link specific to the workflow section of the napari docs could help.,, +docs/beginner-guides/manage-project.md,md,true,online,viable,move,,,,Move to a dedicated GUI section. Making the config edit tool slightly easier to work with and updating the docs below to include additional fields would be helpful.,, +docs/beginner-guides/video-analysis.md,md,true,online,viable,move,,,,"As mentioned on other beginner-guides/ docs, this should be part of the GUI section.",, docs/benchmark.md,md,true,,,,,,,,, docs/citation.md,md,true,,,,,,,,, docs/convert_maDLC.md,md,true,,,,,,,,, @@ -29,8 +29,8 @@ docs/dlc-live/dlc-live-gui/user_guide/misc/timestamp_format.md,md,true,,,,,,,,, docs/dlc-live/dlc-live-gui/user_guide/overview.md,md,true,,,,,,,,, docs/dlc-utils/XROMM/usage.md,md,false,,,,,,,,, docs/dlc-utils/index.md,md,true,,,,2026-05-06,,,,, -docs/docker.md,md,true,online,review_needed,verify,,,,,, -docs/gui/PROJECT_GUI.md,md,true,online,review_needed,update,,,,"While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commmands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide.",, +docs/docker.md,md,true,online,viable,,2026-05-22,,,,, +docs/gui/PROJECT_GUI.md,md,true,online,review_needed,update,,,,"While the content is generally accurate, repeating installation instructions is not ideal. I would suggest linking to the installation guide instead of re-suggesting commands but then still saying to read the install page... Also, the GUI is likely used by the majority of users, so I would even consider making this a full section in the TOC, and maybe even having one file per GUI tab, which would make tracking code/docs sync easier. Addendum: it seems the beginner guide section is more of a GUI step-by-step, as mentioned earlier in this comment. I would suggest merging/moving and adding links in the present doc, which would make it less of a video list and more of a proper GUI guide.",, docs/gui/index.md,md,false,,,,,,,,, docs/gui/napari/advanced_usage.md,md,true,,,,2026-04-09,,,,, docs/gui/napari/basic_usage.md,md,true,,,,2026-04-09,,,,, @@ -42,7 +42,7 @@ docs/maDLC_UserGuide.md,md,true,online,review_needed,verify,,,,"Could use a smal docs/notebooks/extra.md,md,false,,,,,,,,, docs/notebooks/main_demos.md,md,false,,,,,,,,, docs/notebooks/your_data.md,md,false,,,,,,,,, -docs/pytorch/Benchmarking_shuffle_guide.md,md,true,online,viable,move,,,,"Useful and well-written, but it could be better groped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat inbetween the two backends.",, +docs/pytorch/Benchmarking_shuffle_guide.md,md,true,online,viable,move,,,,"Useful and well-written, but it could be better grouped with other tutorials/guides rather than being a PyTorch docs only page, as its contents are somewhat in between the two backends.",, docs/pytorch/architectures.md,md,true,online,viable,keep,,,,,, docs/pytorch/index.md,md,false,,,,,,,,, docs/pytorch/pytorch_config.md,md,true,online,review_needed,verify,,,,"Check for accuracy and completeness of content, and update as needed. Formatting is fairly consistent and does not need an urgent update.",, @@ -67,18 +67,18 @@ docs/recipes/io.md,md,true,,,,,,,,, docs/recipes/nn.md,md,true,,,,,,,,, docs/recipes/pose_cfg_file_breakdown.md,md,true,,,,,,,,, docs/recipes/post.md,md,true,,,,,,,,, -docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md,md,true,online,review_needed,verify,,,,"Sligthly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo.",, +docs/recipes/publishing_notebooks_into_the_DLC_main_cookbook.md,md,true,online,review_needed,verify,,,,"Slightly redundant with CONTRIBUTING.md, style may need adjusted based on the rest of the repo.",, docs/roadmap.md,md,true,,,,,,,,, docs/standardDeepLabCut_UserGuide.md,md,true,online,review_needed,update,,,,"This is a crucial piece of the doc, but it is rather long and verbose. Recommend breaking it up into smaller sections, and adding more visuals (e.g. screenshots of the GUI, etc.) to make it more engaging and easier to read. Also, consider adding a table of contents at the beginning for easier navigation.",, -examples/COLAB/COLAB_3miceDemo.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_3miceDemo.ipynb,ipynb,true,,,,2026-05-11,,,"This notebook is a demo for the TensorFlow-based pipeline described in the Nature Methods publication (https://doi.org/10.1038/s41592-022-01443-0). However, the corresponding DeepLabCut version does not run anymore on Colab (which requires Python >= 3.11). The notebook has been adapted to use the latest TensorFlow-enabled version of DeepLabCut (namely, 3.0), which supports both PyTorch and TensorFlow.",, examples/COLAB/COLAB_BUCTD_and_CTD_tracking.ipynb,ipynb,true,,,,,,,,, -examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb,ipynb,true,,,,,,,,, -examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb,ipynb,true,,,,,,,,, -examples/COLAB/COLAB_DLC_ModelZoo.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_DEMO_SuperAnimal.ipynb,ipynb,true,,,,2026-05-11,,,,, +examples/COLAB/COLAB_DEMO_mouse_openfield.ipynb,ipynb,true,,,,2026-05-11,,,,, +examples/COLAB/COLAB_DLC_ModelZoo.ipynb,ipynb,true,,,,2026-05-11,,,,, examples/COLAB/COLAB_HumanPose_with_RTMPose.ipynb,ipynb,false,,,,,,,,, -examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb,ipynb,true,,,,,,,,, -examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,,,,,, -examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,,,,,, +examples/COLAB/COLAB_YOURDATA_SuperAnimal.ipynb,ipynb,true,,,,2026-05-11,,,,, +examples/COLAB/COLAB_YOURDATA_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,2026-05-11,,,"This notebook demos the primary generic/PyTorch API for single-animal DeepLabCut projects. Note that it is a bit outdated and may need revisions after dropping TensorFlow support. Also it does not reflect any of the planned refactors currently in the works (e.g. structured configs, keypoints).",, +examples/COLAB/COLAB_YOURDATA_maDLC_TrainNetwork_VideoAnalysis.ipynb,ipynb,true,,,,2026-05-11,,,"This notebook demos the primary generic/PyTorch API for multi-animal DeepLabCut (maDLC) projects. Note that it may need revisions after dropping TensorFlow support. And does not reflect any of the planned refactors currently in the works (e.g. structured configs, keypoints).",, examples/COLAB/COLAB_transformer_reID.ipynb,ipynb,false,,,,,,,,, examples/JUPYTER/Demo_3D_DeepLabCut.ipynb,ipynb,true,,,,,,,,, examples/JUPYTER/Demo_labeledexample_MouseReaching.ipynb,ipynb,true,,,,,,,,, From 7369087b2388b5918f89a91ee1bb5df082f31222 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 15:20:09 +0200 Subject: [PATCH 45/86] Start updating single animal docs guide Improve user documentation for the GUI and CLI flows: add an important note to always run the terminal as administrator on Windows, rename and rephrase GUI/CLI headings for clarity, and break out stepwise startup instructions. Restructure the create_new_project section with a concise list of required and optional arguments, add a note explaining symbolic links and why Windows requires admin privileges, include a code example and tip block, and fix Windows path formatting. Minor wording and formatting tweaks throughout to improve readability. --- docs/gui/PROJECT_GUI.md | 4 ++ docs/standardDeepLabCut_UserGuide.md | 61 ++++++++++++++++++---------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/docs/gui/PROJECT_GUI.md b/docs/gui/PROJECT_GUI.md index 3bede5488b..ed53b4794d 100644 --- a/docs/gui/PROJECT_GUI.md +++ b/docs/gui/PROJECT_GUI.md @@ -21,6 +21,10 @@ While several advanced features are not fully available in this Project GUI, we 1. Install DeepLabCut following the instructions in the {ref}`installation page`. 1. Open the terminal and run: `python -m deeplabcut` +```{important} +If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +``` +

      diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 914d85d08e..8f50c77c52 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -18,19 +18,18 @@ the same), then please see our [maDLC user guide](multi-animal-userguide). To get started, you can use the GUI, or the terminal. See below. -## DeepLabCut Project Manager GUI (recommended for beginners) +## Using the GUI (recommended for beginners) -**GUI:** +1. To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch + "Terminal" (unix/MacOS) on your computer. +1. We assume you have DeepLabCut installed (if not, see {ref}`file:how-to-install`). Next, launch your conda env (i.e., for example `conda activate DEEPLABCUT`). +1. Then, simply run `python -m deeplabcut`. -To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch -"Terminal" (unix/MacOS) on your computer. We assume you have DeepLabCut installed (if not, see -[install docs](how-to-install)!). Next, launch your conda env (i.e., for example `conda activate DEEPLABCUT`). Then, -simply run `python -m deeplabcut`. The below functions are available to you in an easy-to-use graphical user interface. -While most functionality is available, advanced users might want the additional flexibility that command line interface -offers. Read more below. +Most functions are available to you in the GUI. +However, advanced users might prefer the additional flexibility that command line interface offers. Read more below. -```{Hint} -🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +```{important} +If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ```

      @@ -42,7 +41,7 @@ As a reminder, the core functions are described in our Additional functions and features are continually added to the package. Thus, we recommend you read over the protocol and then please look at the following documentation and the doctrings. Thanks for using DeepLabCut! -## DeepLabCut in the Terminal/Command line interface: +## Using the CLI To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch "Terminal" (unix/MacOS) on your computer. We assume you have DeepLabCut installed (if not, see Install docs!). Next, @@ -52,24 +51,40 @@ launch your conda env (i.e., for example `conda activate DEEPLABCUT`) and then t import deeplabcut ``` -```{Hint} -🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +```{important} +If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ``` ### (A) Create a New Project +#### Overview + The function `create_new_project` creates a new project directory, required subdirectories, and a basic project configuration file. Each project is identified by the name of the project (e.g. Reaching), name of the experimenter (e.g. YourName), as well as the date at creation. -Thus, this function requires the user to input the name of the project, the name of the experimenter, and the full -path of the videos that are (initially) used to create the training dataset. +Thus, this function requires the user to input: + +- The name of the project +- The name of the experimenter +- The full path of the videos that are (initially) used to create the training dataset. +- Optional arguments specify: + - The working directory + - Where the project directory will be created + - Whether to copy the videos to the project directory -Optional arguments specify the working directory, where the project directory will be created, and if the user wants -to copy the videos (to the project directory). If the optional argument `working_directory` is unspecified, the -project directory is created in the current working directory, and if `copy_videos` is unspecified symbolic links -for the videos are created in the videos directory. Each symbolic link creates a reference to a video and thus +```{note} +If the optional argument `working_directory` is unspecified, the +project directory is created in the current working directory. + +If `copy_videos` is unspecified symbolic links +for the videos are created in the videos directory. +Each symbolic link creates a reference to a video and thus eliminates the need to copy the entire video to the video directory (if the videos remain at the original location). +This is why administrator privileges are required for Windows users, as creating symbolic links requires them. +``` + +#### Code example ```python deeplabcut.create_new_project( @@ -82,13 +97,17 @@ deeplabcut.create_new_project( ) ``` +#### Additional arguments + **Important path formatting note** Windows users, you must input paths as: `r'C:\Users\computername\Videos\reachingvideo1.avi'` or -` 'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` +`'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` -TIP: you can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds +```{tip} +You can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_project(...)` +``` This set of arguments will create a project directory with the name **++** in the **Working directory** and From 2d4ce4491ae3bce5fe9e22bc3889d641de580228 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 6 May 2026 15:38:16 +0200 Subject: [PATCH 46/86] Refactor user guide to MyST format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert the single-animal user guide to MyST-friendly markdown and improve layout and clarity. Changes include: add a table-of-contents directive; replace raw HTML /

      blocks with MyST image directives and metadata; introduce admonitions (important/note/caution/hint) for critical points; restructure the project directory section into bulleted lists and an ASCII tree; clarify Windows path guidance and config.yaml parameter notes; normalize API Docs headings and other formatting fixes. These are documentation/formatting updates to improve rendering and readability—no functional code changes. --- docs/standardDeepLabCut_UserGuide.md | 279 ++++++++++++++++++--------- 1 file changed, 190 insertions(+), 89 deletions(-) diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 8f50c77c52..44be886926 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -13,6 +13,13 @@ deeplabcut: # Single animal projects +```{contents} +--- +local: +depth: 2 +--- +``` + This document covers single/standard DeepLabCut use. If you have a complicated multi-animal scenario (i.e., they look the same), then please see our [maDLC user guide](multi-animal-userguide). @@ -32,9 +39,12 @@ However, advanced users might prefer the additional flexibility that command lin If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ``` -

      - -

      +```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w +--- +width: 60% +align: center +--- +``` As a reminder, the core functions are described in our [Nature Protocols paper](https://www.nature.com/articles/s41596-019-0176-0) (published at the time of 2.0.6). @@ -55,6 +65,8 @@ import deeplabcut If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". ``` +## Workflow + ### (A) Create a New Project #### Overview @@ -97,12 +109,13 @@ deeplabcut.create_new_project( ) ``` -#### Additional arguments - -**Important path formatting note** +#### Output & directory structure -Windows users, you must input paths as: `r'C:\Users\computername\Videos\reachingvideo1.avi'` or +```{important} +On Windows, input paths as: +`r'C:\Users\computername\Videos\reachingvideo1.avi'` or `'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` +``` ```{tip} You can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds @@ -110,35 +123,63 @@ the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_projec ``` This set of arguments will create a project directory with the name -**++** in the **Working directory** and -creates the symbolic links to videos in the **videos** directory. The project directory will have subdirectories: -**dlc-models**, **dlc-models-pytorch**, **labeled-data**, **training-datasets**, and **videos**. All the outputs -generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be -curated in separation from other projects. The purpose of the subdirectories is as follows: - -**dlc-models** and **dlc-models-pytorch** have a similar structure; the first contains files for the TensorFlow engine -while the second contains files for the PyTorch engine. At the top level in these directories, there are directories -referring to different iterations of label refinement (see below): **iteration-0**, **iteration-1**, etc. -The iteration directories store shuffle directories, where each shuffle directory stores model data related to a -particular experiment: trained and tested on a particular training and testing sets, and with a particular model -architecture. Each shuffle directory contains the subdirectories *test* and *train*, each of which holds the meta -information with regard to the parameters of the feature detectors in configuration files. The configuration files are -YAML files, a common human-readable data serialization language. These files can be opened and edited with standard text -editors. The subdirectory *train* will store checkpoints (called snapshots) during training of the model. These -snapshots allow the user to reload the trained model without re-training it, or to pick-up training from a particular -saved checkpoint, in case the training was interrupted. - -**labeled-data:** This directory will store the frames used to create the training dataset. Frames from different videos -are stored in separate subdirectories. Each frame has a filename related to the temporal index within the corresponding -video, which allows the user to trace every frame back to its origin. - -**training-datasets:** This directory will contain the training dataset used to train the network and metadata, which -contains information about how the training dataset was created. - -**videos:** Directory of video links or videos. When **copy_videos** is set to `False`, this directory contains -symbolic links to the videos. If it is set to `True` then the videos will be copied to this directory. The default is -`False`. Additionally, if the user wants to add new videos to the project at any stage, the function -**add_new_videos** can be used. This will update the list of videos in the project's configuration file. +**++** in the **Working directory** and creates the symbolic links to videos in the videos directory. + +The project directory will have subdirectories: + +- dlc-models +- dlc-models-pytorch +- labeled-data +- training-datasets +- videos + All the outputs generated during the course of a project will be stored in one of these subdirectories, thus allowing each project to be + curated in separation from other projects. + +``` +++/ +├── dlc-models/ +│ ├── iteration-0/ +│ ├── iteration-1/ +│ └── ... +├── dlc-models-pytorch/ +│ ├── iteration-0/ +│ │ └── / +│ │ ├── train/ +│ │ └── test/ +│ ├── iteration-1/ +│ └── ... +├── labeled-data/ +│ └──

      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 V`CRYI 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�h*<)MC;+h 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 literal 0 HcmV?d00001 diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 10d97c38b3..36cf6908e2 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -700,7 +700,7 @@ are stored in the subdirectory *train* under the respective iteration directory. If the user wishes to restart the training at a specific checkpoint they can specify the full path of the checkpoint to the variable ``init_weights`` in the **pose_cfg.yaml** -file under the *train* subdirectory (see Box 2). +file under the *train* subdirectory (see {ref}`Box 2 `). **Tip**: It is recommended to train the networks for thousands of iterations until the loss plateaus (typically around **500,000**) if you use batch size 1. If you @@ -716,6 +716,15 @@ rates, and batch training defaults. Thus, please use a lower ``save_iters`` and ``maxiters``. I.e. we suggest saving every 10K-15K iterations, and only training until 50K-100K iterations. We recommend you look closely at the loss to not overfit on your data. This will reduce your training time. + +```{figure} images/box2-single.png +--- +name: config-box2 +alt: Box 2 - Single Animal TensorFlow Configuration File Glossary +align: center +--- +Single-animal TensorFlow configuration file glossary +``` ```` ##### API Docs @@ -1310,7 +1319,7 @@ subdirectory, where the `#` is the new value of `iteration` variable stored in t Now you can run `create_training_dataset`, then `train_network`, etc. If your original labels were adjusted at all, start from fresh weights (which is generally recommended), otherwise consider using your already trained network -weights (see Box 2). +weights (see {ref}`Box 2 `). If after training the network generalizes well to the data, proceed to analyze new videos. Otherwise, consider labeling more data. From 1b2a42b495bc6fe9ec948e9afae8c49a899e66c5 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 14:45:41 +0200 Subject: [PATCH 62/86] update single-animal guide: images --> figures --- docs/standardDeepLabCut_UserGuide.md | 44 ++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 36cf6908e2..105681eaa7 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -50,11 +50,14 @@ Choose your interface below to launch DeepLabCut: python -m deeplabcut ``` -```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w --- +name: fig-gui-launch +alt: The DeepLabCut Project Manager GUI after launch width: 60% align: center --- +The DeepLabCut Project Manager GUI. ``` ### Python API @@ -350,15 +353,19 @@ deeplabcut.extract_frames(config_path, "manual") ``` The user can use the *Load Video* button to load one of the videos in the project configuration file, use the scroll -bar to navigate across the video and grab a frame or a range of frames to extract the frame(s). +bar to navigate across the video and grab a frame or a range of frames to extract the frame(s) +(see {numref}`fig-manual-frame-selection`). The user can also look at the extracted frames and e.g. delete frames (from the directory) that are too similar before reloading the set and then manually annotating them. -```{image} https://static1.squarespace.com/static/57f6d51c9f74566f55ecf271/t/5c71bfbc71c10b4a23d20567/1550958540700/cropMANUAL.gif?format=750w +```{figure} https://static1.squarespace.com/static/57f6d51c9f74566f55ecf271/t/5c71bfbc71c10b4a23d20567/1550958540700/cropMANUAL.gif?format=750w --- +name: fig-manual-frame-selection +alt: Manual frame selection using the extract_frames GUI width: 70% align: center --- +Manual frame selection using the `extract_frames` GUI. ``` ##### API Docs @@ -719,7 +726,7 @@ data. This will reduce your training time. ```{figure} images/box2-single.png --- -name: config-box2 +name: pose-cfg-box2 alt: Box 2 - Single Animal TensorFlow Configuration File Glossary align: center --- @@ -969,11 +976,14 @@ deeplabcut.filterpredictions( Here is an example of how this can be applied to a video: -```{image} https://static1.squarespace.com/static/57f6d51c9f74566f55ecf271/t/5ccc8b8ae6e8df000100a995/1556908943893/filter_example-01.png?format=1000w +```{figure} https://static1.squarespace.com/static/57f6d51c9f74566f55ecf271/t/5ccc8b8ae6e8df000100a995/1556908943893/filter_example-01.png?format=1000w --- +name: fig-filter-example +alt: Example output of filterpredictions applied to a video width: 70% align: center --- +Example output of `filterpredictions` applied to a video. ``` ##### API Docs @@ -995,7 +1005,8 @@ ______________________________________________________________________ The plotting components of this toolbox utilize matplotlib. Therefore, these plots can easily be customized by the end user. -We also provide a function to plot the trajectory of the extracted poses across the analyzed video, as shown in the example below. +We also provide a function to plot the trajectory of the extracted poses across the analyzed video +(see {numref}`fig-trajectory-frame` and {numref}`fig-trajectory-plots`). ##### Code example @@ -1009,20 +1020,26 @@ It creates a folder called `plot-poses` (in the directory of the video). The plo vs. time, likelihoods vs time, the x- vs. y- coordinate of the body parts, as well as histograms of consecutive coordinate differences. These plots help the user to quickly assess the tracking performance for a video. Ideally, the likelihood stays high and the histogram of consecutive coordinate differences has values close to zero (i.e. no jumps in -body part detections across frames). Here are example plot outputs on a demo video (left): +body part detections across frames). Example outputs are shown below. -```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559946148685-WHDO5IG9MMCHU0T7RC62/ke17ZwdGBToddI8pDm48kEOb1vFO6oRDmR8SXh4iL21Zw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVG1gXK66ltnjKh4U2immgm7AVAdfOWODmXNLQLqbLRZ2DqWIIaSPh2v08GbKqpiV54/file0289.png?format=500w +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559946148685-WHDO5IG9MMCHU0T7RC62/ke17ZwdGBToddI8pDm48kEOb1vFO6oRDmR8SXh4iL21Zw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVG1gXK66ltnjKh4U2immgm7AVAdfOWODmXNLQLqbLRZ2DqWIIaSPh2v08GbKqpiV54/file0289.png?format=500w --- +name: fig-trajectory-frame +alt: Example video frame with tracked body parts overlaid height: 240px align: center --- +Example video frame with tracked body parts overlaid. ``` -```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559939762886-CCB0R107I2HXAHZLHECP/ke17ZwdGBToddI8pDm48kNeA8e5AnyMqj80u4_mB0hV7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z5QPOohDIaIeljMHgDF5CVlOqpeNLcJ80NK65_fV7S1UcpboONgOQYHLzaUWEI1Ir9fXt7Ehyn7DSgU3GCReAA-ZDqXZYzu2fuaodM4POSZ4w/plot_poses-01.png?format=1000w +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559939762886-CCB0R107I2HXAHZLHECP/ke17ZwdGBToddI8pDm48kNeA8e5AnyMqj80u4_mB0hV7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z5QPOohDIaIeljMHgDF5CVlOqpeNLcJ80NK65_fV7S1UcpboONgOQYHLzaUWEI1Ir9fXt7Ehyn7DSgU3GCReAA-ZDqXZYzu2fuaodM4POSZ4w/plot_poses-01.png?format=1000w --- +name: fig-trajectory-plots +alt: Example plot_trajectories output height: 250px align: center --- +Example `plot_trajectories` output: body part coordinates, likelihoods, and consecutive displacement histograms. ``` ##### API Docs @@ -1069,8 +1086,8 @@ deeplabcut.create_labeled_video( ) ``` -You can also optionally add a skeleton to connect points and/or add a history of points for visualization. To set the -"trailing points" you need to pass `trailpoints`: +You can also optionally add a skeleton to connect points and/or add a history of points for visualization +(see {numref}`fig-skeleton-trail`). To set the "trailing points" you need to pass `trailpoints`: ```python deeplabcut.create_labeled_video( @@ -1131,11 +1148,14 @@ The best quality videos are created when `fastmode=False` is passed. Therefore, `trailpoints` and `draw_skeleton` are used, we **highly** recommend you also pass `fastmode=False`! ``` -```{image} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559935526258-KFYZC8BDHK01ZIDPNVIX/ke17ZwdGBToddI8pDm48kJbosy0LGK_KqcAZRQ_Qph1Zw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpzkC6kmM1CbNgeHQVxASNv0wiXikHv274BIFe4LR7nd1rKmAka4uxYMJ9FupazBoaU/mouse_skel_trail.gif?format=750w +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1559935526258-KFYZC8BDHK01ZIDPNVIX/ke17ZwdGBToddI8pDm48kJbosy0LGK_KqcAZRQ_Qph1Zw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpzkC6kmM1CbNgeHQVxASNv0wiXikHv274BIFe4LR7nd1rKmAka4uxYMJ9FupazBoaU/mouse_skel_trail.gif?format=750w --- +name: fig-skeleton-trail +alt: Labeled video with skeleton overlay and trailing points width: 40% align: center --- +Labeled video with skeleton overlay and trailing points (`draw_skeleton=True`, `trailpoints=10`). ``` This function has various other parameters, in particular the user can set the `colormap`, the `dotsize`, and From df8105361be345ba287a93bc80d5c53ed5cc62d1 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:34:37 +0200 Subject: [PATCH 63/86] Fix Sphinx refs and link formatting Replace markdown-style links with Sphinx {ref} cross-reference roles in docs/UseOverviewGuide.md and docs/maDLC_UserGuide.md to ensure proper Sphinx rendering. Also fix a malformed bracket/URL in docs/pytorch/architectures.md for the Ye et al. citation link. --- docs/UseOverviewGuide.md | 8 ++++---- docs/maDLC_UserGuide.md | 2 +- docs/pytorch/architectures.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/UseOverviewGuide.md b/docs/UseOverviewGuide.md index 690735a4c0..f9ebc3a1a7 100644 --- a/docs/UseOverviewGuide.md +++ b/docs/UseOverviewGuide.md @@ -42,8 +42,8 @@ We are primarily a package that enables deep learning-based pose estimation. We - We highly recommend carefully considering which one is best for your needs. - For example, a white mouse + black mouse would call for standard, while two black mice would use multi-animal. See {ref}`important-info-regd-usage`. - Then pick a user guide: - 1. [How to use standard DeepLabCut](single-animal-userguide) - 1. [How to use multi-animal DeepLabCut](multi-animal-userguide) + 1. {ref}`How to use standard DeepLabCut ` + 1. {ref}`How to use multi-animal DeepLabCut ` - To note, as of DLC3+ the single and multi-animal code bases are more integrated and we support **top-down**, **bottom-up**, and a new "hybrid" approach that is state-of-the-art, called **BUCTD** (bottom-up conditional top down) @@ -234,8 +234,8 @@ That's it! Follow the GUI for details Please decide which mode you want to use DeepLabCut with, and follow one of: -- (1) \[How to use standard DeepLabCut\](file:single-animal-userguide) -- (2) [How to use multi-animal DeepLabCut](multi-animal-userguide) +- (1) {ref}`How to use standard DeepLabCut ` +- (2) {ref}`How to use multi-animal DeepLabCut ` ## Useful links diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 5ca4fc31e4..85ffea2bfd 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -316,7 +316,7 @@ which then also uses temporal information to link across the video frames. Note, we also highly recommend that you use more bodyparts that you might otherwise have (see the example below). -For more information, checkout the \[napari-deeplabcut docs\](file:napari-gui-landing) for +For more information, checkout the {ref}`napari-deeplabcut docs ` for more information about the labelling workflow. ### (E) Check Annotated Frames diff --git a/docs/pytorch/architectures.md b/docs/pytorch/architectures.md index 71ace606ca..41de1dd0c9 100644 --- a/docs/pytorch/architectures.md +++ b/docs/pytorch/architectures.md @@ -74,7 +74,7 @@ and you can add more easily in our new model registry). Also check out the expla **AnimalTokenPose** -- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024\](https://arxiv.org/abs/2203.07436) +- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in [Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024](https://arxiv.org/abs/2203.07436) - One variant is implemented as: `animal_tokenpose_base` for video inference only (we don't support directly training this within deeplabcut) ## Information on Single Animal Models From 3273146cc80c3f7afc164817b0d781cdad01951a Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 16:34:37 +0200 Subject: [PATCH 64/86] Fix Sphinx refs and link formatting Replace markdown-style links with Sphinx {ref} cross-reference roles in docs/UseOverviewGuide.md and docs/maDLC_UserGuide.md to ensure proper Sphinx rendering. Also fix a malformed bracket/URL in docs/pytorch/architectures.md for the Ye et al. citation link. --- docs/UseOverviewGuide.md | 8 ++++---- docs/maDLC_UserGuide.md | 2 +- docs/pytorch/architectures.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/UseOverviewGuide.md b/docs/UseOverviewGuide.md index 74038ef62b..f9ebc3a1a7 100644 --- a/docs/UseOverviewGuide.md +++ b/docs/UseOverviewGuide.md @@ -42,8 +42,8 @@ We are primarily a package that enables deep learning-based pose estimation. We - We highly recommend carefully considering which one is best for your needs. - For example, a white mouse + black mouse would call for standard, while two black mice would use multi-animal. See {ref}`important-info-regd-usage`. - Then pick a user guide: - 1. [How to use standard DeepLabCut](single-animal-userguide) - 1. [How to use multi-animal DeepLabCut](multi-animal-userguide) + 1. {ref}`How to use standard DeepLabCut ` + 1. {ref}`How to use multi-animal DeepLabCut ` - To note, as of DLC3+ the single and multi-animal code bases are more integrated and we support **top-down**, **bottom-up**, and a new "hybrid" approach that is state-of-the-art, called **BUCTD** (bottom-up conditional top down) @@ -234,8 +234,8 @@ That's it! Follow the GUI for details Please decide which mode you want to use DeepLabCut with, and follow one of: -- (1) [How to use standard DeepLabCut](single-animal-userguide) -- (2) [How to use multi-animal DeepLabCut](multi-animal-userguide) +- (1) {ref}`How to use standard DeepLabCut ` +- (2) {ref}`How to use multi-animal DeepLabCut ` ## Useful links diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 5ca4fc31e4..85ffea2bfd 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -316,7 +316,7 @@ which then also uses temporal information to link across the video frames. Note, we also highly recommend that you use more bodyparts that you might otherwise have (see the example below). -For more information, checkout the \[napari-deeplabcut docs\](file:napari-gui-landing) for +For more information, checkout the {ref}`napari-deeplabcut docs ` for more information about the labelling workflow. ### (E) Check Annotated Frames diff --git a/docs/pytorch/architectures.md b/docs/pytorch/architectures.md index 71ace606ca..41de1dd0c9 100644 --- a/docs/pytorch/architectures.md +++ b/docs/pytorch/architectures.md @@ -74,7 +74,7 @@ and you can add more easily in our new model registry). Also check out the expla **AnimalTokenPose** -- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024\](https://arxiv.org/abs/2203.07436) +- Adapted from [Li, Yanjie, et al. "Tokenpose: Learning keypoint tokens for human pose estimation." Proceedings of the IEEE/CVF International conference on computer vision. 2021.](https://arxiv.org/abs/2104.03516) as in [Ye et al. "SuperAnimal pretrained pose estimation models for behavioral analysis." Nature Communications. 2024](https://arxiv.org/abs/2203.07436) - One variant is implemented as: `animal_tokenpose_base` for video inference only (we don't support directly training this within deeplabcut) ## Information on Single Animal Models From ed001a5e47b2e63c807373fc74b0870c1a3a02ec Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Fri, 29 May 2026 13:34:13 +0200 Subject: [PATCH 65/86] Add clearer optional requirements instructions for upgrading --- docs/installation.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index bdef596d20..4d3fc677c9 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -319,13 +319,15 @@ Create a new conda environment with Python 3.10 (or 3.11, 3.12) by running: `conda create -n DLC python=3.10` **Current version:** The only thing you then need to add to the env is deeplabcut ( -`pip install deeplabcut`) or `pip install 'deeplabcut[gui]'` which has a napari based -GUI. +`pip install deeplabcut`) or `pip install 'deeplabcut[gui]'` if you are using the GUI, which includes the napari based labeling +interface. ## Updating your installation -If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` inside your env. -If you want to use a specific release, then specify the version you want, such as `pip install deeplabcut==3.0`. +If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` (alongside optional needed reqirements, e.g. `[gui]`) using your environment. + +If you would like to use a specific release, then specify the version you want, such as `pip install deeplabcut==3.0` and optional requirements. + Once installed, you can check the version by running: From 463766582fcf959ff11417d69d0511e1c76c1ff2 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Fri, 29 May 2026 13:36:08 +0200 Subject: [PATCH 66/86] Fix typo --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 4d3fc677c9..4628990add 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -324,7 +324,7 @@ interface. ## Updating your installation -If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` (alongside optional needed reqirements, e.g. `[gui]`) using your environment. +If you ever want to update your DLC, just run `pip install --upgrade deeplabcut` (alongside optional needed requirements, e.g. `[gui]`) using your environment. If you would like to use a specific release, then specify the version you want, such as `pip install deeplabcut==3.0` and optional requirements. From 52a080925d59a7222790982a19bdd8d07bb2ed14 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 14:56:21 +0200 Subject: [PATCH 67/86] update multi-animal guide: add contents block --- docs/maDLC_UserGuide.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 85ffea2bfd..ffa40dc198 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -13,6 +13,13 @@ deeplabcut: # Multi-animal projects +```{contents} +--- +local: +depth: 3 +--- +``` + This document should serve as the user guide for maDLC, and it is here to support the scientific advances presented in [Lauer et al. 2022](https://doi.org/10.1038/s41592-022-01443-0). From 8e967d8ae106a09350dc4d352109f538abff6ee3 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 15:00:49 +0200 Subject: [PATCH 68/86] update multi-animla guide: restructure 'Getting started' (same as single-animal) --- docs/maDLC_UserGuide.md | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index ffa40dc198..7d3f6f99b4 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -46,36 +46,44 @@ Thus, you should always label, train, and evaluate the pose estimation performan maDLC -## Install: +## Getting started -**Quick start:** If you are using DeepLabCut on the cloud, or otherwise cannot use the GUIs and you should install with: `pip install 'deeplabcut'`; if you need GUI support, please use: `pip install 'deeplabcut[gui]'`. Check the [installation page](how-to-install) for more information, including GPU support. +DeepLabCut offers two equivalent interfaces: a **GUI** for those who prefer a visual +workflow (no Python knowledge required), and a **Python API** for users who want +scripting flexibility or to integrate DeepLabCut into a larger pipeline. All workflow +steps are available in both. -IF you want to use the bleeding edge version to make edits to the code, see [here on how to install it and test it](https://deeplabcut.github.io/DeepLabCut/docs/recipes/installTips.html#how-to-use-the-latest-updates-directly-from-github). +We assume you have DeepLabCut installed (if not, see {ref}`file:how-to-install`). +Open a terminal and activate your conda environment: -## Get started in the terminal or Project GUI: +```bash +conda activate DEEPLABCUT +``` + +```{important} +On Windows, always open the terminal with administrator privileges: right-click and +select "Run as administrator". +``` -**GUI:** simply launch your conda env, and type `python -m deeplabcut` in the terminal. -Then follow the tabs! It might be useful to read the following, however, so you understand what each command does. +Choose your interface below to launch DeepLabCut: -**TERMINAL:** To begin, 🚨 (windows) navigate to anaconda prompt and right-click to "open as admin", or (unix/MacOS) simply launch "terminal" on your computer. We assume you have DeepLabCut installed (if not, [see installation instructions](how-to-install)). Next, launch your conda env (i.e., for example `conda activate DEEPLABCUT`). +### GUI (recommended for beginners) -```{Hint} -🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +```bash +python -m deeplabcut ``` -Please read more [here](https://deeplabcut.github.io/DeepLabCut/docs/docker.html), and in our Nature Protocols paper [here](https://www.nature.com/articles/s41596-019-0176-0). And, see our [troubleshooting wiki](https://github.com/DeepLabCut/DeepLabCut/wiki/Troubleshooting-Tips). +Each workflow step has a corresponding tab in the Project Manager. It is useful to +read the sections below so you understand what each step does. + +### Python API -Open an `ipython` session and import the package by typing in the terminal: +In an interactive Python session (e.g. `ipython`), import DeepLabCut: ```python -ipython import deeplabcut ``` -```{TIP} -for every function there is a associated help document that can be viewed by adding a **?** after the function name; i.e. ``deeplabcut.create_new_project?``. To exit this help screen, type ``:q``. -``` - ### (A) Create a New Project ```python From ff85d5f82b439a83e5f7d4b756a0769d1a1e242d Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 15:15:31 +0200 Subject: [PATCH 69/86] update multi-animal docs: group steps A-L in phases 1 to 5; demote headers accordingly --- docs/maDLC_UserGuide.md | 95 ++++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 7d3f6f99b4..191135cd52 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -84,7 +84,17 @@ In an interactive Python session (e.g. `ipython`), import DeepLabCut: import deeplabcut ``` -### (A) Create a New Project +## Workflow + +DeepLabCut's full multi-animal workflow is described in steps (A)–(L) below. +Every step can be completed either via the **GUI** or the **Python API** — both are +fully equivalent. Code examples throughout this page use the Python API; if you are +using the GUI, the same steps are available in the corresponding tabs of the Project +Manager. + +### Phase 1 — Project setup + +#### (A) Create a New Project ```python deeplabcut.create_new_project( @@ -144,7 +154,7 @@ There are docs for this: [convert single to multianimal annotation data](convert ![Box 1 - Multi Animal Project Configuration File Glossary](images/box1-multi.png) -### API Docs +##### API Docs ````{admonition} Click the button to see API Docs --- @@ -155,7 +165,7 @@ class: dropdown ``` ```` -### (B) Configure the Project +#### (B) Configure the Project Next, open the **config.yaml** file, which was created during **create_new_project**. You can edit this file in any text editor. Familiarize yourself with the meaning of the @@ -212,7 +222,9 @@ identity: True/False **Uniquebodyparts:** are points that you want to track, but that appear only once within each frame, i.e. they are "unique". Typically these are things like unique objects, landmarks, tools, etc. They can also be animals, e.g. in the case where one German shepherd is attending to many sheep the sheep bodyparts would be multianimalbodyparts, the shepherd parts would be uniquebodyparts and the individuals would be the list of sheep (e.g. Polly, Molly, Dolly, ...). -### (C) Select Frames to Label +### Phase 2 — Data preparation + +#### (C) Select Frames to Label **CRITICAL:** A good training dataset should consist of a sufficient number of frames that capture the breadth of the behavior. This ideally implies to select the frames from different (behavioral) sessions, different lighting and different animals, if those vary substantially (to train an invariant, robust feature detector). Thus for creating a robust network that you can reuse in the laboratory, a good training dataset should reflect the diversity of the behavior with respect to postures, luminance conditions, background conditions, animal identities, etc. of the data that will be analyzed. For the simple lab behaviors comprising mouse reaching, open-field behavior and fly behavior, 100−200 frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). However, depending on the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, more or less frames might be necessary to create a good network. Ultimately, in order to scale up the analysis to large collections of videos with perhaps unexpected conditions, one can also refine the data set in an adaptive way (see refinement below). **For maDLC, be sure you have labeled frames with closely interacting animals!** @@ -281,7 +293,7 @@ class: dropdown ``` ```` -### (D) Label Frames +#### (D) Label Frames ```python deeplabcut.label_frames(config_path) @@ -334,7 +346,7 @@ Note, we also highly recommend that you use more bodyparts that you might otherw For more information, checkout the {ref}`napari-deeplabcut docs ` for more information about the labelling workflow. -### (E) Check Annotated Frames +#### (E) Check Annotated Frames Checking if the labels were created and stored correctly is beneficial for training, since labeling is one of the most critical parts for creating the training dataset. The DeepLabCut toolbox provides a function @@ -361,7 +373,9 @@ class: dropdown ``` ```` -### (F) Create Training Dataset +### Phase 3 — Training and evaluation + +#### (F) Create Training Dataset At this point, you'll need to select your neural network type. @@ -475,7 +489,7 @@ class: dropdown ``` ```` -### (G) Train The Network +#### (G) Train The Network ```python deeplabcut.train_network(config_path, shuffle=1) @@ -593,7 +607,7 @@ class: dropdown ``` ```` -### (H) Evaluate the Trained Network +#### (H) Evaluate the Trained Network It is important to evaluate the performance of the trained network. This performance is measured by computing two metrics: @@ -726,7 +740,9 @@ deeplabcut.extract_save_all_maps(config_path, shuffle=shuffle, Indices=[0, 5]) You can drop "Indices" to run this on all training/testing images (this is very slow!) -### (I) Analyze new Videos +### Phase 4 — Video analysis and tracking + +#### (I) Analyze new Videos ```{versionadded} 3.0.0 With the addition of conditional top-down models in DeepLabCut 3.0, it's now possible to @@ -788,7 +804,7 @@ deeplabcut.find_outliers_in_raw_data(config_path, pickle_file, video_file) where pickle_file is the `_full.pickle` one obtains after video analysis. Flagged frames will be added to your collection of images in the corresponding labeled-data folders for you to label. -### Animal Assembly and Tracking across frames +#### Animal Assembly and Tracking across frames After pose estimation, now you perform assembly and tracking. @@ -798,7 +814,7 @@ metrics, so this no longer requires user input. The metrics, in case you do want them, can be found in the `inference_cfg.yaml` file. ``` -### Optimized Animal Assembly + Video Analysis: +#### Optimized Animal Assembly + Video Analysis: Please note that **novel videos DO NOT need to be added to the config.yaml file**. You can simply have a folder elsewhere on your computer and pass the video folder (then it @@ -809,7 +825,7 @@ path to the **folder** or exact video(s) you wish to analyze: deeplabcut.analyze_videos(config_path, ['/fullpath/project/videos/'], videotype='.mp4', auto_track=True) ``` -### IF auto_track = True: +#### IF auto_track = True: ```{versionadded} v2.2.0.3 A new argument `auto_track=True`, was added to `deeplabcut.analyze_videos` chaining pose @@ -820,7 +836,7 @@ DLC. If `auto_track=False`, one must run `convert_detections2tracklets` and the workflow (ideal for advanced users). ``` -### IF auto_track = False: +#### IF auto_track = False: You can validate the tracking parameters. Namely, you can iteratively change the parameters, run `convert_detections2tracklets` then load them in the GUI @@ -883,7 +899,7 @@ deeplabcut.stitch_tracklets(..., n_tracks=n) In such cases, file columns will default to dummy animal names (ind1, ind2, ..., up to indn). -### API Docs +#### API Docs ````{admonition} Click the button to see API Docs for analyze_videos --- @@ -912,7 +928,7 @@ class: dropdown ``` ```` -### Using Unsupervised Identity Tracking: +#### Using Unsupervised Identity Tracking: In Lauer et al. 2022 we introduced a new method to do unsupervised reID of animals. Here, you can use the tracklets to learn the identity of animals to enhance your @@ -924,7 +940,7 @@ deeplabcut.transformer_reID(config, videos_to_analyze, n_tracks=None, videotype= Note you should pass the n_tracks (number of animals) you expect to see in the video. -### Refine Tracklets: +#### Refine Tracklets: You can also optionally **refine the tracklets**. You can fix both "major" ID swaps, i.e. perhaps when animals cross, and you can micro-refine the individual body points. You will load the `...trackertype.pickle` or `.h5'` file that was created above, and then you can launch a GUI to interactively refine the data. This also has several options, so please check out the docstring. Upon saving the refined tracks you get an `.h5` file (akin to what you might be used to from standard DLC. You can also load (1) filter this to take care of small jitters, and (2) load this `.h5` this to refine (again) in case you find another issue, etc! @@ -948,7 +964,9 @@ Short demo:

      -### (J) Filter Pose Data +### Phase 5 — Post-processing and refinement + +#### (J) Filter Pose Data Firstly, Here are some tips for scaling up your video analysis, including looping over many folders for batch processing: https://github.com/DeepLabCut/DeepLabCut/wiki/Batch-Processing-your-Analysis @@ -969,28 +987,19 @@ class: dropdown ``` ```` -### (K) Plot Trajectories , (L) Create Labeled Videos - -- **NOTE :bulb::mega::** Before you create a video, you should set what threshold to use for plotting. This is set in the `config.yaml` file as `pcutoff` - if you have a well trained network, this should be high, i.e. set it to `0.8` or higher! IF YOU FILLED IN GAPS, you need to set this to `0` to "see" the filled in parts. - -- You can also determine a good `pcutoff` value by looking at the likelihood plot created during `plot_trajectories`: - -Plot the outputs: +#### (K) Plot Trajectories -```python - deeplabcut.plot_trajectories(config_path,['/fullpath/project/videos/reachingvideo1.avi'],filtered = True) -``` +Before creating labeled videos, set the `pcutoff` threshold in `config.yaml`. For a +well-trained network this should be high, e.g. `0.8` or higher. If you filled in gaps, +set it to `0` to make those interpolated points visible. -Create videos: +You can determine a good `pcutoff` value by inspecting the likelihood plot produced by +`plot_trajectories`: ```python - deeplabcut.create_labeled_video(config_path, [videos], videotype='avi', shuffle=1, trainingsetindex=0, filtered=False, fastmode=True, save_frames=False, keypoints_only=False, Frames2plot=None, displayedbodyparts='all', displayedindividuals='all', codec='mp4v', outputframerate=None, destfolder=None, draw_skeleton=False, trailpoints=0, displaycropped=False, color_by='bodypart', track_method='') +deeplabcut.plot_trajectories(config_path, ['/fullpath/project/videos/reachingvideo1.avi'], filtered=True) ``` -- **NOTE :bulb::mega::** You have a lot of options in terms of video plotting (quality, display type, etc). We recommend checking the docstring! - -(more details [here](functionDetails.md#i-video-analysis-and-plotting-results)) - ````{admonition} Click the button to see API Docs for plot_trajectories --- class: dropdown @@ -1000,6 +1009,22 @@ class: dropdown ``` ```` +#### (L) Create Labeled Videos + +There are many options for controlling video quality and display style — check the +docstring for the full list. More details are also available +[here](functionDetails.md#i-video-analysis-and-plotting-results). + +```python +deeplabcut.create_labeled_video( + config_path, [videos], videotype='avi', shuffle=1, trainingsetindex=0, + filtered=False, fastmode=True, save_frames=False, keypoints_only=False, + Frames2plot=None, displayedbodyparts='all', displayedindividuals='all', + codec='mp4v', outputframerate=None, destfolder=None, draw_skeleton=False, + trailpoints=0, displaycropped=False, color_by='bodypart', track_method='', +) +``` + ````{admonition} Click the button to see API Docs for create_labeled_video --- class: dropdown @@ -1009,7 +1034,7 @@ class: dropdown ``` ```` -### HELP: +#### HELP: In ipython/Jupyter notebook: From e95d1428bc9f84dc1a4e1b3b04ba49b605075745 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 15:17:54 +0200 Subject: [PATCH 70/86] update multi-animal docs: restructure resources and further reading --- docs/maDLC_UserGuide.md | 60 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 191135cd52..4f8d142b6a 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -1034,60 +1034,58 @@ class: dropdown ``` ```` -#### HELP: +## Resources and further reading -In ipython/Jupyter notebook: +### Getting function help -``` +In an interactive Python session or Jupyter notebook, append `?` to any function name: + +```python deeplabcut.nameofthefunction? ``` -In python or pythonw: +Or use the built-in `help()`: -``` +```python help(deeplabcut.nameofthefunction) ``` -## Tips for "daily" use: +### Tips for daily use -

      - -

      - -You can always exit an conda environment and easily jump back into a project by simply: +You can always exit a conda environment and pick up where you left off: -Linux/MacOS formatting example: +Linux/macOS: -``` +```bash source activate yourdeeplabcutEnvName -ipython or pythonw +ipython import deeplabcut -config_path ='/home/yourprojectfolder/config.yaml' +config_path = '/home/yourprojectfolder/config.yaml' ``` -Windows formatting example: +Windows: -``` +```bash activate yourdeeplabcutEnvName ipython import deeplabcut config_path = r'C:\home\yourprojectfolder\config.yaml' ``` -Now, you can run any of the functions described in this documentation. - -# Getting help with maDLC: +### Getting help and support -- If you have a detailed question about how to use the code, or you hit errors that are not "bugs" but you want code assistance, please post on the [![Image.sc forum](https://img.shields.io/badge/dynamic/json.svg?label=forum&url=https%3A%2F%2Fforum.image.sc%2Ftags%2Fdeeplabcut.json&query=%24.topic_list.tags.0.topic_count&colorB=brightgreen&&suffix=%20topics&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABPklEQVR42m3SyyqFURTA8Y2BER0TDyExZ+aSPIKUlPIITFzKeQWXwhBlQrmFgUzMMFLKZeguBu5y+//17dP3nc5vuPdee6299gohUYYaDGOyyACq4JmQVoFujOMR77hNfOAGM+hBOQqB9TjHD36xhAa04RCuuXeKOvwHVWIKL9jCK2bRiV284QgL8MwEjAneeo9VNOEaBhzALGtoRy02cIcWhE34jj5YxgW+E5Z4iTPkMYpPLCNY3hdOYEfNbKYdmNngZ1jyEzw7h7AIb3fRTQ95OAZ6yQpGYHMMtOTgouktYwxuXsHgWLLl+4x++Kx1FJrjLTagA77bTPvYgw1rRqY56e+w7GNYsqX6JfPwi7aR+Y5SA+BXtKIRfkfJAYgj14tpOF6+I46c4/cAM3UhM3JxyKsxiOIhH0IO6SH/A1Kb1WBeUjbkAAAAAElFTkSuQmCC)](https://forum.image.sc/tags/deeplabcut) - -- If you have a quick, short question that fits a "chat" format: +- **Forum** — for detailed usage questions or errors that are not bugs, please post on the + [Image.sc forum](https://forum.image.sc/tags/deeplabcut). +- **Chat** — for short questions: [![Gitter](https://badges.gitter.im/DeepLabCut/community.svg)](https://gitter.im/DeepLabCut/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -- If you want to share some results, or see others: +- **Social** — share results or follow updates: [![Twitter Follow](https://img.shields.io/twitter/follow/DeepLabCut.svg?label=DeepLabCut&style=social)](https://x.com/DeepLabCut) - -- If you have a code bug report, please create an issue and show the minimal code to reproduce the error: https://github.com/DeepLabCut/DeepLabCut/issues - -- if you are looking for resources to increase your understanding of the software and general guidelines, we have an open source, free course: https://deeplabcut.github.io/DeepLabCut/docs/course.html. - -**Please note:** what we cannot do is provided support or help designing your experiments and data analysis. The number of requests for this is too great to sustain in our inbox. We are happy to answer such questions in the forum as a community, in a scalable way. We hope and believe we have given enough tools and resources to get started and to accelerate your research program, and this is backed by the >700 citations using DLC, 2 clinical trials by others, and countless applications. Thus, we believe this code works, is accessible, and with limited programming knowledge can be used. Please read our [Missions & Values statement](mission-and-values) to learn more about what we DO hope to provide you. +- **Bug reports** — please open an issue with a minimal reproducible example: + + +```{note} +We are not able to provide individual support for experiment design or custom data +analysis — the volume of such requests is too large to sustain. We welcome these +discussions on the forum, where the community can benefit collectively. Please read our +[Missions & Values statement](mission-and-values) to learn more. +``` From 0d1236b1bb4a6354301a6962642dbb83677fd0bb Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 16:14:49 +0200 Subject: [PATCH 71/86] update multi-animal docs: change images to figures --- docs/maDLC_UserGuide.md | 60 ++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 4f8d142b6a..d40ff79aa8 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -44,7 +44,15 @@ You should think of maDLC being **four** parts. Thus, you should always label, train, and evaluate the pose estimation performance first. If and when that performance is high, then you should go advance to the tracking step (and video analysis). There is a natural break point for this, as you will see below. -maDLC +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1596370260800-SP2GWKDPJCOIR7LJ31VM/ke17ZwdGBToddI8pDm48kB4fL2ovSQh5dRlH2jCMtpoUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcSV94BuD0XUinmig_1P1RJNYVU597j3jgswapL4c_w92BJE9r6UgUperYhWQ2ubQ_/workflow.png?format=2500w +--- +name: fig-madlc-workflow +alt: Overview of the four-part multi-animal DeepLabCut workflow +width: 550px +align: center +--- +Overview of the multi-animal DeepLabCut workflow. +``` ## Getting started @@ -152,7 +160,13 @@ deeplabcut.add_new_videos( You can also use annotated data from single-animal projects, by converting those files. There are docs for this: [convert single to multianimal annotation data](convert-maDLC) -![Box 1 - Multi Animal Project Configuration File Glossary](images/box1-multi.png) +```{figure} images/box1-multi.png +--- +name: pose-cfg-box1-multi +alt: Box 1 — multi-animal project configuration file parameter glossary +--- +**Box 1.** Multi-animal project `config.yaml` parameter glossary. +``` ##### API Docs @@ -315,7 +329,13 @@ Keyboard arrows: advance frames. Delete key: delete label. ``` -![hot keys](https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/192345a5-e411-4d56-b718-ef52f91e195e/Qwerty.png?format=2500w) +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/192345a5-e411-4d56-b718-ef52f91e195e/Qwerty.png?format=2500w +--- +name: fig-labeling-hotkeys +alt: Keyboard shortcut reference for the DeepLabCut labeling GUI +--- +Keyboard shortcuts for the labeling GUI. +``` **CRITICAL POINT:** It is advisable to **consistently label similar spots** (e.g., on a wrist that is very large, try to label the same location). In general, invisible or @@ -358,9 +378,15 @@ deeplabcut.check_labels(config_path, visualizeindividuals=True/False) **maDeepLabCut:** you can check and plot colors per individual or per body part, just set the flag `visualizeindividuals=True/False`. Note, you can run this twice in both states to see both images. -

      - -

      +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1586203062876-D9ZL5Q7NZ464FUQN95NA/ke17ZwdGBToddI8pDm48kKmw982fUOZVIQXHUCR1F55Zw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpx7krGdD6VO1HGZR3BdeCbrijc_yIxzfnirMo-szZRSL5-VIQGAVcQr6HuuQP1evvE/img1068_individuals.png?format=750w +--- +name: fig-check-labels-individuals +alt: Example check_labels output showing annotated individuals per frame +width: 50% +align: center +--- +Example `check_labels` output with annotations shown per individual. +``` For each video directory in labeled-data this function creates a subdirectory with **labeled** as a suffix. Those directories contain the frames plotted with the annotated body parts. The user can double check if the body parts are labeled correctly. If they are not correct, the user can reload the frames (i.e. `deeplabcut.label_frames`), move them around, and click save again. @@ -950,7 +976,15 @@ deeplabcut.refine_tracklets(config_path, pickle_or_h5_file, videofile_path, max_ If you use the GUI (or otherwise), here are some settings to consider: -maDLC +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1619628014395-BQ09VLLTKCLQQGRB5T9A/ke17ZwdGBToddI8pDm48kLMj_XrWI9gi4tVeBdgcB8p7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z4YTzHvnKhyp6Da-NYroOW3ZGjoBKy3azqku80C789l0lt53wR20brczws2A6XSGt3kSTbW7uM0ncVKHWPvgHR4kN5Ka1TcK96ljy4ji9jPkQ/TrackletGUI.png?format=1000w +--- +name: fig-tracklet-gui +alt: Tracklet refinement GUI showing key settings +width: 950px +align: center +--- +Tracklet refinement GUI. Key settings to configure are described in the text. +``` \*note, setting `max_gap=0` can be used to fill in all frames across the video; otherwise, 1-n is the # of frames you want to fill in, i.e. maybe you want to fill in short gaps of 5 frames, but 15 frames indicates another issue, etc. You can test this in the GUI very easy by editing the value and then re-launch pop-up GUI. @@ -960,9 +994,15 @@ If you fill in gaps, they will be associated to an ultra low probability, 0.01, Short demo: -

      - -

      +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1588690928000-90ZMRIM8SN6QE20ZOMNX/ke17ZwdGBToddI8pDm48kJ1oJoOIxBAgRD2ClXVCmKFZw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpxBw7VlGKDQO2xTcc51Yv6DahHgScLwHgvMZoEtbzk_9vMJY_JknNFgVzVQ2g0FD_s/refineDEMO.gif?format=750w +--- +name: fig-refine-tracklets-demo +alt: Animated demonstration of the tracklet refinement workflow +width: 70% +align: center +--- +Short demo of the tracklet refinement workflow. +``` ### Phase 5 — Post-processing and refinement From 845afa46626f3808fb81a16759ca9c484f7227d8 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 16:26:21 +0200 Subject: [PATCH 72/86] update multi-animal docs: capitalized notes -> admonitions --- docs/maDLC_UserGuide.md | 131 ++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index d40ff79aa8..9314996768 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -240,7 +240,19 @@ identity: True/False #### (C) Select Frames to Label -**CRITICAL:** A good training dataset should consist of a sufficient number of frames that capture the breadth of the behavior. This ideally implies to select the frames from different (behavioral) sessions, different lighting and different animals, if those vary substantially (to train an invariant, robust feature detector). Thus for creating a robust network that you can reuse in the laboratory, a good training dataset should reflect the diversity of the behavior with respect to postures, luminance conditions, background conditions, animal identities, etc. of the data that will be analyzed. For the simple lab behaviors comprising mouse reaching, open-field behavior and fly behavior, 100−200 frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). However, depending on the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, more or less frames might be necessary to create a good network. Ultimately, in order to scale up the analysis to large collections of videos with perhaps unexpected conditions, one can also refine the data set in an adaptive way (see refinement below). **For maDLC, be sure you have labeled frames with closely interacting animals!** +```{important} +A good training dataset should consist of a sufficient number of frames that capture +the breadth of the behavior. Select frames from different behavioral sessions, different +lighting conditions, and different animals if those vary substantially (to train an +invariant, robust feature detector). The dataset should reflect the diversity of +postures, luminance conditions, background conditions, and animal identities in the data +to be analyzed. For simple lab behaviors such as mouse reaching, open-field behavior, +and fly behavior, 100–200 frames gave good results +([Mathis et al., 2018](https://www.nature.com/articles/s41593-018-0209-y)). However, +more or fewer frames may be needed depending on accuracy requirements, behavior +complexity, and video quality (e.g. motion blur, poor lighting). **For maDLC, make sure +you include labeled frames with closely interacting animals.** +``` The function `extract_frames` extracts frames from all the videos in the project configuration file in order to create a training dataset. The extracted frames from all the videos are stored in a separate subdirectory named after the video file’s name under the ‘labeled-data’. This function also has various parameters that might be useful based on the user’s need. @@ -254,9 +266,11 @@ deeplabcut.extract_frames( ) ``` -**CRITICAL POINT:** It is advisable to keep the frame size small, as large frames increase the training and -inference time, or you might not have a large enough GPU for this. -When running the function `extract_frames`, if the parameter crop=True, then you will be asked to draw a box within the GUI (and this is written to the config.yaml file). +```{important} +Keep frame sizes small — large frames increase training and inference time and may +exceed GPU memory. When running `extract_frames` with `crop=True`, you will be asked to +draw a bounding box in the GUI (this is saved to `config.yaml`). +``` `userfeedback` allows the user to check which videos they wish to extract frames from. In this way, if you added more videos to the config.yaml file it does not, by default, extract frames (again) from every video. If you wish to disable this question, set `userfeedback = True`. @@ -270,13 +284,15 @@ video and clusters the frames using k-means, where each frame is treated as a ve are then selected. This procedure makes sure that the frames look different. However, on large and long videos, this code is slow due to computational complexity. -**CRITICAL POINT:** It is advisable to extract frames from a period of the video that contains interesting -behaviors, and not extract the frames across the whole video. This can be achieved by using the start and stop -parameters in the config.yaml file. Also, the user can change the number of frames to extract from each video using -the numframes2extract in the config.yaml file. +```{important} +Extract frames from video segments that contain the behaviors of interest rather than +from the whole video. Use the `start` and `stop` parameters in `config.yaml` to limit +the extraction window, and `numframes2extract` to control the number of frames per +video. +``` -```{TIP} -For maDLC, **be sure you have labeled frames with closely interacting animals**! +```{tip} +For maDLC, **be sure you have labeled frames with closely interacting animals**! Therefore, manually selecting some frames is a good idea if interactions are not highly frequent in the video. ``` @@ -337,28 +353,31 @@ alt: Keyboard shortcut reference for the DeepLabCut labeling GUI Keyboard shortcuts for the labeling GUI. ``` -**CRITICAL POINT:** It is advisable to **consistently label similar spots** (e.g., on a -wrist that is very large, try to label the same location). In general, invisible or -occluded points should not be labeled by the user, unless you want to teach the network -to "guess" - this is possible, but could affect accuracy. If you don't want/or don't see -a bodypart, they can simply be skipped by not applying the label anywhere on the frame. - -OPTIONAL: In the event of adding more labels to the existing labeled dataset, the user -needs to append the new labels to the bodyparts in the config.yaml file. Thereafter, the -user can call the function **label_frames**. A box will pop up and ask the user if they -wish to display all parts, or only add in the new labels. Saving the labels after all -the images are labelled will append the new labels to the existing labeled dataset. - -**maDeepLabCut CRITICAL POINT:** For multi-animal labeling, unless you can tell apart -the animals, you do not need to worry about the "ID" of each animal. For example: if you -have a white and black mouse label the white mouse as animal 1, and black as animal 2 -across all frames. If two black mice, then the ID label 1 or 2 can switch between -frames - no need for you to try to identify them (but always label consistently within a -frame). If you have 2 black mice but one always has an optical fiber (for example), then -DO label them consistently as animal1 and animal_fiber (for example). The point of -multi-animal DLC is to train models that can first group the correct bodyparts to -individuals, then associate those points in a given video to a specific individual, -which then also uses temporal information to link across the video frames. +```{important} +**Label similar spots consistently** (e.g., on a large wrist, always click the same +sub-location). Invisible or occluded points should generally not be labeled unless you +intentionally want to teach the network to predict occluded locations — this is +possible, but may reduce accuracy. Body parts that are not visible can simply be skipped +by leaving them unlabeled. +``` + +```{note} +To add new labels to an existing dataset, first append the new body parts to +`bodyparts` in `config.yaml`, then call `label_frames` again. A dialog will ask whether +to display all parts or only the new ones. Saving will append the new labels to the +existing dataset. +``` + +```{important} +**Multi-animal labeling and identity:** Unless you can visually distinguish the animals, +you do not need to maintain a consistent ID across frames. For example, with a white and +a black mouse, always label white as animal 1 and black as animal 2. With two +indistinguishable black mice the ID assignment (1 or 2) may switch between frames — +just be consistent *within* each frame. If one animal always has a distinguishing +feature (e.g., an optical fiber), then label them consistently across all frames. The +goal of maDLC is to train a model that groups body parts to individuals and then links +those individuals across video frames using temporal information. +``` Note, we also highly recommend that you use more bodyparts that you might otherwise have (see the example below). @@ -426,8 +445,8 @@ deeplabcut.create_training_dataset(config_path) information, where the `#` is the value of `iteration` variable stored in the project’s configuration file (this number keeps track of how often the dataset was refined). -- OPTIONAL: If the user wishes to benchmark the performance of the DeepLabCut, they can create multiple - training datasets by specifying an integer value to the `num_shuffles`; see the docstring for more details. +- To benchmark performance across multiple train/test splits, pass an integer to + `num_shuffles`; see the docstring for details. - Each iteration of the creation of a training dataset will create several files, which is used by the feature detectors, and a `.pickle` file that contains the meta @@ -463,10 +482,11 @@ In addition, one can specify a crop sampling strategy: crop centers can either b As a reminder, cropping images into smaller patches is a form of data augmentation that simultaneously allows the use of batch processing even on small GPUs that could not otherwise accommodate larger images + larger batchsizes (this usually increases performance and decreasing training time). -**MODEL COMPARISON**: You can also test several models by creating the same train/test -split for different networks. -You can easily do this in the Project Manager GUI (by selecting the "Use an existing -data split" option), which also lets you compare PyTorch and TensorFlow models. +```{tip} +To compare multiple model architectures on the same train/test split, select "Use an +existing data split" in the Project Manager GUI. This also lets you compare PyTorch and +TensorFlow models side by side. +``` ````{versionadded} 3.0.0 You can now create new shuffles using the same train/test split as @@ -564,9 +584,10 @@ full path of the checkpoint to the variable ``resume_training_from`` in the [ dlc3-pytorch-config) file (checkout the "Restarting Training at a Specific Checkpoint" section of the docs) under the *train* subdirectory. -**CRITICAL POINT:** It is recommended to train the networks **until the loss plateaus** -(depending on the dataset, model architecture and training hyper-parameters this happens -after 100 to 250 epochs of training). +```{important} +Train the network **until the loss plateaus** — depending on the dataset, model +architecture, and hyper-parameters this typically occurs after 100–250 epochs. +``` The variables ``display_iters`` and ``save_epochs`` in the [**pytorch_config.yaml**]( dlc3-pytorch-config) file allows the user to alter how often the loss is displayed @@ -605,9 +626,10 @@ If the user wishes to restart the training at a specific checkpoint they can spe full path of the checkpoint to the variable ``init_weights`` in the **pose_cfg.yaml** file under the *train* subdirectory (see Box 2). -**CRITICAL POINT:** It is recommended to train the networks for thousands of iterations -until the loss plateaus (typically around **500,000**) if you use batch size 1, and -**50-100K** if you use batchsize 8 (the default). +```{important} +Train until the loss plateaus — typically around **500,000** iterations with batch +size 1, or **50–100K** iterations with batch size 8 (the default). +``` If you use **maDeepLabCut** the recommended training iterations is **20K-100K** (it automatically stops at 200K!), as we use Adam and batchsize 8; if you have to reduce @@ -616,12 +638,13 @@ If you use **maDeepLabCut** the recommended training iterations is **20K-100K** The variables ``display_iters`` and ``save_iters`` in the **pose_cfg.yaml** file allows the user to alter how often the loss is displayed and how often the weights are stored. -**maDeepLabCut CRITICAL POINT:** For multi-animal projects we are using not only -different and new output layers, but also new data augmentation, optimization, learning -rates, and batch training defaults. Thus, please use a lower ``save_iters`` and -``maxiters``. I.e. we suggest saving every 10K-15K iterations, and only training until -50K-100K iterations. We recommend you look closely at the loss to not overfit on your -data. The bonus, training time is much less!!! +```{important} +Multi-animal projects use different output layers, data augmentation, optimizers, +learning rates, and batch defaults compared to single-animal projects. Use a lower +`save_iters` and `maxiters`: save every 10K–15K iterations and stop training at +50K–100K iterations. Monitor the loss curve carefully to avoid overfitting. Training +time is correspondingly shorter. +``` ```` ````{admonition} Click the button to see API Docs for train_network @@ -882,9 +905,11 @@ max_age: 100 min_hits: 3 ``` -- **IMPORTANT POINT FOR SUPERVISED IDENTITY TRACKING** - - If the network has been trained to learn the animals' identities (i.e., you set `identity=True` in config.yaml before training) this information can be leveraged both during: (i) animal assembly, where body parts are grouped based on the animal they are predicted to belong to (affinity between pairs of keypoints is no longer considered in that case); and (ii) animal tracking, where identity only can be utilized in place of motion trackers to form tracklets. +If the network was trained with identity supervision (i.e., `identity=True` in +`config.yaml` before training), this information can be leveraged during: (i) animal +assembly, where body parts are grouped by predicted identity rather than keypoint +affinity; and (ii) tracking, where identity alone can be used in place of motion +trackers to form tracklets. To use this ID information, simply pass: From 18517004b2257fb54fd9b6abbcb2331ffdb35c01 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 19 May 2026 16:27:46 +0200 Subject: [PATCH 73/86] update multi-animal docs: remove fixme --- docs/maDLC_UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index 9314996768..a50741522f 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -307,12 +307,12 @@ provided along with the toolbox. This can be launched by using: deeplabcut.extract_frames(config_path, 'manual') ``` -// FIXME(niels) - add a napari frame extractor description. + ````{admonition} Click the button to see API Docs --- From 4717b73beab98c39bfa9715dd8b50c90d489ce39 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 21 May 2026 13:23:37 +0200 Subject: [PATCH 74/86] update multi-animal docs: update analyze videos step --- docs/maDLC_UserGuide.md | 58 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index a50741522f..a50cc996c4 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -793,36 +793,40 @@ You can drop "Indices" to run this on all training/testing images (this is very #### (I) Analyze new Videos -```{versionadded} 3.0.0 -With the addition of conditional top-down models in DeepLabCut 3.0, it's now possible to -track individuals directly **during video analysis**. If you choose to train any model -with a name that starts with `ctd_`, you'll be able to call `deeplabcut.analyze_videos` -with `ctd_tracking=True`. To learn more about tracking with CTD, see the [ -`COLAB_BUCTD_and_CTD_tracking`]( -https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_BUCTD_and_CTD_tracking.ipynb) -COLAB notebook. +```{important} +Before moving on, make a deliberate decision about whether the pose estimation quality is sufficient. If you do not have good pose estimation evaluation metrics at this point, please revisit the original labels, add more training data and refine the model rather than proceeding with the current results. ``` -**-------------------- DECISION POINT -------------------** +```{note} +In prior versions of DeepLabCut, pose estimation and tracking were separate procedures. From version 3.0 onward, `deeplabcut.analyze_videos` runs the **full pose estimation + tracking pipeline** by default (`auto_track=True`), producing an .h5 file ready for downstream use. To inspect raw detections before any of this is applied, pass `auto_track=False` explicitly. +``` -**ATTENTION!** -**Pose estimation and tracking should be thought of as separate steps.** If you do not -have good pose estimation evaluation metrics at this point, stop, check original labels, -add more data, etc --> don't move forward with this model. If you think you have a good -model, please test the "raw" pose estimation performance on a video to validate -performance: +##### Pose estimation quality check -Please run: +To validate raw pose estimation performance on a video before committing to the tracking +results, run: ```python videos_to_analyze = ['/fullpath/project/videos/testVideo.mp4'] -scorername = deeplabcut.analyze_videos(config_path, videos_to_analyze, videotype='.mp4') +deeplabcut.analyze_videos(config_path, videos_to_analyze, videotype='.mp4', auto_track=False) deeplabcut.create_video_with_all_detections(config_path, videos_to_analyze, videotype='.mp4') ``` -Please note that you do **not** get the .h5/csv file you might be used to getting (this -comes after tracking). You will get a `pickle` file that is used in -`create_video_with_all_detections`. +With `auto_track=False`, no `.h5` file is produced — only a `*_full.pickle` file +containing the raw detections, which is what `create_video_with_all_detections` uses to +render all detections before any individual is assigned. + +```{versionadded} 3.0.0 +For conditional top-down (CTD) models, tracking can be performed **inside the model +during inference**, using temporal context from previous frames to condition predictions +on the current frame. This is a distinct mechanism from `auto_track`: pass +`ctd_tracking=True` to `deeplabcut.analyze_videos` when using any model whose name +starts with `ctd_`. When `ctd_tracking=True`, post-processing tracking (`auto_track`) is +skipped automatically. To learn more, see the [ +`COLAB_BUCTD_and_CTD_tracking`]( +https://github.com/DeepLabCut/DeepLabCut/blob/main/examples/COLAB/COLAB_BUCTD_and_CTD_tracking.ipynb) +COLAB notebook. +``` For models predicting part-affinity fields, another sanity check may be to examine the distributions of edge affinity costs using `deeplabcut.utils.plot_edge_affinity_distributions`. Easily separable distributions @@ -853,7 +857,7 @@ deeplabcut.find_outliers_in_raw_data(config_path, pickle_file, video_file) where pickle_file is the `_full.pickle` one obtains after video analysis. Flagged frames will be added to your collection of images in the corresponding labeled-data folders for you to label. -#### Animal Assembly and Tracking across frames +##### Animal Assembly and Tracking across frames After pose estimation, now you perform assembly and tracking. @@ -863,7 +867,7 @@ metrics, so this no longer requires user input. The metrics, in case you do want them, can be found in the `inference_cfg.yaml` file. ``` -#### Optimized Animal Assembly + Video Analysis: +##### Optimized Animal Assembly + Video Analysis: Please note that **novel videos DO NOT need to be added to the config.yaml file**. You can simply have a folder elsewhere on your computer and pass the video folder (then it @@ -874,7 +878,7 @@ path to the **folder** or exact video(s) you wish to analyze: deeplabcut.analyze_videos(config_path, ['/fullpath/project/videos/'], videotype='.mp4', auto_track=True) ``` -#### IF auto_track = True: +##### IF auto_track = True: ```{versionadded} v2.2.0.3 A new argument `auto_track=True`, was added to `deeplabcut.analyze_videos` chaining pose @@ -885,7 +889,7 @@ DLC. If `auto_track=False`, one must run `convert_detections2tracklets` and the workflow (ideal for advanced users). ``` -#### IF auto_track = False: +##### IF auto_track = False: You can validate the tracking parameters. Namely, you can iteratively change the parameters, run `convert_detections2tracklets` then load them in the GUI @@ -950,7 +954,7 @@ deeplabcut.stitch_tracklets(..., n_tracks=n) In such cases, file columns will default to dummy animal names (ind1, ind2, ..., up to indn). -#### API Docs +##### API Docs ````{admonition} Click the button to see API Docs for analyze_videos --- @@ -979,7 +983,7 @@ class: dropdown ``` ```` -#### Using Unsupervised Identity Tracking: +##### Using Unsupervised Identity Tracking: In Lauer et al. 2022 we introduced a new method to do unsupervised reID of animals. Here, you can use the tracklets to learn the identity of animals to enhance your @@ -991,7 +995,7 @@ deeplabcut.transformer_reID(config, videos_to_analyze, n_tracks=None, videotype= Note you should pass the n_tracks (number of animals) you expect to see in the video. -#### Refine Tracklets: +##### Refine Tracklets: You can also optionally **refine the tracklets**. You can fix both "major" ID swaps, i.e. perhaps when animals cross, and you can micro-refine the individual body points. You will load the `...trackertype.pickle` or `.h5'` file that was created above, and then you can launch a GUI to interactively refine the data. This also has several options, so please check out the docstring. Upon saving the refined tracks you get an `.h5` file (akin to what you might be used to from standard DLC. You can also load (1) filter this to take care of small jitters, and (2) load this `.h5` this to refine (again) in case you find another issue, etc! From 3dfcd8dacb2e23d06f696463f14cf2d8aafa5bc5 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Fri, 22 May 2026 11:34:55 +0200 Subject: [PATCH 75/86] Custom CSS dropdowns for animal guides (#3342) * Update custom.css * Refine workflow dropdown styles and colors Update docs/_static/custom.css to adjust dark-theme variables and overhaul workflow dropdown styling. Changed single/multi-animal background variables, replaced old title-prefix approach with CSS-generated emoji titles, and hid sphinx-design's no-title icon. Apply consistent header/body color variables for sd-card dropdowns, keep text/chevron colors stable, and disable pydata's hover darken/lighten effect to prevent color shifts on focus/hover. These changes ensure consistent appearance and correct application of border/background styles overridden by pydata. --- docs/_static/custom.css | 276 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index c8df32f9cf..8f6d0eb6d5 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -9,6 +9,17 @@ html[data-theme="light"] { --logo-filter: none; --button-color: #fff; --footer-text-color: #000000; + + /* Workflow dropdown/admonition colors */ + --single-animal-border: #9b5de5; + --single-animal-bg: #f5edff; + --single-animal-title-bg: #ead7ff; + --single-animal-title-text: #4b236f; + + --multi-animal-border: #2f9e44; + --multi-animal-bg: #effaf1; + --multi-animal-title-bg: #d8f5dc; + --multi-animal-title-text: #14532d; } html[data-theme="dark"] { @@ -20,6 +31,17 @@ html[data-theme="dark"] { /* --logo-filter: grayscale(100%) brightness(20); */ --button-color: #fff; --footer-text-color: #b9b9b9; + + /* Workflow dropdown/admonition colors */ + --single-animal-border: #c084fc; + --single-animal-bg: rgba(72, 86, 107, 0.16); + --single-animal-title-bg: rgba(241, 83, 255, 0.32); + --single-animal-title-text: #f3e8ff; + + --multi-animal-border: #74c69d; + --multi-animal-bg: rgba(72, 86, 107, 0.16); + --multi-animal-title-bg: rgba(47, 158, 68, 0.30); + --multi-animal-title-text: #dcfce7; } /* Sidebar */ @@ -101,3 +123,257 @@ html[data-theme="dark"] { opacity: 0.8; z-index: 1; } + +/* ============================================================ + Workflow-specific dropdown/admonition styling + Single animal = light purple + Multi animal = light green + + Recommended MyST usage: + + ```{dropdown} Configuration + :class: single-animal + :open: + + Single-animal-specific instructions. + ``` + + ```{dropdown} Configuration + :class: multi-animal + :open: + + Multi-animal-specific instructions. + ``` + ============================================================ */ + +/* ------------------------------------------------------------ + Sphinx-design dropdowns + Usually rendered with .sd-dropdown + ------------------------------------------------------------ */ + +.sd-dropdown.single-animal { + border-left: 0.35rem solid var(--single-animal-border); + background-color: var(--single-animal-bg); + border-radius: 0.5rem; + margin: 1rem 0; + overflow: hidden; +} + +.sd-dropdown.single-animal>.sd-summary-title { + background-color: var(--single-animal-title-bg); + color: var(--single-animal-title-text); + font-weight: 700; +} + +.sd-dropdown.multi-animal { + border-left: 0.35rem solid var(--multi-animal-border); + background-color: var(--multi-animal-bg); + border-radius: 0.5rem; + margin: 1rem 0; + overflow: hidden; +} + +.sd-dropdown.multi-animal>.sd-summary-title { + background-color: var(--multi-animal-title-bg); + color: var(--multi-animal-title-text); + font-weight: 700; +} + +/* ------------------------------------------------------------ + Regular Sphinx/MyST admonitions as fallback + + ```{admonition} Configuration + :class: single-animal + + Single-animal-specific instructions. + ``` + ------------------------------------------------------------ */ + +div.admonition.single-animal { + border-left: 0.35rem solid var(--single-animal-border); + background-color: var(--single-animal-bg); + border-radius: 0.5rem; + overflow: hidden; +} + +div.admonition.single-animal>.admonition-title { + background-color: var(--single-animal-title-bg); + color: var(--single-animal-title-text); + font-weight: 700; +} + +div.admonition.multi-animal { + border-left: 0.35rem solid var(--multi-animal-border); + background-color: var(--multi-animal-bg); + border-radius: 0.5rem; + overflow: hidden; +} + +div.admonition.multi-animal>.admonition-title { + background-color: var(--multi-animal-title-bg); + color: var(--multi-animal-title-text); + font-weight: 700; +} + +/* ------------------------------------------------------------ + Raw HTML
      fallback + +
      + Configuration + + Single-animal-specific instructions. +
      + ------------------------------------------------------------ */ + +details.workflow-dropdown { + border: 1px solid transparent; + border-left-width: 0.35rem; + border-radius: 0.5rem; + margin: 1rem 0; + padding: 0; + overflow: hidden; +} + +details.workflow-dropdown>summary { + cursor: pointer; + font-weight: 700; + padding: 0.6rem 0.9rem; + list-style-position: inside; +} + +details.workflow-dropdown>*:not(summary) { + padding-left: 1rem; + padding-right: 1rem; +} + +details.workflow-dropdown.single-animal { + border-left-color: var(--single-animal-border); + background-color: var(--single-animal-bg); +} + +details.workflow-dropdown.single-animal>summary { + background-color: var(--single-animal-title-bg); + color: var(--single-animal-title-text); +} + +details.workflow-dropdown.multi-animal { + border-left-color: var(--multi-animal-border); + background-color: var(--multi-animal-bg); +} + +details.workflow-dropdown.multi-animal>summary { + background-color: var(--multi-animal-title-bg); + color: var(--multi-animal-title-text); +} + +/* ------------------------------------------------------------ + Compatibility fallback for dropdowns rendered as div.dropdown + ------------------------------------------------------------ */ + +div.dropdown.single-animal { + border-left: 0.35rem solid var(--single-animal-border); + background-color: var(--single-animal-bg); + border-radius: 0.5rem; + overflow: hidden; +} + +div.dropdown.single-animal>.admonition-title, +div.dropdown.single-animal>.sd-summary-title { + background-color: var(--single-animal-title-bg); + color: var(--single-animal-title-text); + font-weight: 700; +} + +div.dropdown.multi-animal { + border-left: 0.35rem solid var(--multi-animal-border); + background-color: var(--multi-animal-bg); + border-radius: 0.5rem; + overflow: hidden; +} + +div.dropdown.multi-animal>.admonition-title, +div.dropdown.multi-animal>.sd-summary-title { + background-color: var(--multi-animal-title-bg); + color: var(--multi-animal-title-text); + font-weight: 700; +} + +/* ============================================================ + Workflow dropdowns: title from CSS, default alignment, + custom left stripe, no hover color shift + ============================================================ */ + +/* Hide sphinx-design's no-title kebab icon */ +details.sd-dropdown.sd-card.single-animal .sd-summary-text>svg.no-title, +details.sd-dropdown.sd-card.multi-animal .sd-summary-text>svg.no-title { + display: none !important; +} + +/* CSS-generated titles inside the default title span */ +details.sd-dropdown.sd-card.single-animal .sd-summary-text::before { + content: "🐁 Single animal"; +} + +details.sd-dropdown.sd-card.multi-animal .sd-summary-text::before { + content: "🐀🐀🐀 Multi animal"; +} + +/* Single animal colors */ +details.sd-dropdown.sd-card.single-animal>summary.sd-card-header { + --pst-sd-dropdown-color: var(--single-animal-border); + --pst-sd-dropdown-bg-color: var(--single-animal-title-bg); + + color: var(--single-animal-title-text) !important; + background-color: var(--single-animal-title-bg) !important; +} + +/* The body also needs the variable because pydata sets border-left there too */ +details.sd-dropdown.sd-card.single-animal>summary.sd-card-header+div.sd-summary-content { + --pst-sd-dropdown-color: var(--single-animal-border); + + background-color: var(--single-animal-bg) !important; +} + +/* Multi animal colors */ +details.sd-dropdown.sd-card.multi-animal>summary.sd-card-header { + --pst-sd-dropdown-color: var(--multi-animal-border); + --pst-sd-dropdown-bg-color: var(--multi-animal-title-bg); + + color: var(--multi-animal-title-text) !important; + background-color: var(--multi-animal-title-bg) !important; +} + +/* The body also needs the variable because pydata sets border-left there too */ +details.sd-dropdown.sd-card.multi-animal>summary.sd-card-header+div.sd-summary-content { + --pst-sd-dropdown-color: var(--multi-animal-border); + + background-color: var(--multi-animal-bg) !important; +} + +/* Keep text, emoji, chevron color stable */ +details.sd-dropdown.sd-card.single-animal .sd-summary-text, +details.sd-dropdown.sd-card.single-animal .sd-summary-state-marker, +details.sd-dropdown.sd-card.single-animal .sd-summary-state-marker svg { + color: var(--single-animal-title-text) !important; + fill: currentColor !important; +} + +details.sd-dropdown.sd-card.multi-animal .sd-summary-text, +details.sd-dropdown.sd-card.multi-animal .sd-summary-state-marker, +details.sd-dropdown.sd-card.multi-animal .sd-summary-state-marker svg { + color: var(--multi-animal-title-text) !important; + fill: currentColor !important; +} + +/* Disable pydata hover darken/lighten effect */ +details.sd-dropdown.sd-card.single-animal>summary.sd-card-header:hover, +details.sd-dropdown.sd-card.single-animal>summary.sd-card-header:focus { + color: var(--single-animal-title-text) !important; + background-color: var(--single-animal-title-bg) !important; +} + +details.sd-dropdown.sd-card.multi-animal>summary.sd-card-header:hover, +details.sd-dropdown.sd-card.multi-animal>summary.sd-card-header:focus { + color: var(--multi-animal-title-text) !important; + background-color: var(--multi-animal-title-bg) !important; +} \ No newline at end of file From b061f1141049a5a1c73b27d0f21b4c779657d577 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Thu, 21 May 2026 13:26:17 +0200 Subject: [PATCH 76/86] update multi-animal docs: add optional refinement stage --- docs/maDLC_UserGuide.md | 159 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 2 deletions(-) diff --git a/docs/maDLC_UserGuide.md b/docs/maDLC_UserGuide.md index a50cc996c4..0ce799554f 100644 --- a/docs/maDLC_UserGuide.md +++ b/docs/maDLC_UserGuide.md @@ -1033,8 +1033,6 @@ align: center Short demo of the tracklet refinement workflow. ``` -### Phase 5 — Post-processing and refinement - #### (J) Filter Pose Data Firstly, Here are some tips for scaling up your video analysis, including looping over many folders for batch processing: https://github.com/DeepLabCut/DeepLabCut/wiki/Batch-Processing-your-Analysis @@ -1103,6 +1101,163 @@ class: dropdown ``` ```` +### Phase 5 — Refinement (optional) + +#### (M) Optional Active Learning - Network Refinement: Extract Outlier Frames + +##### Overview + +While DeepLabCut typically generalizes well across datasets, one might want to optimize its performance in various, +perhaps unexpected, situations. For generalization to large datasets, images with insufficient labeling performance +can be extracted, manually corrected by adjusting the labels to increase the training set and iteratively improve the +feature detectors. Such an active learning framework can be used to achieve a predefined level of confidence for all +images with minimal labeling cost (discussed in Mathis et al 2018). Then, due to the large capacity of the neural network that underlies the feature detectors, one can continue training the network with these additional examples. One does not +necessarily need to correct all errors as common errors could be eliminated by relabeling a few examples and then +re-training. A priori, given that there is no ground truth data for analyzed videos, it is challenging to find putative +“outlier frames”. However, one can use heuristics such as the continuity of body part trajectories, to identify images +where the decoder might make large errors. + +All this can be done for a specific video by typing (see other optional inputs below): + +##### Code example + +```python +deeplabcut.extract_outlier_frames(config_path, ["videofile_path"]) +``` + +##### Frame-selection methods + +We provide various frame-selection methods for this purpose. In particular +the user can set: + +```text +outlieralgorithm: "fitting", "jump", or "uncertain" +``` + +- `outlieralgorithm="uncertain"`: select frames if the likelihood of a particular or all body parts lies below `p_bound` + (note this could also be due to occlusions rather than errors). + +- `outlieralgorithm="jump"`: select frames where a particular body part or all body parts jumped more than `epsilon` + pixels from the last frame. + +- `outlieralgorithm="fitting"`: select frames if the predicted body part location deviates from a state-space model fit + to the time series of individual body parts. Specifically, this method fits an Auto Regressive Integrated Moving Average + (ARIMA) model to the time series for each body part. Thereby each body part detection with a likelihood smaller than + `p_bound` is treated as missing data. Putative outlier frames are then identified as time points, where the average + body part estimates are at least `epsilon` pixels away from the fits. The parameters of this method are `epsilon`, + `p_bound`, the ARIMA parameters as well as the list of body parts to average over (can also be `all`). + +- `outlieralgorithm="manual"`: manually select outlier frames based on visual inspection from the user. + +As an example: + +```python +deeplabcut.extract_outlier_frames(config_path, ["videofile_path"], outlieralgorithm="manual") +``` + +##### Selection after detection + +In general, depending on the parameters, these methods might return many more frames than the user wants to +extract (`numframes2pick`). Thus, this list is then used to select outlier frames either by randomly sampling from +this list (`extractionalgorithm="uniform"`), by performing `extractionalgorithm="kmeans"` clustering on the +corresponding frames. + +In the automatic configuration, before the frame selection happens, the user is informed about the amount of frames +satisfying the criteria and asked if the selection should proceed. This step allows the user to perhaps change the +parameters of the frame-selection heuristics first (i.e. to make sure that not too many frames are qualified). The user +can run the `extract_outlier_frames` method iteratively, and (even) extract additional frames from the same video. +Once enough outlier frames are extracted the refinement GUI can be used to adjust the labels based on user feedback +(see below). + +##### API Docs + +````{admonition} Click the button to see API Docs +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.extract_outlier_frames.rst +``` +```` + +______________________________________________________________________ + +#### (N) Refine Labels: Augmentation of the Training Dataset + +##### Overview + +Based on the performance of DeepLabCut, four scenarios are possible: + +- (A) Visible body part with accurate DeepLabCut prediction. These labels do not need any modifications. + +- (B) Visible body part but wrong DeepLabCut prediction. Move the label’s location to the actual position of the + body part. + +- (C) Invisible, occluded body part. Remove the predicted label by DeepLabCut with a middle click. Every predicted + label is shown, even when DeepLabCut is uncertain. This is necessary, so that the user can potentially move + the predicted label. However, to help the user to remove all invisible body parts the low-likelihood predictions + are shown as open circles (rather than disks). + +- (D) Invalid images: In the unlikely event that there are any invalid images, the user should remove such an image + and their corresponding predictions, if any. Here, the GUI will prompt the user to remove an image identified + as invalid. + +The labels for extracted putative outlier frames can be refined by opening the GUI: + +##### Code example + +```python +deeplabcut.refine_labels(config_path) +``` + +This will launch a GUI where the user can refine the labels. + +Please refer to the {ref}`napari-deeplabcut docs ` for more information about the labelling workflow. + +##### Merge datasets + +After correcting the labels for all the frames in each of the subdirectories, the users should merge the dataset to +create a new dataset. In this step the iteration parameter in the config.yaml file is automatically updated. + +```python +deeplabcut.merge_datasets(config_path) +``` + +Once the dataset is merged, the user can test if the merging process was successful by plotting all the labels (Step E). +Next, with this expanded training set the user can now create a new training set and train the network as described +in Steps F and G. The training dataset will be stored in the same place as before but under a different `iteration-#` +subdirectory, where the `#` is the new value of `iteration` variable stored in the project’s configuration file +(this is automatically done). + +Now you can run `create_training_dataset`, then `train_network`, etc. If your original labels were adjusted at all, +start from fresh weights (which is generally recommended), otherwise consider using your already trained network +weights (see {ref}`Box 2 `). + +If after training the network generalizes well to the data, proceed to analyze new videos. Otherwise, consider labeling +more data. + +##### API Docs for deeplabcut.refine_labels + +````{admonition} Click the button to see API Docs +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.refine_labels.rst +``` +```` + +##### API Docs for deeplabcut.merge_datasets + +````{admonition} Click the button to see API Docs +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.merge_datasets.rst +``` +```` + ## Resources and further reading ### Getting function help From 797b6a6245c36cc63e3ead271832915001e0dfe5 Mon Sep 17 00:00:00 2001 From: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Date: Tue, 26 May 2026 08:32:45 +0200 Subject: [PATCH 77/86] Create merged single and multi-animal guide. Move multi-animal tracking details to separate doc. --- _toc.yml | 6 +- docs/images/dlc-workflow.png | Bin 0 -> 477016 bytes docs/main-workflows/multi-animal-tracking.md | 232 +++ docs/main-workflows/user-guide.md | 1662 ++++++++++++++++++ 4 files changed, 1898 insertions(+), 2 deletions(-) create mode 100644 docs/images/dlc-workflow.png create mode 100644 docs/main-workflows/multi-animal-tracking.md create mode 100644 docs/main-workflows/user-guide.md diff --git a/_toc.yml b/_toc.yml index 3c369280c3..a6d5bf6602 100644 --- a/_toc.yml +++ b/_toc.yml @@ -16,8 +16,10 @@ parts: - caption: Main workflows overview chapters: - - file: docs/standardDeepLabCut_UserGuide - - file: docs/maDLC_UserGuide + - file: docs/main-workflows/user-guide + - file: docs/main-workflows/multi-animal-tracking + # - file: docs/standardDeepLabCut_UserGuide + # - file: docs/maDLC_UserGuide - file: docs/Overviewof3D - caption: GUI workflow diff --git a/docs/images/dlc-workflow.png b/docs/images/dlc-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f8091cd908c403c3369e8634c04a13d7ba8e08 GIT binary patch literal 477016 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

      t?)vi$%;D^rwk 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

      pmV|O^ zjKY3lcl`KlTM0cs#-`N@TcL_Gzf0XVXDH)w(-;44sj8VPbY8x zs!tIxjWNvUh{igk4TN%PL|~*ks51pOCJ|5$uQBDjNnev)LWV;5PS45U`k7m+k%B&K znug~3n-jJBa=<7~iUvcZSjIB`R|MlSSs(lj#znY-x&YBCd15p?(F{$V6~T9%ka0n7 z`cr$PdUeSn859(IB@hVYx;TET4ZOlysvJLFoG{koeugmC?==8&Bl}51JIt0QiN#0E z#|r}Zs_gU@c1%<%D=aR&{!qq9C@ z*i*K@^NzvX2eB|VpRZL{T<&!_j>T^+R<|v^GoZaOCt~GY?A(}Pu~YRb{QAgIFrzWw z?Yg5?ik}SSKF5UITyJ6!>ycja%o%D*%x%27kUaEO+Dt>Liobs) zO$S2%(`e0~wQqa|^7^+XaIbd=2xx*2RH2Iipq2hEQ8!hw0vFQ=cC3`J+4MfM# zQHQnza0;s}O@x38pmq>Rmc*j}rCd|3BBy#3Y0J6}R`xkx6v*Pgfl*K?ZL5!!(bb23 zq*Iqx6=OAIUw+ZNTYo;fg(3rUb*EZI*wT5>745gnTyuO<6H}W;wD6#Xc~SjED5PZf z$(U^GjizPmi%uZQHg9w9Oa%G1{nV13gDI~(DSrY@{5>x(bb1FDDcWuC9kzCRv(dLi z>Not6ELJ6io`LPqKfJqlGtuTbqDyG5yIg|nSlfVZ>O}v?Byx;M<3dRn6*RWyb&uQb z9D{u7w0PUqnhXHtI-K%7g~8>-+#!&bF&N}eA=l7$d?h*;cALC>^En&k53+Uq8Nao& z?NhZ@MqS!NeTDiV!~Uj6NB3~NMtfF;j; zFNc3kK|!I3+c|yQcThXtwAXe#WA0D$nfG#E-;%ozQ!@cPU}Iyeywl~lHV1d^UM5vc zeta%BbcOD0XyzHg>-PT;Rp;16# z={e<(9LfRDg@boTXrlLXD5Pg8;f5%(9i0@-;^#Vhx#cBWB+}XKN z!$3}GwchSSO$tbXo&moin3kwE+r=cGVL!;q!4c;UYaYoU?z z|9qR9aFAr#pw6aqB8t9}ctF4XBoVyQ`~Q3;D8K(5-VBhzlm{x(nLBqE=GYqX=zBqD zFN~s)TQ@|d>4g|YUDV=1W4DevuExX%*uGbR2}o;ISkGCpfRB~DUA?L@75 z6R!JjOoB8#D;qz8L{#rC?gO6`}Uk;ueDarTZP z3Xv)pA?AM=SnjsIQ3n@IAEs$aXwGr|L|Ttnth zg8$=m=5KL2UwK#(aG6Zd)`|sk*YS;zT~VAqdw*5iAzw-0!GJA1&P<%2=^|bwKV=*F zugbLb=TBuSe-3W))2}hQW9+qUzI^n+ftQX82k#p~$iPP_6lCsXL?Uy(m_@AG)_!fF zc(H$i6+u9iVE=i7y83gM|5c{P{*tNG2OE&HH!RKrD;<07!0So+|8;x{kJDDaX^z}V zd>nV|qzL&BRUI3w7f>q+m~;3W-B(`semB5%?>@qV{hH;YV_-E>PV5r(hA*vAuiZ~SfP6dlc7iyP^g2A0sa|>WE;@}<`(+m-_=Y^ZNZyIXw3%iPX`UHR@P`zmMP$bWl&BI)^id1VO;nG0Z+gWfjO7m=cqB6Cx<%U3u)7-Wt+iX1lofdFngqUAz7W`nH(?;H z{8U~9xCKx^a^dCk4DdSLlA^4J?u*%(V1Hk+?$tH$B9FFM-X|M?t90syTIOZ9Y8Jrc z`fykJp?K4DuwY+*UIDW)Y@q4-$0Ocohk_pJCWvuC1Ag z=7(cW6(C{rhUK@ft9@WJm8lCXhZtUE@B`a!oUeB9mf?4Aei^eVW?BY&&ilX)Jo+7c zu3RXPy|>lZ0|!E=wi-E81b7@1>sRQ^LFmj(cq+`$} zX}qQqsj@*DweAyaWgPI}dCnXzlmZUVqh|65t>H^n#bb<5{;X(l2fIg??0OxP!kKMT zj$y&cBI^FQ`U_U>E8T8gZdVH+Aky*Qo$4clb)?(BX}& z7ew8`nnWk@0|zQB!JzhQuaU&5Gg6;lzJD5KhCX0{mRtwhaFxI%qLyHNuh_=PAa(ml z5SU#)`znmIU2F`jM=3PBLZ)%&i_5qz?Ic)P-3ONaTkULJU#XrBlVpD+C`TOaDR6uc zF=u%2(V>4Hk*g-{Z$`5WOKV@^NHG!RNxS&nU4sC?-ru+7j(_}1@x+l}fbBQn5@2C+ z!Sv8oFcXY^1eVaw3#c8sc2OMch$zIAsjjO7?+ zfE5?ZKc_JZdbh#&Wc$l|@}-pnq4N7}92ZD1T?trs?%v#DR1u(END^mCvesRbjUG9T zT6U5p{dZsCug}x-{dq=#MS|yfNDFc5TL8-yhD{D081xGj9cv>jTPGf4a*8-}>diB@ zNWzm&!B#y-^h1pM5+4&=c?{UvaK9BZ3&vxeUH@$P|M7(5dxbVCm}@a3e8z$8Q(6>&m?ma))=t1+HsU;b=P1sOF+B z!NUprP`4&ufJi#1rb;Wm^-uBC6iZ9=jP@3 zWs|z#i)VWrMwd7oAk+ubA9{SWxyz37m!o+yY{0cMFjRpaYXb%yA$4K=G*PWL@IfiX zJw~FPk`jXIf_(xy;SJVATzch3nRN)@OOPOD=&~GP8BJLq+I<35nKt5@-*D<*-gA#*Y9BuNkT#$JUU9`7A3)WXm2&F0IkM(&sEZ9_ynuq1xhB`lgj5P83+c@gxmA9 z+e-`P@$;_zu;FqG?9Sb@3}(rb%Y5-$-Xl)z{gZi3VE?Gh^j@7@Mb}_d_}xd6E+a|2 zdNvVHkL!2&0~UghE~7RM{VEu4y9Py$mJdbrBv?CCPLu?#EDfK;c0QZ$&hui=DW}Jy zYVc`VsY*AWKHJ>$*$vYoX`|wH@{@n3_@f~Ax5w4tz&=DHDDVYk&&`pVj8{@R4qE(w zt7E*Qu162tQ-MDEp9dTz@Af~fGpoF7#S$4J%tDZhG9iA;167NysOFP$;2JP*1Gp^I zI_^40R;wVNQ?n%X;D%EZlJ=?{H0i_*FMfe9|N8b|NY28!@u?;W{yqpoR4dF9z`G)g zh68Y0-es9DKXF+y4ds&7aP!-o{8xhtDGUHv!q*OGHMl4gkpai~x03b68RFVczpIdc zh-mX>MR4mGCob3UhW+ATAZ`PmDJ9I7EWGj74W}ZZAr=o;<-LCD$iRL5^X>E_?*LGQ z2*d3VeJFNGsDro1)Xj8!zS0C&-0kdUv%lhTckw21UZ<}B`{nGHA~#N5P#rGs$Uh2( zFF*YYZuY<3wg2a3w_lN4A`_#?5ipI|Wu(9hrV#Jkp`CNQpzQY_x2dhYV5}Q17$4sK ztMI9Ct#ZVuzehQJ2AqN@^ds+KS9rd~DRP5#Ds+`#Wx`{{Q@`v&ci z8a9M}NGg{}(n@V*H!#^nmTD41ox|{+^s18kdBX*ruMZ5L4c-Sm`_kK&T)P5}mb`u* zC>eqT3Q5a4LrCr;?I|w*eVYD);ZpxRP35Cm*Z25Me_!GrIJKKOxe3YgHsZQRc1u=4 z(r$-x#I81~$9$DZp;~1fs~?`LStU$^$>+`8r@0G&2M+{Zg6MJ-Hj|nj0|5Jz? z{s*_)S_&!B;jhJby)^6zy^H zIU82fbUnrt_1}+}Q)IVD;XeMX z@l8qGlZ&x_N4=+0_|<7kborDW@^6o=6)ymhkHursZ>X@50oqs7b~22s!8L2zi$9md92THvM6;j%CVNud6e>w~*1G^-bEvo+2(j|+!@uBfpU44g9|BS%WA#rX z+gjW=U8Ivwf-N7;8CDF;2Bw@#q(6HHPOAcI5Udn+I=talIe0`R1EZjBzVON*8MdfV z<0p59a?2i}0+2}tSMn^k7WwdNoB^>G^6v&X;Qi-yGrmk;l<12;8 z<Zv1H-?C8kgb)cdk|jikWcM-xeTb>)+z1k)_Sm&X&*@^+7%2m zB$t0?bm{A17{%5I4u<$~FvjH4f4|%}pz103=gUnqLH&FDIPf)olxw}by5d+;7dr&8 zpg4|ttzRu4)@K;y$7JG-eerA>-9cMk{H}bb{Mlw6wa#Hl&#x` z6aG~3Xx$m8H{ZfhwL@8VZ*<@G_m}l`*(a(PE$xt6b#`R+T)rq|L87FeYOZ>R>2sk> zRBK;tQ5c@)n2eQIK3dQq*bdl^19B3o`b@&lY{E93#V_^*v`TCRY>LpZH6qzXg>PS@?yxl2CAS7^fSG^m7eM{{hZ37ycWW8d*M851J z%MP`5%3y>8e60c;af5hrFsu*H*wbsk0{qEyv2VqR$ z|Hc~Nt>Pv_RzX!=!3J{0&pvhJ&aD`G(*NS2V*e9aRt0llM7Yh;;F)rvOw?t(Yfm0U z7EE~9H@tDE=k;K9!W!dcSwrkAM$_BFyq5+?^1PR`Tzd~gZRrc)MpSX=p6YK8{nSlu zGt=BRiRwPe7Tm=^ZDPzm0(0ClgHtKE_b%n{qsOZS=wK<`BaVIMRJr!QDK?_o8g7j*Q6ELs-X zQHIZ`rQ3%AYK%Y}4DH7c^X{-b9J^!-+jL3?rZIHd9!1$-fs*MAqz&tNO|jtw*)(}w z?sr@7A{%F&vE0g6l-L%Jwd<3-TgY9i6R1Z0_1~YB@?))37N{_szw4=B%nbbg6@(H5 z5LSqswgdVmjF<@79wG0UEOU%>lx3i*b%KM2Xh}smpm$A#p8SLj6Z!q|fIxF{d@1pA zd8`u@o5qrRW}q7Cv{R{TJe0T(0T4Z2SIWq8y=pZJWP6!ZBh_#%d~B&!Y^lr0zMhMW z^lWfL)AqZ-bA~-Y8Gv~^_*~mh=--tl%jg4UJA~1SvgD&vUPruz8l)(WYSAy3_IXhm zR%#XpoVy8k6h%}wx%%s-qM+yJq#A`#CzDLUYPPudlBBv$t1{!<^tk!z8gJ-Mkz%;! zIkhMpQiP?YDX_(Lj%4ppGo2=ZcBqt5c+hwVs`C5&y>sV?bg~U>b458r89Ud1%BqF8 za~Nny{+D3lrQ!|;#G`+&`+w`Z*T^-VfIhs`)Vtf^S`Yq_sK$p~T#$P7yN-|)3HXFzc21L9&o0}m9r1yDC*Nr@D|?qy*8=Lu(z-tiY{DCW-LWo4zm)KNw~eYU;05&; zns7fU&aa>xSW1uDmvp7n6nSeX5( zO-l6M^#wkr3+{RW84X+efdPy|m+;y5_f%Q(Eo_nzT%58Bb*o}kk`s8vYwGLDMzPy> zBJ|i~UT{n;#1zXJbk{Nv)~U4_^`XNtg% z2UY5V>8I3IJs!vmR;)0`Ps;U3p}{aUXKw^T>Oyvpd|yUP&J~0h$_JNmyQz@HJYZ_< z44V;yqpaXIv=&kz7Q7uR6pfdEd`e~g#d$3p$v3b~x8|1GAk?8Sr1Mpo-xwenroHg~ z7~fCHTK{u6Uh#*A-wV{AQXa+ZS3GY3 zJ!*HZQ89WKPcDz@X~LZjVv*hpNhPHF#;!SlYG#!u;eF0oMHv{F;opxyV4-AYZi0ti zTXjuqI6DAVa%L(PB}HUt3F##L{uH4|TpFG=>KEMz+!o&etjUd#+V?#6RY{dM238g) zOQ~WOT*230=+}@J_rm|NmhAUyDF__Wp@>fc{U%;SnAhk>d0?46}sJKQD%>=$`HlL=r7T9j>QCa$=%G=-8;CNILUjLCZC-W+iHUf*% zVfcGR-8UkZldFUy(vLl_$`Sh?^aZTbow{zoIS6k_grzMxq%*c&(yuI_w}Jx8L4@x^0px|yjl&;AdUBVx1zC31d!2Tf`%&k3GpSQ?T zOsao;g48g9^=bH&K(8Jl`>M|x58{&mejD<6FF9aa3T*rL7WLXyszbI8lS_<;4)}3y zCD-h3R}NiClxf4%22z~Ta<)kPz^j5|HI-EJ2xviu$aNlu#LJI8M{t7;(|?qwi|m%R z=aIe}4vFkm-aRKsQ(@_`7F)BtW3Gc#V4*$CtE-YFuc+f}b!iQkZgBcuTzZ`K*z&CB zn0{hldc5ru8z@{0Ef{F)aQ{Z_;u>+x*82kd>&d2@kr@7gtRLBe>OjR{81;|i*#7TP zsOT~};s1+5V!IWfuFNSTJOm^|RXYX_!N;>|vg5a4$s1d)Beb^~MB~D4dk(U(yzj60 zjd$uIuIOK$4l-XlLu9GDVqnUSG}KTv=(o3C>?nS7_L%*tHbYogr!5=+eZf|BoukE< zC!gJ9oLUC(%$HL(5LmtC23fVBLhmQCY8gba;PcPg9%%_FCoT;g%E9ZTEUX}%)^_^V z&j4d{=GrP|qw0VnVNl<;HCz(9bXmX4#)~ynaqRI(f>X$45^r_Lh)5 zV_o)(>2MDH_FCp!9wmIuqjiGel^-jb0(*z+ca^*1zr5v@_-?f4=h_q>7RAQ~r|$WIw{VTyz8Din?W_r9 zJ`k4xN^9l`E(#MGPW1M|ZFcMc4v`@oA@%d;x+38U;D5$0pW6I=;w7+tzFv*Cw3CA^ zm>PvOlfv0S*~=xmw1m+TfBgG*8`O-+KU7Au@*ssntR}2p@;}1Y%rKp+xbG2h!=k%l zq+^a{JaZjxK|daI|D);GCk^W3k0ki5d4Fo^P`^SWz$CKx6~DI*%_Wu(&N#IXn}6X5 zit@Fr23`iB-l{--uYpTG252L(TMse9wZawbMsi5M>LRzEQIqGOb^?Hvlgt6m8k?EK z9@w;{gpex5Z#tmRG)~^cVfcICp&TG#9?GGQT;~YLh6mn`;6SBlbv!HqK?vYCV+X>B zb`_a&C-)rQ{c|hQDhS~_L5;60gWX%s@4>ao%srD`Gs1eG%UVS{n+7D>rApD4(Bn57 zsc5I{`NektDzy@-UdNvL(|aqRgQ5}2GYrI8mQOD-irx0_3`j;U7gN{zStrLSvK`F^?YM)g~N|C$9X!~LIC-Bq=m`;r9i z8e(&bvsF55`B?ac@hb&*+7rH~t&FQU8gNkH5AC=H44i31E#Tz*L;Mav4vp)q#9 z`_JJ0UEE(Q2pKd_&Qt*?>H6HtkKAO)z14Uk#550@sQz(RsDH=Oqa1$!VT)nCOykZ? zDD|HK1NQF&kQiele_GQ1+QJ$he1Ou|T4VhR%MFq8e>PIaKJnLM7ld~EBFp9#0kI{6 zbV9`lGOdR_=V)cuC7l@(g-+(#CSG=RQWt4=>&d`o7>&fmx5Mr=wZa-9y=iYs^6)x= z`0+^03(pKPu@)%v*?!^xJ=QYRjGsQ&H!W}5_1Fdq?1>qB$74>)y2?l%DQXZ5njVl= zw-WAIgMqUG3|C40<2H5qfCkl-K9*TJ_n>c#eiGPH@k>{6tAYwA4e;Wq=C!!JXW0AiKz zn?8Qm^y{mSz+6pT>-qJmnCZQ37M*J|_9IXvtGv1KbS z9|#o9p6xu|C={s%Tx7MJ{2t(Wj);!*V-iW5^!Es}8M682Lc02>W zegbPAv;z7XTh6pkl$w>|xnq@e_fU*`_@97WRLq(X0vXuFFR>?_%R2V7TMlpfe$_!& zqz5zpvF()e51H5??Jsig*TN8fqVR=v6#E1z%g0$H9?HL63Q63+C#6oQ{7*szyS{ ziXr3tMP*1p#Q|?)YqYW_GCp(G%-@xhz1+NUncI>Z_7COgZn_Q)z(VG^K`0keb$3M7 z^LdEH12oS$9+}|yN<`G7?8N18e|(u-mwA8db6^^;)<*OoeIjDko?X2#RP&=GUUf7zl}R_>ysm4;rebW>M(&)UEtKO zsQobD%6PI4O({F$+l11!EA+JH;-Ab}x}sb(%~ee3Z!Jq*zSdFS98kV{WZ+?M2#*XT zOGN=D3AdjAjOxW?8~>o1h(y*v*$||)FUNkTa+1_LCK{4%_$YLZU(Ck5#g+CIWnTK} zqR?Qn-~p{-NY>2R$%goH~^4uYPA0r7Ey*yoBWXrC9oIm-o| zCw6^qU}JhlU=3g!{gP$>;WV7E0+^Lxr7!#_k8T&catNnj-X+arsd(&4}Uo&bOXP3XBuTN*F%7jXVZ_%)rMx~FoT{pLJV zJgc>0w8;;><$1xM_2<7nw<+jK!K(%)w$%pH4J@?Z#(MxJiBF9cUwJK!u# zZNd;B^fcW~$eJpYxwhA+j(H$-sSn_u$lWY^=Zk8_c!FlBDD#g!M|Y!vm@aBex;5Rd zX`G+t5O+PgJ^cujJ$6&Yc?7aziMVd~^QR(4z;F{?{`h4h%To)T!Hb%_X}W22D5DCg zI*t%PdaNI9*b~s@1JBKGpQHajo}1LDfJz@pEOMlSe3ll1{f`LOS*4vDJbrJo!r*#~ z(oF)4N>(o>M*1#!#zQnK;?~ki$PZ27H6J8wi~1PF`mFb z6lEHH1}LTu8n$9~w}`dd$DRP4+(ckRQV?7fscH$=ugK!uAONz*x>tULUg{7KmW81? zI*dxmn}P5`{T8d34=~nPQdr@|c4;+aNwi#4AmpImZ6z9kxjp^my1w+(96t|t6-km6 zN-{gwOWRAdX{w%A`m;axJ^qlgc&DfNZhNrt#HzgI8~HGTe6CCHk?f`_p*Z1|YxOoV zlBoe#=C%c>_KH2p({ozxo=`Q4!Pc}-51%Qm{gkf2 zI(9FwV&5L`OH~l{`UQkD|C~$VMWqF;*w;w#OWqIXTwtE7h-NPqF9%?jo4lH99K(3z z?=zssTqzq_<=Zc(zTWYt_1#w(feqJ+-m)5;m0b`BuP?|c8*Jqpk@gHR^C11%<&YDN z_TIe@g5QIv#PumtYf6c>5Gtpyb1s3~BLZlYY&kaM(L*twAt&$LJZCa^&M{n_quu%l zbYtznx0ltpzGoPqY@Y7rv;BZqFU-Roenj5E9!U%4mVFf{+lb&3{mkQ|sgcpv3&7Y%>>s!g{ruYx33*8&XBojJB(FF zc&^ihQI`@`kolPBCQN$uVfA55EF+>;&;iA6Nm~i|BYWC@H`W6!#x}7ne-x&LYKd7$ zGp0FZG9L0BvqbVvizh(M2MQEK9j4`5opInYhvjHQx zQ{Fdqujw6T|AK|IP_19zH|qq&?6aJoX)8i!R=pN;!OuvFMVeDA^7hH0-x`_J>0JZL zw?>1sODD#aHfz)Pzg8?yR6jocqM}vt`^u5#06QPjHw?Hf8(1J{usrCtj<}*c#2*N% z(cZw5jpf4+jfo;Jk!oY+ofFXLA;2}U6XXj)B!ldQtDYp z(54^(#q{v*1ppm6l|7-bo|_ujo3_xuL5BCMY#7(!W_h@a952TFiCr(;uh_(@`rQz5 zE_tXrz|aq`Z8>th$v@w|!H~g6k!mOHBqGD~Rpn2BI<8Y@P9@B{$d7Wz%~9pGXsS1p z9M4(u<}Q;KBm(P(R0m&ScPBY2P#l_^yzVHoo>NMyvzdOtk1m;r+(QgfW;_ulJ6yW? z8n+HLIPY4Wn0s$cDC!er=5h(-aSAwXAXj!638R@EI7YnMvt9CRy+4ne~$ zoqXyC=-zEX2p#s)rURkJ&$w-|+4ohL+M7CQt>;gaMeA0Sr}WG=VT$fb@0uMB4%)c+r*y!A{Xwju%+mM z5ZPYp4sw3HaEHbwfNi_H~lp^w`)Po|*8D z_LY%O?kI`!6O+HzS$DC!s_dLcipzxrv_-R&n|S9edsuPag4n3Wjl?1b`X4uyR(z{% zMs$?QIl%nTba09uLm&)>=yw;N#3|$3EZ-3geCndRi&7u(#E=v^ai-}fLVZ^p!idpQ zt(5G+V?yNWpsK-7wf0(pTk`YPQ9k0EmuC;X-@Uo-P#9_4xE-t6QJkrFrTl7~jk$Kc zUTLeXQAbON4o$KPw{LtoIYNx9V0=sdwW=s2G_r&IkLJS zdWF04GlKkuFFC+2H6z?XJjeyG(#6BDh^M43ds*}2Zyt$EBY@z4)w#NDdF&^P`AC@ zlivLR>F5XczK147$~r|dlJpKvlH-$w`+_?rBF{Och))>m8j}>pQx-FqT{n;N)YvIC z6v@9BJ1!wkaI!c?7+3K*CrvM6$T!GLWQ53KnlWJ^5BVKTV@q6mPurUN>l!%yF5Yj_ zjrdgX5h!~pE^^dQ`0SW2|>KJ{`wg-v^<>IxKhI5w( zQ!%2r^AFOG#*k(sTW)mb(F3TYF~Qco5Q*7XEzG~ofj>QBS_Y_{BJ6{$5o6|dt55l- zVj~46W*RwD1SXViRyZhk&1j~!<{DtV!a?|aL_IXAU3LybS0*c5)nZHGDin=Ajse#y zA|*8+NR60o#5nNpq((ODAM%-6LQSe91h9X6h;-%ZZCi&AseJw!mn;d28ymhV@#ozJ z=D6axAt35f$uhr*+3y@#1U2hf;?EjTEBNubYY`tG1b*#p&{yr?2u zLgz6|WhPS(%`kHF{v2dJa_h)JP>q8Ym5Ttk9%6uGtsA#@1UhI4W{=FXLWFd${k(QX zbsH26OdQlj?PB%>oZ|U9NC>2byzkW8?4Oe)gnjH1tvblX%JMz0szlxg8I&GP&f`}# zrPsQt44u#Eh5kqZpO4!-^Xg#3G?aN(y?q({rr<{JU*gO@-kEhPm zVj4QFP0U%qqEWW>^ZArK(=?lp1A@Ahm{4>N{#fr~Xq15NO`mCUR#s~jfy>nDL`-LM z;YXhl{l7@1vz#QFEk*XRUJo{N3|phstKvE6f~L>3P+Y^Y)e@zLrAkSzQG%a&Oj9uw zH#@G5qNH@L%8!vK^WNP2Aud&OPIT*a+5)zL%4dQ4uS*$uPAY)CrYY{mL$sS7bU<%f z77sfCv>#oT{Y2Wrcl!|qi0Xz>7-cfagw9ip>_Z`BfbK!Txdc}#21QgMo0C~&Yp%39 zJQUoef9?VY%$6ekjM0z9^h(-tuB@++`5Ii60i9-|bj$ISxsn49nuPI9M@vVZuASl9 zcn~GNmczK2+ou&4DPq~oSYVJ1&JbFzI=IbSL4I?>5R(=K4arMFKjOYvmm=-Y3dz)7 zgKHhSiP`dd3062!yGscb1S3=Vq3sp8U4$--nJ43-P)plH^o;4&6Nwn=QAY-6e&hG` zz({2sGnecuNI67vk(hL$%C}VExCvmOvna--8%%>>y1>>d(Kj*j9(3Tc54Z5&Y*o zh#9u|#f+k_5I;2aaOudIgz?yw2^fJKJzL>sGSbd=xgCWJu^>`}KCEt!JfRshs?<9% zk>?c~Z4Wd;)u8{SXijY)PCc=Rx`N6daMcd~spzj-&CSv#R^HIls{Gjqk9oAK3A4fD zK${!el3pvzuimOh+fkS8^ar--5#UscS3mw!ah%JNKknlCh=|v?#CK1vV?`VY zFlEXmbC1n^Dp`n6MK2}FfXlg8jM;|kRQ$<&3E#TIfQX^Lam(d#UR16akRED$6JhZ& z(oN+GCx%WLSrp&fQR4IXo1cN-l~KV_d8JYAsG=G@+Kf!Ati&iY^{;PoD8qkTwN!U} z{~3PGlq|9g<3q|w0=RB8KkChp9QEiqH0k+7yrVf!62k(YYk2uTO6~?w3EI?tbOOb9 zkMJc+zI|P@pS;&J$|6m7L{!@3K6`%zh_87488qx1pKanCflC8BCyVOt4FTDfPQI_f z6Qt&~&}6Q0lGz@XJQ#M8A7Yj!);tJSeb{`7HZbVzky)*sC+w(P!QQ2ei_hK5sXq*t`xKrA1LHC6JR zuR`A#y7CJQ*Q)z7I@NnhR6{A(M=a@;jq&f5d|wNHb+tug2l)*y?QR4qt7?r5jJzIE zy)L$=jj~cemGOPZYT!Y4qIq|^c8mz>dXN^*6?$_MhI0kRmn!HI=X>M`6rG*q4FXD0%;1%R9(8haTR34(t?%@y#UNRN*Go0@G<^a6qK#6}wvD5AdrCwr&18Kn4s{NYb@_o6q6Sk>a{g64NWuQ3qSfNJMWiOEc|qFf+O1 zFWY6Z2xm67m}~t&-?G8-&TEc!N7L>`KFjz$e3E&yA#&q^WuZ`kPltE1b$ey$t2#eG?xNte^}xLz`$Xr@iTC~0$Gnlv9ey~+SAqfNtKe|%&% zm9~+VFDWz;w%6!Cu8>xbp9HJ&r&BmVc0h5_-5g$Tv+`ySp|r(HUR$7u^CxTOswYS9 zZ#n>20Ax^km6V4dgYMw=YXwmtcI}A5p(*q{P~Ps%T|qid1Ic&Y_B{Js9ZHl7E&3?bSS`O=VwsiC18k#nxx@h9%jA>~hos~3y#$3nL zVK~mGV9+)EP|sV#{qBu_y}lm@4^(}x2X^OsWp)xR=VatRj)XLT3yZn@;O{;>eG=dgOo%m}4(uILapv@FpZ$O%2{}=q{i+@q; z#t_vp5kJ#E?HG>SsQmE~yvxOU{O9l)dY%cUTFmu|Qo+&ppbD6g6m^$l2GEF>YAPU^6gBJME=-ref;- z?0C-bqg#|HZviVrqBu#D55~);+b4E0)*st8nte^Y^U(%(@>Fq5an6yvG*X#MuaK!i zw1Do%$W(hXXXC`&1tR8i)VFoCVeLtFcxWWWAcArXp zC~ubTeGTJ4HHdXGqCH>@$VV)_X>(E?;K$`6L`w|xv7s|WNA)ljrp+`oN3f+FfGND) zDOAuWK5-+L0e_aF%Az1-bUo@ywn~9Ji1smVQ4u9tR`8loOnIKcSd48*ZN@^s^)*O| zMO3XRDA(Jq_a6dIG7e_VU4Sk@Mjah0Q?>p_{pE|L0(8_WC5I}}`XwadY4m{9Adgi8 z(M-JHB^PDwJ}UCNJmjP)*#5-j#Fup(oSvPM!1l3X)b7~w$gIEVh4rw5k|jpL(PVq> z9nAP-I#*C+IbEC9%h4?#1GY*{!F}@e=+H`RGluyp{zX~a#ASn3-|S(1BU6S&gOr`Q z5;_$AyNurG7Rvp~e^=#tRfV`o&9cw5DR$ASTzEcL0!`Jn)j^zqD{|nw5Ie=n@93B> zqUoN2t``Tb4#P}DdM7(FB)qyZR|9vGkz-G2 zf}jb?M?>P_kdi$CsSgH0KBnh(^d*SQQa}#TI(8_Fp0l5hI}xTluZW9mK`2sjs_`BydGrI^-IZ5 zBznZ01_LE==G2Ee6ns40^VS5mL8?cLS(hM8Cy`z=67;nz_Uw%9V)_&Ms&lsP2^xAcEmW%_ZiION&x$21_D89a15KCayuY@7&X&` zxC*2TYYz-Z{YyaI+?Snsmj6XC7JTOGMk@u)s$2C~%HsA8%K7NGFDd7_D6MVF3yw$n(jbnWFItQDi zo~So*3b!^R4Bw7lW{fCtZm*~YhhfaHc#!yXY(=PMqLjr8yR3CdaNF{Po@K|3z=R70 zJ{KE2>7F1LE#~_{!pc}2Oqj&CNRGU92%o)O(Gnoz^iH*ON1CXaYJBWs#I`keo_`^r z4TT(mjxcsu6q_rwXJY~YsKPjBJf0}dzz#Vh4#m{rSBsT@KE zm&l-msxB4GhKag%pcy&(V6sV3Hw}i$hm!pGI{L6-c%3_;FNV!LCepqHT13Zel+QAC zhwXfusnZ&;pU7}AtQBx*elfxw)0Dm^U@wg@XA0O-8B}`Ea;SposUj{3WU4wxu45i* z@bkpq_94j-T1VZcSieSI*?&?Y)7H9C%m&9n(IUF<{V~DGr3Jgd(Gr)7!$Q+l^Hj#Q zmMAY}s`XCM?KR3M~N_f!7Fiaw0-$lm|2lU?KmphB}duBS-AFjM= zktWn1A?LeIoV3YCm++Ye4>MvmY;g@!_p(33oO;L#_yoxG0A%@O8Lb;#a||b=ev;cM zGTYsY005>O!XE@lX`uWO@IMr;Y5N7hz*OX$K$m++Z~9|AajmO*GKB7#w-FgD#+2r9d35Y}A~e;Km}lNsvUOZaf<%0Zk+l2?Zz-vEE~$Z8{i*h0@joxu zq|0%URV`Zzgu)2oJT)_3nS!M$kCouTAUpoH>E}^bZDwQ$zE)h|^ z%7q8uhaXUEJBMMWEkpMgKNw;g@7c$cspo%=T%6<}akw~oJ${9tY%#$l%TO-~6*NmV z8N#hWEI&TR2Pw18>dE&xx5J$5Hk_@^TImohPP{BM_1ZEFA*zN?u9m~;&~6XzzzK(g zR=3;sP$Q6G=ZL=|H|M3HTL;PE73k^La~ubRn|7q%W7?H)o$0$JJyB+-;=3R2jYS8p z>1i&*;+&#Udkc(R%1ijS0lR9<-JjUHa zP8) z$bF_IWlYHnGw^Xd=p?3p>d(o5f4M<9T0_t+S<`Go{71|yKu&;IAK6mAM6F-^0BiKd zt0o4C75K~jpwI}X0WB5eDFcUyFdHxq{fK;jv%28IaS$P8mqb=UleH)=$s$*WI|aEi z2`)WoD9ReA7H=T(tm1&n`(W%9WsGTN_UwKN?QA~8v;oyDu1a#*de!i&*9&Mfc~sGM z$LAx^-f7X^Cvz<%xVnM(EETOfa@q@RZO~8X~?*u2Fam^<%ITpoekBn_HNk!=V4D8aNmS^#UTLU2m$t#hdz4kCBQ z*z>21dumZzDH#If6}$^MOrXiFiPJlJ@{Cc?1r23?{2EXgjK$R}!n&Ssx(*l;z~4S+ zIg1DX7Yth*8i^pT1UnGPQ~!5+O`D}KtpJ`Twruwz#aOk8@?$aq{9qLZi9+V?!7HHG zQsFSN5y-+Nf^^qcPSQEr%pD_oJ_bhgG1OiO(o|HQAuvhx`=R} zhXlisDfYnj>wRxP(4G@($_KNO6-uWD+tg3kC0H0h;CkigBa%vr-CjZ9ChH!g?D)N) z0Z!z&OK-9q#%yz(bFP&@YslMs%bW+XOC(|wy7$b@p!khF?|kjM5rYUxXhd1IZy`iX zaZqHNzXYy2lx%K3bDErJM>L?BEQZ!#?OZBl2nTufIV&FMK)DSUq*Wf4fiZ4s^=fdK z#^%pkNDA?4z7$-~DkYChR*YBhYtD`G3~<|?t8l%d-DA=w?~U#S%A;PMl3U(A(J>w6 zoLk;Dv3WGGbEhNU6^h{wZSau~qPcla{h4CccAxyEu0sh)!Eg{-a&b++6wv$u8uzG5 z6=W_E!}iBJh*SmiV~qd{3?QyRUXfIRfgq|H4vl{wl`|g+5Sp_%t^+jwN=Uls&ed~b z=?VwYa(`g=^~gZA_{+cF$Q6Jd2Wa#wiTQY*JW_i-Ls}c z4^ARtu@Zk>B4=XyYAQo`2ikI5`;EiM<>6h;#tD>wHRfNUa@vf;g_e8WLe3s3lNB-V znUh~anL*Tzichu5hf8GY>+af7C@$MOr=z-%{4)ATVJvdC@;!GAa&es76YXiS+tH!h zEI8J)OS=Z-``mb?%N%#mW`vt&Br;czID~YkN$|H&Q4!*v%i9$-FfCl16{hAC$#b1C z_TE1Bp6WBaHAVS6gwHn?#8bP!N~@`{N@q^AeM177T0;QT3I=8nb2BVkc^QnfLnz8- zDEEZKn0vj6uUQ*`0SWBAVyz+2{!xT&8&9r$W)+?NqRUUejN}Y zjZLv7&foc{B2z#jq<_2#V?PkyVA4kK?}O88w9`|&=kpEjg=DvlM?<-=JteS)1@0Bm za&2>h1ZILWXTAl;j~-ymT&xS}zQ=6&wW@yKnha`fTMVMYi6#)Hi|zM1ADuIu+l-s+ zpt$+xN8#A<>FpqC$I(uwD#(eO)W4A3f}Y|>Zk1_1kICQ_LcK6@R=ZA?kQ}%=61MoG zze_uhX$+ywrmdco_|v_W*-S<5OXeyG2U*Xi*gtgcCHZJMwUpiBWu=tgb7k?g)aljW zgJeclo|&ngj4u?d*w6Vg{m=DV-?Y+l>;Y@(x=N+>_~3S&ASc2|bh}2RKibq`xz*j7 zh42x^v8n$X+K&zQ7x~HN$HDrrQVYF;u`T+&a6Us3I)I*$^MM|QW%0P9FPC*&ANB<& z>C+}rvlv~`-EUxWqd35*08q10{-FiXM4J({$%v#Xt6Bz`jH2$b`U9k~`Sh+~sDz6H zl5T-Rn{oa^wh{~gR=J5&MajuaWYQvF6I#R^k~W~+~$V~%VQPH88c&eh z1f!W6Zh4!KX(RTm)^zrOz2@$t2XW~rWgxIn&Dy@VrP2MR0SUJU0^o?QKFLfkpm)8e ztxh!d()tzb-PcndjG z2bd?)HjIm;O|HrC=|uQcRN9}jo!=Dm7lfvOPSpg@DL;6o$lx;w3jvnhoC!}2;OTGx zyAeZ1%uu&MCEE=xO^`^bbDCZTiPTBZW8}m}CV*xhtUH-n#3NBa5qUxzzQ}^t3Ut7T zV#1d49wygvD=9zf2dCyUZ(4+F_0fbQhK~v&9)fa_aaHzglHhOSL*18Z1+{WMz4JZN z<*H=8D^}xDS7F)Tl_pt<=z;(49kT}QuF!6O?z57%3aQszWA^HLVQT|isFX0pRvj(! zaROv~B~I~zw{TFTN#j0CO);JI3Ci3nZk8FZK`URO|EG1 zIn9vq7pt$m`_LY3F*Ryi|A^q*g`CvbYtyn&``y=H`uDAy_c+U$OIxX8PI0R)#lP#7 z8!xU^@9|8wB`n;6V%9PAG+~Ee)55@+FkE!3XGOzqCltibf|rw6&0*0y;wDZ}YFv_n z>7a>Pb3p&gIpFYaE@|sv_Ka45RzmKe?JkNt^A^e;)Jg479{KacAGRO@W?64-I{?7c z?N&m1;r^dNb>0qYPG~9d>4MV&s!DrpQ2O#{5qQJL~IQ^a7dm8ek2)ipJQLPh>p1!NY;M!#NFkK394G2w=)?pLF1;X?kCyj zcJ^O&xtQU=QZNPs4@5*ufvh}Sljlm%8X{WL+TD)IPv>FaQuSaqgzgx!yS%VKi*FDANZU>S! zYa3;*)(Rs|YkCDKd)t0pVhoFxZ9sza5r$2v$FmYT?=kCg<=b~vf>-^z6Rg?pvLlSB zcGB%u_-s6_G?U_G2}y>o?8R5s!ij6m$jh5|^=WWliexr*nsJ*ltQsOJ7pR$2i=)It zw53^*11K=w`*REIwJQ~$mS=~%-AtvY7pLE!Lg$H)N}PKYM=MFzjR!l%#`8wYA5HFS za92q~0&Ax%4Y+Z)cSJYZXLt#+{lQ!OZ|4Pt3&LjxN;HBApy-;-Q0D#*VE2mh*7jl$ zXT@bT+)*Heg zLX$%n1apFFAvhvWS!yUQWTd*94zc5 z%ihO98w%|C@A$x0p6JOaEZ^GI2}-s6u-F2JYW5*?{h?~XeaxEV#vG$;qsgK34w0~! z{;KC0LD__b+#Gc8*{q=S;oovgpr5SM;r5}RB}!s8n|4>GLMyOWp00BJWzfi_Kcgqt zSKk%gqq`O0`Q*IrxD5=st^Tw5343qsOiZ2m%2W*Xa>_gmcknEOm2>c#%QUEtg3LTW ztM>`*#qb{w^8haxtaOOw^E*EyE|y$i&vm^WCc0Br%Vl7YWbgPV1Ii9Wg^~Tb!yRD& zoub;Hg^5s8zyJyas*%8j+jyd433@E-5H2;TFE2D0@3*+=2qzComm=)y9#@ z>9P8EMW*C->7RniS>7hHco2SL0McX=^_oGPmP~yjXF{A2>lC?*TnHXw*W(^<0X_0f z@CaEeF@D&gy54$fO^`oot$TP&-}cMSi9)9LC51Whi&JFSDR+evZ#gq6sACRY&RaVq zY2pRJvLPg%RP?ZrmGPS5=9_N>46a7c><^oCxBIj_2LvH3tDNFux=#>cW8WQ;Q&J6i z|C!Jn@0RivkB6jSQht=fL(m)$dJcY+p|P81`^w<M$Rk&T^|3WKR0I( zHh&d8u?4Atcc6r5u8bWR>QFD=ste`C&Jc$H)88EdeIblCv_e<2+oQn=%=Yr@ioiMN z{#4AvR)yhxS$Q)3V6H>GJb@p}%t(ejb}Sx7Wph5qZi&pgeZ0yh+}{D5{5q^f-y_xf z|FQSx;Z(2f->}-dVM}Q+Wh|9KrZN+iB!xz^MTlq_lBpGoN|}cw8KV#~Ci7gG63duH z#xg838JF2}UQ2ar-@o@c-sgCZ_rJG4+O>WA4%c;F=X`!X2Iq$Xrjb=ST>Nra(j#zr z;BV4uNiH;(555D0N3GF?B)JD4p=idWd}8K{nwe>GxBYvCdT4}WwT96olk~vJVSp?m z3kenr7+o)-ZB=Ke^5p#+;mr+or$P2u)1I~l`V|ajhOMC^r-_T_!;-G)QPX58lGsVZ zSp=zOvPZ5DCNPEyFMpzA4Vf|oi{?m5oNe`a(1MZKiF<>Q= z`A6X7OoncTovQ28`OoIVM)Ua(`}Z&O=gWXOpZ4L!0tM1!udeCz%-3n1x~7Qz!)b~Q z3dABEunMhe%$S(v6F&&)`^}}?H43 z3e%n@_NBHif~QFv)u{+?a>7t zP#2jV=Owz`4y(1>ak^!n`F|EEJWF)XeaN;uB6Y ziF$(;Pj2_T-8O(oF`*rjQY+x{8t2jvmloUP12RzX+&17du>FPEqQ5M3i`@ue)YC>y zL--pW=?UZhsgX(juH#Zn$Baw4)*~A+P2LNX@5&@7L<~n*dgEHHff2b@CvTEnE@HM} z;Nx_^r$XDg=<&Jy?j!e-93O>)Ju!d!s`kx6%#9F-W?aMJ3)=4Z^$ytO*>T&3nUC@j z!;$0nnD2xG>vQ>NRp9CJq&$;*`~y;=@~x`)`1xqBqt?BW7Z+}rZWBuV z9dc&Rk-@T!W$AuXWyNXo$@+`(3*O8{ENB#V$Z(A16HW$M`A%B4e= zKKs46I?*1q+8BXD-3t;?KtH@sj?SYO_hbRm1x2D)B`Lsx#bo9S?2vRYXosE8n7_iU zbw+Kry%==Wn_^l13Llm@!j8vK7!srezH<#Gq*rEVeVC1Ah8uM_s>wOjlS?UYl&^an zdj1v)RM5$X-4iIN|M5|$WyMX|MNQt=QwWx~_3wl2;v*Y>k6w$pe$M&OoxdTTZm_Fa z!JS37Xm+vJr^{YxvVF;G*el<6syobU=L9q6hDYN7i-WrcUMzn*BxE6VO=)}ht^3nF zhqEtq&9ul9u}+~yr@hm?vBl#pbcExWyagM41oO~_SBCy4p8c=M7du4g{wK~$CrO;zXx!!lp{nnINxD*d!E6(dD3nF8iYzhc>WO( z9nEH5z|^bep*$D^%N#r}`1k>&pHk?rY7xTR6TX4T$ZN8Hs%=@A31gSgPTw>n=BIo; z2xFJltul#*_l(c?07etRHiC(uo${^c--dwZabB*0h2Z?c-ZS+@_+_A49gMveiGnaH zl6ksiBNXHrDXp}@>7CUxgydHPKEx+!v8L%J1@6Cj)=@)ey}fc$_d<7m(RR)Y7Q36p zROIT@7Rvp}t>ab6lQnWri)6O=+nbfg7)A}O;9v|x1>b-FRQAPaOJC23bm-c+Y4MbF z;9^({<_}F!Hf}>KD0xB#GZ4!>nFVotM^%`>eCtu>)T*S4gX1mUiWO(-m(xSP==n=1 zhh`T{^?K!=E8xfU&Y$@4qS#g1oHO01x1anuBUA8fQcLfr$DJBRIz@VxJ@%RuJNq|iEcA?Us$vI6InjCIM!St6{ zD4=R4x4gT>u5;Au81N;98c^mF@~a=?dKBWjclMwnJ?0t;+8S1T-Hz-Q3O+4mF69$u zo)scW?+s~^cy;%uS=YI|%z1YYVm$@f9e9R{PLfTOaX@#pt!koNlkML2xi#q4H`<%k)+I zhYiThg)B}Kw1*UCoTfH}9{z>Ua2QVHcLyRG+fhk+4iFS5+la|SYT8~H`gt@*Z#HG@ zO32~c7H0O&gZ=`$EDXZPL+`Rd>UAz*E;n&#Oo#$Hg(}b!q~wzqPxR@Yq*m_al)EZS zH|cN}?4-Qj+(&ROJX`3LWL~BnM)kbuqMlcRt2Gjk({Xsr)~c=x&Bzv`u~Yx0Ot!le zh`B?xE`WdZFKuIA9rKV{{Hijz@QDO*<1i;7--J;k(|n7mr=;?Dk3-7U%d{pP1{KNld`H32Z)uwTR-n9EU9y;-)>; z3w9@VZ_ulOG{M+I;~JYoj8z&*DyF1_PtxNtkrbKThtS*p7r3g7R`)m9&VkEeLZZ=M{=7BKIsI%w#G@BRaXr7HfStBlF z{8;&ee~Xb9G`SU%?|*B&D9hFXT7ft*J&#x+V3;#PG=%ypjloKHD(?Lx%uu`AL8i_m zt&AakVe2byo4b%`6M6JmQ~xo2Qp-EZd(#7*a_@|OKn$ASoQ12?UEKa%tY~8U=&>V^ ziSuf@sixq=OwR_H*?O44xM(i3m6UuK5(s#1+N(jDj|}6Z&K*p_H9nN+Du#}rS<;9@ z*P^b?m&*$BFr#xl16uXS?9X(er4qpzmbQvLg3|nrar*?CPN&7uPPs3nY%*e!m_{Qx zWR{U**j>-Y^cWk9_zqw5{{#qxyOgCyGt?F}+W{Oq8X`{lFqKj|j4sT!)SYpZ)R0($4~tlh=YFp$fnrBWZ|R=HDqmvv2z9-NSqbS-=oUz}lbeH94j;g8 zUP)7zR#kYXOYTM_AL9f=_G%Uyg1rL-+8M3ezoQH_#*Y2J>NN@f;Qu;IP(I)?ygw%< z?9OtSX3FSf=g8;Xi~F7~D7V?YARRKVc6ACjjw~`Y6zla6uuMvkP`OaA;bTfFl^+;C z+WmGNS27fEsuBw9VhYRY3nN5FTO$wY9Nw;i4?_@ptFvxtO|rWb z70q+^EDlC}5^o52OMLIcBLkx}Nf4f6ih5(LK}A%>Bx-_BD8#d#_eqD=~k@&@4Ss`@zDWz*rg zzNV$7J}9(sQSdJzrb#D1d5PQkxnM)d(k9)j@j^gVbQYoaQqblXgZeyqQ#3xaT%5e# zX?MLmRfuE-eN-d#nBZ)DJ0ed)=CtF`By?2GtaQ)pcVlgEh%Q6@yfb?MATRt_sG$Bs z*PY>LN@+;Sk4yLJBLsb-0B(|YN)$j()263#rwDdE&ak}v3Hzy7SH>M$R7nDs>htgK zn%oT5cO5`bcPgj$D}8sFHxD-sHBDOi(c=nLRytgr_!y;iJhPe(@691wL?*pL9+di{ z+W`I~4=q|}rjc7nfoDf~y4Kh{6?^udFn?&Zi))D3aKq(ChO#A zn+D%JLxEbMv`P>4_n@Nb*DxlrWNZWQSks-t2or0%W(G(}3e;P$DOh!kt*Q-xQ_XnJ zDs89%$N+=PJ?E$JiOg3`Vyt@WdsRvHC3N^;YzDWo&W$AO1xcT);aR7%V}|jdZ2m^uP>ZsA9a zHG5c3I)I!gL@tlqOcp)u0O%=0m!$mGgGi&g@g>z@rq6j+SBZ1oVtg2}DbMziV*vcJytF_2;CudDj zkzsH2IU3XWp%3pldwyuz6)|&KbS*ubShl%rbJVoR+Q@rLTl62|jO_fVtwiYzC&Bj3 zk^TJw0`erD?aDQq62-T8Ry*r;Ej=>Pv%Ngc6oWLfOUJ)Fy?8N_zU>KP^Cs!wo1MOw z4@11i#apv8bjvPfe_!0z4r!AdaH`3kvekbzkiPdJs4RpXU$A9 zUsSJCU;fM-hBJID5eHL`=_cTK)k93sfYLHN^-vJNTsXg&HVN#Rlu^`=*zF*`z$C!KkF~R^EK0!h3JD z+@nVCBRZDYd{A*KK_OQRfM4QWm_=vu;tVChUW5W^ivs-$l;zPAzl|CvZpI1LOc1 z(XpuD>}3<#0Wlls0&uUB8A{%q%9^xGQ%bU*-+UO!3#w6I- z|117}necI^2thgeppMv1jM(aFI9A4mAA(cBr8 zG8u}7gwq2e7xc{JeN!(mzVa2zT~{DZ=R=Tcm-Hz7Sa&lC7ahCz)Pw7sD3{7cQr<*y z9_QL(aG!7*w57{H8|VX3=n39fQPXmJ=(-%JyMX4epi^lj4NuTkvkA+?fr@lIO1gyD zWz_U2`|=&N-Y&dJgv!QXg+U}T+vcYc--c5X2P27aGS70WvcLOx=(WjS(e6Og#nAv0 zuND_8N@@SARz`FE?m!@xTEfB{J8;b~DFDGu3aBg>#KYK0uu9n_O7A;USTBIHG8KYP zBzbghweAnVWRxO%n7hGHc$B3or}9}vQqQR0sW!z%xW@aSlThuFQQzaTK4EqOxdF0DYSdETUo%- zZ5cA)4>nf8JPP;ADaz%(JM51j^m#Q$Xh^2rIGYn zUlO32VB7Si0H*0Isz120c%$0>(4OVzK(rC>@TwPF0H)>H?Bb@k7kGsw5%ON*gAr&i zBNpu+VFZR2@$Rj|#m!}KOzpl|yk!MV zDTrkY?+~?KMdJ2Qx3{UqEBDwe48;-Or;rE%PD4KV$v8-4Yzd2GEY)=i4l(36wo5<( z;pQ|%1p_~L&@q5i@|%3}TD1vCySxFlmu-LYv}LI+3D;71 z6wJ@@#A3-D=-D%kKk#hkxjSU7mGha;X*S2-g%bhI;$!sYgLWlf3N{U*{tJz8+w$r` zpb5I=6J5g(9A^~5I=MIWwmjl&(?s5m*mx9F*a_L7!53&rtb1=wRoL5h`2S2Rc^=>xt zqmvaf(NX$=AHfb=mfd$kf$)p+myY1bXD_fmN8^Hfy6(?_3s&AL@CbpC*@^6&Vo6^4Viiq02fTlO4hpCt~!g;;6f}LBC&b%Z!Y3_5G1Mabn6|c`)C=)H>5iD@zw+B zQiA>r6h|bTmhO&5iF%_zBYQ`vK^($3zX$!8A~(*R{1??V;&>U+k}<3M4{>^&4=!>Y z=lD9gTEiw@K+dFQMWSg9;FcE}Fi!0=WkFCR?8yLFOw1YXRXR@ivN$}X?0A26qJm@m z#It0>gaDGjpe6KqWI9Np)k3<^p2Hn?&JlSk2x>5MSF5IR$m<3m|A4-YZ2E0^sAy?R zec?kv?l)l1OlopgwSa(>7$)qP^zJi{8jHM+Sz1}fw!;Vzg}bZXW6$AR>IZ0slQ~IC ziHq8N4F;1jsB*?^$R=!s)O^zuY%MB14+KOm#fU^46S1s1zPvEk-Y;`=RJ{}u1}gdS z^gz6-k!o_bCq?V{I2xd3388KN=l@2;cATY%7y-Ixv25v*iy^g+T&++kb#QK)gT93? z-!q;g0P}j_<1r;vyj}XpSXAe*a|{XhC6-FW{e|zB>heI`bl9YlIy%7-XwIld6`n$H z4Vf+YVA}p^|9DlALDtg($$yefS6dP1Ir=oWF3Wf zDa@`iVKp-Ce5z0F_HGg~|1t}JkY=74Q~|J`TvPTR9pmBn{?M zU)g=c4tx1`Ee?^iPC=_B+Z}~9vd`%dCX_{umnD7RntC||eLjY4#rooaTCD(9)N)+l zt}{Z61;zbo07jvGofg}=ZVkLBp({tGxgMBr_D*l;5Kcj$<%as5MfGYcP%%+J<~if5 zao9}flPK#;v7`^>kS;q6>DPSWB&{oU{^wYyvi#rysp{V*d@LQK$&4j1@8;iW`FPfd z8czZLmFon#x66P=n3>MgKOnrn9LB~2hDl%8xH@-p^;i8?PQw`G9I@968#pb2IEpa-JFWXko*@P}t>p0uA<3ub+=D}XR;1v)DYZ(pGB_g4qUZPMy zoXJHND*gbF&T6FYw7egnEYARL;%)9t2aJ8u=+~?huTmQOBZdDP735DbZN`Y#zP$*l zmGux7H#vO!A}xJuMQa8P1L*3z;I0pYh!39_u!G4qGP`s>B3neX3efTwcaK(U8G0#( zPh@Nz6tuQ&GtZWXmcC1M*?hrnZpx=VAt31&FkM(^I0H2f6Y`7q1%z(EDjqx`%{rui zW9m`{_jSRt9Z&`_n?_qk-s}>4*~s6WcItWxE`AZ5a}PwZJ>YEd_kwn-5vcpsp=p{x z*!e8-lUcy?l^-rp8HR|8VHEmw3dQ~^1hmjr`JL67VqQisD~|cdBPi;q#FV@QvO^y9 zJ&`-_K!z0mS#q-#fkmU*&e-AV89Ts;I)e&%nS(0&PEyJrK8XQ~5ry%ZbTlciKrXb6%RLhqkgNhbOC$plde%zFHz(U_reLc?1J+ zU_Bsn6W*z}eYKNZ#Asf;JX@G6V%aNXc~X$JH54Zc%wYHAxnf&LkW*1iWEV`j;J@{x zDk6y~6w?Uq=AWutL`-d@);bB~EE<=J-=ACLr)I@^N ze3^h#J?{}AoM7>u5~KFH^cTNjL_sf7%y&0Ibsd#!YcP2*=RdTA>(rtkWfQ1OIOsg6 zsBCDj3YxONb%v!svT*~|R`0dZ^Ix2+b`zw8b!4mN)r;$hk=7w*Ri~l~1r=2Wt>+mk z^y}k#>g>4R$Wmv4ZAdiX_aG~B)S#Pf9kkjMFJf7uq8bG{7j&Qdw||a8A+HVbt^ORY zMPzF}|0&JF8U$bb18!r<6R2M|Qk`4`J`!}JeZK%D(Z2+mwqNL}h+H=MKi)LF5eeve z{xcwZycmU%R8(~`M|N*OH`@9KM=}Jx|Nj#Gf44*vm5+n6p&B|SMb1vzbc!ODeq3FR ztZ&B;GivExtstIO@kZ`_HZP82jnUa^I8^G^Q7ecc|9k5ylB$v{AhPVhj&&r-|8cvd z3#ln@46$nz;#qBh1%3rPkf`L?64*qZ=hW#;hv=<8I3Nj+42uL(Ez#}FBhrXbYkc(z z0pq4STI@Sjo14F+Wj>)W#kY-~?_4AH)@aWo`7&S7G2vhM?<12|dQV#mN`1u=wJQI* zori7qm;dA2O)^MnpxcSo&i?CmeFXcu|KrdbVu+r1HTwh@bJn5T=e;j)?114 zhUMNKL=8h96VQFW!1UaK_@4Ykfy%}N@^8MP(82Uz4DgCk(uf7|b~g)B6aX_}ULA82 zwjFc3Q{-P#v`O8zpY}&^+R$932a+D;g{h)pkrTI$CfR~!;bh280g%DnjGmge77Ix*LIEm|e0f+52 z-7!GwE5E2^CU4U2|UocCe8=pKd zzsO<O;7-Ms<2j)RI6TE(#StT|T6*t)G_{LYLlR*EUsq zrVp=YqTktHHC(MTu!Jt_ULDaI+ghR!N%;BNq}$MMs8QTwYYQ#JbwAMJzkD^&t=69M zc4~v0w&D2V>&wHMUM`eXaSUS4j0jwu>6pK76?!a-eQjwHI}66&mx%D)lI99(vYHjK zel}q zQj3)$p(O02G~wSL6Qtu15G(KFM$sBV#h5BK{kZ|_+@HpS720!+hwTeeY9KMfEQ9VZ zOowUrY@_EYSYX7CSY?OZ+=6|8f|y-liIwBR{a#Yv1B*>Qx7_uSZc5R?~sfps5xiFLPa9`IT;YZ!U4B})uQbrl#Um7PWpHH+X% zZPZB}|ExU{&u!4Z?=bRgvIeRam1-L8)(&E0+f4f|S2v>5rGp#Mz2MiWI(hhno{Vh* z*`$4AqElu!`IwMiFt8S$4=3HVQkH44UEA;NPs#qx`{75ifp8O#|KTQR z5$lTi%%(4HGP*?`yg$mXoquBnJlo_WoCoQ#?Az=XC+r3UZ7ywGgdbFF-5HF1>jX#{(RMK7_0ox7H+Jj1o`&Nv*s3j6s=-_7nu(u z*;pyBY~gUD=&P_JxXA4kFQEH+CEKeV|9Y(v&o))3#gQqZPU#EdqP{50+QP8RCzSIr z)7Wdy<=hy~pHjK{t!HiZ8kdR-EH!y82k-qf-X>L{`@d}Z^VPiI)vAjWUYHOR+8_60 z8nu)tTd`m|DN5+;9<%=95la1Wb&G@$EP!ZbOhIk0C}!U3CLHW>?S&LkZiqmCAR%Rq+|Lz+yeqq22Q4p-N490yH#H9@+!6yCmtO5t!Xo-1zf zPG^PIVR%mW>J7rqp+|qn3=`;X?Dxd+4qEA`Fndp=)I#^zzPPNdvCRvufViV_L~L%@ zt;rKV=t=AU)tk?IFY{u+QhaC2JE09t+iMG#65ewqAYp1qjAE39}SOwwd0U?zB6b$#e9ssgL^3a*FAI{=bKDw=$o@hTw@tiKE8G@ZYE{cp+~wm zVJD9TM4HwxH22zb)w8TX>iuh4JSX`;G4?p~bTy{Nq4?H*jR$jZmh+I7TA3Fo^ zs>keC7WQK;zT}dY-(|L}-Bzl(AW<_n^wy-*r_Gd2Au0zrn8-vuC4YT_&YJumkHRz4!KL*7%#CVb*Znhk729hIzwXWDsFny%4aF(9e*Up++80z3!Dc{gKU z!1G!TwLOsvU7Q8vB`XNoWVy)GVLpG{T5y{}-d1AslGq%_7B>3?5ru?#USX1LS>7Dw zb^A;wQ-z%sTYIf9(NMHBYiuw6`#yB0OS9Ty+x;CDM&+@xKO+-}miE1U`OGJ|2!CJX z;t*QVtcZRV;^~9vg9fiyuoUvXj-6)#uyZ zXepqz2+V;$kM!RkvR~fNRo}+ZzYMrpeWDAYBI+(WH@`3tAFkcHu~$3PWqU)fC6}Lz z;M(bFdP)xbi*gpT>R}?V$YFubL-@~geVhE3pT;&tJooOs)s~TXnNZxDrlfi1UW&wX zA(2YU;i_$D$3Ee*JU-9z=rQGxCq6Am)uCwEH03N2dtvgZEe)Qq>}10K=PRopGF1zU_JLr03TRFvq7N*2 z$D13StCwmxh#i}f``1SpPsESsOxz?hgdW*ZS$?YG#Vx+i^E%+mMwyeo)@W5z6xgci zmDQ~tijUL!$Pimnz)?ZwYLq$ufOv*tSr)~mV|jUc)vqU#s_Bte|)iA{c-d$2#u zUMXW zR-_W?tF zIx$xqewS@n{E#AArk3qq6qTX6m2xn}%_`ZVO@Q$)Ic)~u!RG&bSYKI?o)1O8abmP? zhSedMq)vcPc=1wL;;bb1s0Ha3OIPh>PWtR_o=BbRac)sXV zLOOn$fV1i7*PYjjnMrGP|$WZFT#Q zt*u99o3E2{zkA9uMw2`yTx)<_}T&3-|rCdek_( zRY9gZy3pN%yz+gbeoCM)>J7ax9YrJBD0Vgd+2sK*D^jcNX;TiKP5$p{LdV~=}oO2)r65NV4TxwBoX9eG$IPq{cGryn&s%lU zeNWL-Ei#phdH+yUE6KloVpZ_*K1ngW@`ish{`zA-|5{r15sQWZQabNj!f=#}uarou z85tiHDAu)K%bU*7gl^nzLc4xH|F{fd1FyP|J3Y^|daW10 ze_d0z8>AjR((cv&?va1eop!0$zy*! z=zK%l8KqtS{QIhd(d!qe?|=BB?mxar;=jM>rTF>>(L9dH_V8wL&Kmm_*8P5@&@UJF zz9*V!h(a_yg{#X0(SFmi5X0KI!oOr9i2lC*=N|-_eu~GwoiIt~M`_)IktuiJ{#ejK zlU$T)m{(1I#oH1zffQV8UMUR^ZQ z>|JG&G!~#lJdGo8q)t1a**3_4LC>==6RI^0uXamJt`Ev7e$Xi8XW}D5bVto;!%N!- zX^vO#bd`Vmgqvki?x~q6-{}8(CO5$S4;3Q8B$D~03T|Ts$l?~4%xn{ z^z61@E;C;_)DD9OYDZNUq2{MuvXSaOgB9{VAMa22x_NCE_R+374tLeRZth?O7$e2{ z=2@8>as@Smu3>=5LYaEj$})IXEjI|61f8Dh%rUG3$Cv!s5bVob2J~(xr-YoZ`^&!D z>QdJ~iePI&=HHVLu}ezGems!rWL{v}i135a7Gz{4`@V`3Er4r6GirSg1_GY2Ud{-?V*n)6+xu#IDS$Oxw z`mpB-+y{Ri(;pKbFQlHyXPuTC?s^6`VNRBi*`RZrl75p27IQbzt`o^s$$^}!$<7M!kx|;#qr%OX&=2FqT&T}1+@WQo`Oj{*AT$-C$nh9~qPZx$ zf9P*R@mixIN(C`8Gv9e*2FYJF8rA$tt}qh~Se`46UfOt=R9$;kY3`D%c2r1^7GZ&W z0G`E#O?gGq0wV$YP7|#y(Mj8SVT{CL*Y3!nT8^ z4^X$_I!<}8!dw+mC_Wm-sB&C&C1LI=nO-3fNJOaWPT1&QFnYCZ?fG_+*TZMV<>B$w zskvDcDaF@0nm?iX{n%{?{iZ(ta&*#EF%7f>B$znFx_8~}jkcDoKB2Cm z|JVd@rrvfRp)^R{gNZU>*89Xe(Cd8`)ij0Sdd)63&XvK7&J8Iq4?02ftM-(hI)Y}| zUc6fc+G0(hwLGKy4H_-iDA_=D|9Q`%*O3DGpXQ^X;PJ7s>I=yX_))1XXZtZ$$~KK` zaiuVlGv<4bICwsSl57S{7+x9^4$fNecY zlr#(^~Qj-pZ7^@FlYvq*bviQ@1=Hqdp50;Gp(IP=aSr-%d1|eAF`V zICQVf9a8uKnHRNSL6o-_-a$Ec#Jc9q4j8Kgh*lx>+z=`!7plfNr{p7m<7j9X5s*al zPKbb)Ir0Lkq2_sL)-{9$&_U@D{W|$v%-t+&ksLK_Sy*+?odIIw3%bs2m_lrn?qSU2 zS!B!ae?R?T>kavz0&H@eq~FZb_3ry5Y9gwmPD6?Ze{B>-h+pb&uwe%Z05@*ky4>2R zTvr6@SIFrBJt(KbI6i@wE%ng+$_{fX{H*|r6GcISl^TPw@dSc!C~65OGGP!Z zPo5N5wnr=7jDTNHc~>eLg%?f{GnY#DRhXq)+w_duYtvRD?WJjLF5G;s&|=4A{PCK` zDnWGhwfieVWvAdQc>Yu}%^Rmd%`!zr>xO|SM z=63E!YTh%D>3%J$zV)i~B=pb4s-Lt1ov*-%vAI0`{x8}y2v*Ia^)AYe+|T$iyL0X3 z1a+KB_=s}5T%?Dlt&`mhAefqP4#mFKmEB^RQi!g(#AZr;X6`R9!L7fJCjrp~6D4G6 zU{cm{JD(Vb)7-136+twtAuLRJr$Rw_CdqMAVapv43;?na!AIKKuRRccAJ}PGxNIjp zbtO@g_H5}3yR^V4fT{_Y*>@C{r8N{An`<{TBb<^u8;YeY$}`$coR|Lo{d6>}ho0^y zIdo)u@=hdRO$tplz~#lvaIzo3Lv@kXBNiOS)t%a6di=>>Ka23_`TO`#Vrl038J(#o z!)5AS*H2KPgr5Z=^Z1)fr8+JYwXUNy;YQMT`TO>(+BOeVH_r&^TA9s8&qOVw@Jxg^ zk}Q*82gvqKZ>c0{w7kXv_7#I@rFg)^@(QpMSN9+~cfs8LORy z9p>j5yO8X;jsNAhjr?0JU?k98i_Sh7t9o)5{b$Z7HTewpsE3}mk3BuNYS7b*oheJO zEs4}Bqn?-TpN(83kgbmeNK`64t;82b^e?{`6T2Crcq}(0yp|1po2dKv>OjTUD0e1x zl)Db$A3Pyklv*A`Hh}X}pK-GHS!1oYvOY$~lJRNBTXqdwM3k4_zbtKC>(F^z#nhN% z{*%HxE7A+p4``+J_B;1(O?Gsg)A2Ig;J@jPxN>u^RsBO-7Uff`8P0keua`LxkKXA7pAmZ5xa=$;DU5mc?t2>Ok3k^X# zQg8&Uv7z0I>7e2yZGI(|OIN-0^dAlCGlD9`x;^Bx-m!xqlm}H$Z2u|$!-ud;T8agf~22Y3< zjqg}{ph^IzzYRz5+25ZAzUf=^tYMvg$u!(}nRya*T{!xtkSZN6_@=Kg9A{{4eC^7? z$@g1i1Vy*pe?ueC6}AGl`28J+u??1=7%tGHR~*+1=DUSX%h!NT!=A-4!NJ14RQCsC zWR01eid;4k~NylOP_!E2moRMay#tacVs%Viiam*R7}S1 zgExGepyfnN*lDnQ_xrLcoCH2IDA7z2dsIF#WO`OhrQT~w+)R7-{a?h%Am{lY&4$rI z8E%fnmWp??oSap`)9fr=_HJJdi=90!o2jVim{u;AFm2+j=J|Det|8j6^kz8>8mMcL zx5NW92_ef;CkuK%VXXmrUIO)S*Us8wPz!0xrsF)^yA}0fHoQ+t;O|P*0JrA4geuHe(wl0E z?qY_ISAZo*c2yq(x#Q5{h-kH@-igE7Uw9gfu2@xMl0X{D|E5;jEGzggfYd@G@RvV@#@OgS)VGb?o?=t%^N(xy)iisU5#XBg&92; zAflde0qF607YI%#T%hZ5#ie+4v6w?=v9+1KeZ*LdrF|-b%sK*XelE~nKj;EHHi0gv zZPA4mKOpANy|3xr!Bh|K{)K*xTB(6qxFG$SzY5^r}L8m#qX06RyeVQ{Q@}=P6IDAy}XRe<$X|Sv3j%I!B&(e2V(vz)(4YvurR<~>0iPm#^)bb5Y zSIb`uOhwu^IC(7I3cjo7Z=`h3&u2WpB!+BEMP(c({wS+##%}-D?ZXdzMxbZ<_H1bU zXY0tt_LhR|E8oww7g;Gj-cxmy{&B&evL&-LV0N*?xooZ^$(qAT=6^^8vy~a;Uvyr* zV{S62xF9Qdt^*n;l@z@S5t~%mel05i1EYaodIEhM%0`%6EWO_p4;%LJzBh9R z#>%t(s|HCQ%=rA_sz`u(oM;nnAeFL{q+|vne6J9_KtF! zP+UATmZ;y2mwzrYfwvb1T{G!1T)d_pH5Yi>CqPhbOuwmGHRpGVv=v#+6SIrx!}z~| zHH%a6JUw(LGZAA>F?yr74uJSw?0NQFMQb{2<)LG{ujtbVF_2ono+o8B;EHD!-!29P zWNcU+I;>01b3v2YJ0!%W_;)LAOGNWyJ66WVSNMmEM`L&e3WqV{o>w)r25&gFyCz7( z()kiXE-M0q*O+~Ai(|=9)R7o|^}L3_%~H^X`wbnc)-+tFujEkt2N*niK}ht98HFbG zvgOyVHuORL()|)xbrCOXED(`BM|9j))NdPNx#<)yAB9Nnt@y<8R+DZ6HGlpqSN1(E zI?S%Tgu^^9ymYX}o=KjwC;HqOwf(;r2d!tETtUM= z6R)tH9s0Uy0qQJ!<{4d0%%*urX)J2#`8l-r5Et+t_e8wS(paqoAFuW9Mcn7B#BwK~ ztdp6ma9*nTa6DqdJF{O?5%~j2m{)^<8DP;~9TjevZhEQ_|fN<*L)q^}cl3@p&O!0eIxRGCwA#yZ}UkZQKt-)UVWklAi5}LcS$* zo2SjYT0tI;hN1`-Z`3Pp+CKRC8V0e6zZ2>YME;$X9wW zb>UM-st8;Z2^5r_IR2F)fmz1~Z|ytunC*?mjVsPojw1fz&H8j6-hQ0BG#{6eJL;*Z z%!K2@EzCDn38ef(P4P`{AnOGh?t-=ou*oNl=OKE8G_N-ZtpwI$lI*-nP8)33fvFG| zXq7K>;nkb}{I%dYAFV@6$z~wky4C*Z@j3N;k104FxA+e=oL+?hkfbR)^%;VqJ#k;& z;21n&5^t8u^alb#hL@FO@&b%2oX7z@!$_a}TZ(1IiRb;#6#{Yd-PNRy_wX zl)#z7q(*vw!BnYjWQsZl?>U_|3!XfD0PKr2gY=lI;{r|Txh1aCd#)rn~YfN;$R4kIj%7QkQgOc ztW^U%xz#{}Paxg)0a*t#j-w6{pcpHZLnT$?N`(2oxQ`B%dy}~9SejOg~6b zAlK=)d&zZ=%ar7VZmr_~b(m}h1B>D@Y%BL$6_${4`VyP_v zHS0eEf{H>qSRfeL2!sWihu{z`P-jvZX9^D(vAT%45UjA3P~y2T53k8KotLt2UheC3 z4!&F5Fkfm1i*?Bzi4v!8f;oF59PNApjCu9vh}Ie!EKgxc?_Gcfnz zIBM^fL%{UHPZru!t~Hc5iI3fOlR{Pz9YmMamGM>ItAp);#MYn7ID-NE&#?p-dtTkJ z;yn21n=nQHWE^%PF)Qm-^E9Y6bT8)Ya~7Uhc^#6qdbe1=mH%#hzGZ+n@3(l~sNicf zmjkVON=rpcG74*lvQiZdoVf#Lt8zp+&A~KDZlR`{#_;?Iw#j^=XeF}ixuy;y9ZHzA z44h|pX8}_|X}C1-hwU_rl^e=iDrJ{SWN+a8s!+pqONK2@>-Bi?yS&dgX zaq9L^1F`p9t+B?{su`{kH*nzSXtMVKE0Jg;AiRdFgG)?+J13dxi?z~bH`>&ssv;| zbLM$p^%mNydYx%lG-(^>1DCXq=&6DNvkz_n^q$F?14z=>leg;Iw4>p_ACCnb^?x8Y z`$uSVf$?oP*awEOL^MSnW^VZg71vx?ItI>a7Gn<4*T;PPB0mpscsXh@yZf8uQ|vMm zw*x-o#Zqo6!)J6}IiAobbuz!ZKc&93EQ!v8b zZXKYsdPZz72Wf^w6;RXp5aPcv2r4s(?78!`N>@}Ai_t1=CF(U5eI;0Asj&(TKm3H| zrd)uP@&-(bO5HG23PXBsM`JE>wU`UOZ4zLT2LD_~+Yt|%%jtGlTf6aX$XDEY3;c(v ze4h))Y*X{?i~>=Tq0AX4BMAk-^hKqBw$9ls7Z`YUqIl8fMF^QiOP}H;jua_dBZZ=p zebtL+w_-yNOT`hwYku1|AJ91X-2pic$-59KO3w9zTzmi*Y%H_6TpAB*;u9&$GlV>4 z9RW$1F$jA=>%L0nbw?r2-VvDY!fxU~^NHPpKCd5EW*7AFVN=J&%QF|tyjnfQti<@ znOtbx36tVCmjinxYH=zf?=(iNbu1v>uP{!=8cvKTTi$E@P_MwjmTyr8+E=IrW+2`P zU9bk_WjdPrS|DG1JkJ{eRi#G;-Dt+xV;pD@&#gJp@|mZ3!^Z9wrz^&MtUQ^3_YFlR z`%zEswAI+JcdGcBXU!!C3zfEcAsn8Y)|l5ZiE?Nx(kflO{H(xkMR_$VsS5!qjuWlT zMWS{co;FJm*cHALimL<=TBiI+MV?@H!)txumwFP^&nj*Jp6_`=3v2Kx)wFYr-AtI+ z(T&f(=&?puWt><&=v!};cjTC-p-l)sN!Bl5zQo4rO7ZwqswB}iFlz?Cf|qrj#jhyB z)izc%K9tM4$c83e{l9-7knZO|{#amM*}SsXHm=txKVIGPzFVwF_Ct$)?Z>5N%C-m_ zwKpl8y_#J-MB*5iQfkCi*eRDQy=m*b+m#R_WYDJ1H7ejQy1UEX&~e8n^yJkOdE--& z{p0oA_!ZVC4YNxD;%9>fyP23P299B>i^nVKifYmCDP-p%SvLDT@!6AMzxK~1vn+2S z^Ku{pvlq2I%IEF}+gL7EWHs{c+`_irv|200vR#-^+ldhrntwo(kolvf$bN@x(`wK= zUJNxN!{!TzYI6DIP#l{cDWb?Trg-?$VR~2Z00u%VuWzYL#Uc8=)oq|GjdQ!p`7Erw zC>f3%05UMhzR+_)Z=s=;-ssA%Q#`u)mC6?Hp4*6oL&SOytIn1~5=oWFX>Cf$QX6@y z5)sE+s{_e?ftAFiK^~qrEnFBy?#wQz01+3?Kh|}gV02C++UE_aF!%GQ=YDS08@t#O zo7fQ}u{7GXGWu;CLSiE6S<06HQjo7IBxbfZcN#WKNMTM4KA?5{)~fpV3OM&-7Gvij zv#zMVQ|k~^=bW>A4k=dn+jxgpV5h(z-YX43crEGD)9Ji9kSm7#2(5dB3ZaCjDbF$! z08+f)%%S2CMr6~#S;<}E(x$Ct|4bA)ziA-PAGY%5Z!EJuf&?kpx%u#nLStDF4?fbl ztC((RacR+sW_0oYY3J7V4_6}#F`X%|?Y5;b21cdxn0mP;rU|EjF^)ZL+mFBb_A14^ zF>QF(G~l6I-v1)*z2llb*Zy(a9PZyMqmAT_t!BYoDF35G?vY&+vJg_EZ809+ntK2RE;(ab7w3O=_^b@XYg4F;m&OCWD!h`(1{*w+P)-nFGO0 zHZhBj-Tp{J6k;Nk9Jb6$z=ikDa3DZwCHCvVWnX!}KU7Lg!B=_%Jm_LwU?3&yXG$Qc zq>rQYktX%}SB&0&ZtaIT+)~++aOd=F!^HH*NSyyVO$YCP zXG16xC%6Sc)<4u9`C|q4UIuqWDaEFZ1Hz?*b@^bBIA_@0qTp5Uny{JfJPchVFXjZJ z-STc=0K86oStb1vowe3pv%An$@90lcsZV#Xfb&$1i9QzZXpR)FZ3}d@im%k7qLb2a zt^Qa&f{32wWx79pR_E-IlUJFI!ai1KpPhwA^T0fo1bVPcRm)=5Dg+g zb^^7B%D&P_3sVwPD;p}4)tLUl4%ddA5T4B+!Dgl4tCRC9%7!jMqjgnZ=`?6xs4?r) zsOeX}T4?I~u1>;%`_G4R*IzN&1i3|9kst(w8`8f1$gQw7O3=Q-Fsi?A=xZJFme)kl+Oo#tw?& zIDky*Lo$8Y(WOovrnLxaYjw9C82p}APMU>f+(yao0f@r|d%BTob=4NY$N95QfDvUk z;TT?HK62?ANT^oRYLYkfpNY=hIhLPh#=c-g85mUY-A@(`Q|THDHL;AibX~^m+-Rm} zsfe6dw-kGW6krq52rGHud#aRRp{@9`g#ege77AnWtU z1DbM1@yK7LL*4k4hYcl2t9eXD11JJ8KRdm!t$q5-?}H7q)hOy0-@2;e`T|jIoa~DoQ15by$>b9rLj)QX(GQLRHXx4>_W+FZHBt45s7#I?oqX4&k=5LxXQn4EEr+t8Wkt4|5gd8h@bS zN^?%n2Ekumx;~&nyNiewSHi1jbK*97`(D`Grvb-C`BrO*XNqhZis5(A&wS6TLlqRi zeVjdueTmYrR&yGn4VaX>BXN+O^z($dg<-hpN5p5g#?pd2PIV-4(=I{205v@_H6rTy z=9r`aNoA%MQ}THA-P`Pa#DDb>y%TCFL2?9Sjr^sW{+RYr^oXvHFX8Mp7f@}=BOdhV#8z`p+s5H~7H&8ka8cyE4+QH<8#BcQ56aKp`koCK~q5QWxX4;XED!*HD0!99|p(N?#P~6=fHFmQt+LS=o?PRom_NhFV>GNTV1s>sChE;^yzg>WlCoaTMM9_V-HV z`fyv>;n?RT-QEiP3 zCt( z-z{|v=y|@f5FtpJM;1UC%GNiy?@UWEpz)2Ci)3|?XgBd7eHxkM1vXZQQa8LtvG6dq zp4u^6?-|;;C)ser#{MobkkY+0eBpl2d`g{Z*Z7^*Pd6AIVK0CJ7nSE2UQqVwF)jVa z<6$qXpgPn6br`6Lif=8dAjU5VPTQ?k0u3~XLrlsEvH6$t z>w_#NA2`Lwz($wEQrf89+iw;@^;DPw@YAYEEwjip&7*x$#Ttvcf&WMgZ?7ynW?)pZ zfy1QgMoj7Ei|0#$1M>$5rV)1Qg%7x^tst54^it5!4PHTIKCxQ0PaZ8gln^DYCeF}& zYeD9#+^^fkpUZ4(sO|-m14BX4gZ@4jf-yuUaNI8i_06qokSg}@g(KkdjRoPl20qJ~U-H#-8OJtOmZ*OC zc|8;XrHE!x!%$g!G51)TvIvp5>`=M%Kp8P`!KfE#7v@fg;`myIbSh1BW2}8o&*GaV z^RXlhEioL&TDUn-yd2jucgNj=Sc>U_z}&l@PKvcu-{z{Rz&!`Ye2q{y*q(wy=iOrT zb81hQq>4l&o!0MVGPFwO1sPYfv^?*RC@To_E)fwHW{g1(hlL+n`L8 zBQIeK#2Q%qyy=pDwKlBIt7JLffoI6b!vUz6jXL)0izSC7%?}9nZx8rzc?n+xK!gf% zFV>!dpcz&Pb@rluHO_X*bQRj}PTmr|rwfV+!*;1CF>S*tyhJbn>;q;;9~Sn3*EGF* zC*_3fR!rq$`lS#@vt8K4c2wiYSW5GOzlGEx4%8KKj21ymbV8@|m!-(!o`1#|8lLnN z501oN=NntpWhOU;sHMI;*Gw}QoU)BrFm5SxUWXvuANJSa(kU(_94gf-xZal03Z9^h zBaJ9$z5Fdd@?icMb;-MK`crd{ULjE-iqVz#e3mhJ|8m5%`gGT%T>KA z3-1g&ZaqYliSU0FAVADJ1xSk9Lls-*eko8!*BQ1Oh%zG*W6)g!9tOiuzxHZ&A@B$= zKGG<;&nc7aeJ-+iaoA3pmr|5f+oF4Uba|5_xjZ>~X7AK7sXyIwe(z`g?CDwAfORN2Igijmt)b1Y%ysDtY@yO_7XrWPvpfsm6A z%*%i@iN+!ELjPq0qPJ{7?&jW8$Gpy}8BJS1Hn={5LA`h{bMz-$8;g{mv@YwhXhl$)ERW|Cfo;?HNkK=qi{TnnRU! ztSJQ07zg=t1|Wo}-Rx)99vNtCwFK7V%BQy|ad7e;ywo{lq3A)|OLEp72dG8aBj>%Y zsn~e#Lp52hR|K_uq~S75g5$0&0aWX=9e41`AR}j`SQ?huw6VZmA0;Q1&Vij!Bdwi# ztR-z1ODNuFFzl(%pq2kf>rR^-3v`5|vg#CX*!*D#`JxV3EoJt-v6;tL@+WOKDm=v~ z6N~68d*RE^Y_c`;4?N0C#1J9zY*A(2a@c}xgZl%sTQmuAmupPB!t;Vs!x!5xmv9PE z!H+gzochzx`5|~dd8QkHk`jVR7$AF8zC-or&dDm^whuc|BzloNednH|@hwy#pV4PD zzLY&smjA$Ni2I-+cjc5&!p7y*wgJx=Qs;f&VXXH&_!5^&=PN9bB&*H0*YAS7tJ*mb zVVPhi@SNv4yNlAyYL9~iK&v_8lk749copIQSj5}@m|VD<5O!;ibkH8`HeIJ~1^3l! zb^A9k3AT`?v8uL5w`Mxnb=r$FRWr*kC&ow^UECNe{>5 z^;;8ZHK(_RmntXDP!|68NCJ)Q6fjw9}=U(1U^5ZZ;NZRGXiSL7|_u zVkzUp;CXqX8GE<+fn8IkQI6(AXJ}qws31R-=Tmd!qpajeVyb`%x2|3&OB>%hj<~}WR6_0zR@NzDp)16yx8~7 zCXO7#2{0hLtgy6YveSN=ZY_^iWV3&4@pHsvUFpFJUp(V!iUajC+l3Ra zfVi`RK5!QiUfMj~CWoxfCBi(sB4l2QYK`0|4na~MVp0m-kw;lsnm~Y#!Co2=1*)8{ zJRBg@-#|5eD*=Nd0KD#eGLJG*{djo&t2xIwgoe@RqO|ffA@TEL4YtD9(Mb+w0qd zwdeTSiOPL3*4c}ay-22gIK@*KVtjihAsUeYJ!l(976b&;S{odzP0|z-zbp0-?zrVS zNnW5MR|pgi|6$$H`#51JcFS3rymtAY@- zi_cb@SQ2KT&MHDd5*(BIyn}y7%3-7bL6JCp!ne1bPsFA?IR||^rivEv%)PAdw@BD3 zc?kI{-6Tzurv>dM{hs^o;27lTCYv<0$xp{1lA5&u-^PAIl;J-P=Xq@npyrx1<-u)-yuA>A@%QiAJak?mNgtRCxcm&u z%q%vWePtACuG0&dxn{E`0pbns%D#|zHwNCsGT95f^)@>30~D+3=XOMcC&nzFhsQi~ zpsBt;bJQ9bT^mh8zl>-x*fQeAl<4!c2%#PBHaWQ z9?{-RVBrA-5~S#{w>Mlq*6eSNxWZMKD^lj?B%DpnGkw{P)fj%!`gCdkPe%S*Df_Gv zG(@GK8O1FA>m~JNKQ(guG1$$icmxHYBO;BHX**L_iRJH%J}Bq)QahVV)~4uh)EO?v z!1J-K1WMg%<*RL&r=tbL(p$=K*49Z>!G(!+&h&Zm+Wjisx`X30<0L-Lkn7mo^T0 ztK44~49HPb|1YQWz)@ZX^KhBGfTa(~3EPagCmHNQq08@nr41CL zQ%CpLVH)LX2KlkJxfekdOMw0{8Q{63wtU@JD0XVC>!?&F^u97GyX5rhmIgRmlxdTs z1^+miU~6_zJ#dZNLLcJBBElqmYkNB4)CoI z8_Or9a($iRQTYmziA!KjRF_AV_jxP+%gEe6k8C=oT2+EKG8CB)mn9WF`_Xv=#SkiL zi;;PdrB#MW`%ftPM|7&&fm9~B&hFB4!LGgFcpaXxrIBPRnsz7*DSGVpBLXHMYn>qm z^p!I>X_5R2!WW-@Wg;SvFP<|hQA?SmInR097hm}i_TE$JfFS*?0kpQw+UqLC||Q%>v08}tC<(7oADA@%ky zU~TzkCx&PTwB}3mY^nha?5ai3-w#ZjFQ^+5eLh5HvZFVrX%}cbBQ#FkaWOz$2lr_(Sjs zxrtXVjpZrC0Z4iDj^gKK1>(=Dv$GX>e;h)%-O4U2B2Bed>O?@@TDa28)T2B`AF(oX zaA5a0kdeV3_G69TU+=pcQfXoD;joZX(Fi%91zB8yQg#B-)cj8GDDcpMz*p2WgCylC(crc5vG5}nzJ!Pbpzo_KK_w-4*^0Z|eFAw8-a zWP#`?t!@&4B1~k<4_vobiQV<2`3Y-@!xHV3Yw zu_a3IC@;fy&w(Y5PUI!HJi;E*$bqztzSBTxP-14{i%^A7aX;QDA;2121lCvk>)FYAPU?qYaTUu#PPs0!1Kw{oRfjcLj`m{HFsLgi>K0rxT`2Bv z@(NWtkz)tu@k?;*OQY+THqec4DP^SrL}heFY#b^g3LaszkjW~~q?ga7XRxVGljW*e z%TcdQoK-*;G;q==kX)*C#}bXq8S*qDsy1Tv2xYK&tNLPFCHk&@v#xb`QI{->dIPYI zih524QThI8mCgf0FlYCsUk55$7>MWyEfWrMUpTb^JP7E6@aWaGHd#?=!CL-O;)|+% zC;)*m&cPl+V=O4Fl*KwihQYO+4k!Zk<1!Np7E#*ks$wH^>JQ3zG^&sIh$>mAQuXM#ae0V6@1WvBo@J%=3= zIa$`~DR<>f5PVP#qRF>b)}nOBmSt!QV&=E%6kUO7ZAY}K2l{dA9++>{!BgbGIxMP9 z*b=LHfh=Ol+q!Tt|FU&&-O}_1X9*0eRd-I9o#0vDpIWF-tU4UeGc38~pmJT(wxE5$ z{3>n`LKyFX4FSIs0L>jh%VZr_6w-AKUckJ&LbLjJ8BEryco_-XnzYVc_8mtg| zuC7Yzt=r-EXzzc*LMEyKBgF7$Lc?SE3s^*y#{ql*{Z6=WVk5O=DlaPp<)uahgwa-| z1b@ud6q^MH6!)o7Opp{tgXsLsC(*DEs8pU!Os#RxbiLcEkriq7%sQrYsvUMjAiDOs z&6og|PTOk2eXL9#dU1|8W%r58dEq^}N!vZQhTjLK0%|}Z|L3Cvn63eB)%eRj0ggoE zi-+yyp;#H+b5bJ?Q(Ow$rL;?8(aEg1nDG>xA=xPdKl?VzZ!3Ku#Ff4`CiHxguM zBsSimwq9s{hS<&Ai)RW>KZ7=pvj_k1C`XUBYx9V#Yf|@DU$L?Aqy**B%3-T7J5L615guSAtYp0nF+;Ci1!wBJ-{`c z2T?+}GqHOUex34%+Zp8&cq4k-ZnRI2!T;mjC7DX}BFgx1iXzV$10)GOS-!(52Xwn# z;kv7#RyW<^aHA3z9rO2tC}{3fPZ=DPM}aylrx(zbb|65hHcB*1_mtSz?4Yb<9+ym1 zlwq;V47%F8xn&D4>fV<1vZtK4>l~-a1=UEFk#s8+_0yPiv&Iop#a={X1HhEE_p#DY zMouXwtuT3 zit0%DvJuOeQX?Na6bLWl<(-XbsClO?hOoUKBBf&<!M^ZmQ^VkK*&kA2#Q;i2Bh?PfErp&!Sy^5>NBxd5OXLdFpN z4DG?;Dbg$yw0GWg&}}TAREx_kq`Nq~QkXUfB}H&KLP-aI$pap^7+A;?%^WJSt0FwM zbvp3=ZD`nEKq9X0?SXX%Ki+GtV|c&5CLBqurj|hWJGnDgdh7El`E(?!Pi&q7I=X)j zw?Y*TP)CNY8#EDtZ4o!0l?t5R9*qzS+IEOoJD~4(i-zdyvY9hHRwi_7vLR{ugZaPg z5yyCzDJwcnVb-yk*I~24AjsFK7qlztorCZ}?etu@GsV_g?-dG4=q48+Vy9#iVK#lJVe2q&(`8jGa@}f5ro%8=#g`hH#X70qv1S&4B$?f`0`YTw z)i%gIYszb#gHUb5dipV)O?07zs7NUmzX@5R4qR&}@%6Vg_<3NbCGdQYqVe&T=8y6p zf$`@rDAWLazXP83R%Zqp83OFXZ$dq%4XgXA7vou!C!@88j%rzL9TYM1bB@AV7X3(2 zriEFVSV`?RjYHS?G(DNqg4XCegKUJu3|pmp`HU|N}d^_ zJ9i>Jdk9kuY=JL4K5t|8b%>!L#mb0Jpx;;^O*UKe1K?A_h!;@rC>BQ!YVVd1v=D`1gP zO=2BE3J`<$oc#cRCgvoD)Lavuyr=X79IIb;|J|`7em+)=--c$c#A3}g`PQ+N8b3gO zc6_*aGl0M5SdWNdxKacTz$h#Qmg3mx116r_DQgyQ4Xg12Rs$Lqy|8)_s<1ag%s-(l z9aURjZcZ5erxQKy1In3(FGwNk?KK3Iw)s##@Jc0_JSZM}lT=jio|)sZgpMQEq!uoJ z*nTtB4RR5jqdMj#By4v&ahT)6UN$`L=+9dMoB~BRp11rQJVSHr)R)X4e>pSAgZrbT zz3U=*cu{A558T60R~09LGFTWFsyAlSD1A^C3GS3_Lc1h2Q4leTtUa}VuFt_3n!1H) zUP8%~^?{d=(hAZC51>uX9W$!tw4oE1}hM)bIJ$v9KLUQw}iQ6lSny+7|IVl$I0~D;9 zD#!3>$OUNWUA!{rBQ5KD__+NcUygvdNpO9IX7I}z5MSG}t~ z%VBXseQCc(TM_D`Yg0{Qd?*|Rmb&!1Q$yenUe0Zc=7l#z)+N+zvJMW>69_H-#wb|w zjKaNkxQ8|xMu+NGmCmNFP)t-4%o0Osq;>S&gD5grjkuIYaA9`yJS7R8Qlqj1`=dBZ}qqmYQyJf zHAR~K;wtsY3W&P?4&Xhl;bM2V{N?pK6v|-z@H_z6Ia)8?6^7yjh5!{CoQ5Uv8vMQ~ zC~~*}kpq#`d|nuw$U3BL)9OB?f4CL(afVoi!^yoc3ecK@hnf*24bwSZx)Hnz%g{00 z1Oy@{!4`^ZQ&0+WnwL<1clDb!Jf0EH z2%*kBSLTgLpG8DKMYjR1MXt5^`$N1o>+%I=Il&G(uWIriV$gT3g{x)f-$6-XsePNn zn`w|;SD1mygz5|eKU^84L8ySacH}1C4)q#Pf{eu1akS3G&vg`nJ>Q)EPYO~+7YwC0 zAxbMPpUe=_|H{S`{H)(5MNdro?i)Hlq%mK^3p%Iwt3cgkO+ir|F?&qQ6=Lk-h*@20 z(As+0XN2U@Bt4j|JV4wi4mu1}JV3bM$;p2?_L>D=2y>aK0YCqV>R-)$F}c07V1S!B zGZ7NLR`uOiL)@Pi{O5~mR{#USJk!_2grZDNi*94B_2E%OlyK@ufl@}LpI08-k%cz6 z1I@AcQVps$KGP5|-*PidFx8174Gt-d^v_A`nkO?|U2BeuoOGcgWXaSCyUyRnZAUvK8h z=t}DWqGBxZU#9nz7{h$aF(={G`)k5@U4RG-JaCMM$PXr$Ulg`f)D71guYHbCey8CS zUJD1ElAb%Wh-?%#%fuD*DD0j97xwX1J!<-Q(1(<@9s1Kb#wu?j`L7B?>HivX9M{lA z%GcJaeLQ>(8DSF<;s-!h>^nX*mjapOWtDkeJm?LPa{49A<$Dp-fPIK%xQA&T{8glS zc;CRQ?})Rg2wylz$chW0Y2l4zOd{QSZ=)c$Egt&|gYckl0AVQDo7ilq5oK=mp{D;M zx#t!lFgY4!D8o&CYajynuq-7&kcZ+SV5Zy*UqL(z6M>pK+k~KzV$*@ghW~^KdkKcS z?HLaPgY5U|FaMfablRaBJ}02j<40KU>k3tA{2IX{HR1h14`O?l8%|Lkd~n%-d|FOA zC=$z#XRtQ+I={nL^A8pPr848z%#oaZ>$~Ucx-(>(*zKqU{p>AtIYD<-4V>8S!U0!T zR9d2(FdYCa!<--)sz~NBXAELrIn&v9K9yd;8@YZQS3cPfH&k7~CWeF?9=(jx5pzZ= zI$M?(n+KS?_o41C>>`xRjZ1YHgl~IKr#oZ^~e7wXiDJb!|Gu zk7OZgfVuXUFlhiAwEJF+CqFG@Lf9oCHd)gqD#(5={Lj7b{(0}C%dXmn?DWBxq_^rm z1VBj6#x*7qZg)KBk#iB1z}CW*_O{rTGMjGS=@3d&s#{*1(oI6$dQej+oV}~fcb}!& zt`)6u2CZk#SYH&1vh^OeqC!n&(h zy1@!aTW+6jd*S%QfkOB>8@{_7wqJqTno)L39hHaoce;(BQW%z8OpQ2I1J^Cg*1tn! z9c;I40|NL9rS7VXzu1-Im2m+zTUOO^Iv~`JtxJ0BWwUYvX^iE~g(yv-=jGe~TyJl$Ez!)P5at}!1fWE#oO1&C@2(^8uqT#wXIS-nl{+mi33$Uw(m*G2d7r;9Q zH6{k3#EjA?-IoPco0ZZ~i70YT7-BELtVYK2(Zopb^*vdXbhv) zHmQHjw>s^*R&NP~&^2akd*?Up!|2;q@+k~Pm)ez-d*d zS6>$B4y;+4Jh7xO172~*!xoj~YBow@fK!tEHKWzveB|O<%R-bV!tKE;4d4KV#UI*| zJn-9iWUI$z?=w$unH$cUX$9@P;n2RcH<_==n){w@?re(hmKrG2t-jT8?M=1vVuo}w z_lfg-u|j8NIPSQ?xKNfBb3s?DqZuPyet9V+U?Ernm&j^Jrhhqpip$L*CdK<+d;<|_ z-s;G)0}48GZ4n8R)Mv4mA#d9D6E8e|AW(Y#BGi?-%O*0VafkwOT=7g33wA zsc{)a0n#Wha)d^98D>JhE7Ws+Mxm_Y%ju}Tw#9g}dz}gq{1NLnGj&z$B7VDij^S&~O>rnTm!h$Atra`-9p*6Gckyqc z`k&Zu_Y$WQYZshiT}iwUXA*Rtvm%Av%ivBGb#uk%BZG<#Xw0EwfN zE<1&NNWt+A0xid!`J(xMuJ%gFhy#VST+IbYn~XesC=#i+?4WO7s00xycwoZwPrs6IaDxytRS%>woh zf8hJ(n81aH%qm%hEK?nz!(qp|r5u9KSy57~2_ec(A_9pI{i|mqgSRp(t!}>e_;K3) zt)EbS$U=1mHfdo!XTOkSSHa6|w9dk!s_F|JzHz|^4tBRFT$40 z51Dp2I9*)fRh8%&R!C$`wG{g9nC`z=Ua@G<;};0^D#~z!(#=WEWsw1iFNMlbUOw_f znqhhPg#YygBr5d|+SazATKzQ?R$l{?X#b=JL(hD1oAu`?OS&;erG~m$8Hpr z6h={XV>ze&Zk09*`p`st0NoQprKD>JXW_|sIU0T42DQI6pd_fa2D!VnybK#8O`6{w z$nvUtha%o~!U4o508?$Yfo|%>gBTic&#AspIP;aoI_MU^YH0+WDyNQfjHrY%U_n-c zLe?tne}Od})LHzOtGU5;9S=r~8%(cZB(k+ zjd=1AEvL=?T?$FQwT}J)h_w8XQaHkcO5lmoKSHyexl9^VgpM?Sf7F2V5vd(i(cLAs zenb>PM-7#MSN0G;bJrk=gq}`#&mE|(tc;Wx&Q-F*WGEsO#`rLLCX|l76di@uIb&A4 zg2~4OeK=X9jBui0!O~FQ!MgdXkd2)EacQF0ioM?Eg-i!*Z%KJ+EJgBH*e)j?+GeAE zM`C0;r6B+YKy3DHx9K8f%uJ*NSXU=%EB+ZTXDs}29o19Azd}M$9{bt9OcieM)u$KU z@?k6--&}nm`<{P0Eu~F_#MJNc9o)ohCR&;u?RI*qmuHd#1mkKL< z8C2hnDhZ<2ezJU(c&O>Yslur-oP6?hmX^;R?F7$#zJK~QM|C8bjDGfR{cB{E+^J)* zMP8?vvp0g@wITafiCbv$bYdQ{BOlKdl?aX9#Mxh)8}zYp;h0F)%*2}t(O<*Az7`p- ze8@LJ6Gh4+->TdE?g%w1{Y;`NGe%zJrNHiC&i3*vy5q}2T?Vw}2{1iI> zWqXl+omL2XB`F@d(cdE4So5`wUuxanF?;s_>jSZl0}IwwAtnbng}2H^${Hm?PZgh3 z=ik;;Cl~tm18rw?;fbCG>z+dN9OB&jb-6SmX(U28nz3LRh3&)i{wIq8cIBUB%nvS( zVIIROkoVATSuuY5WU{IH!oC&;Q0j)0((aw@n7@H16A1M1TKIlk;$WY`kn!^h-&2Zq zTBfXK@sXP|6Pb*v{7RfeXocB(}5FA$3cKX<#K-kKvM}id@XWACxsGoBSsmf)3Y2xJ#Lr>||Caw%9gb zXFa#Nt#lKdeq|(jf_VuzLR=gD!S4@P*~#v^#ne}v+A|@fE9AJVDkHS5!zex zNex+-6W>I36ktdljFw^@AeH^kvw$N#^EHpd^n`+W9oonKeXP*943pZB#tvPm;(dLq zuE12a?|v!Wz`Z?wjt8U9_2f5&D8peD4^?)k&vCYns2~QZbEJt*%))*`NyB-q5z}ZT z=f;-eT4=lcA0HsrlJOfm_o*u8DcK?Wwn~10dRC1BUv+w4yz>dBAt89f9~&axW#IQk z1}5; zyaZbz5+g(o`asD|-I4y%Oq-*QA(iXpKpR=a_s0eU<*n!p=+8Ett0MKeRW+V7-M0Y5rxV^tDlx`E|BlP)eY2@PH0~x{0lw#j~ zj$wy=oSTT+B`yPS2H5F>`)!+vPT@)q|2P9$mab#{x|^%-{)Y#^LD4~e;XJJRCV?9* zdF1I3^(^f@mmZluvAEPt3Sd)e^ClNrj9jvVNLJxYnR9ss_YS6sd|kwSBG~$EUAlCm zsvYbzcm#%WUKBR}aV|MOKhMp~LGn-6oG0>!P;(4aZU5>Q>`Xe$^?%q~qeT1mUgqte zF#EFToWcrPTId+{D*N4aY-2;e2{NZ4SRrxnH$zCA`)eZqC zgG50O;@>Qv&RV(NKe ztJ#rfuQ`EKs5XPajn|fzr=h3Ia>7X1-naLT8$U(_F?=s z63(rvP;TC;M6IAnbgF++clM5}heaAFWL51U?jKl`A}u91$@Y*n*0@jaj8>|4NH{Uj z9noIth21G*+ktav&v)qAmNQa)4rr`Z>}Uz*wtgnHZZ9cQHzAs}sXA0W+WF7wpfUG8 zqQSz?)zp7U)7g@kQDMw@Xb@EO#?pQZ#PhvmEwIq;%{p=BD$Y4<{>jI)3Il#5(;j2p zz8xG9t`3X(L$#2ib0e*)&PC~%&kr|PmE1ccg548XJIw%+mm+bStX8vRS zG+-%lPpJ4sP<OAJ!a#J${;K+7L+rKT-VBd65k3LncSGle&ELx_c>dyC+JdC{-DOp-wHQjlR;k_T~4n9`wo68rTgRJ#~&oBf}Z}F2t z?Qxv@1@u_DXEN^cdy`E^?>Y-w#Qv0@u01S?=8NPVaeX|A$m*GR!@dPEE?6pZD&49Q z+5N+NUDQVY>2xan#lFfOkJOryM3D&4<(1FjZ+tO{=g?q_#HdYqpYovt>U8JOm%#MN z2aD0TBiXCZ)Chy{bK+#lZ?;n%-*nwpbGg~Zij}JcZQVTvedho8X+dkx)$>E&?ZHL)H`VbpwT)5G{%dW?`#==dWBlGx0O8iVf zgAJ!3>A!j459R)|>Cf~|bSRoW$#a6O>eDtGz|BsB!tUe+-h-iQ=I-wHl(CqS=Mi>82T+O5F2q zFEbwsTDzlP*6y`|%fYD`r?KYjqag17;gM M1ioVtx6$^6dV}^E@4UP;;-@pdrdo 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

      {3)m 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. + +```{important} +From version 3.0 onward, `deeplabcut.analyze_videos` runs the **full pose estimation + tracking pipeline** by default (`auto_track=True`), producing an .h5 file ready for downstream use. + +In prior versions of DeepLabCut, pose estimation and tracking were separate procedures. This behavior can still be obtained by setting `auto_track=False`. With `auto_track=False`, no `.h5` file is produced — only a `*_full.pickle` file containing the raw detections. If `auto_track=False`, one must run `convert_detections2tracklets` and +`stitch_tracklets` manually (see below), granting more control over the last steps of +the workflow (ideal for advanced users). +``` + +## Visualization before tracking + +### Visualize raw keypoint detections (without tracking) + +To validate raw pose estimation performance on a video before committing to the tracking +results, run: + +```python +videos_to_analyze = ['/fullpath/project/videos/testVideo.mp4'] +deeplabcut.analyze_videos( + config_path, + videos_to_analyze, + auto_track=False +) +deeplabcut.create_video_with_all_detections( + config_path, + videos_to_analyze +) +``` + +### Visualizing part-affinity fields (PAFs) + +For models predicting part-affinity fields, another sanity check may be to +examine the distributions of edge affinity costs using `deeplabcut.utils.plot_edge_affinity_distributions`. Easily separable distributions +indicate that the model has learned strong links to group keypoints into distinct +individuals — likely a necessary feature for the assembly stage (note that the amount of +overlap will also depend on the amount of interactions between your animals in the +dataset). All TensorFlow multi-animal models use part-affinity fields and PyTorch models +consisting of just a backbone name (e.g. `resnet_50`, `resnet_101`) use part-affinity +fields. If you're unsure whether your PyTorch model has a one, check +the **pytorch_config.yaml** for a `DLCRNetHead`. + +````{tip} +If these results do not look good, we recommend extracting and labeling more frames (even from more videos). Try to label close interactions of animals for best performance. Once you label more, you can create a new training set and train. + +You can either: + +1. extract more frames manually from existing or new videos and label as when initially building the training data set, or +1. let DeepLabCut find frames where keypoints were poorly detected and automatically extract those for you. All you need is + to run: + +```python +deeplabcut.find_outliers_in_raw_data(config_path, pickle_file, video_file) +``` + +where pickle_file is the `_full.pickle` one obtains after video analysis. +Flagged frames will be added to your collection of images in the corresponding labeled-data folders for you to label. +```` + +## Manually run tracking steps + +### Animal Assembly and Tracking across frames + +After pose estimation, now you perform assembly and tracking. + +You can validate the tracking parameters. Namely, you can iteratively change the +parameters, run `convert_detections2tracklets` then load them in the GUI +(`refine_tracklets`) if you want to look at the performance. If you want to edit these, +you will need to open the `inference_cfg.yaml` file (or click button in GUI). The +options are: + +```python +# Tracking: +#p/m pixels in width and height for increasing bounding boxes. +boundingboxslack : 0 +# Intersection over Union (IoU) threshold for linking two bounding boxes +iou_threshold: .2 +# maximum duration of a lost tracklet before it's considered a "new animal" (in frames) +max_age: 100 +# minimum number of consecutive frames before a detection is tracked +min_hits: 3 +``` + +If the network was trained with identity supervision (i.e., `identity=True` in +`config.yaml` before training), this information can be leveraged during: (i) animal +assembly, where body parts are grouped by predicted identity rather than keypoint +affinity; and (ii) tracking, where identity alone can be used in place of motion +trackers to form tracklets. + +To use this ID information, simply pass: + +```python +deeplabcut.convert_detections2tracklets(..., identity_only=True) +``` + +- **Note:** If only one individual is to be assembled and tracked, assembly and tracking are skipped, and detections are treated as in single-animal projects; i.e., it is the keypoints with highest confidence that are kept and accumulated over frames to form a single, long tracklet. No action is required from users, this is done automatically. + +**Animal assembly and tracking quality** can be assessed via `deeplabcut.utils.make_labeled_video.create_video_from_pickled_tracks`. This function provides an additional diagnostic tool before moving on to refining tracklets. + +If animal assemblies do not look pretty, an alternative to the outlier search described above is to pass the +`_assemblies.pickle` to `find_outliers_in_raw_data` in place of the `_full.pickle`. +This will focus the outlier search on unusual assemblies (i.e., animal skeletons that were oddly reconstructed). This may be a bit more sensitive with crowded scenes or frames where animals interact closely. +Note though that at that stage it is likely preferable anyway to carry on with the remaining steps, and extract outliers +from the final h5 file as was customary in single animal projects. + +\*\*Next, tracklets are stitched to form complete tracks with: + +```python +deeplabcut.stitch_tracklets( + config_path, + ['videofile_path'], + video_extensions='mp4', + shuffle=1, + trainingsetindex=0, +) +``` + +Note that the base signature of the function is identical to `analyze_videos` and `convert_detections2tracklets`. +If the number of tracks to reconstruct is different from the number of individuals +originally defined in the config.yaml, `n_tracks` (i.e., the number of animals you have in your video) +can be directly specified as follows: + +```python +deeplabcut.stitch_tracklets(..., n_tracks=n) +``` + +In such cases, file columns will default to dummy animal names (ind1, ind2, ..., up to indn). + +##### API Docs + +````{admonition} Click the button to see API Docs for analyze_videos +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.analyze_videos.rst +``` +```` + +````{admonition} Click the button to see API Docs for convert_detections2tracklets +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.convert_detections2tracklets.rst +``` +```` + +````{admonition} Click the button to see API Docs for stitch_tracklets +--- +class: dropdown +--- +```{eval-rst} +.. include:: ./api/deeplabcut.stitch_tracklets.rst +``` +```` + +##### Using Unsupervised Identity Tracking: + +In Lauer et al. 2022 we introduced a new method to do unsupervised reID of animals. +Here, you can use the tracklets to learn the identity of animals to enhance your +tracking performance. To use the code: + +```python +deeplabcut.transformer_reID(config, videos_to_analyze, n_tracks=None, video_extensions="mp4") +``` + +Note you should pass the n_tracks (number of animals) you expect to see in the video. + +##### Refine Tracklets: + +You can also optionally **refine the tracklets**. You can fix both "major" ID swaps, i.e. perhaps when animals cross, and you can micro-refine the individual body points. You will load the `...trackertype.pickle` or `.h5'` file that was created above, and then you can launch a GUI to interactively refine the data. This also has several options, so please check out the docstring. Upon saving the refined tracks you get an `.h5` file (akin to what you might be used to from standard DLC. You can also load (1) filter this to take care of small jitters, and (2) load this `.h5` this to refine (again) in case you find another issue, etc! + +```python +deeplabcut.refine_tracklets(config_path, pickle_or_h5_file, videofile_path, max_gap=0, min_swap_len=2, min_tracklet_len=2, trail_len=50) +``` + +If you use the GUI (or otherwise), here are some settings to consider: + +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1619628014395-BQ09VLLTKCLQQGRB5T9A/ke17ZwdGBToddI8pDm48kLMj_XrWI9gi4tVeBdgcB8p7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z4YTzHvnKhyp6Da-NYroOW3ZGjoBKy3azqku80C789l0lt53wR20brczws2A6XSGt3kSTbW7uM0ncVKHWPvgHR4kN5Ka1TcK96ljy4ji9jPkQ/TrackletGUI.png?format=1000w +--- +name: fig-tracklet-gui +alt: Tracklet refinement GUI showing key settings +width: 950px +align: center +--- +Tracklet refinement GUI. Key settings to configure are described in the text. +``` + +\*note, setting `max_gap=0` can be used to fill in all frames across the video; otherwise, 1-n is the # of frames you want to fill in, i.e. maybe you want to fill in short gaps of 5 frames, but 15 frames indicates another issue, etc. You can test this in the GUI very easy by editing the value and then re-launch pop-up GUI. + +If you fill in gaps, they will be associated to an ultra low probability, 0.01, so you are aware this is not the networks best estimate, this is the human-override! Thus, if you create a video, you need to set your pcutoff to 0 if you want to see these filled in frames. + +[Read more here!](functionDetails.md#madeeplabcut-critical-point---assemble--refine-tracklets) + +Short demo: + +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1588690928000-90ZMRIM8SN6QE20ZOMNX/ke17ZwdGBToddI8pDm48kJ1oJoOIxBAgRD2ClXVCmKFZw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpxBw7VlGKDQO2xTcc51Yv6DahHgScLwHgvMZoEtbzk_9vMJY_JknNFgVzVQ2g0FD_s/refineDEMO.gif?format=750w +--- +name: fig-refine-tracklets-demo +alt: Animated demonstration of the tracklet refinement workflow +width: 70% +align: center +--- +Short demo of the tracklet refinement workflow. +``` + +``` +``` diff --git a/docs/main-workflows/user-guide.md b/docs/main-workflows/user-guide.md new file mode 100644 index 0000000000..21a68080cc --- /dev/null +++ b/docs/main-workflows/user-guide.md @@ -0,0 +1,1662 @@ +## --- deeplabcut: last_content_updated: '2025-06-30' last_metadata_updated: '2026-03-06' ignore: false visibility: online + +(file:dlc-userguide)= + +# DeepLabCut User Guide + +```{contents} +--- +local: +depth: 3 +--- +``` + +This guide covers the standard single-animal and multi-animal 2D pose estimation projects. + +## Getting started + +DeepLabCut offers two equivalent interfaces: a **GUI** for those who prefer a visual +workflow (no Python knowledge required), and a **Python API** for users who want +scripting flexibility or to integrate DeepLabCut into a larger pipeline. All workflow +steps are available in both. + +We assume you have DeepLabCut installed (if not, see {ref}`file:how-to-install`). +Open a terminal and activate your conda environment: + +```bash +conda activate DEEPLABCUT +``` + +```{important} +On Windows, always open the terminal with administrator privileges: right-click and +select "Run as administrator". +``` + +Choose your interface below to launch DeepLabCut: + +### GUI (recommended for beginners) + +```bash +python -m deeplabcut +``` + +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w +--- +name: fig-gui-launch +alt: The DeepLabCut Project Manager GUI after launch +width: 60% +align: center +--- +The DeepLabCut Project Manager GUI. +``` + +### Python API + +In an interactive Python session (e.g. `ipython`), import DeepLabCut: + +```python +import deeplabcut +``` + +As a reminder, the core functions are described in our +[Nature Protocols paper](https://www.nature.com/articles/s41596-019-0176-0) (published +at the time of DeepLabCut version 2.0.6). Additional functions and features are +continually added to the package; we recommend reading the protocol alongside this +documentation. + +## Workflow + +DeepLabCut's full workflow is described in steps (A)–(N) below. Code examples throughout this page use the Python API; if you are +using the GUI, the same steps are available in the corresponding panels of the +Project Manager. + +You should think of the workflow as 5 phases + +```{figure} ../images/dlc-workflow.png +--- +name: dlc-workflow-figure +alt: The 5 phases of the DeepLabCut workflow. +align: center +--- +The 5 phases of the DeepLabCut workflow. The expected outputs are indicated in the grey boxes. +``` + +1. Project setup: create and configure your new project. +1. Data preparation: select frames and annotate your training data. +1. Training and evaluation: configure, train and evaluate your neural network model. +1. Analysis: run inference with your trained model to create predictions and labeled videos. +1. Refinement (optional): improve your data quality for a next training iteration. + +```{admonition} Automated multi-animal tracking +--- +class: multi-animal +--- + For multi-animal projects, the video-analysis step contains an automated tracking step. More information is described in the {ref}`multi-animal tracking guide `. +``` + +### Phase 1 — Project setup + +#### (A) Create a New Project + +##### Overview + +The function `create_new_project` creates a new project directory, required subdirectories, and a basic project +configuration file. Each project is identified by the name of the project (e.g. Reaching), name of the experimenter +(e.g. YourName), as well as the date at creation. + +Thus, this function requires the user to input: + +- The name of the project +- The name of the experimenter +- The full path of the videos that are (initially) used to create the training dataset. +- Optional arguments specify: + - The working directory + - Where the project directory will be created + - Whether to copy the videos to the project directory + - Whether to create a single- or multi-animal project + +```{note} +If the optional argument `working_directory` is unspecified, the +project directory is created in the current working directory. + +If `copy_videos` is unspecified symbolic links +for the videos are created in the videos directory. +Each symbolic link creates a reference to a video and thus +eliminates the need to copy the entire video to the video directory (if the videos remain at the original location). +This is why administrator privileges are required for Windows users, as creating symbolic links requires them. +``` + +##### Code example + +````{dropdown} Create single-animal project +--- +class: single-animal +open: +--- +```python +deeplabcut.create_new_project( + "Name of the project", + "Name of the experimenter", + ["Full path of video 1", "Full path of video 2", "Full path of video 3"], + working_directory="Full path of the working directory", + copy_videos=True, + multianimal=False +) +``` +```` + +````{dropdown} Create multi-animal project +--- +class: multi-animal +open: +--- +```python +deeplabcut.create_new_project( + "Name of the project", + "Name of the experimenter", + ["Full path of video 1", "Full path of video 2", "Full path of video 3"], + working_directory="Full path of the working directory", + copy_videos=True, + multianimal=True +) +``` +```` + +###### Output & directory structure + +```{important} +On Windows, input paths as: +`r'C:\Users\computername\Videos\reachingvideo1.avi'` or +`'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` +``` + +```{tip} +You can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds +the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_project(...)` +``` + +This set of arguments creates a project directory with the name +**++** in the **working directory** and creates the symbolic links to videos in the videos directory. + +The project directory will have subdirectories: + +``` +++/ +├── dlc-models/ +│ ├── iteration-0/ +│ ├── iteration-1/ +│ └── ... +├── dlc-models-pytorch/ +│ ├── iteration-0/ +│ │ └── / +│ │ ├── train/ +│ │ └── test/ +│ ├── iteration-1/ +│ └── ... +├── labeled-data/ +│ └──

      G^Z-t_yx|_wM2ar0xE%Rb6UI2m40kz{z#3kv`!>;zRxE>iYo**% zetD)i4*d>tBrdTn=P@h=E}Wg@7Q?{l6g3qoR9-{T$nOyYCjmOjKIM}=Kqp#|BzITj zdJwNLG5sAU)Kd)Lflx@5s>Cdz5bLZm3kdz!pa?autWvvEi_JKQs&D^l6nJ@L;lyTm zM2OgMerOÞ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≻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

      UI^_Uja`%9QNJAZ@NA_)$ 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 Fe*jwyWj+7^ literal 0 HcmV?d00001 diff --git a/docs/main-workflows/user-guide.md b/docs/main-workflows/user-guide.md index c035519320..b937dd4510 100644 --- a/docs/main-workflows/user-guide.md +++ b/docs/main-workflows/user-guide.md @@ -97,7 +97,7 @@ The 5 phases of the DeepLabCut workflow. The expected outputs are indicated in t --- class: multi-animal --- - For multi-animal projects, the video-analysis step contains an automated tracking step. More information is described in the {ref}`multi-animal tracking guide `. + For multi-animal projects, the video-analysis step contains an automated tracking step. More information is available in the {ref}`multi-animal tracking guide `. ``` ### Phase 1 — Project setup @@ -118,7 +118,7 @@ Thus, this function requires the user to input: - Optional arguments specify: - The working directory - Where the project directory will be created - - Whether to copy the videos to the project directory + - **Recommended**: Whether to copy the videos to the project directory - Whether to create a single- or multi-animal project ```{note} @@ -181,8 +181,11 @@ You can also place `config_path` in front of `deeplabcut.create_new_project` to the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_project(...)` ``` -This set of arguments creates a project directory with the name -**++** in the **working directory** and creates the symbolic links to videos in the videos directory. +This set of arguments creates a project directory with the name: + +**`++`** + +in the **working directory** and creates the video copies in the videos directory. The project directory will have subdirectories: @@ -219,10 +222,10 @@ All the outputs generated during the course of a project will be stored in one o - `iteration-0` - `iteration-1`, etc. which correspond to successive rounds of label refinement. - Each iteration folder in turn contains **shuffle directories**, each representing a specific experiment defined by a particular train/test split and model architecture. - Within each shuffle directory: + - Each iteration folder in turn contains **shuffle directories**, each representing a specific experiment defined by a particular train/test split and model architecture. + - Within each shuffle directory: - `train/` and `test/` store metadata and configuration files for the feature detectors. - - These configuration files are written in YAML, a human-readable format that can be edited with any standard text editor. + - The `train/` folder also stores training checkpoints (snapshots), which let users reload a trained model or resume training from an intermediate checkpoint if training was interrupted. 1. `labeled-data/`: @@ -233,8 +236,8 @@ All the outputs generated during the course of a project will be stored in one o 1. `videos/`: Stores either the project videos themselves or symbolic links to them: - If copy_videos=False (default), it contains symbolic links. - If copy_videos=True, the videos are copied into the directory. + If `copy_videos=False` (default), it contains symbolic links. + If `copy_videos=True`, the videos are copied into the directory. ```python deeplabcut.add_new_videos( @@ -244,7 +247,7 @@ deeplabcut.add_new_videos( ) ``` -```{note} +```{hint} The *Full path of the project configuration file* will be referenced as `config_path` throughout this guide. ``` @@ -283,7 +286,11 @@ Familiarize yourself with the meaning of the parameters. For instance **it is im The project configuration **differs between single-animal and multi-animal projects**, a complete overview is presented below. -````{dropdown} Configuration +```{danger} +Please **do not include spaces** in the names of `bodyparts`, `multianimalbodyparts` or `Uniquebodyparts`. +``` + +````{dropdown} : Configuration --- class-container: single-animal open: @@ -293,10 +300,6 @@ A complete list of parameters including their description can be found in You **must add** the list of *bodyparts* (or points of interest) that you want to track. -```{caution} -Please do not include spaces in the names of bodyparts. -``` - ```{figure} ../images/box1-single.png --- name: config-box1-single @@ -307,7 +310,7 @@ Single Animal project configuration file glossary ``` ```` -````{dropdown} Configuration +````{dropdown} : Configuration --- class-container: multi-animal open: @@ -334,20 +337,19 @@ multianimalbodyparts: identity: True/False ``` -```{caution} -Please do not include spaces in the names of `bodyparts`, `multianimalbodyparts` or `Uniquebodyparts`. -``` - -**Individuals:** are names of "individuals" in the annotation dataset. These should/can be generic (e.g. mouse1, mouse2, etc.). These individuals are comprised of the same bodyparts defined by `multianimalbodyparts`. For annotation in the GUI and training, it is important that all individuals in each frame are labeled. Thus, keep in mind that you need to set individuals to the maximum number in your labeled-data set, .i.e., if there is (even just one frame) with 17 animals then the list should be `- indv1` to `- indv17`. Note, once trained if you have a video with more or less animals, that is fine - you can have more or less animals during video analysis! - -**Identity:** If you can tell the animals apart, i.e., one might have a collar, or a black marker on the tail of a mouse, then you should label these individuals consistently (i.e., always label the mouse with the black marker as "indv1", etc). If you have this scenario, please set `identity: True` in your `config.yaml` file. If you have 4 black mice, and you truly cannot tell them apart, then leave this as `false`. - -**Multianimalbodyparts:** are the bodyparts of each individual (in the above list). +- **Individuals:** are names of "individuals" in the annotation dataset. These should/can be generic (e.g. mouse1, mouse2, etc.). These individuals are comprised of the same bodyparts defined by `multianimalbodyparts`. + - For annotation in the GUI and training, it is important that all individuals in each frame are labeled. Thus, keep in mind that you need to set individuals to the maximum number in your labeled-data set, .i.e., if there is (even just one frame) with 17 animals then the list should be `- indv1` to `- indv17`. + - Note, once trained if you have a video with more or less animals, that is fine - you can have more or less animals during video analysis! +- **Identity:** If you can tell the animals apart, i.e., one might have a collar, or a black marker on the tail of a mouse, then you should label these individuals consistently (i.e., always label the mouse with the black marker as "indv1", etc). + - If you have this scenario, please set `identity: True` in your `config.yaml` file. + - If you have 4 black mice, and you truly cannot tell them apart, then leave this as `false`. +- **Multianimalbodyparts:** are the bodyparts of each individual (in the above list). +- **Uniquebodyparts:** are points that you want to track, but that appear only once within each frame, i.e. they are "unique". + - Typically these are things like unique objects, landmarks, tools, etc. + - They can also be animals, e.g. in the case where one German shepherd is attending to many sheep, the sheep bodyparts would be multianimalbodyparts, the shepherd parts would be uniquebodyparts and the individuals would be the list of sheep (e.g. Polly, Molly, Dolly, ...). -**Uniquebodyparts:** are points that you want to track, but that appear only once within each frame, i.e. they are "unique". Typically these are things like unique objects, landmarks, tools, etc. They can also be animals, e.g. in the case where one German shepherd is attending to many sheep the sheep bodyparts would be multianimalbodyparts, the shepherd parts would be uniquebodyparts and the individuals would be the list of sheep (e.g. Polly, Molly, Dolly, ...). - -```{figure} ../images/box1-multi.png +```{figure} ../images/box1-multi-rec.png --- name: config-box1-multi alt: Box 1 - Multi Animal Project Configuration File Glossary @@ -364,30 +366,39 @@ ______________________________________________________________________ #### (C) Select Frames to Label ```{important} -A good training dataset should consist of a sufficient number of frames that capture the breadth of the -behavior. This ideally implies to select the frames from different (behavioral) sessions, different lighting and -different animals, if those vary substantially (to train an invariant, robust feature detector). Thus for creating a -robust network that you can reuse in the laboratory, a good training dataset should reflect the diversity of the -behavior with respect to postures, luminance conditions, background conditions, animal identities, etc. of the data that +A good training dataset should consist of a **sufficient number of frames** that **capture the breadth of the +behavior**. This ideally implies to select the frames from different (behavioral) sessions, different lighting and +different animals, if those vary substantially (to train an invariant, robust feature detector). + +Thus for creating a robust network that you can reuse in the laboratory, a **good training dataset should reflect the diversity of the +behavior with respect to postures, luminance conditions, background conditions, animal identities, etc**. of the data that will be analyzed. For the simple lab behaviors comprising mouse reaching, open-field behavior and fly behavior, 100−200 -frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). However, depending on -the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, more -or less frames might be necessary to create a good network. Ultimately, in order to scale up the analysis to large -collections of videos with perhaps unexpected conditions, one can also refine the dataset in an adaptive way (see +frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). +However, depending on the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, **more +or less frames might be necessary to create a good network**. + +Ultimately, in order to scale up the analysis to large +collections of videos with perhaps unexpected conditions, one can also **refine the dataset in an adaptive way** (see refinement below). ``` -```{admonition} Converting single-animal data to multi-animal data -class: multi-animal +```{dropdown} : Converting single-animal data to multi-animal data +--- +class-container: multi-animal +open: +--- You can use annotated data from single-animal projects, by converting those files. + See the {ref}`conversion guide` for more information. ``` ##### Overview -The function `extract_frames` extracts frames from all the videos in the project configuration file in order to create -a training dataset. The extracted frames from all the videos are stored in a separate subdirectory named after the video -file’s name under the ‘labeled-data’. This function also has various parameters that might be useful based on the user’s +The function `extract_frames` **extracts frames from all the videos in the project configuration file in order to create +a training dataset**. The extracted frames from all the videos are stored in a **separate subdirectory** named after the video +file’s name under the ‘labeled-data’ subfolder. + +This function also has various parameters that might be useful based on the user’s need. ##### Code example @@ -405,27 +416,43 @@ deeplabcut.extract_frames( ```{important} It is advisable to keep the frame size small, as large frames increase the training and inference time. The cropping parameters for each video can be provided in the config.yaml file (and see below). + When running the function `extract_frames`, if the parameter `crop=True`, then you will be asked to draw a box within the GUI (and this is written to the config.yaml file). ``` -##### Parameter note - +```{tip} `userfeedback` allows the user to specify which videos they wish to extract frames from. When set to `True`, a dialog will appear, where the user is asked for each video if (additional/any) frames from this video should be extracted. Use this, e.g. if you have already labeled some folders and want to extract data for new videos. +``` ##### Frame selection methods -The provided function either selects frames from the videos that are randomly sampled from a uniform distribution -(uniform), by clustering based on visual appearance (k-means), or by manual selection. Random uniform selection of -frames works best for behaviors where the postures vary across the whole video. However, some behaviors might be sparse, -as in the case of reaching where the reach and pull are very fast and the mouse is not moving much between trials. In -such a case, the function that allows selecting frames based on k-means derived quantization would be useful. If the -user chooses to use k-means as a method to cluster the frames, then this function downsamples the video and clusters the -frames using k-means, where each frame is treated as a vector. Frames from different clusters are then selected. This -procedure makes sure that the frames look different. However, on large and long videos, this code is slow due to -computational complexity. +Select representative frames from videos for labeling. + +Frame selection can be performed in three ways: + +1. Uniform random sampling + Use when relevant postures and behaviors are distributed throughout the video. +1. K-means-based selection + Use when important behaviors are sparse, brief, or when most frames look similar. + The video is downsampled, frames are clustered by visual appearance, and frames + are selected from different clusters to improve diversity. This can be slower + for large or long videos. +1. Manual selection + Use when you already know which frames are informative and want precise control + over the training set. + +In brief: +\- Behavior varies throughout the video -> use uniform sampling. +\- Behavior is sparse or brief -> use k-means selection. +\- Specific useful frames are known -> use manual selection. + +For best results, restrict frame extraction to video intervals containing the +behaviors of interest using the `start` and `stop` parameters in `config.yaml`. +Aim to label a diverse, representative set of frames rather than simply increasing +the total number of labeled frames. ```{important} It is advisable to extract frames from a period of the video that contains interesting @@ -436,10 +463,12 @@ Also, the user can change the number of frames to extract from each video using ##### Manual frame selection -However, picking frames is highly dependent on the data and the behavior being studied. Therefore, it is hard to -provide one-size-fits-all code that extracts frames to create a good training dataset for every behavior and animal. +However, picking frames is highly dependent on the data and the behavior being studied. +Therefore, it is hard to provide one-size-fits-all code that extracts frames to create a good training dataset for every behavior and animal. If the user feels specific frames are lacking, they can extract hand selected frames of interest using the interactive GUI -provided along with the toolbox. This can be launched by using: +provided along with the toolbox. + +This can be launched by using: ```python deeplabcut.extract_frames(config_path, "manual") @@ -479,10 +508,11 @@ ______________________________________________________________________ ##### Overview The toolbox provides a function **label_frames** which helps the user to easily label -all the extracted frames using an interactive graphical user interface (GUI). The user -should have already named the bodyparts to label (points of interest) in the -project’s configuration file by providing a list. The following command invokes the -napari-deeplabcut labelling GUI. +all the extracted frames using an interactive graphical user interface (GUI). + +The user should have already named the bodyparts to label (points of interest) in the +project’s configuration file by providing a list. +The following command invokes the napari-deeplabcut labelling GUI. ```{hint} Check out the {ref}`napari-deeplabcut docs ` for @@ -495,44 +525,37 @@ more information about the labelling workflow. deeplabcut.label_frames(config_path) ``` -##### Demo - -[🎥 DEMO](https://youtu.be/hsA9IB5r73E) - - - - - ```{important} It is advisable to **consistently label similar spots** (e.g., on a wrist that is very large, try to label the same location). In general, invisible or occluded points should not be labeled by the user. They can simply be skipped by not applying the label anywhere on the frame. ``` -```{dropdown} Annotation tips for multi-animal projects +```{dropdown} : Annotation tips for multi-animal projects --- class-container: multi-animal open: --- -*Interacting Animals*
      -For multi-animal projects with interacting animals, make sure that interaction-frames are well-represented in your training dataset: i.e. make sure that you have labeled frames with closely interacting animals! -If interactions do not not frequently occur in the video, it is advised to selecting some interaction-frames *manually*. - -*Labeling and Identity*
      -Unless you can visually distinguish the animals, -you do not need to maintain a consistent ID across frames. For example, with a white and -a black mouse, always label white as animal 1 and black as animal 2. With two -indistinguishable black mice, the ID assignment may switch between frames — -just be consistent *within* each frame. If one animal always has a distinguishing -feature (e.g., an optical fiber), then label them consistently across all frames +- **Interacting Animals**:
      + For multi-animal projects with interacting animals, make sure that interaction-frames are well-represented in your training dataset: i.e. make sure that you have labeled frames with closely interacting animals! + If interactions do not not frequently occur in the video, it is advised to selecting some interaction-frames *manually*. +- **Labeling and Identity**:
      + Unless you can visually distinguish the animals, + you do not need to maintain a consistent ID across frames. For example, with a white and + a black mouse, always label white as animal 1 and black as animal 2. With two + indistinguishable black mice, the ID assignment may switch between frames — + just be consistent *within* each frame. If one animal always has a distinguishing + feature (e.g., an optical fiber), then label them consistently across all frames ``` -```{admonition} ---- -class: multi-animal ---- -``` +##### Demo + +[🎥 DEMO](https://youtu.be/hsA9IB5r73E) + + + + ##### Optional: Adding new bodypart labels @@ -563,15 +586,17 @@ deeplabcut.check_labels(config_path, visualizeindividuals=True/False) For each video directory in labeled-data this function creates a subdirectory with **labeled** as a suffix. Those directories contain the frames plotted with the annotated body parts. The user can double check if the body parts are -labeled correctly. If they are not correct, the user can reload the frames (i.e. `deeplabcut.label_frames`), move them -around, and click save again. +labeled correctly. + +If they are not correct, the user can reload the frames (i.e. `deeplabcut.label_frames`), move them around, and click save again. -````{dropdown} Multi-animal colors +````{dropdown} : Colors set per individual or body part --- class-container: multi-animal open: --- -you can check and plot colors per individual or per body part, just set the flag `visualizeindividuals=True/False`. Note, you can run this twice in both states to see both images. +You may check and plot colors per individual or per body part, just set the flag `visualizeindividuals=True/False`. +Note, you can run this twice in both states to see both images. ```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1586203062876-D9ZL5Q7NZ464FUQN95NA/ke17ZwdGBToddI8pDm48kKmw982fUOZVIQXHUCR1F55Zw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpx7krGdD6VO1HGZR3BdeCbrijc_yIxzfnirMo-szZRSL5-VIQGAVcQr6HuuQP1evvE/img1068_individuals.png?format=750w --- @@ -609,13 +634,13 @@ Only run this step **where** you are going to train the network. If you label on move your project folder to Google Colab or AWS, lab server, etc, then run the step below on that platform! If you labeled on a Windows machine but train on Linux, this is handled automatically (it saves file sets as both Linux and Windows for you). -``` - If you move your project folder, you must only change the `project_path` (which is done automatically) in the main config.yaml file - that's it - no need to change the video paths, etc! Your project is fully portable. - Be aware you select your neural network backbone at this stage. As of DLC3+ we support PyTorch (and TensorFlow, but this will be phased out). +``` ##### Overview @@ -636,14 +661,18 @@ deeplabcut.create_training_dataset(config_path) The function creates a new shuffle(s) directory in the **dlc-models-pytorch** directory (**dlc-models** if using TensorFlow), in the current "iteration" directory. -The `train` and `test` directories each have a configuration file -(**pytorch_config.yaml** in **train** and **pose_cfg.yaml** in **test** for PyTorch models, -**pose_cfg.yaml** in **train** and **test** for TensorFlow models). + +The `train` and `test` directories each have a configuration file: + +- **pytorch_config.yaml** in **train** and **pose_cfg.yaml** in **test** for PyTorch models +- **pose_cfg.yaml** in **train** and **test** for TensorFlow models + Specifically, the user can edit the **pytorch_config.yaml** (or **pose_cfg.yaml**) within the **train** subdirectory -before starting the training. These configuration files contain meta information with regard to the parameters -of the feature detectors. For more information about the **pytorch_config.yaml** file, see [here](dlc3-pytorch-config) -(for TensorFlow-based models, see key parameters -[here](https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml)). +before starting the training. +These configuration files contain meta information with regard to the parameters of the feature detectors. + +For more information about the **pytorch_config.yaml** file, see [here](dlc3-pytorch-config) +For TensorFlow-based models, see key parameters [here](https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml). A schematic view of the structure described above is: @@ -679,8 +708,9 @@ use. Once you've called `create_training_dataset`, you can edit the TensorFlow engine, the [**pose_cfg.yaml**](https://github.com/DeepLabCut/DeepLabCut/blob/main/deeplabcut/pose_cfg.yaml) file). - PyTorch Engine: [Albumentations](https://albumentations.ai/docs/) is used for data - augmentation. Look at the [**pytorch_config.yaml**](dlc3-pytorch-config) for more - information about image augmentation options. + augmentation. + - See the [**pytorch_config.yaml**](dlc3-pytorch-config) for more + information about image augmentation options. - TensorFlow Engine: The default augmentation works well for most tasks (as shown on www.deeplabcut.org), but there are many options, more data augmentation, intermediate supervision, etc. Here are the available loaders: @@ -692,7 +722,7 @@ TensorFlow engine, the [**pose_cfg.yaml**](https://github.com/DeepLabCut/DeepLab less efficiently than in imgaug, does not allow batch size>1 - `deterministic`: only useful for testing, freezes numpy seed; otherwise like default. -```{dropdown} Multi-animal augmentation details (TensorFlow engine) +```{dropdown} : Augmentation details (TensorFlow) --- class-container: multi-animal open: @@ -728,9 +758,11 @@ You can easily do this in the Project Manager GUI (by selecting the "Use an exis data split" option), which also lets you compare PyTorch and TensorFlow models. ````{versionadded} 3.0.0 + You can now create new shuffles using the same train/test split as -existing shuffles with `create_training_dataset_from_existing_split`. This allows you to -compare model performance (between different architectures or when using different +existing shuffles with `create_training_dataset_from_existing_split`. + +This allows you to compare model performance (between different architectures or when using different training hyper-parameters) as the shuffles were trained on the same data, and evaluated on the same test data! @@ -918,7 +950,8 @@ ______________________________________________________________________ It is important to evaluate the performance of the trained network. This performance is measured by computing the average root mean square error (RMSE) between the manual labels and the ones predicted by DeepLabCut. -The RMSE is saved as a comma-separated file and displayed for all pairs and only likely pairs (>p-cutoff). +The RMSE is saved as a comma-separated file and displayed for all pairs and only likely pairs ($>p_{\text{cutoff}}$). + This helps to exclude, for example, occluded body parts. One of the strengths of DeepLabCut is that due to the probabilistic output of the scoremap, it can, if sufficiently trained, also reliably report if a body part is visible in a given frame. (see discussions of finger tips in reaching and the Drosophila legs during 3D behavior in @@ -928,7 +961,7 @@ For multi-animal projects, two additional metrics are reported alongside RMSE: * and **Mean Average Recall (mAR)**. These describe how precisely and completely the model detects individuals across frames, and are more informative than RMSE alone when multiple animals are present. -```{dropdown} mAP and mAR explained +```{dropdown} : mAP and mAR explained --- class-container: multi-animal open: @@ -994,20 +1027,31 @@ Neuroscience 2018). The plots can be customized by editing the **config.yaml** file (i.e., the colormap, scale, marker size (dotsize), and transparency of labels (alphavalue) can be modified). By default each body part is plotted in a different color -(governed by the colormap) and the plot labels indicate their source. Note that by default the human labels are -plotted as plus (‘+’), DeepLabCut’s predictions either as ‘.’ (for confident predictions with likelihood > p-cutoff) and -’x’ for (likelihood \<= `pcutoff`). +(governed by the colormap) and the plot labels indicate their source. + +```{important} +Note that by default: +- **Human labels** are plotted as plus ($+$) +- **DeepLabCut’s predictions** either as: + - dot ($\cdot$) for confident predictions with likelihood $> p_{\text{cutoff}}$ + - cross ($\times$) for (likelihood $\leq p_{\text{cutoff}}$). +``` ##### Output and interpretation The evaluation results for each shuffle of the training dataset are stored in a unique subdirectory in a newly created directory ‘evaluation-results-pytorch’ (‘evaluation-results’ for TensorFlow models) in the project directory. + The user can visually inspect if the distance between the labeled and the predicted body parts are acceptable. In the event of benchmarking with different shuffles of same training dataset, the user can provide multiple shuffle indices to evaluate the corresponding network. + Note that with multi-animal projects additional distance statistics aggregated over animals or bodyparts are also stored -in that directory. This aims at providing a finer quantitative evaluation of multi-animal prediction performance -before animal tracking. If the generalization is not sufficient, the user might want to: +in that directory. +This aims at providing a finer quantitative evaluation of multi-animal prediction performance +before animal tracking. + +**If the generalization is not sufficient**, the user might want to: - Check if the labels were imported correctly; i.e., invisible points are not labeled and the points of interest are labeled accurately - Make sure that the loss has already converged @@ -1022,7 +1066,7 @@ data-driven selection of the **optimal skeleton** is carried out. Skipping this causes video analysis to use the redundant skeleton by default, which is slower and does not guarantee best performance. -You should also plot the scoremaps, locref layers, and PAFs to assess detection quality +You should also plot the scoremaps, locref layers, and PAFs (for relevant models) to assess detection quality before proceeding to video analysis. ``` @@ -1048,9 +1092,9 @@ class: dropdown ```` ```{important} -Before moving on, make a deliberate decision about whether the pose estimation quality is sufficient. If you do not have -good pose estimation evaluation metrics at this point, please revisit the original labels, add more training data and -refine the model rather than proceeding with the current results. +Before moving on, make a deliberate decision about whether the pose estimation quality is sufficient. +**If you do not have good pose estimation evaluation metrics at this point, please revisit the original labels, add more training data and +refine the model rather than proceeding with the current results.** ``` ______________________________________________________________________ @@ -1087,16 +1131,16 @@ deeplabcut.analyze_videos( ) ``` -````{admonition} Automated multi-animal tracking +````{dropdown} : Automated tracking --- -class: multi-animal +class-container: multi-animal --- For multi-animal projects, the video analysis is slightly more complex compared to single-animal projects: besides bare keypoint estimation, the keypoints need to be assigned to one of the different individuals and coherenty tracked across frames. This tracking procedure is **automated by default**, but it is worthwile to understand the details, which are discussed in the {ref}`multi-animal tracking guide `. - *Disabling automated tracking*
      + **Disabling automated tracking**
      After bare pose estimation, multi-animal tracking is applied by default (`auto_track=True`). This produces an *.h5* file that is ready for downstream use. To disable the automated tracking step and inspect raw detections before tracking, pass `auto_track=False` explicitly to `deeplabcut.analyze_videos`. No *.h5* file will be produced - only a *.pickle*. @@ -1108,7 +1152,7 @@ class: multi-animal ) ``` - *Conditional top-down tracking*
      + **Conditional top-down tracking**
      For conditional top-down (CTD) models, tracking can be performed inside the model, using temporal context from previous frames to condition predictions on the current frame. This is a distinct mechanism from `auto_track`. Pass `ctd_tracking=True` to `deeplabcut.analyze_videos` when using any model whose name starts with `ctd_`. @@ -1166,7 +1210,7 @@ ______________________________________________________________________ ##### Overview You can also filter the predictions with a median filter (default) or with a [SARIMAX model](https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html), if you wish. -This creates a new .h5 file with the ending *\_filtered* that you can use in `create_labeled_video` and/or `plot_trajectories`. +This creates a new .h5 file with the ending `*_filtered` that you can use in `create_labeled_video` and/or `plot_trajectories`. ##### Code examples From 3b6f0c311d6337b8427f1b0c8b0f600cf461ae55 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 11:29:58 +0200 Subject: [PATCH 81/86] Fix docs formatting and examples in user guide Improve rendering and correctness in docs/main-workflows/user-guide.md: change admonition key to `class-container`, update dropdown/admonition syntax, fix code block languages (python -> yaml/text), correct example function parameter (`config` -> `config_path`), adjust heading capitalization and list formatting. These changes ensure examples render correctly and the docs reflect the actual API usage. --- docs/main-workflows/user-guide.md | 38 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/docs/main-workflows/user-guide.md b/docs/main-workflows/user-guide.md index b937dd4510..4885ffd619 100644 --- a/docs/main-workflows/user-guide.md +++ b/docs/main-workflows/user-guide.md @@ -95,7 +95,7 @@ The 5 phases of the DeepLabCut workflow. The expected outputs are indicated in t ```{admonition} Automated multi-animal tracking --- -class: multi-animal +class-container: multi-animal --- For multi-animal projects, the video-analysis step contains an automated tracking step. More information is available in the {ref}`multi-animal tracking guide `. ``` @@ -810,7 +810,7 @@ class: dropdown ______________________________________________________________________ -#### (G) Train The Network +#### (G) Train the Network ##### Overview @@ -1057,9 +1057,9 @@ before animal tracking. - Make sure that the loss has already converged - Consider labeling additional images and make another iteration of the training dataset -```{dropdown} Multi-animal skeleton selection and map inspection +```{dropdown} : Skeleton selection and map inspection --- -class: multi-animal +class-container: multi-animal --- In multi-animal projects, model evaluation is crucial because this is when the data-driven selection of the **optimal skeleton** is carried out. Skipping this step @@ -1101,7 +1101,7 @@ ______________________________________________________________________ ### Phase 4 — Analysis -#### (I) Analyze new Videos +#### (I) Analyze New Videos ##### Overview @@ -1178,10 +1178,8 @@ If you have large frames and the animal/object occupies a smaller fraction, you field experiment but only track the mouse, this will speed up your analysis (also helpful for real-time applications). To use this simply add `dynamic=(True,.5,10)` when you call `analyze_videos`. -```python -""" +```text dynamic: tuple containing (state, detectionthreshold, margin) -""" ``` If `state` is `True`, then dynamic cropping will be performed. @@ -1421,7 +1419,7 @@ There is also a GUI to help you do this, used by calling `deeplabcut.SkeletonBui Here is how the `config.yaml` additions/edits should look (for example, on the Openfield demo data we provide): -```python +```yaml # Plotting configuration skeleton: - ["snout", "leftear"] @@ -1499,7 +1497,7 @@ can use the function by: ```python deeplabcut.analyzeskeleton( - config, + config_path, video, video_extensions="avi", shuffle=1, @@ -1611,19 +1609,19 @@ ______________________________________________________________________ Based on the performance of DeepLabCut, four scenarios are possible: -- (A) Visible body part with accurate DeepLabCut prediction. These labels do not need any modifications. +1. Visible body part with accurate DeepLabCut prediction. These labels do not need any modifications. -- (B) Visible body part but wrong DeepLabCut prediction. Move the label’s location to the actual position of the - body part. +1. Visible body part but wrong DeepLabCut prediction. Move the label’s location to the actual position of the + body part. -- (C) Invisible, occluded body part. Remove the predicted label by DeepLabCut with a middle click. Every predicted - label is shown, even when DeepLabCut is uncertain. This is necessary, so that the user can potentially move - the predicted label. However, to help the user to remove all invisible body parts the low-likelihood predictions - are shown as open circles (rather than disks). +1. Invisible, occluded body part. Remove the predicted label by DeepLabCut with a middle click. Every predicted + label is shown, even when DeepLabCut is uncertain. This is necessary, so that the user can potentially move + the predicted label. However, to help the user to remove all invisible body parts the low-likelihood predictions + are shown as open circles (rather than disks). -- (D) Invalid images: In the unlikely event that there are any invalid images, the user should remove such an image - and their corresponding predictions, if any. Here, the GUI will prompt the user to remove an image identified - as invalid. +1. Invalid images: In the unlikely event that there are any invalid images, the user should remove such an image + and their corresponding predictions, if any. Here, the GUI will prompt the user to remove an image identified + as invalid. The labels for extracted putative outlier frames can be refined by opening the GUI: From 01f907e465c4642f26b71eabc7035bc88ce0372d Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Wed, 27 May 2026 11:33:56 +0200 Subject: [PATCH 82/86] Revamp quick-start guides and update TOC Add single- and multi-animal quick-start pages to the Main workflows overview in _toc.yml and substantially rewrite both quick-start docs. single_animal_quick_guide.md was reorganized into a clear step-by-step workflow (create project, configure, extract/label frames, create dataset, train/evaluate, analyze/filter/plot/create videos) with concrete Python examples, notes, and tips (use absolute paths, no spaces in body-part names). tutorial_maDLC.md was refactored into a multi-animal overview with GUI and Python workflows, clearer config guidance for multi-animal fields, extraction/annotation/checking steps, separate training engine examples (PyTorch/TensorFlow), and explicit tracking steps (analyze, convert detections, stitch tracklets, create labeled videos) plus helpful notes. Overall improvements focus on clarity, concrete examples, and actionable tips for users. --- _toc.yml | 7 +- docs/main-workflows/multi-animal-tracking.md | 3 - docs/quick-start/single_animal_quick_guide.md | 127 ++++++++++++----- docs/quick-start/tutorial_maDLC.md | 128 +++++++++++++----- 4 files changed, 192 insertions(+), 73 deletions(-) diff --git a/_toc.yml b/_toc.yml index a6d5bf6602..6da12c3416 100644 --- a/_toc.yml +++ b/_toc.yml @@ -11,13 +11,14 @@ parts: - file: docs/docker # - file: docs/quick-start/index # sections: - # - file: docs/quick-start/single_animal_quick_guide - # - file: docs/quick-start/tutorial_maDLC - caption: Main workflows overview chapters: - file: docs/main-workflows/user-guide - - file: docs/main-workflows/multi-animal-tracking + sections: + - file: docs/quick-start/single_animal_quick_guide + - file: docs/quick-start/tutorial_maDLC + - file: docs/main-workflows/multi-animal-tracking # - file: docs/standardDeepLabCut_UserGuide # - file: docs/maDLC_UserGuide - file: docs/Overviewof3D diff --git a/docs/main-workflows/multi-animal-tracking.md b/docs/main-workflows/multi-animal-tracking.md index fbc26f62a6..8e638c3768 100644 --- a/docs/main-workflows/multi-animal-tracking.md +++ b/docs/main-workflows/multi-animal-tracking.md @@ -227,6 +227,3 @@ align: center --- Short demo of the tracklet refinement workflow. ``` - -``` -``` diff --git a/docs/quick-start/single_animal_quick_guide.md b/docs/quick-start/single_animal_quick_guide.md index 16b68873cc..3f8960e27d 100644 --- a/docs/quick-start/single_animal_quick_guide.md +++ b/docs/quick-start/single_animal_quick_guide.md @@ -11,90 +11,149 @@ deeplabcut: (file:single-animal-quick-start)= -# QUICK GUIDE to single Animal Training: +# Single-animal at a glance -**The main steps to take you from project creation to analyzed videos:** +This page summarizes the main DeepLabCut functions used in a standard single-animal +2D pose-estimation workflow, from project creation to analyzed videos. -Open ipython in the terminal: +## Start Python -``` +Open a terminal and start an interactive Python session, for example with IPython: + +```bash ipython ``` -Import DeepLabCut: +Then import DeepLabCut: -``` +```python import deeplabcut ``` -Create a new project: +## Workflow -``` -deeplabcut.create_new_project("project_name", "experimenter", ["path of video 1", "path of video2", ..]) -``` +### 1. Create a project -Set a config_path variable for ease of use + go edit this file!: +```python +project_name = "project_name" +experimenter = "experimenter" +video_paths = [ + "/absolute/path/to/video_1.mp4", + "/absolute/path/to/video_2.mp4", +] +config_path = deeplabcut.create_new_project( + project_name, + experimenter, + video_paths, + copy_videos=True, +) ``` -config_path = "yourdirectory/project_name/config.yaml" + +```{note} +Use absolute paths to your video files. The returned `config_path` is the full path to +the project `config.yaml` file and is used throughout the rest of the workflow. ``` -Extract frames: +### 2. Configure the project +Open the generated `config.yaml` file and edit it for your experiment. + +At this stage, define the body parts or points of interest that you want to track. You +can also adjust project settings such as the number of frames to extract, visualization +settings, and training options. + +```{important} +Do not include spaces in body-part names. ``` + +### 3. Extract frames + +```python deeplabcut.extract_frames(config_path) ``` -Label frames: +### 4. Label frames -``` +```python deeplabcut.label_frames(config_path) ``` -Check labels \[OPTIONAL\]: +### 5. Check labels -``` +```python deeplabcut.check_labels(config_path) ``` -Create training dataset: - +```{tip} +This step is optional, but strongly recommended. Use the generated labeled images to +visually confirm that the annotations were saved correctly before training. ``` + +### 6. Create the training dataset + +```python deeplabcut.create_training_dataset(config_path) ``` -Train the network: +### 7. Train the network -``` +```python deeplabcut.train_network(config_path) ``` -Evaluate the trained network: +### 8. Evaluate the trained network -``` +```python deeplabcut.evaluate_network(config_path) ``` -Video analysis: +Inspect the evaluation results before moving on to video analysis. If pose-estimation +quality is not sufficient, improve the labels, add more training data, or train for +longer before continuing. -``` -deeplabcut.analyze_videos(config_path, ["path of video 1", "path of video2", ..]) +### 9. Analyze videos + +```python +deeplabcut.analyze_videos( + config_path, + video_paths, +) ``` -Filter predictions \[OPTIONAL\]: +### 10. Filter predictions +```python +deeplabcut.filterpredictions( + config_path, + video_paths, +) ``` -deeplabcut.filterpredictions(config_path, ["path of video 1", "path of video2", ..]) + +```{note} +Filtering is optional. It can help smooth pose predictions before plotting +trajectories or creating labeled videos. ``` -Plot results (trajectories): +### 11. Plot trajectories -``` -deeplabcut.plot_trajectories(config_path, ["path of video 1", "path of video2", ..], filtered=True) +```python +deeplabcut.plot_trajectories( + config_path, + video_paths, + filtered=True, +) ``` -Create a video: +### 12. Create labeled videos +```python +deeplabcut.create_labeled_video( + config_path, + video_paths, + filtered=True, +) ``` -deeplabcut.create_labeled_video(config_path, ["path of video 1", "path of video2", ..], filtered=True) -``` + +This creates videos with the predicted keypoints overlaid, which is useful for a quick +visual inspection of tracking quality. diff --git a/docs/quick-start/tutorial_maDLC.md b/docs/quick-start/tutorial_maDLC.md index e33fe44bc7..56f0a18432 100644 --- a/docs/quick-start/tutorial_maDLC.md +++ b/docs/quick-start/tutorial_maDLC.md @@ -10,47 +10,81 @@ deeplabcut: (file:multi-animal-quick-start)= -# Multi-animal pose estimation with DeepLabCut: A 5-minute tutorial +# Multi-animal at a glance -## GUI: +This page summarizes the main DeepLabCut functions used in a standard multi-animal +2D pose-estimation workflow. -Full graphical user interface: just follow the tabs in the GUI! `python -m deeplabcut` launches the GUI. +## GUI workflow -## Terminal: +DeepLabCut provides a full graphical user interface. To launch it, run: -**Import deeplabcut** +```bash +python -m deeplabcut +``` + +Then follow the tabs in the Project Manager GUI. + +## Python workflow + +The same workflow can also be run from Python. Start by importing DeepLabCut: ```python import deeplabcut ``` -**(1) Create a project** +### 1. Create a project ```python project_name = "cutemice" experimenter = "teamdlc" -video_path = "path_to_a_video_file" +video_paths = ["/absolute/path/to/video_file.mp4"] + config_path = deeplabcut.create_new_project( project_name, experimenter, - [video_paths], + video_paths, multianimal=True, copy_videos=True, ) ``` -> **_NOTE:_** Make sure to specify the absolute path to the video file(s). -> It is quickly obtained on Windows with ⇧ Shift+Right click and `Copy as path`, -> and on Mac with ⌥ Option+Right click and `Copy as Pathname`. -> Ubuntu users only need to copy the file and its path gets added to the clipboard. +```{note} +Use absolute paths to your video file(s). + +On Windows, you can quickly copy a file path with Shift + +Right click and **Copy as path**. On macOS, use +Option + Right click and **Copy as Pathname**. +On Ubuntu, copying the file usually also copies its path to the clipboard. +``` -> Next, you can set a variable for the config_path: 'Full path of the project configuration file\*' +The returned `config_path` is the full path to the project `config.yaml` file. This +variable is used throughout the rest of the workflow. -**(2) Edit the config.ymal file to set up your project** +### 2. Configure the project -> **_NOTE:_** Here is were you will define your key point names and animal IDs. Also you can change the default # of frames to extract for the next step. +Open the generated `config.yaml` file and edit it for your experiment. + +At this stage, define the animal identities and keypoints you want to track. For +multi-animal projects, the most important fields are typically: + +- `individuals` +- `multianimalbodyparts` +- `uniquebodyparts` +- `identity` +- `numframes2pick` + +```{important} +Do not include spaces in the names of individuals, body parts, multi-animal body +parts, or unique body parts. +``` + +```{tip} +You can also adjust the number of frames to extract in the next step by editing +`numframes2pick` in `config.yaml`. +``` -**(3) Extract video frames to annotate** +### 3. Extract video frames to annotate ```python deeplabcut.extract_frames( @@ -61,15 +95,18 @@ deeplabcut.extract_frames( ) ``` -> **_NOTE:_** try to extract a few frames from many videos vs. a lot of frames from one video! +```{tip} +For robust training data, it is usually better to extract a few informative frames +from many videos than many similar frames from a single video. +``` -**(4) Annotate Frames** +### 4. Annotate frames ```python deeplabcut.label_frames(config_path) ``` -**(5) Visually check annotated frames** +### 5. Check annotated frames ```python deeplabcut.check_labels( @@ -78,7 +115,10 @@ deeplabcut.check_labels( ) ``` -**(6) Create the training dataset** +Use the generated labeled images to visually confirm that the annotations were saved +correctly. + +### 6. Create the training dataset ```python deeplabcut.create_multianimaltraining_dataset( @@ -88,18 +128,24 @@ deeplabcut.create_multianimaltraining_dataset( ) ``` -**(7) Train the network** +### 7. Train the network + +Choose the example corresponding to the engine you are using. + +#### PyTorch engine ```python -# PyTorch Engine deeplabcut.train_network( config_path, device="cuda", save_epochs=5, epochs=200, ) +``` + +#### TensorFlow engine -# TensorFlow Engine +```python deeplabcut.train_network( config_path, saveiters=10000, @@ -108,7 +154,7 @@ deeplabcut.train_network( ) ``` -**(8) Evaluate the network** +### 8. Evaluate the network ```python deeplabcut.evaluate_network( @@ -117,45 +163,57 @@ deeplabcut.evaluate_network( ) ``` -**(9) Analyze a video (extracts detections and association costs)** +Inspect the evaluation results before moving on to video analysis. For multi-animal +projects, pay particular attention to detection quality and tracking readiness. + +### 9. Analyze videos ```python deeplabcut.analyze_videos( config_path, - [video], + video_paths, auto_track=True, ) ``` -> **_NOTE:_** `auto_track=True` will complete steps 10-11 for you automatically so you get the "final" H5 file. Use the below steps if you need to change the parameters of tracking based on your dataset. +```{note} +With `auto_track=True`, DeepLabCut automatically performs the tracking steps needed to +produce the final `.h5` output file. Use the manual tracking steps below only if you +need to inspect detections or tune tracking parameters for your dataset. +``` + +### 10. Convert detections to tracklets -**(10) Spatial and (locally) temporal grouping: Track body part assemblies frame-by-frame** +This step performs spatial and local temporal grouping, assembling body parts into +tracklets frame by frame. ```python deeplabcut.convert_detections2tracklets( config_path, - [video], + video_paths, track_method="ellipse", ) ``` -**(11) Reconstruct full animal trajectories (tracks from tracklets)** +### 11. Stitch tracklets into trajectories + +This step reconstructs full animal trajectories from the tracklets. ```python deeplabcut.stitch_tracklets( config_path, - [video], + video_paths, track_method="ellipse", min_length=5, ) ``` -**(12) Create a pretty video output** +### 12. Create labeled videos ```python deeplabcut.create_labeled_video( config_path, - [video], + video_paths, color_by="individual", keypoints_only=False, trailpoints=10, @@ -163,3 +221,7 @@ deeplabcut.create_labeled_video( track_method="ellipse", ) ``` + +This creates a video with the predicted keypoints overlaid. For multi-animal projects, +`color_by="individual"` is useful for visually checking identity assignment and +trajectory consistency. From c44a2ce67019746a76647e162390a5a6ad5f180a Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Mon, 1 Jun 2026 11:25:47 +0200 Subject: [PATCH 83/86] Move dataset guidance and fix frame-selection docs Relocate the important guidance about selecting diverse training frames to the section near frame extraction/functionality, making it more contextually relevant. Clean up manual frame-selection wording, normalize the selection-method bullets, and adjust figure/code-fence markup (wrap figure in a comment) to prevent rendering issues. Minor formatting fixes for clarity. --- docs/main-workflows/user-guide.md | 50 +++++++++++++++++-------------- docs/recipes/installTips.md | 1 - 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/docs/main-workflows/user-guide.md b/docs/main-workflows/user-guide.md index 4885ffd619..dd48c5d789 100644 --- a/docs/main-workflows/user-guide.md +++ b/docs/main-workflows/user-guide.md @@ -365,23 +365,6 @@ ______________________________________________________________________ #### (C) Select Frames to Label -```{important} -A good training dataset should consist of a **sufficient number of frames** that **capture the breadth of the -behavior**. This ideally implies to select the frames from different (behavioral) sessions, different lighting and -different animals, if those vary substantially (to train an invariant, robust feature detector). - -Thus for creating a robust network that you can reuse in the laboratory, a **good training dataset should reflect the diversity of the -behavior with respect to postures, luminance conditions, background conditions, animal identities, etc**. of the data that -will be analyzed. For the simple lab behaviors comprising mouse reaching, open-field behavior and fly behavior, 100−200 -frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). -However, depending on the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, **more -or less frames might be necessary to create a good network**. - -Ultimately, in order to scale up the analysis to large -collections of videos with perhaps unexpected conditions, one can also **refine the dataset in an adaptive way** (see -refinement below). -``` - ```{dropdown} : Converting single-animal data to multi-animal data --- class-container: multi-animal @@ -401,6 +384,23 @@ file’s name under the ‘labeled-data’ subfolder. This function also has various parameters that might be useful based on the user’s need. +```{important} +A good training dataset should consist of a **sufficient number of frames** that **capture the breadth of the +behavior**. This ideally implies to select the frames from different (behavioral) sessions, different lighting and +different animals, if those vary substantially (to train an invariant, robust feature detector). + +Thus for creating a robust network that you can reuse in the laboratory, a **good training dataset should reflect the diversity of the +behavior with respect to postures, luminance conditions, background conditions, animal identities, etc**. of the data that +will be analyzed. For the simple lab behaviors comprising mouse reaching, open-field behavior and fly behavior, 100−200 +frames gave good results [Mathis et al, 2018](https://www.nature.com/articles/s41593-018-0209-y). +However, depending on the required accuracy, the nature of behavior, the video quality (e.g. motion blur, bad lighting) and the context, **more +or less frames might be necessary to create a good network**. + +Ultimately, in order to scale up the analysis to large +collections of videos with perhaps unexpected conditions, one can also **refine the dataset in an adaptive way** (see +refinement below). +``` + ##### Code example ```python @@ -445,9 +445,10 @@ Frame selection can be performed in three ways: over the training set. In brief: -\- Behavior varies throughout the video -> use uniform sampling. -\- Behavior is sparse or brief -> use k-means selection. -\- Specific useful frames are known -> use manual selection. + +- Behavior varies throughout the video -> use uniform sampling. +- Behavior is sparse or brief -> use k-means selection. +- Specific useful frames are known -> use manual selection. For best results, restrict frame extraction to video intervals containing the behaviors of interest using the `start` and `stop` parameters in `config.yaml`. @@ -475,11 +476,14 @@ deeplabcut.extract_frames(config_path, "manual") ``` The user can use the *Load Video* button to load one of the videos in the project configuration file, use the scroll -bar to navigate across the video and grab a frame or a range of frames to extract the frame(s) -(see {numref}`fig-manual-frame-selection`). +bar to navigate across the video and grab a frame to extract. + + + The user can also look at the extracted frames and e.g. delete frames (from the directory) that are too similar before reloading the set and then manually annotating them. +````{comment} ```{figure} https://static1.squarespace.com/static/57f6d51c9f74566f55ecf271/t/5c71bfbc71c10b4a23d20567/1550958540700/cropMANUAL.gif?format=750w --- name: fig-manual-frame-selection @@ -488,7 +492,7 @@ width: 70% align: center --- Manual frame selection using the `extract_frames` GUI. -``` +```` ##### API Docs diff --git a/docs/recipes/installTips.md b/docs/recipes/installTips.md index fe75d885d3..044e8efd67 100644 --- a/docs/recipes/installTips.md +++ b/docs/recipes/installTips.md @@ -350,7 +350,6 @@ Activate! `conda activate DEEPLABCUT` and then run: `conda install -c conda-forg Then run `python -m deeplabcut` which launches the DLC GUI. - ## How to confirm that your GPU is being used by DeepLabCut During training and analysis steps, DeepLabCut does not use the GPU processor heavily. To confirm that DeepLabCut is properly using your GPU: From 53ad699b148bc7c28a9fc684a2fc678b4765a160 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Mon, 1 Jun 2026 11:26:32 +0200 Subject: [PATCH 84/86] Docs: simplify augmentation sentence in user guide Remove the parenthetical reference to www.deeplabcut.org and merge the broken sentence in the TensorFlow Engine augmentation section to improve readability and flow. No functional changes; content about available loaders remains the same. --- docs/main-workflows/user-guide.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/main-workflows/user-guide.md b/docs/main-workflows/user-guide.md index dd48c5d789..32446174cf 100644 --- a/docs/main-workflows/user-guide.md +++ b/docs/main-workflows/user-guide.md @@ -715,8 +715,7 @@ TensorFlow engine, the [**pose_cfg.yaml**](https://github.com/DeepLabCut/DeepLab augmentation. - See the [**pytorch_config.yaml**](dlc3-pytorch-config) for more information about image augmentation options. -- TensorFlow Engine: The default augmentation works well for most tasks (as shown on - www.deeplabcut.org), but there are many options, more data augmentation, intermediate +- TensorFlow Engine: The default augmentation works well for most tasks, but there are many options, more data augmentation, intermediate supervision, etc. Here are the available loaders: - `imgaug`: a lot of augmentation possibilities, efficient code for target map creation & batch sizes >1 supported. You can set the parameters such as the `batch_size` in the `pose_cfg.yaml` file for the model you are training. This From 4aa6cdb2eba5940bdb3a91f97cbc49b3a3acb5a7 Mon Sep 17 00:00:00 2001 From: Cyril Achard Date: Thu, 25 Jun 2026 14:43:36 -0500 Subject: [PATCH 85/86] Documentation : Update formatting of single animal guide (#3315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Start updating single animal docs guide Improve user documentation for the GUI and CLI flows: add an important note to always run the terminal as administrator on Windows, rename and rephrase GUI/CLI headings for clarity, and break out stepwise startup instructions. Restructure the create_new_project section with a concise list of required and optional arguments, add a note explaining symbolic links and why Windows requires admin privileges, include a code example and tip block, and fix Windows path formatting. Minor wording and formatting tweaks throughout to improve readability. * Refactor user guide to MyST format Convert the single-animal user guide to MyST-friendly markdown and improve layout and clarity. Changes include: add a table-of-contents directive; replace raw HTML /

      blocks with MyST image directives and metadata; introduce admonitions (important/note/caution/hint) for critical points; restructure the project directory section into bulleted lists and an ASCII tree; clarify Windows path guidance and config.yaml parameter notes; normalize API Docs headings and other formatting fixes. These are documentation/formatting updates to improve rendering and readability—no functional code changes. * Refactor single-animal user guide and fix links Update documentation for the single-animal user guide: convert local link refs to file:single-animal-userguide, fix napari link formatting, and reorganize/clarify many sections in standardDeepLabCut_UserGuide.md. Added consistent subsection headings (Overview, Code example, Output, etc.), separators, code block language annotations, a schematic of the training dataset layout, and improved wording/indentation for lists and examples. Also updated UseOverviewGuide.md to point to the revised single-animal guide. These changes improve readability, provide clearer examples, and make the workflow steps and outputs easier to follow. * Clean up user guide wording and formatting Minor documentation cleanup in docs/standardDeepLabCut_UserGuide.md: split the conda activation into its own numbered step, simplify wording and line breaks for clarity, and remove bold all-caps headings (OVERVIEW and MODEL COMPARISON) in favor of normal sentences. Purely editorial changes; no functional code changes. * Fix figure * docs: tidy project dirs and fix crossrefs Reorganize the project directory section in the user guide: move the sentence about where outputs are stored to follow the directory tree block and adjust list numbering for the subdirectory descriptions for clarity. Replace Markdown-style links to the napari-deeplabcut docs with Sphinx {ref} roles in two places and clean up minor whitespace/formatting. * docs: fix typos and clarify user guide Miscellaneous documentation fixes and clarifications across the user guide: - Grammar/wording fixes (e.g. "training and testing set", other minor edits). - Rename config option reference: numframes2extract -> numframes2pick. - Update napari-deeplabcut docs reference to RST cross-reference style. - Rework Optional labels section for clearer phrasing and line breaks. - Adjust networks paragraph spacing and wording. - Reformat dynamic-cropping docs: use triple-quoted string, change "triple" -> "tuple", correct "detectiontreshold" -> "detectionthreshold", and move explanatory text outside the code block for readability. - Update Filter Pose Data: note output used by create_labeled_video (was create_labeled_data) and plot trajectories. - Minor improvements to Plot Trajectories section wording and spacing. - Clarify SkeletonBuilder usage: call deeplabcut.SkeletonBuilder(config_path) and explain config_path. These edits are documentation-only and improve readability, accuracy, and consistency. * Refactor docs: project layout and labeling Rewrite and reorganize project subdirectory documentation for clarity: convert prose into numbered sections for dlc-models/dlc-models-pytorch, labeled-data, training-datasets, and videos; clarify iteration/shuffle/train/test structure, YAML config files, and checkpoint usage; note copy_videos behavior (default False). Update napari labeling section to use a hint block linking to napari docs and remove the inline HOT KEYS block (left commented out). Minor wording tweaks for the optional-labels and label-checking guidance. * Fix typos and style in user guide Apply editorial fixes to the standard DeepLabCut user guide: correct spelling (e.g., "docstrings"), standardize capitalization for PyTorch and TensorFlow, unify dataset/data set usage, fix punctuation and spacing (e.g., video path, SkeletonBuilder call), and normalize list capitalization. These changes improve readability and consistency across the documentation. * single animal guide: update refs, tips admonitions * single animal guide: critical point -> tip / recommendation * single animal guide: minor fixes typo's, formatting, etc * Group steps A-N in phases 1-5; Demote headers accordingly. * single animal user guide: update getting started section * single animal user guide: fix typos, improve structure * update single animal user guide: restructure 'getting started' section * update single-animal guide: add box 2 tensorflow pose config yaml * update single-animal guide: images --> figures * Fix Sphinx refs and link formatting Replace markdown-style links with Sphinx {ref} cross-reference roles in docs/UseOverviewGuide.md and docs/maDLC_UserGuide.md to ensure proper Sphinx rendering. Also fix a malformed bracket/URL in docs/pytorch/architectures.md for the Ye et al. citation link. --------- Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com> Co-authored-by: Mackenzie Mathis --- docs/gui/PROJECT_GUI.md | 4 + docs/images/box2-single.png | Bin 0 -> 446748 bytes docs/standardDeepLabCut_UserGuide.md | 812 ++++++++++++++++++--------- 3 files changed, 558 insertions(+), 258 deletions(-) create mode 100644 docs/images/box2-single.png diff --git a/docs/gui/PROJECT_GUI.md b/docs/gui/PROJECT_GUI.md index 3bede5488b..ed53b4794d 100644 --- a/docs/gui/PROJECT_GUI.md +++ b/docs/gui/PROJECT_GUI.md @@ -21,6 +21,10 @@ While several advanced features are not fully available in this Project GUI, we 1. Install DeepLabCut following the instructions in the {ref}`installation page`. 1. Open the terminal and run: `python -m deeplabcut` +```{important} +If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +``` +

      diff --git a/docs/images/box2-single.png b/docs/images/box2-single.png new file mode 100644 index 0000000000000000000000000000000000000000..e680e64b7ed1d55a2d78aa61c960c76ae66e0b31 GIT binary patch literal 446748 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 z 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 V`CRYI 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�h*<)MC;+h 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 literal 0 HcmV?d00001 diff --git a/docs/standardDeepLabCut_UserGuide.md b/docs/standardDeepLabCut_UserGuide.md index 914d85d08e..105681eaa7 100644 --- a/docs/standardDeepLabCut_UserGuide.md +++ b/docs/standardDeepLabCut_UserGuide.md @@ -9,140 +9,230 @@ deeplabcut: notes: This is a crucial piece of the doc, but it is rather long and verbose. Recommend breaking it up into smaller sections, and adding more visuals (e.g. screenshots of the GUI, etc.) to make it more engaging and easier to read. Also, consider adding a table of contents at the beginning for easier navigation. --- -(single-animal-userguide)= +(file:single-animal-userguide)= # Single animal projects +```{contents} +--- +local: +depth: 3 +--- +``` + This document covers single/standard DeepLabCut use. If you have a complicated multi-animal scenario (i.e., they look the same), then please see our [maDLC user guide](multi-animal-userguide). -To get started, you can use the GUI, or the terminal. See below. +## Getting started -## DeepLabCut Project Manager GUI (recommended for beginners) +DeepLabCut offers two equivalent interfaces: a **GUI** for those who prefer a visual +workflow (no Python knowledge required), and a **Python API** for users who want +scripting flexibility or to integrate DeepLabCut into a larger pipeline. All workflow +steps are available in both. -**GUI:** +We assume you have DeepLabCut installed (if not, see {ref}`file:how-to-install`). +Open a terminal and activate your conda environment: -To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch -"Terminal" (unix/MacOS) on your computer. We assume you have DeepLabCut installed (if not, see -[install docs](how-to-install)!). Next, launch your conda env (i.e., for example `conda activate DEEPLABCUT`). Then, -simply run `python -m deeplabcut`. The below functions are available to you in an easy-to-use graphical user interface. -While most functionality is available, advanced users might want the additional flexibility that command line interface -offers. Read more below. +```bash +conda activate DEEPLABCUT +``` -```{Hint} -🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". +```{important} +On Windows, always open the terminal with administrator privileges: right-click and +select "Run as administrator". ``` -

      - -

      +Choose your interface below to launch DeepLabCut: -As a reminder, the core functions are described in our -[Nature Protocols paper](https://www.nature.com/articles/s41596-019-0176-0) (published at the time of 2.0.6). -Additional functions and features are continually added to the package. Thus, we recommend you read over the protocol -and then please look at the following documentation and the doctrings. Thanks for using DeepLabCut! +### GUI (recommended for beginners) + +```bash +python -m deeplabcut +``` + +```{figure} https://images.squarespace-cdn.com/content/v1/57f6d51c9f74566f55ecf271/1572824438905-QY9XQKZ8LAJZG6BLPWOQ/ke17ZwdGBToddI8pDm48kIIa76w436aRzIF_cdFnEbEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcLthF_aOEGVRewCT7qiippiAuU5PSJ9SSYal26FEts0MmqyMIhpMOn8vJAUvOV4MI/guilaunch.jpg?format=1000w +--- +name: fig-gui-launch +alt: The DeepLabCut Project Manager GUI after launch +width: 60% +align: center +--- +The DeepLabCut Project Manager GUI. +``` -## DeepLabCut in the Terminal/Command line interface: +### Python API -To begin, navigate to Anaconda Prompt Terminal and right-click to "open as admin "(Windows), or simply launch -"Terminal" (unix/MacOS) on your computer. We assume you have DeepLabCut installed (if not, see Install docs!). Next, -launch your conda env (i.e., for example `conda activate DEEPLABCUT`) and then type `ipython`. Then type: +In an interactive Python session (e.g. `ipython`), import DeepLabCut: ```python import deeplabcut ``` -```{Hint} -🚨 If you use Windows, please always open the terminal with administrator privileges! Right click, and "run as administrator". -``` +As a reminder, the core functions are described in our +[Nature Protocols paper](https://www.nature.com/articles/s41596-019-0176-0) (published +at the time of DeepLabCut version 2.0.6). Additional functions and features are +continually added to the package; we recommend reading the protocol alongside this +documentation. + +## Workflow -### (A) Create a New Project +DeepLabCut's full workflow is described in steps (A)–(N) below. Code examples throughout this page use the Python API; if you are +using the GUI, the same steps are available in the corresponding panels of the +Project Manager. + +### Phase 1 — Project setup + +#### (A) Create a New Project + +##### Overview The function `create_new_project` creates a new project directory, required subdirectories, and a basic project configuration file. Each project is identified by the name of the project (e.g. Reaching), name of the experimenter (e.g. YourName), as well as the date at creation. -Thus, this function requires the user to input the name of the project, the name of the experimenter, and the full -path of the videos that are (initially) used to create the training dataset. +Thus, this function requires the user to input: + +- The name of the project +- The name of the experimenter +- The full path of the videos that are (initially) used to create the training dataset. +- Optional arguments specify: + - The working directory + - Where the project directory will be created + - Whether to copy the videos to the project directory + +```{note} +If the optional argument `working_directory` is unspecified, the +project directory is created in the current working directory. -Optional arguments specify the working directory, where the project directory will be created, and if the user wants -to copy the videos (to the project directory). If the optional argument `working_directory` is unspecified, the -project directory is created in the current working directory, and if `copy_videos` is unspecified symbolic links -for the videos are created in the videos directory. Each symbolic link creates a reference to a video and thus +If `copy_videos` is unspecified symbolic links +for the videos are created in the videos directory. +Each symbolic link creates a reference to a video and thus eliminates the need to copy the entire video to the video directory (if the videos remain at the original location). +This is why administrator privileges are required for Windows users, as creating symbolic links requires them. +``` + +##### Code example ```python deeplabcut.create_new_project( "Name of the project", "Name of the experimenter", - ["Full path of video 1", "Full path of video2", "Full path of video3"], + ["Full path of video 1", "Full path of video 2", "Full path of video 3"], working_directory="Full path of the working directory", copy_videos=True/False, multianimal=False ) ``` -**Important path formatting note** +###### Output & directory structure -Windows users, you must input paths as: `r'C:\Users\computername\Videos\reachingvideo1.avi'` or -` 'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` +```{important} +On Windows, input paths as: +`r'C:\Users\computername\Videos\reachingvideo1.avi'` or +`'C:\\Users\\computername\\Videos\\reachingvideo1.avi'` +``` -TIP: you can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds +```{tip} +You can also place `config_path` in front of `deeplabcut.create_new_project` to create a variable that holds the path to the config.yaml file, i.e. `config_path=deeplabcut.create_new_project(...)` +``` + +This set of arguments creates a project directory with the name +**++** in the **working directory** and creates the symbolic links to videos in the videos directory. + +The project directory will have subdirectories: + +``` +++/ +├── dlc-models/ +│ ├── iteration-0/ +│ ├── iteration-1/ +│ └── ... +├── dlc-models-pytorch/ +│ ├── iteration-0/ +│ │ └── / +│ │ ├── train/ +│ │ └── test/ +│ ├── iteration-1/ +│ └── ... +├── labeled-data/ +│ └──

      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