Skip to content

v0.14.0

Latest

Choose a tag to compare

@niksirbi niksirbi released this 17 Feb 10:16
· 9 commits to main since this release
447492e

To update movement to the latest version, see the update guide.

What's Changed

⚡️ Highlight: unified data loading interface

Thanks to @lochhh's tireless efforts, loading poses and bounding boxes is now handled by a single entry point, movement.io.load_dataset.

The new load_dataset function works for all our supported third-party formats. For example:

from movement.io import load_dataset

# DeepLabCut -> poses dataset
ds = load_dataset("path/to/file.h5", source_software="DeepLabCut", fps=30)

# SLEAP -> poses dataset
ds = load_dataset("path/to/file.slp", source_software="SLEAP")

# NWB -> poses dataset
ds = load_dataset("path/to/file.nwb", source_software="NWB")

# VGG Image Annotator tracks -> bounding boxes dataset
ds = load_dataset("path/to/file.csv", source_software="VIA-tracks")

Similarly, movement.io.load_multiview_dataset replaces the old movement.io.load_poses.from_multiview_files, with added support for bounding boxes:

from movement.io import load_multiview_dataset

# Load LightningPose pose predictions from two cameras.
ds = load_multiview_dataset(
    {"cam1": "path/to/cam1.csv", "cam2": "path/to/cam2.csv"},
    source_software="LightningPose",
    fps=30,
)

Software-specific loaders (e.g. load_poses.from_dlc_file, load_bboxes.from_via_tracks_file) remain available for users who want full control over the loading process.

Warning

The following functions are deprecated and will be removed in a future release:

  • load_poses.from_file → use load_dataset instead
  • load_bboxes.from_file → use load_dataset instead
  • load_poses.from_multiview_files → use load_multiview_dataset instead

Migrating from deprecated functions:

# Before
from movement.io import load_poses, load_bboxes

ds = load_poses.from_file("file.h5", source_software="DeepLabCut", fps=30)
ds = load_bboxes.from_file("file.csv", source_software="VIA-tracks", fps=30)
ds = load_poses.from_multiview_files(
    {"cam1": "cam1.csv", "cam2": "cam2.csv"},
    source_software="LightningPose", fps=30,
)

# After
from movement.io import load_dataset, load_multiview_dataset

ds = load_dataset("file.h5", source_software="DeepLabCut", fps=30)
ds = load_dataset("file.csv", source_software="VIA-tracks", fps=30)
ds = load_multiview_dataset(
    {"cam1": "cam1.csv", "cam2": "cam2.csv"},
    source_software="LightningPose", fps=30,
)

🐛 Bug fixes

  • Adapt savgol_filter for compatibility with Scipy >= 1.17 by @niksirbi in #761
  • Fix coordinate assignment for elem2 in _cdist by @HARSHDIPSAHA in #776
  • Hide _factorized properties from Points layer tooltips by @niksirbi in #781

🤝 Improving the contributor experience

📚 Documentation

🧹 Housekeeping

  • Restrict sphinx version to < 9 by @niksirbi in #768
  • Unpin sphinx and pin ablog>=0.11.13 by @niksirbi in #811
  • Fix deprecated license syntax by @sfmig in #549
  • Ignore Docutils URL in linkcheck by @lochhh in #793
  • Ignore ISO URL in linkcheck by @lochhh in #815
  • Authenticate with GitHub token during linkcheck by @niksirbi in #800
  • [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #795
  • Contributors-Readme-Action: Update contributors list by @github-actions[bot] in #787
  • Bump conda-incubator/setup-miniconda from 3.2.0 to 3.3.0 by @dependabot[bot] in #788

New Contributors

Full Changelog: v0.13.0...v0.14.0