Skip to content
imaged

Multi-object tracking

DeepSort

ByteTrack motion plus an OSNet appearance gate for crowded scenes.

MIT
Explore model

About this model

DeepSort layers a ReID appearance gate on top of ByteTrack. When motion-only association is ambiguous after a long occlusion, DeepSort compares buffered OSNet embeddings to keep IDs stable. Pure C++ algorithm, no ONNX of its own.

It depends on the osnet-ain-x1-0-msmt17 ReID variant for embeddings. On a 10-person scene this adds about 200 ms per frame on top of ByteTrack. Use it for crowded scenes where motion alone causes ID switches.

What you can build

  • Track people through a crowded mall walkway with many crossings.
  • Hold IDs across longer occlusions where ByteTrack would swap.
  • Build a re-id-aware tracker for a multi-camera retail analytics tool.
  • Compare appearance and motion association on a benchmark video.

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 that survive occlusions thanks to appearance matching.

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 and OSNet)

See original catalog hardware notes · CPU

191.6 ms

Warm inference

Catalog reference · variant unspecifiedCold start (ms): 272.91

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/deep_sort_pipeline.hpp"

imaged::SDK::AI ai;
auto& config = ai.getOptions();
config.set("yolo.model", "weights/yolo11n.onnx");
config.set("reid.model", "weights/osnet_ain_x1_0_msmt17.onnx");
config.set("reid.inputWidth", 128);
config.set("reid.inputHeight", 256);
config.set("tracking.maxAge", 30);
config.set("tracking.iouThreshold", 0.3);
config.set("tracking.appearanceThreshold", 0.4);
config.set("deep_sort.classFilter", "person");

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

for (auto& frame : frames) {
    auto tracked = pipeline.update(frame);
}