Back to rankings

mikel-brostrom/boxmot

Pythonmikel-brostrom.github.io/boxmot/

BoxMOT: Pluggable python and c++ SOTA multi-object tracking modules with support for axis-aligned and oriented bounding boxes

strongsortbytetrackocsortdeep-learningsegmentationtensorrttracking-by-detectionyolobotsortdeepocsortmulti-object-trackingmot
Star Growth
Stars
8.2k
Forks
1.9k
Weekly Growth
Issues
0
5k
Jun 2020Jun 2022Jul 2024Jul 2026
ArtifactsPyPIpip install boxmot
README

BoxMOT logo

Pluggable Python and C++ multi-object tracking modules for axis-aligned and oriented bounding box detections from any model.

CI PyPI version downloads license python-version docker pulls DOI colab discord Ask DeepWiki

mikel-brostrom%2Fboxmot | Trendshift


DocsInstallationModesAPI ReferenceTrackersContributing

BoxMOT demo

BoxMOT gives you one CLI and one Python API for running modern multi-object tracking workflows. It covers direct tracking, cached benchmark evaluation, tuning, research loops, ReID training and evaluation, and ReID export without forcing you to rebuild the detector and tracker stack for each experiment.

Why BoxMOT

  • One interface for track, generate, eval, tune, research, train, eval-reid, and export.
  • Swappable trackers with shared detector and ReID plumbing.
  • Benchmark-oriented workflows with reusable detections and embeddings.
  • Support for both AABB and OBB tracking paths.
  • Optional production-ready native C++ tracker implementations with the same metrics as the Python path, opted into via --tracker-backend cpp and embeddable in standalone C++ projects via CMake (see Native C++ Integration).
  • Public Python API for embedding the same workflows in applications and notebooks.

Installation

BoxMOT supports Python 3.10 through 3.13.

pip install boxmot
boxmot --help

For mode-specific extras such as yolo, evolve, research, onnx, openvino, and tflite, see the installation guide.

Benchmark Results

Tracker Status MOT17 ablation SportsMOT val MMOT OBB test OBB
HOTA MOTA IDF1 HOTA MOTA IDF1 HOTA MOTA IDF1
occluboost 70.47
(70.48)
78.32
(78.31)
84.14
(84.14)
83.17 97.48 89.36 28.14 28.21 29.66
botsort 69.44
(69.43)
78.24
(78.26)
81.94
(82.00)
76.93 98.11 78.30 52.27 45.45 61.36
boosttrack 69.25
(—)
75.91
(—)
83.20
(—)
76.32 97.08 77.82 42.88 32.80 48.44
strongsort 68.05
(—)
76.19
(—)
80.76
(—)
79.80 97.31 80.27 49.75 43.64 57.39
deepocsort 67.95
(—)
75.83
(—)
80.54
(—)
79.51 97.94 79.59 50.43 43.93 58.39
bytetrack 67.68
(67.75)
78.04
(78.03)
79.16
(79.38)
67.93 97.25 76.90 33.97 33.72 39.74
hybridsort 67.31
(—)
74.09
(—)
78.87
(—)
81.14 98.07 81.88 53.86 44.63 63.22
ocsort 66.44
(66.44)
74.55
(74.55)
77.90
(77.90)
76.34 96.60 75.64 28.57 26.19 29.95
sfsort 62.65
(62.66)
76.87
(76.74)
69.18
(69.18)
75.73 98.39 72.99 44.19 44.27 46.25

MMOT OBB results report the TrackEval Class Avg (Cls) across all eight categories on the 5,466-frame test split, using yolo11l_3ch detections and lmbn_n_duke ReID features. All trackers use their Python backend.

Py (C++); unavailable. See Benchmark Workflows.

Related guides:

Minimal Usage

CLI:

boxmot track --detector yolo26n --reid lmbn_n_duke --tracker occluboost --source 0 --save --show

Python:

import numpy as np
from boxmot.trackers import OccluBoost

tracker = OccluBoost()

# dets: (N, 6) array with [x1, y1, x2, y2, conf, cls] per detection
dets = np.array([[100, 200, 300, 400, 0.9, 0]], dtype=np.float32)
img = np.zeros((480, 640, 3), dtype=np.uint8)  # current frame

# tracks: (M, 8) array with [x1, y1, x2, y2, id, conf, cls, det_ind] per track
tracks = tracker.update(dets, img)
print(tracks)

Contributing

Start with CONTRIBUTING.md and the contributor docs.

Contributors

BoxMOT contributors

Support and Citation