| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-06-23 | 8.7 kB | |
| v2.5.0_ Pluggable IoU variants + C-BIoU tracker source code.tar.gz | 2026-06-23 | 590.0 kB | |
| v2.5.0_ Pluggable IoU variants + C-BIoU tracker source code.zip | 2026-06-23 | 685.8 kB | |
| Totals: 3 Items | 1.3 MB | 0 | |
π Summary
trackers 2.5.0 makes the association step configurable: all four trackers now accept an iou= parameter and ship five built-in IoU variants. The new CBIoUTracker (C-BIoU, WACV 2023) extends the built-in algorithm roster with cascaded buffered matching for fast-moving or small objects. The Tuner gets four new parameters that round out the tuning workflow, and a correctness fix in HOTA evaluation brings numbers in line with TrackEval.
Track IDs are now allocated per-tracker-instance, so multi-camera and class-specific workflows no longer risk duplicate IDs across independent trackers.
https://github.com/user-attachments/assets/9df19512-e20a-457b-8df0-3be220763747
β¨ Spotlights
π― Pluggable IoU variants
All four trackers now accept an iou= parameter that takes any BaseIoU subclass. Five built-in variants:
| Variant | Score range | Best for |
|---|---|---|
IoU |
[0, 1] |
Default β strong baseline |
GIoU |
[-1, 1] |
Boxes that frequently lose overlap (occlusion) |
DIoU |
[-1, 1] |
Fast-moving objects; centre-distance signal |
CIoU |
[-1, 1] |
Same as DIoU + aspect-ratio consistency |
BIoU |
[0, 1] |
Small or very fast objects (buffered boxes) |
:::python
from trackers import ByteTrackTracker
from trackers.utils.iou import GIoU
tracker = ByteTrackTracker(
iou=GIoU(),
minimum_iou_threshold=0.1, # re-tune for the new score range
)
detections = tracker.update(detections)
Subclass BaseIoU and override _compute to plug in a fully custom metric. The normalize_for_fusion hook handles signed-range variants correctly in BoT-SORT's score-fusion step.
π CBIoUTracker
CBIoUTracker (Yang et al., WACV 2023) expands boxes by a configurable margin before computing IoU and runs two cascade passes with independently tunable buffer ratios:
:::python
from trackers import CBIoUTracker
tracker = CBIoUTracker(
buffer_ratio_first=0.1, # first pass: small buffer (high-conf dets vs tracks)
buffer_ratio_second=0.3, # second pass: larger buffer (confirmed tracks vs low-conf)
)
detections = tracker.update(detections)
Benchmark scores on val sets (default parameters):
| Algorithm | MOT17 HOTA | SportsMOT HOTA | SoccerNet HOTA | DanceTrack HOTA |
|---|---|---|---|---|
| SORT | 58.4 | 70.8 | 81.6 | 47.2 |
| ByteTrack | 60.1 | 73.0 | 84.0 | 53.3 |
| OC-SORT | 61.9 | 71.7 | 78.4 | 54.1 |
| BoT-SORT | 63.7 | 73.8 | 84.5 | 57.8 |
| C-BIoU | 63.0 | 73.1 | 82.6 | 56.7 |
C-BIoU keeps the computational simplicity of ByteTrack while it can exceed its performance depending on the video characteristics.
See tracker comparison for all metrics, tuned numbers and methodology.
βοΈ Tuner enhancements
Four new Tuner parameters:
:::python
from trackers.tune import Tuner
from trackers import BoTSORTTracker
tuner = Tuner(
tracker_class=BoTSORTTracker,
gt_dir="data/gt/",
detections_dir="data/det/",
images_dir="data/img/", # new: frames for CMC-enabled trackers
fixed_params={"enable_cmc": True}, # new: held constant across all trials
enqueue_defaults=True, # new: baseline trial before Optuna samples
seed=42, # new: reproducible TPE sampling
)
result = tuner.tune()
Migration guide
Breaking: tracklet class-level ID counters removed
If you subclass BaseTracker and called a tracklet's class-level get_next_tracker_id():
:::python
# Before (v2.4.0)
tracker_id = SORTTracklet.get_next_tracker_id()
# After (v2.5.0)
tracker_id = self._allocate_tracker_id() # in your BaseTracker subclass
Users of the public tracker.update() API are not affected.
Deprecations (removed in v3.0)
:::python
# SORTTracker.trackers β .tracks
for t in tracker.tracks: # was: tracker.trackers
# CMC import path
from trackers.utils.cmc import CMC, CMCConfig, CMCMethod # was: trackers.core.botsort.cmc
from trackers import CMC # also works
# CMC.apply_to_xyxy β CMC.warp_xyxy_corners
warped = cmc.warp_xyxy_corners(H, boxes) # was: apply_to_xyxy
# BoTSORTTracker.apply_cmc_batch β CMC.apply_batch
cmc.apply_batch(H, tracker.tracks) # was: tracker.apply_cmc_batch(H)
# CMCTMethod β CMCMethod
from trackers.utils.cmc import CMCMethod # was: CMCTMethod
Notable changes
π Added
- Pluggable IoU variants β
iou=parameter onSORTTracker,ByteTrackTracker,OCSORTTracker,BoTSORTTracker; five built-in variants plusBaseIoUABC for custom metrics. (#403) CBIoUTrackerβ Cascaded-Buffered IoU tracker (Yang et al., WACV 2023). (#417)Tunerparams βenqueue_defaults,fixed_params,images_dir,seed. (#427)py.typedmarker β PEP 561 compliance; downstream type checkers now recognise the package as typed.
β οΈ Breaking Changes
- Tracklet class-level ID counters removed β
*Tracklet.get_next_tracker_id()class methods removed from all tracklet subclasses. Useself._allocate_tracker_id()(fromBaseTracker) instead. Only affects customBaseTrackersubclassers. (#419)
π± Changed
CMC,CMCConfig,CMCMethodmoved totrackers.utils.cmc, re-exported from top-leveltrackers; oldtrackers.core.botsort.cmcpath kept as deprecated shim. (#414)CMC.apply_batchhomogeneity guard β raisesTypeErroron mixed state-estimator tracklet lists. (#414)- OC-SORT OCR step always uses standard
IoUregardless of configurediou=variant, matching the paper. (#403)
ποΈ Deprecated
SORTTracker.trackersβ.tracks(FutureWarning, removed in v3.0). (#460)trackers.core.botsort.cmcimport path βtrackers.utils.cmc(DeprecationWarning, removed in v3.0). (#414)BoTSORTTracker.apply_cmc_batchβCMC.apply_batch(H, tracker.tracks)(removed in v3.0). (#414)CMCTMethodβCMCMethod(removed in v3.0). (#414)CMC.apply_to_xyxyβCMC.warp_xyxy_corners(removed in v3.0). (#414)
π§ Fixed
- BoT-SORT score fusion β signed IoU variants (GIoU/DIoU/CIoU) now normalised before fusion via
normalize_for_fusion, preventing track-ranking inversion. (#403) - Non-finite box coordinates β
BaseIoU.computeraisesValueErrorwith a clear message for NaN/inf inputs instead of propagating into SciPy'slinear_sum_assignment. (#403) - ByteTrack
confidence=Noneβ detections without confidence now treated as high-confidence (SORT-like); previously produced no tracks. (#415) - HOTA evaluation accuracy β per-frame alpha loop vectorized; MOT distractor class filtering now matches TrackEval, correcting reported HOTA on MOT17. (#462, [#466])
- Tracker instances no longer share ID counters β resetting one tracker no longer affects another's ID allocator. (#419)
π Contributors
- Alexander Bodner (@AlexBodner, LinkedIn) β C-BIoU tracker, IoU variants, tuner enhancements, DanceTrack benchmark results
- Tomasz StaΕczyk (@tstanczyk95) (LinkedIn) β C-BIoU and IoU variants - expertise sharing and supervision
- Christoph Deil (@cdeil, LinkedIn) β per-instance ID allocators, ByteTrack confidence fix
- Manan Gupta (@manan152003, LinkedIn) β SORTTracker deprecation docs
- Ruben Haisma (@RubenHaisma, LinkedIn) β HOTA vectorization, MOT distractor class fix
- Jirka Borovec (@Borda, LinkedIn) β review, docs, test infrastructure
Full changelog: https://github.com/roboflow/trackers/compare/2.4.0...v2.5.0