|
| 1 | +# DeepLabCut 3.0.2 |
| 2 | + |
| 3 | + |
| 4 | +DeepLabCut 3.0.2 is a patch release bringing several PyTorch workflows fixes, |
| 5 | +improved config handling and export reliability, broadened compatibility for newer |
| 6 | +NumPy / Matplotlib versions, and adding a machine-readable docs/API index for |
| 7 | +agent-assisted interactions with the library. |
| 8 | + |
| 9 | + |
| 10 | +## Highlights |
| 11 | + |
| 12 | +- Forward-compatibility work for NumPy 2, pandas 3 CoW, and Matplotlib 3.9, |
| 13 | + including releasing core NumPy / Matplotlib upper bounds (#3420, #3498, |
| 14 | + #3502, #3508, #3499, #3445, #3394). |
| 15 | +- More reliable COCO training: `model_cfg.metadata` is authoritative, with |
| 16 | + fail-fast validation against annotation JSON (#3435). |
| 17 | +- Safer legacy project configs: empty / `null` top-level YAML fields are treated |
| 18 | + as unset; `ignore_empty` is removed (#3439). |
| 19 | +- Normalized `export_model` pickles for downstream / real-time consumers (#3473). |
| 20 | +- Detector `null` thresholds resolve to field defaults instead of crashing |
| 21 | + (#3470, #3475). |
| 22 | +- PyTorch `analyze_videos` / auto-track honor the `overwrite` argument instead of |
| 23 | + hard-coding `overwrite=False` (#3514). |
| 24 | +- Public LLM-friendly knowledge index (`llms.txt`, `docs.jsonl`, `api.jsonl`) |
| 25 | + plus hardening follow-up and `AGENTS.md` (#3453, #3494, #3483). |
| 26 | + |
| 27 | + |
| 28 | +## Important changes |
| 29 | + |
| 30 | +### NumPy / Matplotlib dependency bounds (#3420, #3498, #3502, #3508, #3499) |
| 31 | + |
| 32 | + |
| 33 | +Core installs no longer pin `numpy<2` or a Matplotlib upper bound. Also added |
| 34 | +`numba>=0.60` and an explicit OpenCV dependency. TensorFlow extras still keep a |
| 35 | +NumPy `<2` ceiling where the corresponding TensorFlow build requires it. |
| 36 | + |
| 37 | + |
| 38 | +- #3420 — Prepare for NumPy 2 forward compatibility (including dense SVD for |
| 39 | + tracklet ranking instead of randomized interpolative SVD) |
| 40 | +- #3498 — Fix broken NumPy 2.0 compatibility in `crossvalutils` and |
| 41 | + `predict_multianimal` |
| 42 | +- #3502 — NumPy 2 + numba: take the real part of eig eigenvectors in |
| 43 | + `EllipseFitter` |
| 44 | +- #3508 — Follow-up NumPy 2 fixes (PyTorch snapshot metric loading / |
| 45 | + `Assembly.affinity` typing; raise `numba` floor; declare OpenCV) |
| 46 | +- #3499 — Remove core NumPy and Matplotlib upper bounds (NumPy `<2` remains |
| 47 | + only where TensorFlow extras still require it; exclude broken Matplotlib |
| 48 | + 3.7 / 3.7.1) |
| 49 | +- #3445 — Guard pandas 3 Copy-on-Write read-only `.to_numpy()` / `.values` |
| 50 | + mutations |
| 51 | +- #3394 — Matplotlib v3.9 compatibility |
| 52 | +- #3509 — Tighten strict canary CI handling (`strict_cells` for same-repo |
| 53 | + pushes/PRs; fork PRs stay non-blocking) |
| 54 | + |
| 55 | + |
| 56 | +### COCOLoader (#3435) |
| 57 | + |
| 58 | + |
| 59 | +`bodyparts` / individuals capacity now come from `model_cfg.metadata`, matching |
| 60 | +`DLCLoader`. Construction validates `train.json` and `test.json` and raises |
| 61 | +`ValueError` if an image exceeds configured capacity or bodyparts do not match. |
| 62 | +Projects that previously relied on capacity inferred only from the busiest |
| 63 | +training image should set `max_individuals` (and bodyparts) explicitly. |
| 64 | + |
| 65 | + |
| 66 | +### ProjectConfig empty / null fields (#3439) |
| 67 | + |
| 68 | + |
| 69 | +Empty top-level YAML fields are treated as unset and emit an actionable warning. |
| 70 | +`DLCBaseConfig.from_yaml(..., ignore_empty=...)` no longer accepts `ignore_empty` |
| 71 | +(breaking for that optional parameter). Lower-level `read_config(..., ignore_empty=...)` |
| 72 | +deprecates the argument. |
| 73 | + |
| 74 | + |
| 75 | +### Exported models (#3473) |
| 76 | + |
| 77 | + |
| 78 | +`export_model` now calls `PoseConfig.to_dict(normalize=True)`, so pickles store |
| 79 | +primitives (`Path` → `str`, enums → `str`, etc.). Prefer re-exporting models for |
| 80 | +consumers that load the pickled config. |
| 81 | + |
| 82 | + |
| 83 | +### `overwrite` in PyTorch video analysis (#3514) |
| 84 | + |
| 85 | + |
| 86 | +`analyze_videos` and the auto-track path now forward the caller’s `overwrite` |
| 87 | +flag instead of always behaving as `overwrite=False`. Existing prediction files |
| 88 | +are skipped only when `overwrite` is false. |
| 89 | + |
| 90 | + |
| 91 | +## Features and enhancements |
| 92 | + |
| 93 | + |
| 94 | +- #3436 — Add `detector_eval_interval` to `train_from_coco` |
| 95 | +- #3475 — Add `DefaultIfNone` config validator (`null` → field default) |
| 96 | +- #3481 — Harden wandb logger error handling (validate before `wandb.init`) |
| 97 | + |
| 98 | +### Agentic interaction |
| 99 | + |
| 100 | + |
| 101 | +Coding agents and LLM tools can now discover DeepLabCut knowledge without |
| 102 | +scraping HTML. |
| 103 | + |
| 104 | + |
| 105 | +CI builds and deploys a structured index with the docs site: |
| 106 | + |
| 107 | + |
| 108 | +- `llms.txt` — [llmstxt.org](https://llmstxt.org)-style entry point at the docs |
| 109 | + root ([published here](https://deeplabcut.github.io/DeepLabCut/llms.txt) |
| 110 | + after deploy) |
| 111 | +- `knowledge/manifest.json` — which API versions are indexed and which is current |
| 112 | +- `knowledge/main/docs.jsonl` — one JSON object per user-docs page and heading |
| 113 | +- `knowledge/<version>/api.jsonl` — one JSON object per documented API symbol |
| 114 | + |
| 115 | + |
| 116 | +Also added: [`AGENTS.md`](https://github.com/DeepLabCut/DeepLabCut/blob/main/AGENTS.md), |
| 117 | +shared guidance for humans and coding agents. |
| 118 | + |
| 119 | +- #3453 — Knowledge indexing generator + CI deploy (`tools/knowledge_indexing`) |
| 120 | +- #3494 — Follow-up hardening for the LLM knowledge index (dependency bounds, |
| 121 | + stable vs `main` API links in `llms.txt`, safer skip/empty-dir publish |
| 122 | + behavior, anchor/regression fixes) |
| 123 | +- #3483 — Add `AGENTS.md` for AI-assisted development |
| 124 | + |
| 125 | +## Bug fixes |
| 126 | + |
| 127 | + |
| 128 | +- #3419 — Skip TensorFlow-backed tests cleanly when the `tf` extra is absent |
| 129 | +- #3435 — Fix `COCOLoader`: treat `model_cfg.metadata` / `max_individuals` as |
| 130 | + authoritative instead of inferring solely from `train.json` |
| 131 | +- #3439 — Update `None`-type validation for legacy `ProjectConfig` templates; |
| 132 | + remove `ignore_empty` |
| 133 | +- #3441 — GUI config editor crash + shared deferred reload on `DefaultTab` |
| 134 | +- #3447 — Evaluation visualization fixes, clean-up, and coverage improvements |
| 135 | +- #3449 — Fix frame extraction failure with pathlib video selections |
| 136 | +- #3452 — Fix incorrect SuperAnimal HumanBody rename mapping in ModelZoo / |
| 137 | + Hugging Face download |
| 138 | +- #3467 — Fix faulty `str` / `Path` conversions |
| 139 | +- #3468 — Fix latent bugs and misleading errors in GUI `create_videos` |
| 140 | +- #3469 — Fix `WandbLoggerConfig` so extra wandb kwargs validate (scoop into |
| 141 | + `wandb_kwargs`) |
| 142 | +- #3470 — Fix Faster R-CNN detector inference crashing on |
| 143 | + `box_score_thresh: null` |
| 144 | +- #3473 — Fix `export_model` dumping unnormalized objects in pickle |
| 145 | +- #3480 — Fix GUI tests: use `config_path` after rename |
| 146 | +- #3484 — Fix `tools` imports under a plain `pytest` invocation |
| 147 | +- #3486 — Docs: fix dead Model Zoo link in `examples/README.md` |
| 148 | +- #3514 — Fix hard-coded `overwrite=False` in PyTorch `analyze_videos` / |
| 149 | + auto-track path |
| 150 | + |
| 151 | + |
| 152 | +Please let us know if you face any issues with this release, especially related |
| 153 | +to the latest forward compatibility efforts, we appreciate any issues or reports! |
0 commit comments