Skip to main content

HOCT

Inference and tracking for the Higher-Order Cell Tracking Transformer (HOCT) model with JIT-compiled models.


Quick start (for biologists)

If all you want is to track cells from images and segmentation masks, you do not need to write any Python. The steps below take you from "nothing installed" to "a tracking result on disk" in about a minute.

1. Install uv (one-time)

uv is a small Python launcher. It downloads everything else automatically.

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Close and reopen your terminal so uv is on your PATH. Verify:

uv --version

2. Run tracking

uvx runs the CLI in a temporary, isolated environment — nothing is installed permanently and there is no virtual environment to manage:

uvx --from "hoct[bioio]" hoct track \
    <IMAGES> <SEGMENTATION> \
    -o <OUTPUT.geff>
  • <IMAGES>: a single image file (whole time series) or a folder of single-frame files sorted alphabetically.
  • <SEGMENTATION>: same format as <IMAGES> (file with file, folder with folder), with one integer label per object.
  • <OUTPUT.geff>: where to write the result. Default is a folder in the GEFF format. Pass -f ctc to instead write a Cell Tracking Challenge folder of per-frame label TIFFs plus res_track.txt.

No model is specified above, so HOCT downloads the default pre-trained model (general_v1) and caches it; later runs reuse the cache. To use the model trained for Cell Tracking Challenge data, pass -m ctc_v0; to use your own checkpoint, pass -m /path/to/model.pt. Set HOCT_CACHE_DIR to change where downloads are cached.

The first run also downloads the Python dependencies; later runs start almost instantly.

Example: a CTC dataset

uvx --from "hoct[bioio]" hoct track \
    /data/Fluo-C3DL-MDA231/01 \
    /data/Fluo-C3DL-MDA231/01_ERR_SEG \
    -o tracks.geff

This loads 12 frames of 3D images and segmentation masks, builds the candidate graph, runs the model on the GPU (falling back to CPU if none is available), solves the tracking ILP, and writes tracks.geff/.

To benchmark against the Cell Tracking Challenge ground truth, write the result directly in CTC format:

uvx --from "hoct[bioio]" hoct track \
    /data/Fluo-C3DL-MDA231/01 \
    /data/Fluo-C3DL-MDA231/01_ERR_SEG \
    -o /data/Fluo-C3DL-MDA231/01_RES \
    -f ctc

This produces the standard CTC layout (maskNNN.tif per timepoint plus res_track.txt).

Useful flags

Flag Default What it does
-o, --output required Output GEFF directory
-m, --model general_v1 Checkpoint path or registered model name (for example, ctc_v0); the default is downloaded on first use
-f, --format geff geff or ctc (Cell Tracking Challenge folder)
-d, --device cuda cuda, mps, or cpu (auto-falls back to CPU if needed)
--tile auto auto/on/off. Tiled inference for large data; auto-enables when the candidate graph has more than 2500 edges per timepoint. Tile shape (t, z, y, x) = (1, 64, 256, 256), overlap (2, 24, 64, 64).
-ow, --overwrite off Overwrite an existing output directory
--full-graph off Save the full candidate graph (with predicted scores) instead of just the solution
--scale none Physical voxel size, repeat the flag per axis: --scale 1 --scale 0.5 --scale 0.5 --scale 0.5 for t z y x
--max-distance 300.0 Largest spatial distance to consider as a candidate edge
--neighbors 5 Maximum candidate neighbors per cell
--max-dt 3 Maximum temporal gap (in frames) for candidate edges
--window, -w 5 Temporal window size used by the model
--config, -c none Path to an ILP solver config YAML (see init-config)

Run uvx --from "hoct[bioio]" hoct track --help for the full list.

Customising the solver

Generate a template config you can edit and pass with -c:

uvx --from hoct hoct init-config -o solver_config.yaml
# ...edit the file...
uvx --from "hoct[bioio]" hoct track ... -c solver_config.yaml

Tracking from an existing GEFF

