Skip to content

releasing 2.6.0 - #536

Merged
Borda merged 1 commit into
developfrom
releasing/2.6.0
Aug 6, 2026
Merged

releasing 2.6.0#536
Borda merged 1 commit into
developfrom
releasing/2.6.0

Conversation

@Borda

@Borda Borda commented Aug 3, 2026

Copy link
Copy Markdown
Member

v2.6.0: McByte and dynamic frame rate

📋 Summary

trackers v2.6.0 adds McByteTracker, a new mask-conditioned tracker that extends BoT-SORT-style
association with SAM/Cutie temporal segmentation masks as an extra matching cue. It also adds
dynamic frame rate support (timestamp= on update()) for all six trackers, tightens
track-lifecycle validation with two breaking changes, fixes nine correctness bugs, and hardens ZIP
extraction against path traversal (CWE-22).

✨ Spotlights / highlights

McByteTracker

from trackers import McByteTracker

tracker = McByteTracker()

Mask-conditioned association via SAM (box→mask) + Cutie (temporal mask propagation), opt-in via
pip install trackers[mask]. Default enable_mask_manager=False runs ByteTrack-parity with no
extra weights required.

Dynamic frame rate via timestamp=

tracker.update(detections, frame, timestamp=frame_wallclock_seconds)

Elapsed wall-clock seconds convert into Kalman frame units; omitting timestamp preserves the
existing fixed-rate behavior.

Breaking: stricter lifecycle validation

# Before: silently accepted
tracker = SORTTracker(lost_track_buffer=-1)

# After: raises ValueError
tracker = SORTTracker(lost_track_buffer=-1)
# ValueError: lost_track_buffer must be greater than or equal to 0

Tracker performance improvements

CMC's sparse optical-flow status filter is now vectorized (~24x on that op); KalmanMotionModel
caches transition/noise matrices and defers DWNA calibration (~38% lower BoT-SORT/CBIoU predict
cost).

Security: hardened ZIP extraction

Dataset-download ZIP extraction rejects archive members with absolute paths, traversal segments,
or Windows backslash paths (Zip Slip / CWE-22).

🔄 Migration guide

Breaking changes

lost_track_buffer / frame_rate now validated

SORTTracker, ByteTrackTracker, OCSORTTracker, BoTSORTTracker, and CBIoUTracker (which
forwards its constructor args to BoTSORTTracker) now raise ValueError at construction if
lost_track_buffer is negative or frame_rate is not finite and positive.

# Before (v2.5.0) — silently accepted
tracker = SORTTracker(lost_track_buffer=-1)

# After (v2.6.0) — raises immediately
tracker = SORTTracker(lost_track_buffer=-1)
# ValueError: lost_track_buffer must be greater than or equal to 0

lost_track_buffer=0 remains valid (no missed-frame grace period).

Missed-frame boundary is now inclusive

Confirmed tracks now survive one additional missed frame — comparison changed from
time_since_update < maximum_frames_without_update to time_since_update <= maximum_frames_without_update (the frame-rate-scaled form of lost_track_buffer), matching
OC-SORT's prior behavior. Expect small IDSW/HOTA shifts when comparing metrics across versions.

Behavior changes (non-breaking)

Unmatched sub-activation-threshold detections are now emitted

ByteTrackTracker, BoTSORTTracker, and CBIoUTracker.update() now return detections between
the two confidence thresholds (below track_activation_threshold but above
high_conf_det_threshold) with tracker_id=-1 instead of dropping them.

result = tracker.update(detections)
matched = result[result.tracker_id != -1]

📝 Notable changes

🚀 Added

⚠️ Breaking Changes

  • Invalid lost-track buffer settings now raise ValueErrorlost_track_buffer must be
    non-negative and frame_rate finite and positive across all five classic trackers (SORT,
    ByteTrack, OC-SORT, BoT-SORT, CBIoU). (Unify lost track buffer semantics #420)
  • Confirmed tracks now survive one additional missed frame — boundary changed from exclusive
    to inclusive to match OC-SORT. (Unify lost track buffer semantics #420)

🌱 Changed

🔧 Fixed

🔒 Security


🏆 Contributors

  • Agis Kounelis (@kounelisagis) — ByteTrack fix: return unmatched detections between the two
    confidence thresholds instead of dropping them.
  • Alexander Bodner (@AlexBodner) — dynamic frame-rate integration.
  • Christoph Deil (@cdeil) — unified lost-track buffer semantics across all trackers.
  • Jesús Royeth (@JESUSROYETH) — McByte miss-clock timing, video output resize fix, OC-SORT
    Kalman scale fix.
  • Jirka Borovec (@Borda) — McByte MPS device support + Cutie streaming config, mask-pipeline
    public API export, package build/publish fix.
  • Ruben (@RubenHaisma) — BoT-SORT instant-activated track fix, IoU signed-variant fusion clamp.
  • S B Pranay (@pranaysb) — CMC resize-crash fix, xcycsr_to_xyxy zero-division fix.
  • Tomasz Stańczyk (@tstanczyk95, LinkedIn) —
    McByte tracker end-to-end: skeleton, dynamic Cutie mask lifecycle management, mask-conditioned
    association.

01_side_by_side.mp4
03_moment_of_decision.mp4
04_how_the_mask_decides.mp4

Full changelog: 2.5.0...2.6.0

@Borda Borda self-assigned this Aug 4, 2026
@Borda
Borda marked this pull request as ready for review August 5, 2026 20:14
@Borda
Borda requested a review from SkalskiP as a code owner August 5, 2026 20:14
@Borda
Borda merged commit 0e839f3 into develop Aug 6, 2026
17 checks passed
@Borda
Borda deleted the releasing/2.6.0 branch August 6, 2026 07:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant