Inferenza Ultralytics per Rust#
Ultralytics Inference è una libreria di inferenza YOLO ad alte prestazioni e uno strumento a riga di comando scritto in Rust. Esegue modelli ONNX esportati tramite ONNX Runtime per fornire previsioni rapide e sicure per la memoria su immagini, video, webcam e flussi, senza richiedere un runtime Python durante l'inferenza.
Il progetto è distribuito come un singolo crate, ultralytics-inference, utilizzabile in due modi: come CLI per previsioni rapide e processi in batch oppure come libreria integrata direttamente nella tua applicazione Rust. Supporta tutte le attività Ultralytics e un'ampia gamma di backend hardware tramite un'interfaccia uniforme per i dispositivi. Per l'inferenza nel browser, lo stesso repository pubblica il pacchetto npm @ultralytics/yolo; consulta la guida alla configurazione.
Perché usare Rust per l'inferenza?#
- Velocità nativa e ingombro ridotto. Viene compilato in un binario nativo senza interprete, ideale per server, container e dispositivi edge.
- Sicurezza della memoria. Il modello di proprietà di Rust elimina intere categorie di errori in fase di esecuzione senza un garbage collector.
- Tutte le attività YOLO. Rilevamento, segmentazione, segmentazione semantica, stima della profondità, classificazione, posa e OBB tramite un'unica API.
- Ampio supporto hardware. CPU più provider di esecuzione CUDA, TensorRT, CoreML, OpenVINO, DirectML, ROCm e XNNPACK, selezionabili in fase di compilazione.
- Preelaborazione sulla GPU. Un kernel CUDA fuso facoltativo esegue letterbox, normalizzazione e conversione del layout sulla GPU e passa il risultato al modello senza uscire dal dispositivo.
- Download automatico. I nomi noti dei modelli YOLO e gli asset di esempio vengono scaricati automaticamente al primo utilizzo.
Questa pagina descrive il crate Rust autonomo. Per il flusso di lavoro Python (addestramento, convalida, esportazione e previsione), consulta la Guida rapida 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 FFmpeg dalla versione 6 alla 9 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 si trova in ~/.cargo/bin/ultralytics-inference (Linux e macOS) oppure in %USERPROFILE%\.cargo\bin\ su Windows.
Guida rapida alla CLI#
La CLI espone un sottocomando predict. Senza argomenti, scarica un modello di rilevamento nano 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 --quantize 16Flag comuni:
| Flag | Predefinito | Descrizione |
|---|---|---|
--model, -m | yolo26n.onnx | Percorso di un modello ONNX; un nome YOLO riconosciuto viene scaricato automaticamente. |
--task | detect | Uno tra detect, segment, semantic, depth, classify, pose, obb. |
--source, -s | esempio | Immagine, directory, glob, video, indice della webcam o URL. |
--conf | 0.25 | Soglia di confidenza. |
--iou | 0.7 | Soglia IoU per la soppressione dei non massimi. |
--imgsz | metadati del modello | Dimensione dell'immagine per l'inferenza. |
--device | automatico | Dispositivo di esecuzione, ad esempio cuda:0, coreml, tensorrt:0. |
--max-det | 300 | Numero massimo di rilevamenti per immagine. |
--rect | true | Inferenza rettangolare con padding minimo. |
--batch | 1 | Dimensione del batch per l'inferenza. |
--quantize | predefinito del modello | Precisione dell'inferenza: 8/int8, 16/fp16, 32/fp32, w8a16 oppure w8a32. |
--save | true | Salva i risultati annotati in runs/<task>/predict. |
--save-frames | false | Salva i singoli fotogrammi per l'input video invece di un file video. |
--save-json | false | Salva le mappe di classe PNG della segmentazione semantica. |
--show | false | Mostra i risultati in una finestra. |
--verbose | true | Stampa i risultati e i tempi per ogni immagine. |
--classes | tutti | Filtra i rilevamenti in base agli ID delle classi, ad esempio "0,1,2". |
Guida rapida alla libreria#
Carica un modello ed esegui una previsione. I metadati del modello, come i nomi delle classi, il tipo di attività e le dimensioni 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, dimensioni dell'immagine, precisione e dispositivo con un'API basata su builder:
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")?;Ogni attività popola un campo diverso in Results. Ogni scheda qui sotto è 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 lavorare con i 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(())
}Attività supportate#
Sono supportate tutte le attività di Ultralytics. Se ometti --model, viene scaricato automaticamente il modello nano corrispondente all'attività selezionata.
| Attività | --task | Output | Modello predefinito |
|---|---|---|---|
| Rilevamento | detect | Riquadri di delimitazione e classi | yolo26n.onnx |
| Segmentazione di istanze | segment | Riquadri e maschere per ogni istanza | yolo26n-seg.onnx |
| Segmentazione semantica | semantic | Mappa delle classi per pixel | yolo26n-sem.onnx |
| Stima della profondità | depth | Mappa di profondità per pixel in metri | yolo26n-depth.onnx |
| Classificazione | classify | Probabilità delle classi | yolo26n-cls.onnx |
| Posa | pose | Riquadri e punti chiave | yolo26n-pose.onnx |
| Riquadri orientati | obb | Riquadri di delimitazione 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 con YOLO26. I modelli di rilevamento RT-DETR funzionano, ma non vengono scaricati automaticamente: prima esportane uno in ONNX.
Sorgenti di input#
L'argomento --source (e il tipo Source nella libreria) accetta molti tipi di input, rilevati automaticamente a partire 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 immagini remote. |
Dispositivi e provider di esecuzione#
I backend GPU e acceleratori vengono compilati come funzionalità Cargo e selezionati in fase di esecuzione con --device (CLI) o Device (libreria). Se non specifichi un dispositivo, i provider compilati nella build vengono registrati seguendo un ordine di preferenza fisso (prima TensorRT, poi CUDA e così via); pertanto, una build con solo le funzionalità predefinite viene eseguita su CPU.
| Stringa del dispositivo | Variante Device | Funzionalità di build | Hardware |
|---|---|---|---|
cpu | Device::Cpu | integrato | 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 preelaborazione CUDA#
Sull'hardware NVIDIA, la funzionalità cuda abilita il provider di esecuzione CUDA, mentre tensorrt aggiunge il provider TensorRT per un'ulteriore ottimizzazione. Per ottenere la latenza più bassa possibile, la funzionalità cuda-preprocess trasferisce la preelaborazione 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 passa il risultato al modello come tensore del dispositivo senza copie. Il fotogramma grezzo a 8 bit viene comunque caricato sulla GPU, attraverso un buffer di staging bloccato sulle GPU discrete; il kernel elimina il ridimensionamento, la normalizzazione e la conversione del layout sulla CPU, oltre al caricamento separato del tensore preelaborato, con vantaggi soprattutto 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 usato automaticamente, senza modifiche all'API, se sono soddisfatte tutte le seguenti condizioni: la funzionalità è compilata, il dispositivo è CUDA o TensorRT, l'attività è detect, segment, pose, OBB, segmentazione semantica (solo immagini singole) o stima della profondità e il modello usa input FP32. È abilitato per impostazione predefinita e può essere disattivato per ogni 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 compilazione e usa NVRTC in fase di esecuzione per il kernel di preelaborazione 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 compilazione. Le impostazioni predefinite includono l'annotazione e la visualizzazione dal vivo.
| Caratteristica | Predefinito | Scopo |
|---|---|---|
annotate | sì | Disegna riquadri, maschere, punti chiave ed etichette; necessario per --save. |
visualize | sì | Visualizzazione in tempo reale in una finestra per --show. |
video | no | Leggi e scrivi file video (richiede FFmpeg dalla versione 6 alla 9). |
cuda | no | Provider di esecuzione NVIDIA CUDA. |
tensorrt | no | Provider di esecuzione NVIDIA TensorRT. |
cuda-preprocess | no | Preelaborazione GPU fusa (implica cuda, tensorrt). |
coreml | no | Provider di esecuzione Apple CoreML. |
openvino | no | Provider di esecuzione Intel OpenVINO. |
rocm | no | Provider di esecuzione AMD ROCm. |
directml | no | Provider di esecuzione Windows DirectML. |
I gruppi di utilità riuniscono provider correlati: nvidia (cuda, tensorrt), amd (rocm, migraphx), intel (openvino, onednn), mobile (nnapi, coreml, qnn) e all (annotate, visualize, video). Sono disponibili anche altri provider, come nnapi, qnn, xnnpack, webgpu e altri ancora.
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.50", features = ["video"] }Output e salvataggio#
Per impostazione predefinita, le previsioni vengono annotate e salvate in una directory di esecuzione con numerazione incrementale 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 mappe di classe PNG per pixel in una sottocartella results/. Per l'attività depth, la mappa di profondità colorata viene sovrapposta all'immagine sorgente, come nell'output plot() di Ultralytics Python. Il salvataggio di immagini e video annotati richiede la funzionalità annotate; l'esportazione delle mappe di classe semantiche in PNG non la richiede. L'input e l'output video richiedono la funzionalità video.
Domande frequenti#
No. Il crate esegue direttamente i modelli ONNX esportati tramite ONNX Runtime. Python serve solo se prima addestri o esporti i modelli con il pacchetto Ultralytics.
Esporta dal pacchetto Python, ad esempio con l'integrazione ONNX, oppure lascia che la CLI scarichi alla prima esecuzione un modello nano standard per l'attività scelta.
Sì, con la funzionalità
videoabilitata e FFmpeg dalla versione 6 alla 9 installato sul sistema. Sono supportati 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ù leggera e senza interfaccia grafica, che restituisce i risultati solo a livello programmatico, disabilitale concargo build --no-default-features(riabilita le singole funzionalità secondo necessità).Questa pagina offre una panoramica generale. Il riferimento API completo, suddiviso per tipo, per ogni struct pubblica, metodo e opzione di configurazione è pubblicato su docs.rs e generato direttamente dal codice sorgente.