Skip to main content

Fast object tracking library - Rust implementation of norfair

Project description

norfair-rs

Real-time multi-object tracking for Rust

License Rust Version


Disclaimer: This is an unofficial Rust port of Python's norfair object tracking library. This project is NOT affiliated with, endorsed by, or associated with Tryolabs or the original norfair development team. All credit for the original design and algorithms goes to the original norfair authors.


Overview

norfair-rs is a Rust implementation of the norfair multi-object tracking library, bringing real-time object tracking capabilities to Rust applications with:

  • Detector-agnostic design: Works with any object detector (YOLO, Faster R-CNN, custom models)
  • Rust-native performance: Zero-cost abstractions, no GC, maximum speed
  • Type-safe API: Compile-time validation of tracking configurations
  • Comprehensive Tests: 278 tests ensuring correctness and equivalence with the original norfair library

Related Projects

  • norfair - Original Python implementation by Tryolabs
  • norfair-go - Go port of norfair (sibling project)

Features

  • Flexible Distance Functions: IoU, Euclidean, Manhattan, Frobenius, Keypoint Voting, and more
  • Multiple Filtering Options: Optimized Kalman filter, full filterpy-equivalent Kalman, or no filtering
  • Camera Motion Compensation: Support for translation transformations (homography with opencv feature)
  • Re-identification: Optional feature embedding for robust identity matching
  • Thread-safe: Concurrent-safe ID generation and tracking

Benchmarks

Cross-language performance comparison (IoU distance, OptimizedKalmanFilter):

Scenario Frames Detections norfair norfair-go norfair-rs (python) norfair-rs (rust)
Small 100 446 4,700 fps 243,000 fps 107,000 fps 296,000 fps
Medium 500 9,015 540 fps 31,000 fps 27,000 fps 89,000 fps
Large 1,000 44,996 101 fps 3,800 fps 11,000 fps 41,000 fps
Stress 2,000 179,789 547 fps 5,200 fps 18,500 fps

Speedup norfair-rs (rust) vs norfair: 60-180x depending on scenario complexity Speedup norfair-rs (python) vs norfair: 20-50x (drop-in replacement)

Benchmarks run on Apple M3 Pro. See examples/benchmark/ for reproduction scripts.


Installation

Add to your Cargo.toml:

[dependencies]
norfair = { git = "https://github.com/nmichlo/norfair-rs" }

Quick Start

use norfair_rs::{Detection, Tracker, TrackerConfig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. Create tracker with IoU distance function
    let mut config = TrackerConfig::from_distance_name("iou", 0.5);
    config.hit_counter_max = 30;
    config.initialization_delay = 3;

    let mut tracker = Tracker::new(config)?;

    // 2. For each frame
    for frame in iter_video_frames() {
        // 2.1 Generate detections from your object detector
        let detections: Vec<Detection> = detect_objects(&frame)
            .iter()
            .map(|bbox| {
                // Bounding box format: [x1, y1, x2, y2]
                Detection::from_slice(
                    &[bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h],
                    1, 4  // 1 row, 4 columns
                ).unwrap()
            })
            .collect();

        // 2.2 Update tracker, returning current tracked objects with stable IDs
        let tracked_objects = tracker.update(detections, 1, None);

        // 2.3 Use tracked objects (draw, analyze, etc.)
        for obj in tracked_objects {
            if let Some(id) = obj.id {
                draw_box(&frame, &obj.estimate, id);
            }
        }
    }

    Ok(())
}
Python Norfair Equivalent

Here's how the same tracking workflow looks in the original Python norfair library:

Python:

from norfair import Detection, Tracker

# Create tracker
tracker = Tracker(
    distance_function="iou",
    distance_threshold=0.5,
    hit_counter_max=30,
    initialization_delay=3,
)

# Process frames
for frame in iter_video_frames():
    # Get detections from your detector
    detections = [
        Detection(points=np.array([[x1, y1, x2, y2]]))
        for x1, y1, x2, y2 in detect_objects(frame)
    ]

    # Update tracker
    tracked_objects = tracker.update(detections=detections)

    # Use tracked objects
    for obj in tracked_objects:
        draw_box(frame, obj.estimate, obj.id)

Key Differences:

  • Rust: Explicit configuration structs vs Python kwargs
  • Rust: Error handling with Result<T, E> returns
  • Rust: Uses nalgebra matrices instead of numpy arrays
  • Rust: Zero-cost abstractions with compile-time guarantees

Both implementations provide the same core functionality with Rust offering better performance.

Configuration Options

use norfair_rs::{TrackerConfig, filter::OptimizedKalmanFilterFactory};
use norfair_rs::distances::distance_by_name;

let mut config = TrackerConfig::new(distance_by_name("euclidean"), 50.0);

// Tracking behavior
config.hit_counter_max = 15;           // Frames to keep tracking without detection
config.initialization_delay = 3;       // Detections required to initialize
config.pointwise_hit_counter_max = 4;  // Per-point tracking threshold
config.detection_threshold = 0.5;      // Minimum detection confidence
config.past_detections_length = 4;     // History for re-identification

// Re-identification (optional)
config.reid_distance_function = Some(distance_by_name("euclidean"));
config.reid_distance_threshold = 100.0;
config.reid_hit_counter_max = Some(50);

