Skip to main content

An annotation and instance segmentation-based multiple animal tracking and behavior analysis package.

Project description

annolid

Annolid Build Annolid Release DOI Downloads Arxiv

Annotate, segment, and track multiple animals (or any research target) in video with a single toolchain.

Table of Contents

Overview

Annolid is a deep learning toolkit for animal behavior analysis that brings annotation, instance segmentation, tracking, and behavior classification into a single workflow. It combines state-of-the-art models—including Cutie for video object segmentation, Segment Anything, and Grounding DINO—to deliver resilient, markerless tracking even when animals overlap, occlude each other, or are partially hidden by the environment.

Use Annolid to classify behavioral states such as freezing, digging, pup huddling, or social interaction while maintaining fine-grained tracking of individuals and body parts across long video sessions.

Python support: Annolid runs on Python 3.10–3.13. The toolkit is not yet validated on Python 3.14, where several binary wheels (PyQt, Pillow) are still pending upstream releases.

Key Features

  • Markerless multiple-animal tracking from a single annotated frame.
  • Instance segmentation powered by modern foundation models and transfer learning.
  • Interactive GUI for rapid annotation (LabelMe-based) plus automation with text prompts.
  • Behavioral state classification, keypoint tracking, and downstream analytics.
  • Works with pre-recorded video or real-time streams; supports GPU acceleration.
  • Optional EfficientTAM video tracking backend, fully integrated and auto-downloaded (no separate installation needed).

Documentation & Support

Quick Start

Install Anaconda, then set up Annolid in a new environment:

conda create -n annolid-env python=3.11
conda activate annolid-env
conda install git ffmpeg
git clone --recurse-submodules https://github.com/healthonrails/annolid.git
cd annolid
pip install -e .
annolid  # launches the GUI

The annolid command detects your hardware automatically. If you need tighter control (for example, to target a specific CUDA toolkit), use the environment files described below.

Installation Options

Conda environment (GPU-ready, Ubuntu 20.04 tested)

git clone --recurse-submodules https://github.com/healthonrails/annolid.git
cd annolid
conda env create -f environment.yml
conda activate annolid-env
annolid

If you see CUDA capability sm_86 is not compatible with the current PyTorch installation, install a matching build:

conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 cudatoolkit=12.1 -c pytorch -c nvidia

Pip-only installation

python -m venv annolid-env
source annolid-env/bin/activate
pip install --upgrade pip
pip install annolid
pip install "segment-anything @ git+https://github.com/SysCV/sam-hq.git"
annolid

This route works well on machines without Conda, but you remain responsible for installing system dependencies such as ffmpeg.

uv (lightweight venv + installer)

Use uv if you prefer fast virtualenv creation and dependency resolution:

pip install --user uv  # or grab the standalone binary
git clone --recurse-submodules https://github.com/healthonrails/annolid.git
cd annolid
uv venv .venv --python 3.11
source .venv/bin/activate
uv pip install -e .
annolid

Generate a lock file for reproducible installs with uv pip compile pyproject.toml -o uv.lock, then reproduce the environment elsewhere via uv pip sync uv.lock. Ensure ffmpeg/ffprobe is available on your PATH (brew install ffmpeg on macOS, sudo apt install ffmpeg on Ubuntu) so timestamp tools work correctly.

Apple Silicon (macOS M1/M2)

Some Intel-specific libraries can trigger MKL errors on Apple Silicon. If you observe messages such as:

Intel MKL FATAL ERROR: This system does not meet the minimum requirements...

recreate the environment with native wheels:

conda create -n annolid-env python=3.11
conda activate annolid-env
git clone --recurse-submodules https://github.com/healthonrails/annolid.git
cd annolid
pip install -e .
annolid

Optional dependencies

  • Detectron2 (required for training new instance segmentation models):
    conda activate annolid-env
    python -m pip install --user "git+https://github.com/facebookresearch/detectron2.git"
    
  • Segment Anything 2 (SAM2) for object tracking:
    cd segmentation/SAM/segment-anything-2
    pip install -e .
    
  • FFmpeg is recommended for format conversion and improved compatibility with OpenCV-based video I/O:
    conda install -c conda-forge ffmpeg
    

