Pluggable Python and C++ multi-object tracking modules for axis-aligned and oriented bounding box detections from any model.
Docs • Installation • Modes • API Reference • Trackers • Datasets • Contributing
BoxMOT provides independent detector, segmentor, appearance-encoder, and tracker components built around validated Torch structures. Pipelines compose those components; the CLI owns sources, outputs, materialized datasets, evaluation, tuning, research, and ReID workflows.
- One interface for
track,materialize,materialize --time-variant,eval,tune,research,train-reid,eval-reid,compare-reid,export,install, and nativebuildworkflows. - Swappable components with explicit capabilities and requirements.
- Immutable, keyed Parquet builds with reusable detections, masks, and embeddings.
- Support for both AABB and OBB tracking paths.
- Optional native C++ tracker implementations selected with
--tracker-backend cpp, with shared detection/output contracts and documented backend differences. They are also embeddable in standalone C++ projects through CMake (see Native C++ Integration and platform dependency installation). - A structured Python API for embedding components and pipelines in applications.
Requires Python 3.10–3.13.
Install from PyPI:
pip install boxmot "ultralytics>=8.4.58"
boxmot --helpOr, from a source checkout, run in the repository root:
pip install "uv==0.12.4"
uv sync --extra cpu --extra yolo
uv run --no-sync python -m boxmot.engine.cli --helpReplace --extra cpu with --extra cu130 for CUDA 13.0.
See installation options, source and CPU/CUDA setup, and GPU batch sizing.
| Tracker key | Status | MOT17 ablation | SportsMOT val | MMOT OBB test | OBB | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| HOTA | MOTA | IDF1 | HOTA | MOTA | IDF1 | HOTA | MOTA | IDF1 | |||
| occluboost | ✅ | 71.10 (71.10) |
78.50 (78.50) |
85.28 (85.28) |
83.17 | 97.48 | 89.36 | 49.84 (49.84) |
39.41 (39.41) |
58.60 (58.60) |
✅ |
| botsort | ✅ | 69.68 (69.74) |
78.23 (78.27) |
82.33 (82.55) |
76.93 | 98.11 | 78.30 | 52.31 (52.40) |
45.43 (45.53) |
61.42 (61.42) |
✅ |
| boosttrack | ✅ | 69.25 (—) |
75.91 (—) |
83.20 (—) |
76.32 | 97.08 | 77.82 | 48.39 (—) |
41.36 (—) |
56.36 (—) |
✅ |
| strongsort | ✅ | 68.05 (—) |
76.19 (—) |
80.76 (—) |
79.80 | 97.31 | 80.27 | 49.76 (—) |
43.70 (—) |
57.32 (—) |
✅ |
| deepocsort | ✅ | 67.95 (—) |
75.83 (—) |
80.54 (—) |
79.51 | 97.94 | 79.59 | 50.84 (—) |
44.21 (—) |
59.33 (—) |
✅ |
| bytetrack | ✅ | 67.68 (67.68) |
78.04 (78.04) |
79.16 (79.16) |
67.93 | 97.25 | 76.90 | 33.97 (33.97) |
33.72 (33.72) |
39.74 (39.74) |
✅ |
| hybridsort | ✅ | 67.31 (—) |
74.09 (—) |
78.87 (—) |
81.14 | 98.07 | 81.88 | 54.64 (—) |
47.50 (—) |
64.67 (—) |
✅ |
| ocsort | ✅ | 66.44 (66.44) |
74.55 (74.55) |
77.90 (77.90) |
76.34 | 96.60 | 75.64 | 28.64 (28.64) |
26.17 (26.17) |
30.06 (30.06) |
✅ |
| sfsort | ✅ | 62.65 (62.65) |
76.87 (76.87) |
69.18 (69.18) |
75.73 | 98.39 | 72.99 | 47.83 (47.83) |
45.42 (45.42) |
52.09 (52.09) |
✅ |
Scores are Python first and C++ in parentheses.
MMOT reported metrics are 'class average'. See Experiment Workflows for details.
Related guides:
Choose a workflow and settings with the terminal UI:
boxmot ui
Track a webcam from the CLI:
boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost \ --source 0 --save --show
Python with axis-aligned boxes (AABB):
import numpy as np from boxmot import OccluBoost tracker = OccluBoost() # x1, y1, x2, y2, confidence, class_id dets = np.array([[100, 200, 300, 400, 0.9, 0]]) frame = np.zeros((480, 640, 3), dtype=np.uint8) # BGR image tracks = tracker.update(dets, frame) print(tracks[:, 4].astype(int)) # track IDs
Python with oriented boxes (OBB):
import numpy as np from boxmot import OccluBoost tracker = OccluBoost(is_obb=True) # cx, cy, width, height, angle in radians, confidence, class_id dets = np.array([[200, 300, 200, 100, np.pi / 6, 0.9, 0]]) frame = np.zeros((480, 640, 3), dtype=np.uint8) # BGR image tracks = tracker.update(dets, frame) print(tracks[:, 5].astype(int)) # track IDs
See the mode guides for more CLI and Python workflows. Advanced examples: capture timing, prompted tracking with EdgeTAM, and 2D/3D fusion with EagerMot.
Add clothing, footwear, and pose descriptions to person tracks with Ollama or vLLM. Display attributes alongside track IDs and export structured JSON results. Every attribute run requires PostgreSQL for its queue and retained results; the Compose workflow starts the database automatically.
See the Track Attributes guide for setup, configuration, and examples. To run detection, ReID, and the VLM on NVIDIA GPUs, use the GPU Compose setup.
BoxMOT is licensed under the GNU Affero General Public License v3 (AGPL-3.0).
Each detector and segmentor integrated with BoxMOT retains its own upstream license. See the respective project's license for its terms. Other third-party components also retain their respective licenses and notices.
Start with CONTRIBUTING.md and the contributor docs.
- Bugs and feature requests: GitHub Issues
- Questions and discussion: GitHub Discussions or Discord
- Limited free consulting is available for nonprofit nature conservation projects using BoxMOT. Contact
box-mot@outlook.comto discuss your project. - Citation metadata: CITATION.cff
- Commercial support:
box-mot@outlook.com

