Inferenza Ultralytics per Rust#
Ultralytics Inference è una libreria di inferenza YOLO ad alte prestazioni e uno strumento da riga di comando scritto in Rust. Esegue modelli ONNX esportati tramite ONNX Runtime per fornire predizioni rapide e sicure rispetto alla memoria su immagini, video, webcam e stream, senza richiedere il runtime Python durante l'inferenza.
Il progetto viene distribuito come un unico crate, ultralytics-inference, che puoi usare in due modi: come CLI per predizioni rapide e processi batch oppure come libreria incorporata direttamente nella tua applicazione Rust. Supporta ogni task Ultralytics e un'ampia gamma di backend hardware tramite un'interfaccia uniforme per i dispositivi.
Perché l'inferenza in Rust?#
- Velocità nativa e footprint ridotto. Viene compilato in un binario nativo senza interprete, ideale per server, container e dispositivi edge.
- Sicurezza della memoria. Il modello di ownership di Rust elimina intere categorie di errori a runtime senza un garbage collector.
- Tutti i task YOLO. Rilevamento, segmentazione, segmentazione semantica, stima della profondità, classificazione, posa e OBB da un'unica API.
- Ampio supporto hardware. Esecuzione su CPU e tramite CUDA, TensorRT, CoreML, OpenVINO, DirectML, ROCm e XNNPACK, con gli execution provider selezionati in fase di build.
- Preprocessing sulla GPU. Un kernel CUDA fuso opzionale mantiene letterbox, normalizzazione e conversione del layout sul dispositivo, per un percorso di input a copia zero.
- Download automatico. I nomi dei modelli YOLO conosciuti e gli asset di esempio vengono scaricati automaticamente al primo utilizzo.
Questa pagina tratta il crate Rust autonomo. Per il flusso di lavoro Python (addestramento, validazione, esportazione e predizione), consulta il Quickstart principale e la modalità Predict. Esporta qualsiasi modello Ultralytics in ONNX con l'integrazione ONNX, quindi eseguilo qui.
Installazione#
È richiesto Rust 1.89 o versione successiva. La funzionalità video richiede inoltre che FFmpeg 7+ sia installato nel sistema.
# Install the command-line tool from crates.io
cargo install ultralytics-inference
# Or with GPU support compiled in
cargo install ultralytics-inference --features cuda,tensorrtIl binario viene posizionato in ~/.cargo/bin/ultralytics-inference (Linux e macOS) oppure in %USERPROFILE%\.cargo\bin\ su Windows.
Quickstart della CLI#
La CLI espone un sottocomando predict. Senza argomenti, scarica un modello nano per il rilevamento e immagini di esempio, esegue l'inferenza e salva i risultati annotati in 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 --halfFlag comuni:
| Flag | Predefinito | Descrizione |
|---|---|---|
--model, -m | yolo26n.onnx | Percorso a un modello ONNX; un nome YOLO conosciuto viene scaricato automaticamente. |
--task | detect | Uno tra detect, segment, pose, obb, classify, semantic, depth. |
--source, -s | sample | Immagine, directory, glob, video, indice della webcam o URL. |
--conf | 0.25 | Soglia di confidenza. |
--iou | 0.7 | Soglia IoU per la soppressione non massima. |
--imgsz | metadati del modello | Dimensione dell'immagine per l'inferenza. |
--device | cpu | Dispositivo di esecuzione, ad esempio cuda:0, coreml, tensorrt:0. |
--half | false | Inferenza FP16 a precisione dimezzata. |
--save | true | Salva i risultati annotati in runs/<task>/predict. |
--show | false | Visualizza i risultati in una finestra. |
--classes | tutto | Filtra i rilevamenti per ID di classe, ad esempio "0,1,2". |
Quickstart della libreria#
Carica un modello ed esegui una predizione. I metadati del modello, come i nomi delle classi, il tipo di task e la dimensione dell'immagine, vengono letti automaticamente dal file ONNX.
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(())
}Usa InferenceConfig per controllare soglie, dimensione dell'immagine, precisione e dispositivo tramite un'API builder:
use ultralytics_inference::{Device, InferenceConfig, YOLOModel};
let config = InferenceConfig::new()
.with_confidence(0.5)
.with_iou(0.45)
.with_imgsz(640, 640)
.with_device(Device::Cuda(0))
.with_half(true);
let mut model = YOLOModel::load_with_config("yolo26n.onnx", config)?;
let results = model.predict("image.jpg")?;Ogni task valorizza un campo diverso in Results. Ogni scheda seguente è un programma completo ed eseguibile; il modello e gli input di esempio vengono scaricati automaticamente alla prima esecuzione. Sostituisci predict_default() con predict("image.jpg") per eseguire l'inferenza sui tuoi file.
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(())
}Task supportati#
Sono supportati tutti i task Ultralytics. Quando --model viene omesso, il modello nano corrispondente al task selezionato viene scaricato automaticamente.
| Attività | --task | Output | Modello predefinito |
|---|---|---|---|
| Detection | detect | Bounding box e classi | yolo26n.onnx |
| Segmentazione delle istanze | segment | Box più maschere per istanza | yolo26n-seg.onnx |
| Segmentazione semantica | semantic | Mappa delle classi per pixel | yolo26n-sem.onnx |
| Stima della profondità | depth | Mappa della profondità per pixel in metri | yolo26n-depth.onnx |
| Classificazione | classify | Probabilità delle classi | yolo26n-cls.onnx |
| Posa | pose | Box più keypoint | yolo26n-pose.onnx |
| Box orientati | obb | Bounding box ruotati | yolo26n-obb.onnx |
Compatibilità dei modelli#
Qualsiasi modello Ultralytics esportato in ONNX può essere caricato da un file locale. Il download automatico è disponibile per i nomi standard dei modelli YOLO26, YOLO11 e YOLOv8 nelle dimensioni n, s, m, l e x:
| Famiglia di modelli | Varianti scaricabili automaticamente |
|---|---|
| YOLO26 | yolo26{n,s,m,l,x}.onnx, -seg, -pose, -obb, -cls, -sem e -depth |
| YOLO11 | yolo11{n,s,m,l,x}.onnx, -seg, -pose, -obb e -cls |
| YOLOv8 | yolov8{n,s,m,l,x}.onnx, -seg, -pose, -obb e -cls |
La segmentazione semantica (-sem) e la stima della profondità (-depth) sono disponibili solo per YOLO26.
Sorgenti di input#
L'argomento --source (e il tipo Source nella libreria) accetta molti tipi di input, rilevati automaticamente dalla stringa:
| Origine | Esempio | Note |
|---|---|---|
| Immagine | image.jpg | File singolo. |
| Directory | images/ | Tutte le immagini nella cartella. |
| Glob | images/*.jpg | Pattern in stile shell. |
| Video | video.mp4 | Richiede la funzionalità video. |
| Webcam | 0 | Richiede la funzionalità video. |
| Stream | rtsp://... | Richiede la funzionalità video. |
| URL | https://example.com/image.jpg | Download di un'immagine remota. |
Dispositivi ed execution provider#
L'inferenza viene eseguita per impostazione predefinita sulla CPU. I backend GPU e degli acceleratori vengono compilati come funzionalità Cargo e selezionati a runtime con --device (CLI) o Device (libreria).
| Stringa del dispositivo | Variante Device | Funzionalità di build | Hardware |
|---|---|---|---|
cpu | Device::Cpu | integrata | Qualsiasi CPU |
cuda:0 | Device::Cuda(0) | cuda | GPU NVIDIA |
tensorrt:0 | Device::TensorRt(0) | tensorrt | GPU NVIDIA, ottimizzata |
coreml | Device::CoreMl | coreml | Apple Silicon / macOS |
intel:cpu | Device::IntelCpu | openvino | CPU Intel |
intel:gpu | Device::IntelGpu | openvino | GPU Intel |
intel:npu | Device::IntelNpu | openvino | NPU Intel |
directml:0 | Device::DirectMl(0) | directml | GPU Windows |
rocm:0 | Device::Rocm(0) | rocm | GPU AMD |
xnnpack | Device::Xnnpack | xnnpack | CPU ottimizzata |
# Build the CLI with the providers you need
cargo install ultralytics-inference --features cuda,tensorrtAccelerazione GPU e preprocessing CUDA#
Su hardware NVIDIA, la funzionalità cuda abilita l'execution provider CUDA, mentre tensorrt aggiunge l' execution provider TensorRT per un'ulteriore ottimizzazione. Per ottenere la latenza più bassa possibile, la funzionalità cuda-preprocess sposta il preprocessing sulla GPU.
cuda-preprocess esegue il ridimensionamento letterbox, la normalizzazione e la conversione del layout da HWC a CHW come un unico kernel CUDA fuso, quindi fornisce il risultato al modello come tensore del dispositivo a copia zero. In questo modo elimina il costo del preprocessing CPU per ogni immagine e della copia dall'host al dispositivo, un aspetto particolarmente importante per i batch ad alto throughput e gli stream in tempo reale.
# Build with fused GPU preprocessing (implies cuda + tensorrt)
cargo build --release --features cuda-preprocessIl percorso rapido viene utilizzato automaticamente, senza modifiche all'API, quando sono vere tutte le seguenti condizioni: la funzionalità è compilata, il dispositivo è CUDA o TensorRT, il task è detect, segment, pose, OBB, segmentazione semantica o stima della profondità e il modello usa input FP32. È abilitato per impostazione predefinita e può essere disattivato per singolo modello:
use ultralytics_inference::{Device, InferenceConfig};
let config = InferenceConfig::new()
.with_device(Device::TensorRt(0))
.with_cuda_preprocess(false); // force CPU preprocessingcuda-preprocess richiede un toolkit CUDA corrispondente in fase di build e usa NVRTC a runtime per il kernel di preprocessing fuso. Consulta la guida all'accelerazione CUDA e TensorRT per i requisiti delle versioni e la risoluzione dei problemi.
Funzionalità Cargo#
Le funzionalità vengono abilitate in fase di build. Le impostazioni predefinite supportano l'annotazione e la visualizzazione dal vivo.
| Caratteristica | Predefinito | Scopo |
|---|---|---|
annotate | sì | Disegna box, maschere, keypoint ed etichette; richiesto per --save. |
visualize | sì | Visualizzazione in una finestra in tempo reale per --show. |
video | no | Leggi e scrivi file video (richiede FFmpeg 7+). |
cuda | no | Execution provider NVIDIA CUDA. |
tensorrt | no | Execution provider NVIDIA TensorRT. |
cuda-preprocess | no | Preprocessing GPU fuso con input a copia zero (implica cuda, tensorrt). |
coreml | no | Execution provider Apple CoreML. |
openvino | no | Execution provider Intel OpenVINO. |
rocm | no | Execution provider AMD ROCm. |
directml | no | Execution provider Windows DirectML. |
I gruppi di convenienza raggruppano provider correlati: nvidia (cuda, tensorrt), amd (rocm, migraphx), intel (openvino, onednn), mobile (nnapi, coreml, qnn) e all (annotate, visualize, video). Sono disponibili anche provider aggiuntivi come nnapi, qnn, xnnpack, webgpu e altri.
Abilita le funzionalità durante l'installazione della CLI o l'aggiunta della libreria:
cargo install ultralytics-inference --features video
cargo install ultralytics-inference --features cuda,tensorrt[dependencies]
ultralytics-inference = { version = "0.0.35", features = ["video"] }Output e salvataggio#
Per impostazione predefinita, le predizioni vengono annotate e salvate in una directory di esecuzione con numerazione progressiva automatica:
runs/
└── detect/
└── predict/ # then predict2, predict3, ...
└── image.jpg # annotated resultLa sottocartella corrisponde all'attività (runs/segment/, runs/pose/ e così via). Per le sorgenti video, l'output annotato viene scritto come file video; passa --save-frames per scrivere invece i singoli fotogrammi. Per l'attività semantic, --save-json scrive PNG della mappa delle classi per pixel in una sottocartella results/. Per l'attività depth, la mappa di profondità colorizzata viene sovrapposta all'immagine sorgente, in modo analogo all'output plot() di Ultralytics Python. Il salvataggio di immagini e video annotati richiede la funzionalità annotate; l'esportazione PNG della mappa semantica delle classi non la richiede. L'input e l'output video richiedono la funzionalità video.
FAQ#
No. Il crate esegue direttamente i modelli ONNX esportati tramite ONNX Runtime. Python è necessario solo se addestri o esporti i modelli con il pacchetto Ultralytics in precedenza.
Esporta dal pacchetto Python, ad esempio con l'integrazione ONNX, oppure lascia che la CLI scarichi al primo avvio un modello nano standard per l'attività scelta.
Sì, con la funzionalità
videoabilitata e FFmpeg 7+ installato nel sistema. Sono inclusi file video, webcam e flussi RTSP/RTMP/HTTP.Entrambe sono abilitate per impostazione predefinita.
annotatedisegna riquadri, maschere, punti chiave ed etichette delle classi sull'immagine ed è necessaria affinché--savescriva i risultati annotati.visualizeapre una finestra live per--show. Per una build più ridotta e senza interfaccia grafica, che restituisce solo i risultati a livello programmatico, disabilitale concargo build --no-default-features(riaggiungi le singole funzionalità secondo necessità).Questa pagina offre una panoramica di alto livello. La documentazione di riferimento completa dell'API, suddivisa per tipo, per ogni struct pubblica, metodo e opzione di configurazione è pubblicata su docs.rs e generata direttamente dal codice sorgente.