Skip to content
imaged

Multi-object tracking

ByteTrack

Motion-only tracker that holds IDs through short occlusions.

MIT
Explore model

About this model

ByteTrack is a pure C++ multi-object tracker. There is no ONNX file: a Kalman motion model and two-stage IoU association rescue low-confidence detections to keep tracks alive across short occlusions.

Feed it a YOLO DetectionResult per frame. The tracker assigns a stable trackId to each surviving detection. The tracker itself adds under 1 ms per frame; the rest of the budget goes to the upstream detector.

What you can build

  • Count unique people walking past a camera over an hour.
  • Hold IDs across brief occlusions in a retail aisle scene.
  • Drive simple analytics from a single-camera live feed.
  • Run a low-cost tracker when no appearance embedding is available.

Variants & downloads

Choose the build for your app

Model files are being prepared.

Explore the model’s examples, source links, and integration notes while download variants are added.

Example inference

Input
Frame 1 of a multi-person restaurant scene.
Output
The scene with track IDs drawn on each person.

Performance

Results depend on the device, runtime, and test conditions. Each measurement keeps its own context.

M1 Max, macOS 15, ONNX Runtime 1.17 (per frame, includes YOLO)

See original catalog hardware notes · CPU

87.5 ms

Warm inference

Catalog reference · variant unspecifiedCold start (ms): 193.28

Reference result from the existing catalog; conversion variant and measurement date were not recorded.

Integration examples

Vision SDK integration

cpp

#include "imaged/sdk.hpp"
#include "imaged/pipelines/tracking/tracking_pipeline.hpp"

imaged::SDK::AI ai;
auto& config = ai.getOptions();
config.set("yolo.model", "weights/yolo11n.onnx");
config.set("tracking.algorithm", "bytetrack");
config.set("tracking.maxAge", 30);
config.set("tracking.minHits", 1);
config.set("tracking.iouThreshold", 0.3);

imaged::SDK::TrackingPipeline pipeline;
pipeline.load(config);

for (auto& frame : frames) {
    auto tracked = pipeline.update(frame);
    // tracked.detections[i].trackId is stable across frames
}