Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

TrackTrack

TrackTrack (CVPR 2025). A track-centric online tracker built on a ByteTrack-style two-stage lifecycle, with two contributions.

  • Track-perspective association. Rather than solving one global assignment, each track picks its own best detection and a pair matches only when the choice is mutual. The loop repeats with a cost gate that tightens each round. High and low confidence detections share one pass; low ones carry a penalty instead of running as a separate stage. The cost fuses a height-modulated IoU, an optional appearance term, a confidence projection, and a velocity-direction term.
  • Track-aware initialization. A leftover detection starts a new track only if it clears an init threshold and does not overlap an existing active track, or a more confident leftover, by more than tai_thresh.

Appearance is optional. Pass embeddings to use the Re-ID term, or an empty slice to track on motion only.

This port keeps the two contributions and the fused cost on the shared 8-dimensional Kalman filter. It uses a simplified velocity-direction term and does not reproduce the paper’s detector-level NMS recovery pool, which needs access to the detector’s suppressed boxes.

Parameters

ParameterDefaultDescription
det_thresh0.6Score above which a detection is high confidence
match_thresh0.7Association cost gate, lower is stricter
track_buffer30Frames a lost track is kept alive
min_hits3Matched frames in a row before a new track is confirmed
init_thresh0.7Smallest score a leftover detection needs to start a new track
tai_thresh0.55Overlap gate for track-aware initialization, a maximum IoU
penalty_low0.2Extra cost added to low confidence detections during association
reduce_step0.05How much the cost gate tightens per matching round

Python

from trackforge import TRACKTRACK

tracker = TRACKTRACK(det_thresh=0.6, match_thresh=0.7, track_buffer=30, min_hits=3)

detections = [([100.0, 100.0, 50.0, 100.0], 0.9, 0)]
tracks = tracker.update(detections)
for track_id, tlwh, score, class_id, det_ind in tracks:
    print(f"ID={track_id}  box={tlwh}")

Rust

use trackforge::trackers::tracktrack::TrackTrack;

let mut tracker = TrackTrack::new();

let detections = vec![([100.0_f32, 100.0, 50.0, 100.0], 0.9_f32, 0_i64)];
let tracks = tracker.update(detections, &[]);
for t in &tracks {
    println!("ID: {}, Box: {:?}", t.track_id, t.tlwh);
}