// Kalman filter
config.filter_factory = Box::new(OptimizedKalmanFilterFactory::new(
    4.0,   // R (measurement noise)
    0.1,   // Q (process noise)
    10.0,  // P (initial covariance)
    0.0,   // pos_variance
    1.0,   // vel_variance
));

Distance Functions

Built-in distance functions available via distance_by_name():

Name Description Use Case
"euclidean" L2 distance between points Single-point tracking
"iou" 1 - Intersection over Union Bounding box tracking
"mean_euclidean" Average L2 across all points Multi-keypoint tracking
"mean_manhattan" Average L1 across all points Grid-aligned tracking
"frobenius" Frobenius norm of difference Matrix comparison

Custom distance functions can be implemented via the Distance trait.

Filter Options

Three filter types are available:

use norfair_rs::filter::{
    OptimizedKalmanFilterFactory,  // Fast, simplified Kalman (default)
    FilterPyKalmanFilterFactory,    // Full filterpy-compatible Kalman
    NoFilterFactory,                // No prediction (detection-only)
};

API Documentation

Core Types

  • Tracker - Main tracking engine that maintains object identities across frames
  • Detection - Input from object detector (bounding boxes, keypoints, or arbitrary points)
  • TrackedObject - Output object with stable ID, position estimate, and tracking metadata
  • TrackerConfig - Configuration for tracker behavior
  • TrackedObjectFactory - Thread-safe ID generation

Camera Motion

use norfair_rs::camera_motion::TranslationTransformation;

// Compensate for camera movement
let transform = TranslationTransformation::new([dx, dy]);
let tracked = tracker.update(detections, 1, Some(&transform));

Feature Flags

[dependencies]
norfair = { git = "...", features = ["opencv"] }
Feature Description
opencv Enable video I/O, drawing, and homography transforms

License & Attribution

norfair-rs is licensed under the BSD 3-Clause License.

This Rust port is based on the original norfair by Tryolabs (BSD 3-Clause). Their well-designed, detector-agnostic architecture made this port possible. Internal modules include code adapted from several Python libraries—see THIRD_PARTY_LICENSES.md for complete attribution.

Citation: If using this library in research, please cite the original norfair paper as described here.


Contributing: Issues and pull requests welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

norfair_rs-0.3.1.tar.gz (1.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

norfair_rs-0.3.1-cp312-abi3-win_amd64.whl (282.1 kB view details)

Uploaded CPython 3.12+Windows x86-64

norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (402.0 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (386.9 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

norfair_rs-0.3.1-cp312-abi3-macosx_11_0_arm64.whl (359.7 kB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

norfair_rs-0.3.1-cp312-abi3-macosx_10_12_x86_64.whl (382.2 kB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

Details for the file norfair_rs-0.3.1.tar.gz.

File metadata

  • Download URL: norfair_rs-0.3.1.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for norfair_rs-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1ace15360f21df592c7606d65ae77fd1ced9d4dd19cc2771f0af421fa4b469e3
MD5 d6db22589236b8e29b58c329616c2ad0
BLAKE2b-256 5b8b93257deaabe6b65d0afecc5e075df783594e41b9608f8f20342ac520075c

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1.tar.gz:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file norfair_rs-0.3.1-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: norfair_rs-0.3.1-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 282.1 kB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for norfair_rs-0.3.1-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 df1b45c156044669d8fec53adc18a5597e9a2abbb05b19785b1114d46ddeb5c8
MD5 40c6f2924b0bde65ca5dbd5afb817cf5
BLAKE2b-256 f581c0cab1d2b45cc13b34bd6a46de1e5713a5698fbeb24360f3bbe6ded2c0a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1-cp312-abi3-win_amd64.whl:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b1dd359aa9a55dd9a052eb1cce676ff1bcf482f2ca6187d19bee015cc184522
MD5 1e862d6f43f98a729cc333ba0f96a659
BLAKE2b-256 2a7815a715713e7a6a93503ac9c774a6fdba437ee1018066b32445bc5cb8e427

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9b4e7eb0ad07ebf2a4851e1ae2d07eea8df8e889ab2ed37a5975c169d699fd0e
MD5 1e25391c4762180cc879d6b490ac5afe
BLAKE2b-256 80f2d2013eacdb8cd03775c9b8229f303d61d42f820c0f1a1cd1000522abb5bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file norfair_rs-0.3.1-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for norfair_rs-0.3.1-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5999e1087b6280bd4de384b692907886203fed038b172648337319dd92b313f
MD5 56b1df0867f93231f23d85519cf07748
BLAKE2b-256 fbf9de9b953e212d9bffd10d41369a35b6054fb14f8f5c26aa64a674e9b5433c

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file norfair_rs-0.3.1-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for norfair_rs-0.3.1-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 61a6fd6950133397228f8dabffd1a6c0f16b014afe082afb6ed2c839b38fa794
MD5 f56f382393717d91be89ede388aadcff
BLAKE2b-256 1f78bb45f0610830d4acbc5587e6560790f91df187519f9a41432201918f7fbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for norfair_rs-0.3.1-cp312-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on nmichlo/norfair-rs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page