If you already have a candidate graph in GEFF form (e.g. produced by hoct.features.create_graph), use predict instead of track. Pass -s to write just the tracking solution; omit it to keep the full candidate graph with predicted scores:

uvx --from hoct hoct predict candidate.geff -s -o tracks.geff

Installation

pip install "hoct[bioio]"

The bioio extra is needed for the track CLI (reading image/label files).

Installation (for developers)

git clone https://github.com/royerlab/hoct
cd hoct
uv sync --extra dev --extra bioio

Test data

Most of the suite runs on tiny synthetic inputs. The data/tracking tests need candidate-graph GEFF fixtures built from two small Cell Tracking Challenge training sets; they are skipped until you build them:

uv run python scripts/prepare_test_data.py

This downloads the datasets into .test-data/ (gitignored) and writes the GEFF fixtures. To use existing graphs instead, point HOCT_TEST_GEFF_2D / HOCT_TEST_GEFF_3D at them.

Python API

import numpy as np
from hoct import load_model, predict

# Downloads and caches the default pre-trained model on first use. Pass a name
# (see hoct.available_models()) or a local .pt path to use a different one.
model = load_model(device="cuda")

# labels: (T, Y, X) or (T, Z, Y, X) integer array; images: same shape (optional)
labels = np.load("labels.npy")
images = np.load("images.npy")

solution_graph = predict(model, labels=labels, images=images)
solution_graph.to_geff("tracks.geff")

See hoct.predict for the full signature (custom solver config, tiled inference, test-time augmentation, etc.).

Pre-trained models

load_model() (and the CLI without -m) fetch a JIT-compiled checkpoint from the project's GitHub releases, verify its SHA256, and cache it under the OS cache directory (override with HOCT_CACHE_DIR). List the available names with hoct.available_models(). The registered models are:

  • general_v1 — the default model for general datasets;
  • ctc_v0 — the model trained for Cell Tracking Challenge datasets;
  • general_v0 — the previous general model, retained for reproducibility.

Select one by passing its name to load_model() or to the CLI's --model / -m option. The registry lives in src/hoct/_models.py.

Publishing new weights (maintainers)

  1. Create a GitHub release with a new weights tag (e.g. weights-v2) and upload the .pt asset.
  2. Compute its hash: shasum -a 256 model.pt.
  3. Add an entry to MODELS in src/hoct/_models.py with the tagged release asset URL and hash, and bump DEFAULT_MODEL if it should become the default.

Development

# Run tests
pytest

# Run linting
ruff check .

# Format code
ruff format .

Download files

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

Source Distribution

hoct-0.2.0.tar.gz (66.5 kB view details)

Uploaded Source

Built Distribution

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

hoct-0.2.0-py3-none-any.whl (51.1 kB view details)

Uploaded Python 3

File details

Details for the file hoct-0.2.0.tar.gz.

File metadata

  • Download URL: hoct-0.2.0.tar.gz
  • Upload date:
  • Size: 66.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for hoct-0.2.0.tar.gz
Algorithm Hash digest
SHA256 67fa1f7afd87e7f404656fc60927c95ccaa1f09f8cb99e3cf448d0cbd356e366
MD5 93bf77fbca4481bbfbec5326545815af
BLAKE2b-256 15e58d40eaa67c2b79676d1c339312299aaf8265276e2c6a8fc47271478e59dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for hoct-0.2.0.tar.gz:

Publisher: release.yml on royerlab/hoct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hoct-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: hoct-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 51.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for hoct-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c6194e81a05d272913dd0945ede2484d9a7d89f8d751c4eb1e30c43031e9093c
MD5 cb213884b6597bc5ef6566ae57a9f7fb
BLAKE2b-256 bf035f42ba29b58d4fdc3d1f3bdecbb303af518bab3d882b2a684e60aa878c86

See more details on using hashes here.

Provenance

The following attestation bundles were made for hoct-0.2.0-py3-none-any.whl:

Publisher: release.yml on royerlab/hoct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page