Using Annolid

  • Launch the GUI:
    conda activate annolid-env
    annolid
    
  • Provide custom labels:
    annolid --labels=/path/to/labels_custom.txt
    
  • Pick between Ollama, OpenAI GPT, or Google Gemini for caption chat features by opening the caption panel and clicking Configure… next to the model selector. API keys are stored in ~/.annolid/llm_settings.json.
  • Summarise annotated behavior events into a time-budget report (GUI: File → Behavior Time Budget; CLI example with 60 s bins and a project schema):
    python -m annolid.behavior.time_budget exported_events.csv \
        --schema project.annolid.json \
        --bin-size 60 \
        -o time_budget.csv
    
  • Compress videos when storage is limited:
    ffmpeg -i input.mp4 -vcodec libx264 output_compressed.mp4
    

Video Depth Anything

  • Run depth estimation on the currently loaded video via View → Video Depth Anything…. Use View → Depth Settings… to pick the encoder, resolution, FPS downsampling, and which outputs to save.
  • Pretrained weights belong under annolid/depth/checkpoints. Download just what you need via the bundled Python helper (uses huggingface-hub, already listed in dependencies):
    cd annolid
    python -m annolid.depth.download_weights --model video_depth_anything_vitl
    
    Pass --all to fetch every checkpoint, or run python -m annolid.depth.download_weights --list for the full menu. Existing files are never re-downloaded.
  • The GUI runner now auto-downloads whichever checkpoint you select in the dialog, so you only need to invoke the helper when you want to prefetch models ahead of time.
  • Depth run now streams inference frame-by-frame, emits a single depth.ndjson record alongside the video (with per-frame base64 depth PNGs plus scale metadata) instead of writing separate JSON files per frame, and still shows a live blended overlay while processing. Enable save_depth_video or save_depth_frames only if you also need rendered outputs.
  • Optional exports include depth_frames/, <video_stem>_vis.mp4, point cloud CSVs, *.npz, and *_depths_exr/ (EXR requires OpenEXR/Imath).
  • Full walkthrough: docs/source/video_depth_anything.md.

Annotation Guide

Annolid UI based on LabelMe

  • Label polygons and keypoints clearly. Give each animal a unique instance name when tracking across frames (for example, vole_1, mouse_2). Use descriptive behavior names (rearing, grooming) for polygons dedicated to behavioral events, and name body-part keypoints (nose, tail_base) consistently.
  • Accelerate timestamp annotation. While scoring behaviors, press s to mark the start, e to mark the end, f/b to step ±10 frames, and r to remove events directly from the video slider.
  • Enable frame-level flags. Launch Annolid with --flags "digging,rearing,grooming" to open a multi-select list of behaviors. Save selections with Ctrl+S or the Save button; remove events by pressing R.
  • Customize configuration. The first run creates ~/.labelmerc (or C:\Users\<username>\.labelmerc on Windows). Edit this file to change defaults such as auto_save: true, or supply an alternative path via annolid --config /path/to/file.
  • Learn more. Additional annotation tips live in annolid/annotation/labelme.md.

Labeling Best Practices

  • Label 20–100 frames per video to reach strong performance; the curve in docs/imgs/AP_across_labeled_frames.png shows how accuracy scales with annotation volume.
  • Close the loop with human-in-the-loop training (see docs/imgs/human_in_the_loop.png): train on initial annotations, auto-label, correct, and retrain until predictions align with human expectations.
  • Draft labeling guidelines up front—start with this template and adapt it to your species and behaviors.
  • Treat each animal instance as its own class when you need cross-frame identity. Use generic class names only when identity consistency is unnecessary, or when you are aggregating across many individuals.
  • To generalize to new animals or videos, include diverse examples of each behavior and adjust the training set iteratively.

Tutorials & Examples

  • DINOv3 Keypoint Tracking tutorial: book/tutorials/DINOv3_keypoint_tracking.md Effortless Multiple Instance Tracking using Annolid: Beginner's Tutorial

