Multi-object tracking
DeepSort
ByteTrack motion plus an OSNet appearance gate for crowded scenes.
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 appModel files are being prepared.
Explore the model’s examples, source links, and integration notes while download variants are added.
Example inference
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
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);
}