Migrating to v24
Version 24.0.0 is one coordinated public cutover. It intentionally does not provide compatibility wrappers for the old Python, CLI, or cache interfaces.
Breaking-change map
| Before v24 | v24 replacement |
|---|---|
BoxMOT(...) workflow facade |
Explicit component factories plus PerceptionPipeline or TrackingPipeline; use the engine CLI for source-to-sink workflows |
Root Detector |
boxmot.detectors.create_detector("yolo26n", device="cpu"); explicit DetectorSpec is also supported |
Root ReIDModel |
boxmot.reid.create_reid_encoder("osnet-x0-25-msmt17", device="cpu"); explicit ReIDEncoderSpec is also supported |
| Separate tracker model/weight/device arguments | Group inference settings in ReIDConfig and pass reid=config to the tracker class or create_tracker. Pass a prebuilt AppearanceEncoder through the same argument to reuse it. TrackerSpec retains algorithm settings only |
tracker.update(numpy_rows, img=..., embs=..., masks=...) |
Use tracker.update(numpy_rows) for simple box-only calls; attach enrichments to Detections and call tracker.update(detections, frame) otherwise |
DetectionBatch, TrackResults, FrameData, FramePayload, engine result records |
Frame, Boxes/OrientedBoxes, MaskBatch, Detections, Tracks, and PipelineResult |
boxmot.api |
Removed; compose public domain packages directly |
boxmot.data |
boxmot.datasets for immutable build loading and dataset configuration; engine materialization owns finite sources |
boxmot generate |
boxmot materialize |
| Eval/tune/research selecting or creating caches | Eval and tune prepare or reuse the resolved experiment's canonical build when --build is omitted; their dataset-only forms without a detector and research require --build PATH_OR_ID |
Positional .npy/.npz caches |
Keyed boxmot.dataset/v1 Parquet builds joined by sample_id and instance_id |
| Native replay executable and caller-sized float row buffers | Live typed v2 C ABI with int64 identifiers and library-owned output/free |
Root imports
The package root exports __version__, create_tracker, ReIDConfig,
KalmanConfig, KalmanNoiseConfig, AbnormalMotionSuppressionConfig, and the lazy tracker
classes: BoostTrack, BotSort, ByteTrack, DeepOcSort, EagerMot,
HybridSort, MafHda, OccluBoost, OcSort, SFSORT, and StrongSort.
Import structures, specs, protocols, factories, pipelines, and datasets from
their named subpackages.
Boundary conversion
Canonical tensors are CPU-contiguous. Constructors validate without silently converting, moving, clipping, or filtering. Convert external framework values once before construction when sample identity, frames, masks, or embeddings are part of the call:
import torch
from boxmot.structures import Boxes, Detections
detections = Detections(
geometry=Boxes(torch.as_tensor(xyxy, dtype=torch.float32).cpu().contiguous()),
scores=torch.as_tensor(scores, dtype=torch.float32).cpu().contiguous(),
class_ids=torch.as_tensor(class_ids, dtype=torch.int64).cpu().contiguous(),
sample_id=sample_id,
)
tracks = tracker.update(detections)
Standalone box-only trackers also accept exact NumPy AABB6 or OBB7 matrices.
They return packed float64 AABB8 or OBB9 matrices. This convenience does not
restore the removed img, embs, or masks arguments; use canonical
structures for those inputs, Tracks output, and pipelines.
Cache cutover
Materialize again under the v1 schema. Existing pre-v1 positional .npy and
.npz cache directories remain physically untouched and unsupported. A
compatible v1 build in the former platform-cache build root may seed the shared
detection cache—or be imported directly when its full build identity matches—
when using the repository-local default.
HTTP compatibility
The /v1 request and response wire format is preserved. The service now
decodes those rows into canonical structures internally and serializes tracks
only at the response boundary. Existing clients still need ordered frame IDs
and the same retry/session rules.