Effortlessly Create Polygon Labels for Objects using Segment Anything Models

Annolid Youtube playlist

YouTube Channel Annolid documentations

Multiple Animal Tracking

Instance segmentations Behavior prediction

Mouse behavior analysis with instance segmentation based deep learning networks

Troubleshooting

  • Video playback errors (OpenCV: FFMPEG: tag ... or missing codecs):
    Install FFmpeg via your package manager or conda install -c conda-forge ffmpeg to extend codec support.
  • macOS Qt warning (Class QCocoaPageLayoutDelegate is implemented in both ...):
    conda install qtpy resolves the conflict between OpenCV and PyQt.
  • If the GUI does not launch, confirm the correct environment is active and run annolid --help for CLI usage.
  • For model training/inference from the terminal, use annolid-run list-models, annolid-run train <model> --help-model, and annolid-run predict <model> --help-model.
  • For an interactive TensorBoard embedding projector view of DinoKPSEG DINOv3 patch features, run annolid-run dino-kpseg-embeddings --data /path/to/data.yaml [--weights /path/to/best.pt] and then tensorboard --logdir <run_dir>/tensorboard (some DINOv3 checkpoints require a Hugging Face token).

Docker

Ensure Docker is installed, then run:

cd annolid/docker
docker build .
xhost +local:docker  # Linux only; allows GUI forwarding
docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix/ -e DISPLAY=$DISPLAY <IMAGE_ID>

Replace <IMAGE_ID> with the identifier printed by docker build.

Citing Annolid

If you use Annolid in your research, please cite:

@misc{yang2024annolid,
      title={Annolid: Annotate, Segment, and Track Anything You Need},
      author={Chen Yang and Thomas A. Cleland},
      year={2024},
      eprint={2403.18690},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

@article{yang2023automated,
  title={Automated Behavioral Analysis Using Instance Segmentation},
  author={Yang, Chen and Forest, Jeremy and Einhorn, Matthew and Cleland, Thomas A},
  journal={arXiv preprint arXiv:2312.07723},
  year={2023}
}

@misc{yang2020annolid,
  author = {Chen Yang and Jeremy Forest and Matthew Einhorn and Thomas Cleland},
  title = {Annolid: an instance segmentation-based multiple animal tracking and behavior analysis package},
  howpublished = {\url{https://github.com/healthonrails/annolid}},
  year = {2020}
}

Publications

Additional Resources

Acknowledgements

Annolid's tracking module integrates Cutie for enhanced video object segmentation. If you use this feature, please cite Putting the Object Back into Video Object Segmentation (Cheng et al., 2023) and the Cutie repository.

The counting tool integrates CountGD; cite the original CountGD publication and repository when you rely on this module in your research.

Contributing

Contributions are welcome! Review the guidelines in CONTRIBUTING.md, open an issue to discuss major changes, and run relevant tests before submitting a pull request.

License

Annolid is distributed under the Creative Commons Attribution-NonCommercial 4.0 International License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

annolid-1.4.0.tar.gz (21.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

annolid-1.4.0-py3-none-any.whl (21.5 MB view details)

Uploaded Python 3

File details

Details for the file annolid-1.4.0.tar.gz.

File metadata

  • Download URL: annolid-1.4.0.tar.gz
  • Upload date:
  • Size: 21.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for annolid-1.4.0.tar.gz
Algorithm Hash digest
SHA256 29833cb26708d12e5de3fd9ce012fcc72e0bc60869ca479bf6053225928a1784
MD5 ded683296b2b2c357dd333394fa4f682
BLAKE2b-256 d3068b613225fbf8f480e167483e3d3455340412e25fadbdff8ad4ac482d711c

See more details on using hashes here.

File details

Details for the file annolid-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: annolid-1.4.0-py3-none-any.whl
  • Upload date:
  • Size: 21.5 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for annolid-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8daf41a39099a1687cd70131d38d9432645905823e7c797fde6bff95c014df6a
MD5 aef0efd8d89e06c9cdec5df95d8bf822
BLAKE2b-256 f689544503720abc65b3516c39997c78e1c2d358989bde05ab32880198b18cd9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page