Metadata-Version: 2.5
Name: boxmot
Version: 23.0.0
Summary: BoxMOT: pluggable SOTA tracking modules for segmentation, object detection and pose estimation models
Author: Mikel Broström
License: AGPL-3.0
License-File: LICENSE
Keywords: AI,DL,ML,YOLO,deep-learning,machine-learning,tracking,tracking-by-detection,vision
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Education
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Image Processing
Classifier: Topic :: Scientific/Engineering :: Image Recognition
Classifier: Topic :: Software Development
Requires-Python: <3.14,>=3.10
Requires-Dist: click>=8.1.8
Requires-Dist: filterpy<2.0.0,>=1.4.5
Requires-Dist: gdown<6.0.0,>=5.1.0
Requires-Dist: huggingface-hub>=1.7.1
Requires-Dist: lapx<1.0.0,>=0.5.5
Requires-Dist: numpy>=2.2.0
Requires-Dist: opencv-python<5.0.0,>=4.7.0
Requires-Dist: pandas<3.0.0,>=2.0.0
Requires-Dist: rich>=15.0.0
Requires-Dist: scikit-learn<2.0.0,>=1.3.0
Requires-Dist: timm<2.0.0,>=1.0.15
Requires-Dist: torch<3.0.0,>=2.2.1
Requires-Dist: torchvision<1.0.0,>=0.17.1
Provides-Extra: coreml
Requires-Dist: coremltools==9.0; extra == 'coreml'
Requires-Dist: psutil<8.0.0,>=5.9.5; extra == 'coreml'
Provides-Extra: evolve
Requires-Dist: bayesian-optimization==2.0.4; extra == 'evolve'
Requires-Dist: hyperopt>=0.2.7; extra == 'evolve'
Requires-Dist: matplotlib<4.0.0,>=3.8.0; extra == 'evolve'
Requires-Dist: optuna==3.5.0; extra == 'evolve'
Requires-Dist: plotly==5.19.0; extra == 'evolve'
Requires-Dist: pydantic<2.12.0,>=2.5.0; extra == 'evolve'
Requires-Dist: ray[tune]==2.52.1; extra == 'evolve'
Requires-Dist: scipy<2.0.0,>=1.11.0; extra == 'evolve'
Requires-Dist: seaborn<1.0.0,>=0.13.0; extra == 'evolve'
Provides-Extra: onnx
Requires-Dist: onnx==1.20.1; extra == 'onnx'
Requires-Dist: onnxruntime==1.24.3; extra == 'onnx'
Requires-Dist: onnxscript>=0.1.0; extra == 'onnx'
Requires-Dist: onnxslim>=0.1.67; extra == 'onnx'
Provides-Extra: openvino
Requires-Dist: openvino>=2025.2.0; extra == 'openvino'
Provides-Extra: research
Requires-Dist: gepa[full]>=0.1.1; extra == 'research'
Provides-Extra: rtdetr
Requires-Dist: transformers>=5.0.0; extra == 'rtdetr'
Provides-Extra: tflite
Requires-Dist: ai-edge-litert>=2.1.0; extra == 'tflite'
Requires-Dist: litert-torch==0.9.1; extra == 'tflite'
Provides-Extra: trackeval
Requires-Dist: trackeval==1.3.0; extra == 'trackeval'
Provides-Extra: yolo
Requires-Dist: loguru<1.0.0,>=0.7.2; extra == 'yolo'
Requires-Dist: ultralytics>=8.4.58; extra == 'yolo'
Requires-Dist: yolox==0.3.0; extra == 'yolo'
Description-Content-Type: text/markdown

