trackers gives you clean-room, benchmarked implementations of SORT, ByteTrack, OC-SORT, BoT-SORT, C-BIoU, and McByte — so occlusions, fast motion, and moving cameras stop being your problem to solve from scratch. It speaks supervision.Detections natively, slotting into any detector you already use — YOLO, DETR, RT-DETR, or anything else — without glue code. One consistent interface, whether you're a researcher comparing algorithms, an engineer shipping a production pipeline, or a hobbyist building something cool. Requires Python ≥ 3.10.
- Clean-room implementations. Every algorithm is re-implemented from the original paper — not vendored or wrapped. You can read it, understand it, and modify it.
- Apache 2.0, no copyleft. Ship it inside closed-source products — unlike AGPL-3.0 alternatives such as BoxMOT.
- Detector-agnostic. Works with YOLO, DETR, RT-DETR, or any model that produces bounding boxes. No inference library required or assumed.
supervision.Detectionsnative. Plugs directly into the supervision ecosystem. Pass detections in, get tracked detections back — zero glue code.- Benchmarked across four datasets. MOT17, SportsMOT, SoccerNet, and DanceTrack — at default parameters and after hyperparameter tuning (McByte: defaults only, by design), so you know what to expect before you deploy.
- Tunable with one extra. Optuna-based hyperparameter search via
trackers tune(pip install "trackers[tune]") so you can optimize for your specific scene and detector. - Camera motion compensation. BoT-SORT and McByte handle moving cameras natively, keeping track IDs stable even when the whole frame shifts.
pip install trackersInstall from source
pip install git+https://github.com/roboflow/trackers.gitFor more options, see the install guide.
Add tracking to your existing detection pipeline in a few lines. Every tracker shares the same update(detections, frame=None) interface, so switching algorithms later is a one-line change. The example below uses the inference package as the detector (pip install inference — it is not part of the base trackers install) — swap it for any detector that returns supervision.Detections.
import cv2
import supervision as sv
from inference import get_model
from trackers import ByteTrackTracker
model = get_model(model_id="rfdetr-medium")
tracker = ByteTrackTracker()
cap = cv2.VideoCapture("video.mp4")
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
result = model.infer(frame)[0]
detections = sv.Detections.from_inference(result)
tracked = tracker.update(detections)For more examples, see the tracking guide.
Prefer the terminal? Point trackers track at a video, webcam feed, RTSP stream, or image directory and it handles detection, tracking, and annotated output in one command — no Python script required.
trackers track \
--source video.mp4 \
--output.video output.mp4 \
--detection.model rfdetr-medium \
--tracker bytetrack \
--show.labels \
--show.trajectoriesFor all CLI options, see the tracking guide.
Each tracker below is a faithful implementation of its original paper's motion and association pipeline; appearance/ReID branches are not included where papers offer them — see each tracker's docs page for the exact scope. Pick the one that fits your scene, or run the benchmark to find out which performs best on your data.
| Algorithm | Description | MOT17 HOTA | SportsMOT HOTA | SoccerNet HOTA | DanceTrack HOTA |
|---|---|---|---|---|---|
| SORT | Kalman filter + Hungarian matching baseline. | 58.4 | 70.8 | 81.6 | 47.2 |
| ByteTrack | Two-stage association using high and low confidence detections. | 60.1 | 73.0 | 84.0 | 53.3 |
| OC-SORT | Observation-centric recovery for lost tracks. | 61.9 | 71.7 | 78.4 | 54.1 |
| BoT-SORT | Camera motion compensation. | 63.7 | 73.8 | 84.5 | 57.8 |
| C-BIoU | Cascaded buffered IoU matching for fast or irregular motion. | 63.0 | 73.1 | 82.6 | 56.7 |
| McByte | Mask-conditioned tracking — adds propagated SAM/Cutie masks as a matching cue.* | 64.1 | 76.5 | 85.0 | 67.2 |
*McByte needs optional heavyweight deps (torch, SAM, Cutie) not installed by default. It tops HOTA on all four benchmarks above — see the McByte docs for setup.
All scores use default parameters on the standard split. Detections come from a YOLOX detector (MOT17, SportsMOT, DanceTrack) or oracle ground-truth boxes (SoccerNet) — absolute numbers shift with detector quality. See the tracker comparison for tuned numbers and methodology.
Once you have tracking results, you want to know how good they are. trackers eval computes CLEAR, HOTA, and Identity metrics against ground-truth annotations and prints a per-sequence breakdown alongside the combined score.
trackers eval \
--gt_dir ./data/mot17/val \
--predictions_dir results \
--metrics '[CLEAR,HOTA,Identity]' \
--columns '[MOTA,HOTA,IDF1]'Example output — a tracker run on MOT17 val using the dataset's public detections; absolute numbers depend on detector quality (see Detection Quality Matters), so they are not comparable to the YOLOX-based benchmark table above.
Sequence MOTA HOTA IDF1
----------------------------------------------------
MOT17-02-FRCNN 30.192 35.475 38.515
MOT17-04-FRCNN 48.912 55.096 61.854
MOT17-05-FRCNN 52.755 45.515 55.705
MOT17-09-FRCNN 51.441 50.108 57.038
MOT17-10-FRCNN 51.832 49.648 55.797
MOT17-11-FRCNN 55.501 49.401 55.061
MOT17-13-FRCNN 60.488 58.651 69.884
----------------------------------------------------
COMBINED 47.406 50.355 56.600
For the full evaluation workflow, see the evaluation guide.
Need benchmark data to evaluate against? trackers download pulls MOT17 and SportsMOT with a single command, handling splits and assets selectively so you only download what you need.
trackers download --name mot17 \
--split val \
--asset annotations,detections| Dataset | Description | Splits | Assets | License |
|---|---|---|---|---|
mot17 |
Pedestrian tracking with crowded scenes and frequent occlusions. | train, val, test |
frames, annotations*, detections |
CC BY-NC-SA 3.0 |
sportsmot |
Sports broadcast tracking with fast motion and similar-looking targets. | train, val, test |
frames, annotations* |
CC BY 4.0 |
*Annotations are available for train and val only — test splits withhold ground truth for held-out evaluation (SportsMOT test ships frames only).
For more download options, see the download guide.
- New to tracking? Start with the tracking guide — it walks through the Python API and CLI end to end.
- Want benchmarks? The tracker comparison covers all six algorithms across all four datasets, at default and tuned parameters, with guidance on which to pick for your scene.
- Building a research pipeline? The evaluation guide and download guide cover the full offline benchmarking workflow.
- Full API reference → trackers.roboflow.com
- Try without installing → Hugging Face Playground — see it in action in your browser before writing any code.
- Questions? Find us on Discord.
Releases follow Semantic Versioning — see the CHANGELOG for release history.
If you use trackers in academic work, please cite the library:
BibTeX
@software{roboflow_trackers,
author = {{Roboflow}},
title = {Roboflow Trackers},
url = {https://github.com/roboflow/trackers},
year = {2025},
license = {Apache-2.0}
}For citations of the individual tracking algorithms, follow the paper links in the Algorithms table.
We welcome contributions. Read our contributor guidelines to get started.
The code is released under the Apache 2.0 license.