Open-source project
mikel-brostrom/boxmot avatar
mikel-brostrom/boxmot

BoxMOT: A Tracker-Agnostic Layer for YOLO-Style Detection Pipelines

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

8,293 stars1,919 forksPythonAGPL-3.0

At a glance

What is it?
BoxMOT packages eleven tracking algorithms behind one Python and C++ interface, with immutable Parquet builds and a CLI that owns data flow from source to evaluation. The design is sound for teams that already have detections; the AGPL-3.0 licence is the decision point most teams will hit first.
Who is it for?
Adopt BoxMOT if you already produce detections from your own model and want several trackers behind one interface, or if you need oriented-bounding-box tracking where most libraries stop at axis-aligned boxes. Do not adopt it if AGPL-3.0 is incompatible with how you ship, or if you need a tracker that learns online from raw video without a detector.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap BoxMOT fills between a detector and a usable track

A detector gives you boxes per frame. It does not give you identity. Deciding that the box at frame 40 and the box at frame 41 are the same person is a separate problem, and the algorithms that solve it (ByteTrack, BoT-SORT, OC-SORT, StrongSORT and others) each ship as their own research repository with their own data loaders, config formats and evaluation scripts. Comparing two of them on your footage normally means writing the same glue code twice. BoxMOT's stated purpose is to remove that glue: it describes itself as providing independent detector, segmentor, appearance-encoder and tracker components built around validated Torch structures, with pipelines that compose them. The audience is therefore narrower than the topic list suggests. It is for engineers who already have a detector they trust and want to swap the tracking stage without rewriting the surrounding pipeline. It is not a detector, and the README is explicit that detection input can come from any model.

How components compose, and what the Parquet layer actually buys

The architecture separates four things that tracking code usually fuses: detection, segmentation, appearance embedding and the tracker itself. A pipeline wires them together, and the CLI owns everything around that pipeline: sources, outputs, materialized datasets, evaluation, tuning, research and ReID workflows. The interesting part is the materialization step. The README describes immutable, keyed Parquet builds with reusable detections, masks and embeddings. That means the expensive forward passes through a detector and a ReID encoder can be computed once, written to disk under a key, and reused across tracker runs. If you are comparing five trackers on the same sequence, you pay for detection and embedding once instead of five times. The keying also makes a run reproducible in the sense that a given build refers to a fixed set of inputs. The trade-off is storage and a build step: you are trading disk and an extra command for repeatable, cheaper ablation runs. For a one-off tracking job on a short clip, that layer is overhead. For a benchmark sweep, it is the reason the tool exists.

Getting a pipeline running from the command line

Installation is a single command, and the package targets Python 3.10 through 3.13. From the README: pip install boxmot, followed by boxmot --help to confirm the CLI is on the path. The default PyPI package pulls the standard PyPI PyTorch build. Source checkouts and CI can instead select a lockfile-backed profile, documented as cpu or cu130, and there are mode-specific extras named yolo, service, evolve, research, onnx, openvino and tflite, all described in the installation guide rather than the README itself. The CLI exposes the modes as subcommands: track, materialize, time-variant, eval, tune, research, train-reid, eval-reid, compare-reid, export and build. The one flag the README states explicitly is --tracker-backend cpp, which switches from the Python tracker implementations to the native C++ ones. Everything else about invocation, including the exact argument names for selecting a tracker key or a source, lives in the docs rather than in the material available here, so treat the subcommand list as the map and the docs as the territory.

The C++ backend is the part most tracking libraries do not offer

BoxMOT ships optional native C++ tracker implementations that the README says produce the same metrics as the Python path. You opt in with --tracker-backend cpp, and the same implementations can be embedded in standalone C++ projects through CMake, with a dedicated native integration document. This is a genuine architectural commitment rather than a wrapper: the tracking logic exists in two languages and the project asserts metric parity between them. Two caveats follow from the material. First, the word optional matters. The C++ path is an opt-in backend, so the default install and the default behaviour are Python. Second, metric parity is a claim made in the README, not something this article can confirm, and parity on benchmark sequences is not the same as parity on your footage. If you are choosing BoxMOT specifically for the C++ path, that claim is the first thing to reproduce on your own data before you depend on it.

Where BoxMOT is the wrong tool

The licence is the sharpest limitation. BoxMOT is AGPL-3.0, and the README carries the badge prominently. AGPL obligations attach to software offered over a network, which covers a tracking service behind an API. If your product ships as a closed binary or a hosted service and you cannot meet those obligations, the licence decides the question before any technical evaluation starts. This is not legal advice; it is a reason to route the decision to whoever handles licensing at your organisation. Beyond licensing, there is the detector dependency. BoxMOT tracks detections; it does not find objects. A pipeline with a weak detector produces confident, stable tracks of the wrong things, and no tracker in the list fixes that. And if your requirement is a single well-known algorithm with a large body of tuning advice specific to it, adopting a multi-tracker framework adds a layer of indirection between you and the code you are trying to tune.

What the benchmark table does and does not tell you

The README includes an ablation table spanning MOT17, SportsMOT validation and MMOT oriented-bounding-box test, with HOTA, MOTA and IDF1 columns and a per-tracker OBB flag. The table is a useful orientation device: it tells you which trackers the project actually maintains and which ones handle oriented boxes. Read it as a map, not as a verdict. The numbers were produced under the project's own evaluation configuration on those three datasets, and the parenthesised values next to some entries suggest a second configuration or backend being compared. None of that transfers automatically to a different camera, a different object class or a different detector. The OBB column is the more actionable signal: it tells you at a glance which trackers have an oriented-bounding-box path, which is a capability question rather than a performance question. If your data is aerial or otherwise rotated, that column narrows the field faster than any metric will.

Maintenance cost and the alternative you are probably already using

BoxMOT is actively released. The material shows v22.0.0 in July 2026, v23.0.0 in late August 2026 and v25.0.0 in September 2026, with the last push to master on the same day as the v25.0.0 release. Major version numbers advancing that quickly mean upgrade work is a real line item, not a theoretical one: pin your version, read the release notes before moving, and expect the CLI surface to be where breakage lands. The alternative most teams already have is the tracking implementation bundled with their detector framework, typically a single tracker with a small set of configuration keys, no dataset materialization, no evaluation harness and no C++ path. The difference in approach is scope. A bundled tracker answers can I get tracks today. BoxMOT answers which tracker is best for this footage, and gives you the materialization and evaluation machinery to answer it with evidence. If you never intend to ask the second question, the bundled tracker is less code to own.

Editorial conclusion

Adopt BoxMOT if you already produce detections from your own model and want several trackers behind one interface, or if you need oriented-bounding-box tracking where most libraries stop at axis-aligned boxes. Do not adopt it if AGPL-3.0 is incompatible with how you ship, or if you need a tracker that learns online from raw video without a detector. Verify three things before committing: that the tracker you want is listed as supported in the benchmark table rather than merely named in the topics, that your Python version falls inside the documented 3.10 to 3.13 range, and that the appearance-encoder weights your chosen tracker expects are obtainable in your environment, since the README does not enumerate them.

Official sources

  1. License: AGPL-3.0
  2. mikel-brostrom/boxmot on GitHub
  3. Project website
  4. README
  5. Releases
Community notes

Community notes