Skip to content

Integrations

Choose the boundary that matches your application. BoxMOT does not expose a workflow facade: Python integrations compose explicit components and pipelines, while the CLI handles complete source-to-sink workflows.

Bring your own detections

For a standalone box-only tracker, pass exact NumPy AABB N x 6 or OBB N x 7 rows directly; update() returns packed float64 AABB M x 8 or OBB M x 9 rows. Convert external results to canonical structures when composing a pipeline or attaching masks, embeddings, and explicit sample metadata:

import torch

from boxmot import create_tracker
from boxmot.pipelines import TrackingPipeline
from boxmot.structures import Boxes, Detections, Frame
from boxmot.trackers import TrackerSpec

frame = Frame(
    image=rgb_chw_uint8_cpu.contiguous(),
    sample_id="stream-a:15",
    sequence_id="stream-a",
    frame_index=15,
)
detections = Detections(
    geometry=Boxes(xyxy_float32_cpu.contiguous()),
    scores=scores_float32_cpu.contiguous(),
    class_ids=class_ids_int64_cpu.contiguous(),
    sample_id=frame.sample_id,
)

tracker = create_tracker(TrackerSpec(name="bytetrack", geometry="aabb"))
pipeline = TrackingPipeline(detector=None, tracker=tracker)
result = pipeline.step_detections(frame, detections)

The example variables deliberately mark the boundary conversion: Frame requires RGB uint8[3,H,W]; geometry and scores require float32; class IDs require int64; all tensors must be CPU-contiguous.

Add perception components

Use create_detector, create_segmentor, and create_reid_encoder with their immutable specs, then pass the instances to PerceptionPipeline or TrackingPipeline. The pipeline inspects the resolved tracker's requirements and executes only missing enrichment. Runtime payloads are still validated; capability declarations are only an early check.

An external appearance encoder is optional when embeddings are needed only by a ReID-enabled tracker adapter: TrackingPipeline forwards the frame and the tracker extracts missing embeddings internally. Supplying an encoder preserves the reusable upstream path and is required when PipelineOutputs requests embeddings. ReID-enabled native adapters support the same fallback before passing features into their model-free C++ tracker libraries.

HTTP service

The /v1 wire format remains compatible. The engine decodes images and detection rows into canonical structures, enriches them with shared engine-owned models when necessary, and advances one decoupled tracker per stream. Requests for one stream must remain ordered. The GPU service deliberately keeps one external encoder shared by all stream trackers; its attached embeddings bypass the private fallback and avoid loading one model per stream. See Deployment.

Native C++

Native tracker libraries use the typed v2 C ABI: geometry, scores, and embeddings use floating-point buffers; IDs, classes, and detection indices use int64. The library allocates each output object and callers release it with the matching free call. Cached evaluation streams keyed Parquet data through this live API; there is no positional NumPy replay format. See Native C++.