Ultralytics Inference für Rust#
Ultralytics Inference ist eine leistungsstarke Inferenzbibliothek und ein Befehlszeilenwerkzeug für YOLO, geschrieben in Rust. Das Werkzeug führt exportierte ONNX-Modelle über ONNX Runtime aus und ermöglicht so schnelle, speichersichere Vorhersagen für Bilder, Videos, Webcams und Streams, ohne dass zur Inferenzzeit eine Python-Laufzeitumgebung erforderlich ist.
Das Projekt wird als einzelnes Crate namens ultralytics-inference bereitgestellt, das du auf zwei Arten verwenden kannst: als CLI für schnelle Vorhersagen und Stapelverarbeitung oder als Bibliothek, die direkt in deine Rust-Anwendung eingebunden wird. Es unterstützt alle Ultralytics-Aufgaben und eine breite Auswahl an Hardware-Backends über eine einheitliche Geräteschnittstelle. Für Inferenz im Browser veröffentlicht dasselbe Repository das npm-Paket @ultralytics/yolo; die Einrichtungsanleitung findest du hier.
Warum Inferenz mit Rust?#
- Native Geschwindigkeit und geringer Platzbedarf. Wird ohne Interpreter zu einer nativen Binärdatei kompiliert – ideal für Server, Container und Edge-Geräte.
- Speichersicherheit. Das Besitzmodell von Rust verhindert ganze Klassen von Laufzeitfehlern, ohne dass eine Garbage Collection erforderlich ist.
- Alle YOLO-Aufgaben. Erkennung, Instanzsegmentierung, semantische Segmentierung, Tiefenschätzung, Klassifizierung, Pose und OBB über eine einzige API.
- Breite Hardwareunterstützung. CPU sowie CUDA, TensorRT, CoreML, OpenVINO, DirectML, ROCm und XNNPACK als zur Build-Zeit ausgewählte Ausführungsanbieter.
- Vorverarbeitung auf der GPU. Ein optionaler, fusionierter CUDA-Kernel führt Letterbox, Normalisierung und Layoutkonvertierung auf der GPU aus und übergibt das Ergebnis an das Modell, ohne das Gerät zu verlassen.
- Automatischer Download. Bekannte YOLO-Modellnamen und Beispielressourcen werden beim ersten Einsatz automatisch heruntergeladen.
Diese Seite behandelt das eigenständige Rust-Crate. Informationen zum Python-Ablauf (Training, Validierung, Export und Vorhersage) findest du im allgemeinen Schnellstart und im Vorhersagemodus. Exportiere ein beliebiges Ultralytics-Modell mit der ONNX-Integration nach ONNX und führe es anschließend hier aus.
Installation#
Rust 1.89 oder höher ist erforderlich. Für die Funktion video muss außerdem FFmpeg 6 bis 9 auf dem System installiert sein.
# Install the command-line tool from crates.io
cargo install ultralytics-inference
# Or with GPU support compiled in
cargo install ultralytics-inference --features cuda,tensorrtDie Binärdatei wird unter ~/.cargo/bin/ultralytics-inference (Linux und macOS) oder unter %USERPROFILE%\.cargo\bin\ auf Windows abgelegt.
CLI-Schnellstart#
Die CLI stellt einen Unterbefehl predict bereit. Ohne Argumente lädt sie ein Nano-Erkennungsmodell und Beispielbilder herunter, führt die Inferenz aus und speichert die annotierten Ergebnisse unter runs/detect/predict.
# Detect on the built-in samples (downloads model and images)
ultralytics-inference predict
# Detect on your own image
ultralytics-inference predict --model yolo26n.onnx --source image.jpg
# Segmentation (auto-downloads yolo26n-seg.onnx)
ultralytics-inference predict --task segment --source image.jpg
# Pose on a video, shown live in a window
ultralytics-inference predict --task pose --source video.mp4 --show
# Depth estimation (auto-downloads yolo26n-depth.onnx)
ultralytics-inference predict --task depth --source image.jpg
# Tune thresholds and filter to specific classes
ultralytics-inference predict --source image.jpg --conf 0.5 --iou 0.45 --classes "0,1,2"
# Run a whole folder on the GPU in half precision
ultralytics-inference predict --source images/ --device cuda:0 --quantize 16Gängige Flags:
| Flag | Standard | Beschreibung |
|---|---|---|
--model, -m | yolo26n.onnx | Pfad zu einem ONNX-Modell; ein bekannter YOLO-Name wird automatisch heruntergeladen. |
--task | detect | Eines von detect, segment, semantic, depth, classify, pose, obb. |
--source, -s | Beispiel | Bild, Verzeichnis, Glob-Muster, Video, Webcam-Index oder URL. |
--conf | 0.25 | Konfidenzschwellenwert. |
--iou | 0.7 | IoU-Schwellenwert für die nicht-maximale Unterdrückung. |
--imgsz | Modellmetadaten | Bildgröße für die Inferenz. |
--device | automatisch | Ausführungsgerät, zum Beispiel cuda:0, coreml, tensorrt:0. |
--max-det | 300 | Maximale Anzahl an Erkennungen pro Bild. |
--rect | true | Rechteckige Inferenz mit minimalem Padding. |
--batch | 1 | Batchgröße für die Inferenz. |
--quantize | Modellstandard | Inferenzgenauigkeit: 8/int8, 16/fp16, 32/fp32, w8a16 oder w8a32. |
--save | true | Annotierte Ergebnisse unter runs/<task>/predict speichern. |
--save-frames | false | Bei Videoeingaben einzelne Frames statt einer Videodatei speichern. |
--save-json | false | PNG-Dateien mit semantischen Segmentierungsklassenkarten speichern. |
--show | false | Ergebnisse in einem Fenster anzeigen. |
--verbose | true | Ergebnisse und Zeitmessungen für jedes Bild ausgeben. |
--classes | alle | Erkennungen nach Klassen-IDs filtern, zum Beispiel "0,1,2". |
Schnelleinstieg für die Bibliothek#
Lade ein Modell und führe eine Vorhersage aus. Modellmetadaten wie Klassennamen, Aufgabentyp und Bildgröße werden automatisch aus der ONNX-Datei gelesen.
use ultralytics_inference::YOLOModel;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Metadata (classes, task, imgsz) is parsed from the model.
let mut model = YOLOModel::load("yolo26n.onnx")?;
let results = model.predict("image.jpg")?;
for result in &results {
if let Some(boxes) = &result.boxes {
for i in 0..boxes.len() {
let class_id = boxes.cls()[i] as usize;
let conf = boxes.conf()[i];
let name = result.names.get(&class_id).map_or("unknown", |s| s.as_str());
println!("{name} {conf:.2}");
}
}
}
Ok(())
}Verwende InferenceConfig, um Schwellenwerte, Bildgröße, Genauigkeit und Gerät über eine Builder-API festzulegen:
use ultralytics_inference::{Device, InferenceConfig, Quantization, YOLOModel};
let config = InferenceConfig::new()
.with_confidence(0.5)
.with_iou(0.45)
.with_imgsz(640, 640)
.with_device(Device::Cuda(0))
.with_quantize(Quantization::Fp16);
let mut model = YOLOModel::load_with_config("yolo26n.onnx", config)?;
let results = model.predict("image.jpg")?;Jede Aufgabe befüllt ein anderes Feld in Results. Jeder Tab unten enthält ein vollständiges, ausführbares Programm; das Modell und die Beispieleingaben werden beim ersten Start automatisch heruntergeladen. Ersetze predict_default() durch predict("image.jpg"), um eigene Dateien zu verwenden.
use ultralytics_inference::YOLOModel;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut model = YOLOModel::load("yolo26n.onnx")?;
let results = model.predict_default()?;
for result in &results {
if let Some(boxes) = &result.boxes {
println!("{} detections", boxes.len());
let xyxy = boxes.xyxy(); // rows of [x1, y1, x2, y2]
for i in 0..boxes.len() {
let class_id = boxes.cls()[i] as usize;
let name = result.names.get(&class_id).map_or("unknown", |s| s.as_str());
println!(" {name} {:.2} {:?}", boxes.conf()[i], xyxy.row(i).to_vec());
}
}
}
Ok(())
}Unterstützte Aufgaben#
Alle Ultralytics-Aufgaben werden unterstützt. Wenn --model nicht angegeben ist, wird das passende Nano-Modell für die ausgewählte Aufgabe automatisch heruntergeladen.
| Aufgabe | --task | Ausgabe | Standardmodell |
|---|---|---|---|
| Erkennung | detect | Begrenzungsrahmen und Klassen | yolo26n.onnx |
| Instanzsegmentierung | segment | Rahmen sowie Masken für einzelne Instanzen | yolo26n-seg.onnx |
| Semantische Segmentierung | semantic | Klassenkarte pro Pixel | yolo26n-sem.onnx |
| Tiefenschätzung | depth | Tiefenkarte pro Pixel in Metern | yolo26n-depth.onnx |
| Klassifizierung | classify | Klassenwahrscheinlichkeiten | yolo26n-cls.onnx |
| Pose | pose | Rahmen sowie Keypoints | yolo26n-pose.onnx |
| Orientierte Rahmen | obb | Gedrehte Begrenzungsrahmen | yolo26n-obb.onnx |
Modellkompatibilität#
Jedes nach ONNX exportierte Ultralytics-Modell kann aus einer lokalen Datei geladen werden. Der automatische Download ist für standardmäßige YOLO26-, YOLO11- und YOLOv8-Modellnamen in den Größen n, s, m, l und x verfügbar:
| Modellfamilie | Automatisch herunterladbare Varianten |
|---|---|
| YOLO26 | yolo26{n,s,m,l,x}.onnx, -seg, -pose, -obb, -cls, -sem und -depth |
| YOLO11 | yolo11{n,s,m,l,x}.onnx, -seg, -pose, -obb und -cls |
| YOLOv8 | yolov8{n,s,m,l,x}.onnx, -seg, -pose, -obb und -cls |
Semantische Segmentierung (-sem) und Tiefenschätzung (-depth) sind nur mit YOLO26 möglich. Erkennungsmodelle von RT-DETR funktionieren ebenfalls, werden aber nicht automatisch heruntergeladen: Exportiere zuerst eines nach ONNX.
Eingabequellen#
Das Argument --source (und der Typ Source in der Bibliothek) akzeptiert viele Arten von Eingaben, die automatisch anhand der Zeichenfolge erkannt werden:
| Quelle | Beispiel | Hinweise |
|---|---|---|
| Bild | image.jpg | Einzelne Datei. |
| Verzeichnis | images/ | Alle Bilder im Ordner. |
| Glob-Muster | images/*.jpg | Muster im Shell-Stil. |
| Video | video.mp4 | Erfordert das Feature video. |
| Webcam | 0 | Erfordert das Feature video. |
| Stream | rtsp://... | Erfordert das Feature video. |
| URL | https://example.com/image.jpg | Herunterladen eines entfernten Bildes. |
Geräte und Ausführungsprovider#
GPU- und Beschleuniger-Backends werden als Cargo-Features einkompiliert und zur Laufzeit mit --device (CLI) oder Device (Bibliothek) ausgewählt. Wenn kein Gerät angegeben ist, werden die in den Build einkompilierten Provider in einer festgelegten Prioritätsreihenfolge registriert (zuerst TensorRT, dann CUDA usw.). Ein Build mit ausschließlich den Standard-Features läuft daher auf der CPU.
| Gerätezeichenfolge | Variante von Device | Build-Feature | Hardware |
|---|---|---|---|
cpu | Device::Cpu | integriert | Beliebige CPU |
cuda:0 | Device::Cuda(0) | cuda | NVIDIA-GPU |
tensorrt:0 | Device::TensorRt(0) | tensorrt | Optimierte NVIDIA-GPU |
coreml | Device::CoreMl | coreml | Apple Silicon / macOS |
intel:cpu | Device::IntelCpu | openvino | Intel-CPU |
intel:gpu | Device::IntelGpu | openvino | Intel-GPU |
intel:npu | Device::IntelNpu | openvino | Intel-NPU |
directml:0 | Device::DirectMl(0) | directml | Windows-GPU |
rocm:0 | Device::Rocm(0) | rocm | AMD-GPU |
xnnpack | Device::Xnnpack | xnnpack | Optimierte CPU |
# Build the CLI with the providers you need
cargo install ultralytics-inference --features cuda,tensorrtGPU-Beschleunigung und CUDA-Vorverarbeitung#
Auf NVIDIA-Hardware aktiviert das Feature cuda den CUDA-Ausführungsprovider. tensorrt fügt den TensorRT-Provider für weitere Optimierungen hinzu. Für eine möglichst geringe Latenz verlagert das Feature cuda-preprocess die Vorverarbeitung auf die GPU.
cuda-preprocess führt das Letterbox-Resizing, die Normalisierung und die Layoutkonvertierung von HWC zu CHW als einen einzigen fusionierten CUDA-Kernel aus und übergibt das Ergebnis anschließend als Gerätetensor ohne Kopiervorgang an das Modell. Der rohe 8-Bit-Frame wird weiterhin auf die GPU hochgeladen, bei diskreten GPUs über einen gepinnten Staging-Puffer. Der Kernel übernimmt jedoch das Resizing, die Normalisierung und die Layoutkonvertierung auf der CPU sowie den separaten Upload des vorverarbeiteten Tensors. Das ist vor allem bei Batches mit hohem Durchsatz und Echtzeit-Streams wichtig.
# Build with fused GPU preprocessing (implies cuda + tensorrt)
cargo build --release --features cuda-preprocessDer schnelle Pfad wird automatisch und ohne Änderung an der API verwendet, wenn alle folgenden Bedingungen erfüllt sind: Das Feature ist einkompiliert, das Gerät ist CUDA oder TensorRT, die Aufgabe ist detect, segment, pose, OBB, semantische Segmentierung (nur bei Einzelbildern) oder Tiefenschätzung, und das Modell verwendet eine FP32-Eingabe. Der schnelle Pfad ist standardmäßig aktiviert und kann für jedes Modell deaktiviert werden:
use ultralytics_inference::{Device, InferenceConfig};
let config = InferenceConfig::new()
.with_device(Device::TensorRt(0))
.with_cuda_preprocess(false); // force CPU preprocessingcuda-preprocess benötigt beim Build ein passendes CUDA-Toolkit und verwendet zur Laufzeit NVRTC für den fusionierten Kernel zur Vorverarbeitung. Versionsanforderungen und Hinweise zur Fehlerbehebung findest du im Leitfaden zur CUDA- und TensorRT-Beschleunigung.
Cargo-Features#
Features werden beim Build aktiviert. Die Standardeinstellungen umfassen Annotation und Live-Anzeige.
| Merkmal | Standard | Zweck |
|---|---|---|
annotate | ja | Rahmen, Masken, Keypoints und Beschriftungen zeichnen; erforderlich für --save. |
visualize | ja | Echtzeitanzeige in einem Fenster für --show. |
video | nein | Videodateien lesen und schreiben (erfordert FFmpeg 6 bis 9). |
cuda | nein | NVIDIA-CUDA-Ausführungsprovider. |
tensorrt | nein | NVIDIA-TensorRT-Ausführungsprovider. |
cuda-preprocess | nein | Fusionierte GPU-Vorverarbeitung (setzt cuda und tensorrt voraus). |
coreml | nein | Apple-CoreML-Ausführungsprovider. |
openvino | nein | Intel-OpenVINO-Ausführungsprovider. |
rocm | nein | AMD-ROCm-Ausführungsprovider. |
directml | nein | Windows-DirectML-Ausführungsprovider. |
Praktische Gruppen bündeln zusammengehörige Provider: nvidia (cuda, tensorrt), amd (rocm, migraphx), intel (openvino, onednn), mobile (nnapi, coreml, qnn) und all (annotate, visualize, video). Weitere Provider wie nnapi, qnn, xnnpack, webgpu und andere sind ebenfalls verfügbar.
Aktiviere Features beim Installieren der CLI oder beim Hinzufügen der Bibliothek:
cargo install ultralytics-inference --features video
cargo install ultralytics-inference --features cuda,tensorrt[dependencies]
ultralytics-inference = { version = "0.0.50", features = ["video"] }Ausgabe und Speichern#
Vorhersagen werden standardmäßig annotiert und in einem automatisch nummerierten Ausführungsverzeichnis gespeichert:
runs/
└── detect/
└── predict/ # then predict2, predict3, ...
└── image.jpg # annotated resultDer Unterordner entspricht der Aufgabe (runs/segment/, runs/pose/ usw.). Bei Videoquellen wird die annotierte Ausgabe als Videodatei geschrieben; übergib --save-frames, um stattdessen einzelne Frames zu speichern. Für die Aufgabe semantic schreibt --save-json PNG-Dateien mit Klassenkarten pro Pixel in einen Unterordner results/. Für die Aufgabe depth wird die farbige Tiefenkarte über das Quellbild gelegt, wie bei der Ausgabe plot() von Ultralytics Python. Das Speichern annotierter Bilder und Videos erfordert das Feature annotate; der Export semantischer Klassenkarten als PNG erfordert es nicht. Videoeingabe und -ausgabe erfordern das Feature video.
Häufig gestellte Fragen#
Nein. Die Crate führt exportierte ONNX-Modelle direkt mit ONNX Runtime aus. Python wird nur benötigt, wenn du Modelle zuvor mit dem Ultralytics-Paket trainierst oder exportierst.
Exportiere das Modell aus dem Python-Paket, zum Beispiel mithilfe der ONNX-Integration, oder lass die CLI beim ersten Start automatisch ein standardmäßiges Nano-Modell für die ausgewählte Aufgabe herunterladen.
Ja, wenn das Feature
videoaktiviert und FFmpeg 6 bis 9 auf dem System installiert ist. Damit werden Videodateien, Webcams und RTSP-/RTMP-/HTTP-Streams unterstützt.Beide sind standardmäßig aktiviert.
annotatezeichnet Boxen, Masken, Keypoints und Klassenbezeichnungen in das Bild ein und ist erforderlich, damit--saveannotierte Ergebnisse speichern kann.visualizeöffnet ein Live-Fenster für--show. Für einen kleineren Build ohne grafische Oberfläche, der Ergebnisse nur programmgesteuert zurückgibt, deaktiviere sie mitcargo build --no-default-features(füge bei Bedarf einzelne Features wieder hinzu).Diese Seite bietet einen allgemeinen Überblick. Die vollständige API-Referenz mit Angaben zu jedem öffentlichen Struct, jeder Methode und jeder Konfigurationsoption ist auf docs.rs veröffentlicht und wird direkt aus dem Quellcode generiert.