<div align="center" markdown="1">

  <img width="400"
       src="docs/logo/logo.png"
       alt="BoxMOT logo">

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

  [![CI](https://github.com/mikel-brostrom/boxmot/actions/workflows/ci.yml/badge.svg)](https://github.com/mikel-brostrom/boxmot/actions/workflows/ci.yml)
  [![PyPI version](https://badge.fury.io/py/boxmot.svg)](https://badge.fury.io/py/boxmot)
  [![downloads](https://static.pepy.tech/badge/boxmot)](https://pepy.tech/project/boxmot)
  [![license](https://img.shields.io/badge/license-AGPL%203.0-blue)](https://github.com/mikel-brostrom/boxmot/blob/master/LICENSE)
  [![python-version](https://img.shields.io/pypi/pyversions/boxmot)](https://badge.fury.io/py/boxmot)
  [![docker pulls](https://img.shields.io/docker/pulls/boxmot/boxmot?logo=docker)](https://hub.docker.com/r/boxmot/boxmot)
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8132989.svg)](https://doi.org/10.5281/zenodo.8132989)
  [![colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/18nIqkBr68TkK8dHdarxTco6svHUJGggY?usp=sharing)
  [![discord](https://img.shields.io/discord/1377565354326495283?logo=discord&label=discord&labelColor=fff&color=5865f2)](https://discord.gg/tUmFEcYU4q)
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/mikel-brostrom/boxmot)

  <a href="https://trendshift.io/repositories/13239" target="_blank"><img src="https://trendshift.io/api/badge/repositories/13239" alt="mikel-brostrom%2Fboxmot | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"></a>

  ---

  [Docs](docs/index.md) • [Installation](docs/getting-started/installation.md) • [Modes](docs/modes/index.md) • [API Reference](docs/python/index.md) • [Trackers](docs/trackers/index.md) • [Contributing](CONTRIBUTING.md)

  <img width="640"
       src="https://github.com/mikel-brostrom/boxmot/releases/download/v12.0.0/output_640.gif"
       alt="BoxMOT demo">

</div>

BoxMOT gives you one CLI and one Python API for running modern multi-object tracking workflows. It covers direct tracking, catalog-backed 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-reid`, `eval-reid`, `export`, and native `build`
  workflows.
- Swappable trackers with shared detector and ReID plumbing.
- Dataset and experiment 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](docs/native/index.md)).
- Public Python API for embedding the same workflows in applications and notebooks.

## Installation

BoxMOT supports Python `3.10` through `3.13`.

```bash
pip install boxmot
boxmot --help
```

For mode-specific extras such as `yolo`, `evolve`, `research`, `onnx`, `openvino`, and `tflite`, see the [installation guide](docs/getting-started/installation.md).

## Benchmark Results

<div align="center" markdown="1">

<!-- START TRACKER TABLE -->
<table>
  <thead>
    <tr>
      <th rowspan="2" align="left"><sub>Tracker</sub></th>
      <th rowspan="2" align="center"><sub>Status</sub></th>
      <th colspan="3" align="center"><sub>MOT17 ablation</sub></th>
      <th colspan="3" align="center"><sub>SportsMOT val</sub></th>
      <th colspan="3" align="center"><sub>MMOT OBB test</sub></th>
      <th rowspan="2" align="center"><sub>OBB</sub></th>
    </tr>
    <tr>
      <th align="right"><sub>HOTA</sub></th>
      <th align="right"><sub>MOTA</sub></th>
      <th align="right"><sub>IDF1</sub></th>
      <th align="right"><sub>HOTA</sub></th>
      <th align="right"><sub>MOTA</sub></th>
      <th align="right"><sub>IDF1</sub></th>
      <th align="right"><sub>HOTA</sub></th>
      <th align="right"><sub>MOTA</sub></th>
      <th align="right"><sub>IDF1</sub></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td align="left"><sub>occluboost</sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub><b>71.10</b><br>(71.10)</sub></td>
      <td align="right"><sub><b>78.50</b><br>(78.50)</sub></td>
      <td align="right"><sub><b>85.28</b><br>(85.28)</sub></td>
      <td align="right"><sub><b>83.17</b></sub></td>
      <td align="right"><sub>97.48</sub></td>
      <td align="right"><sub><b>89.36</b></sub></td>
      <td align="right"><sub>49.84<br>(49.84)</sub></td>
      <td align="right"><sub>39.41<br>(39.41)</sub></td>
      <td align="right"><sub>58.60<br>(58.60)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2206.14651">botsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>69.68<br>(69.74)</sub></td>
      <td align="right"><sub>78.23<br>(78.27)</sub></td>
      <td align="right"><sub>82.33<br>(82.55)</sub></td>
      <td align="right"><sub>76.93</sub></td>
      <td align="right"><sub><b>98.11</b></sub></td>
      <td align="right"><sub>78.30</sub></td>
      <td align="right"><sub>52.31<br>(52.40)</sub></td>
      <td align="right"><sub>45.43<br>(45.53)</sub></td>
      <td align="right"><sub>61.42<br>(61.42)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2408.13003">boosttrack</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>69.25<br>(—)</sub></td>
      <td align="right"><sub>75.91<br>(—)</sub></td>
      <td align="right"><sub>83.20<br>(—)</sub></td>
      <td align="right"><sub>76.32</sub></td>
      <td align="right"><sub>97.08</sub></td>
      <td align="right"><sub>77.82</sub></td>
      <td align="right"><sub>48.39<br>(—)</sub></td>
      <td align="right"><sub>41.36<br>(—)</sub></td>
      <td align="right"><sub>56.36<br>(—)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2202.13514">strongsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>68.05<br>(—)</sub></td>
      <td align="right"><sub>76.19<br>(—)</sub></td>
      <td align="right"><sub>80.76<br>(—)</sub></td>
      <td align="right"><sub>79.80</sub></td>
      <td align="right"><sub>97.31</sub></td>
      <td align="right"><sub>80.27</sub></td>
      <td align="right"><sub>49.76<br>(—)</sub></td>
      <td align="right"><sub>43.70<br>(—)</sub></td>
      <td align="right"><sub>57.32<br>(—)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2302.11813">deepocsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>67.95<br>(—)</sub></td>
      <td align="right"><sub>75.83<br>(—)</sub></td>
      <td align="right"><sub>80.54<br>(—)</sub></td>
      <td align="right"><sub>79.51</sub></td>
      <td align="right"><sub>97.94</sub></td>
      <td align="right"><sub>79.59</sub></td>
      <td align="right"><sub>50.84<br>(—)</sub></td>
      <td align="right"><sub>44.21<br>(—)</sub></td>
      <td align="right"><sub>59.33<br>(—)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2110.06864">bytetrack</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>67.68<br>(67.68)</sub></td>
      <td align="right"><sub>78.04<br>(78.04)</sub></td>
      <td align="right"><sub>79.16<br>(79.16)</sub></td>
      <td align="right"><sub>67.93</sub></td>
      <td align="right"><sub>97.25</sub></td>
      <td align="right"><sub>76.90</sub></td>
      <td align="right"><sub>33.97<br>(33.97)</sub></td>
      <td align="right"><sub>33.72<br>(33.72)</sub></td>
      <td align="right"><sub>39.74<br>(39.74)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2308.00783">hybridsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>67.31<br>(—)</sub></td>
      <td align="right"><sub>74.09<br>(—)</sub></td>
      <td align="right"><sub>78.87<br>(—)</sub></td>
      <td align="right"><sub>81.14</sub></td>
      <td align="right"><sub>98.07</sub></td>
      <td align="right"><sub>81.88</sub></td>
      <td align="right"><sub><b>54.64</b><br>(—)</sub></td>
      <td align="right"><sub><b>47.50</b><br>(—)</sub></td>
      <td align="right"><sub><b>64.67</b><br>(—)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/abs/2203.14360">ocsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>66.44<br>(66.44)</sub></td>
      <td align="right"><sub>74.55<br>(74.55)</sub></td>
      <td align="right"><sub>77.90<br>(77.90)</sub></td>
      <td align="right"><sub>76.34</sub></td>
      <td align="right"><sub>96.60</sub></td>
      <td align="right"><sub>75.64</sub></td>
      <td align="right"><sub>28.64<br>(28.64)</sub></td>
      <td align="right"><sub>26.17<br>(26.17)</sub></td>
      <td align="right"><sub>30.06<br>(30.06)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
    <tr>
      <td align="left"><sub><a href="https://arxiv.org/pdf/2404.07553">sfsort</a></sub></td>
      <td align="center"><sub>✅</sub></td>
      <td align="right"><sub>62.65<br>(62.65)</sub></td>
      <td align="right"><sub>76.87<br>(76.87)</sub></td>
      <td align="right"><sub>69.18<br>(69.18)</sub></td>
      <td align="right"><sub>75.73</sub></td>
      <td align="right"><sub>98.39</sub></td>
      <td align="right"><sub>72.99</sub></td>
      <td align="right"><sub>47.83<br>(47.83)</sub></td>
      <td align="right"><sub>45.42<br>(45.42)</sub></td>
      <td align="right"><sub>52.09<br>(52.09)</sub></td>
      <td align="center"><sub>✅</sub></td>
    </tr>
  </tbody>
</table>
<!-- END TRACKER TABLE -->

<p align="center">
  <sub>Scores are Python first and C++ in parentheses.</sub><br>
  <sub>MMOT reported metrics are 'class average'. See <a href="docs/guides/experiments.md">Experiment Workflows</a> for details.</sub>
</p>

</div>

Related guides:

- [Evaluation and Postprocessing](docs/guides/evaluation.md)
- [Experiment Workflows](docs/guides/experiments.md)
- [Native C++ Integration](docs/native/index.md)

## Minimal Usage

CLI:

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

Python:

```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)
# OBB alternative: (N, 7) with [cx, cy, w, h, angle_radians, conf, cls]
# dets = np.array([[200, 300, 200, 200, 0.25, 0.9, 0]], dtype=np.float32)
img = np.zeros((480, 640, 3), dtype=np.uint8)  # current frame

# tracks: AABB (M, 8), or OBB (M, 9) with angle after h
tracks = tracker.update(dets, img)
print(tracks)
```

## Contributing

Start with [CONTRIBUTING.md](CONTRIBUTING.md) and the [contributor docs](docs/contributing/index.md).

## Contributors

<a href="https://github.com/mikel-brostrom/boxmot/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=mikel-brostrom/boxmot" alt="BoxMOT contributors">
</a>

## Support and Citation

- Bugs and feature requests: [GitHub Issues](https://github.com/mikel-brostrom/boxmot/issues)
- Questions and discussion: [GitHub Discussions](https://github.com/mikel-brostrom/boxmot/discussions) or [Discord](https://discord.gg/tUmFEcYU4q)
- Citation metadata: [CITATION.cff](https://github.com/mikel-brostrom/boxmot/blob/master/CITATION.cff)
- Commercial support: `box-mot@outlook.com`
