Inferencia de Ultralytics para Rust#
Ultralytics Inference es una biblioteca de inferencia YOLO de alto rendimiento y una herramienta de línea de comandos escrita en Rust. Ejecuta modelos ONNX exportados mediante ONNX Runtime para generar predicciones rápidas y seguras en cuanto a la memoria en imágenes, vídeos, cámaras web y flujos, sin necesidad de ejecutar Python durante la inferencia.
El proyecto se distribuye como un único crate, ultralytics-inference, que puedes usar de dos maneras: como CLI para predicciones rápidas y trabajos por lotes, o como biblioteca integrada directamente en tu aplicación Rust. Admite todas las tareas de Ultralytics y una amplia variedad de backends de hardware mediante una interfaz de dispositivo uniforme. Para la inferencia en navegador, el mismo repositorio publica el paquete npm @ultralytics/yolo; consulta su guía de configuración.
¿Por qué usar Rust para la inferencia?#
- Rendimiento nativo y tamaño reducido. Se compila en un binario nativo sin intérprete, ideal para servidores, contenedores y dispositivos periféricos.
- Seguridad de memoria. El modelo de propiedad de Rust elimina categorías enteras de errores en tiempo de ejecución sin necesidad de un recolector de basura.
- Todas las tareas de YOLO. Detecta, segmenta, realiza segmentación semántica y estimación de profundidad, clasifica, estima poses y detecta OBB desde una sola API.
- Amplia compatibilidad de hardware. CPU y proveedores de ejecución CUDA, TensorRT, CoreML, OpenVINO, DirectML, ROCm y XNNPACK seleccionados en el momento de la compilación.
- Preprocesamiento en la GPU. Un kernel CUDA fusionado opcional ejecuta letterbox, normalización y conversión del formato de datos en la GPU, y pasa el resultado al modelo sin sacarlo del dispositivo.
- Descarga automática. Los nombres de modelos YOLO conocidos y los recursos de ejemplo se descargan automáticamente en el primer uso.
Esta página describe el crate independiente de Rust. Para el flujo de trabajo de Python (entrenamiento, validación, exportación y predicción), consulta la guía de inicio rápido principal y el modo de predicción. Exporta cualquier modelo de Ultralytics a ONNX con la integración de ONNX y ejecútalo aquí.
Instalación#
Se requiere Rust 1.89 o una versión posterior. La función video también necesita que FFmpeg 6 a 9 esté instalado en el 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,tensorrtEl binario se coloca en ~/.cargo/bin/ultralytics-inference (Linux y macOS) o en %USERPROFILE%\.cargo\bin\ en Windows.
Inicio rápido de la CLI#
La CLI ofrece un subcomando predict. Si no se indican argumentos, descarga un modelo de detección nano y unas imágenes de ejemplo, ejecuta la inferencia y guarda los resultados anotados en 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 16Indicadores comunes:
| Indicador | Predeterminado | Descripción |
|---|---|---|
--model, -m | yolo26n.onnx | Ruta a un modelo ONNX; los nombres de YOLO conocidos se descargan automáticamente. |
--task | detect | Uno de detect, segment, semantic, depth, classify, pose, obb. |
--source, -s | muestra | Imagen, directorio, patrón glob, vídeo, índice de cámara web o URL. |
--conf | 0.25 | Umbral de confianza. |
--iou | 0.7 | Umbral de IoU para la supresión no máxima. |
--imgsz | metadatos del modelo | Tamaño de imagen para la inferencia. |
--device | automático | Dispositivo de ejecución; por ejemplo, cuda:0, coreml, tensorrt:0. |
--max-det | 300 | Número máximo de detecciones por imagen. |
--rect | true | Inferencia rectangular con relleno mínimo. |
--batch | 1 | Tamaño del lote para la inferencia. |
--quantize | predeterminado del modelo | Precisión de inferencia: 8/int8, 16/fp16, 32/fp32, w8a16 o w8a32. |
--save | true | Guarda los resultados anotados en runs/<task>/predict. |
--save-frames | false | Guarda fotogramas individuales para la entrada de vídeo en lugar de un archivo de vídeo. |
--save-json | false | Guarda PNG de mapas de clases de segmentación semántica. |
--show | false | Muestra los resultados en una ventana. |
--verbose | true | Imprime los resultados y los tiempos de cada imagen. |
--classes | todo | Filtra las detecciones por ID de clase; por ejemplo, "0,1,2". |
Guía de inicio rápido de la biblioteca#
Carga un modelo y ejecuta una predicción. Los metadatos del modelo, como los nombres de las clases, el tipo de tarea y el tamaño de imagen, se leen automáticamente del archivo 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 para controlar los umbrales, el tamaño de imagen, la precisión y el dispositivo con una API basada en un generador:
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")?;Cada tarea rellena un campo distinto de Results. Cada pestaña de abajo contiene un programa completo y ejecutable; el modelo y las entradas de ejemplo se descargan automáticamente en la primera ejecución. Sustituye predict_default() por predict("image.jpg") para ejecutarlo con tus propios archivos.
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(())
}Tareas compatibles#
Se admiten todas las tareas de Ultralytics. Si omites --model, se descarga automáticamente el modelo nano correspondiente a la tarea seleccionada.
| Tarea | --task | Salida | Modelo predeterminado |
|---|---|---|---|
| Detección | detect | Cajas delimitadoras y clases | yolo26n.onnx |
| Segmentación de instancias | segment | Cajas y máscaras por instancia | yolo26n-seg.onnx |
| Segmentación semántica | semantic | Mapa de clases por píxel | yolo26n-sem.onnx |
| Estimación de profundidad | depth | Mapa de profundidad por píxel en metros | yolo26n-depth.onnx |
| Clasificación | classify | Probabilidades de clase | yolo26n-cls.onnx |
| Pose | pose | Cajas y puntos clave | yolo26n-pose.onnx |
| Cajas orientadas | obb | Cajas delimitadoras giradas | yolo26n-obb.onnx |
Compatibilidad de modelos#
Cualquier modelo de Ultralytics exportado a ONNX se puede cargar desde un archivo local. La descarga automática está disponible para los nombres de modelos YOLO26, YOLO11 y YOLOv8 estándar en los tamaños n, s, m, l y x:
| Familia de modelos | Variantes descargables automáticamente |
|---|---|
| YOLO26 | yolo26{n,s,m,l,x}.onnx, -seg, -pose, -obb, -cls, -sem y -depth |
| YOLO11 | yolo11{n,s,m,l,x}.onnx, -seg, -pose, -obb y -cls |
| YOLOv8 | yolov8{n,s,m,l,x}.onnx, -seg, -pose, -obb y -cls |
La segmentación semántica (-sem) y la estimación de profundidad (-depth) solo están disponibles en YOLO26. Los modelos de detección RT-DETR también se ejecutan, pero no se descargan automáticamente: primero debes exportar uno a ONNX.
Fuentes de entrada#
El argumento --source (y el tipo Source en la biblioteca) admite muchos tipos de entrada, que se detectan automáticamente a partir de la cadena:
| Fuente | Ejemplo | Notas |
|---|---|---|
| Imagen | image.jpg | Archivo único. |
| Directorio | images/ | Todas las imágenes de la carpeta. |
| Glob | images/*.jpg | Patrón de estilo shell. |
| Vídeo | video.mp4 | Requiere la característica video. |
| Cámara web | 0 | Requiere la característica video. |
| Flujo | rtsp://... | Requiere la característica video. |
| URL | https://example.com/image.jpg | Descarga remota de imágenes. |
Dispositivos y proveedores de ejecución#
Los backends de GPU y aceleradores se compilan como características de Cargo y se seleccionan en tiempo de ejecución con --device (CLI) o Device (biblioteca). Si no especificas un dispositivo, los proveedores compilados se registran en un orden de preferencia fijo (primero TensorRT, luego CUDA, etc.), por lo que una compilación con solo las características predeterminadas se ejecuta en CPU.
| Cadena del dispositivo | Variante de Device | Característica de compilación | Hardware |
|---|---|---|---|
cpu | Device::Cpu | integrado | Cualquier CPU |
cuda:0 | Device::Cuda(0) | cuda | GPU NVIDIA |
tensorrt:0 | Device::TensorRt(0) | tensorrt | GPU NVIDIA optimizada |
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 optimizada |
# Build the CLI with the providers you need
cargo install ultralytics-inference --features cuda,tensorrtAceleración de GPU y preprocesamiento con CUDA#
En hardware NVIDIA, la característica cuda habilita el proveedor de ejecución de CUDA, y tensorrt añade el proveedor de TensorRT para optimizar aún más el rendimiento. Para conseguir la latencia más baja posible, la característica cuda-preprocess traslada el preprocesamiento a la GPU.
cuda-preprocess ejecuta el redimensionamiento letterbox, la normalización y la conversión de disposición de HWC a CHW como un único kernel CUDA fusionado; después, pasa el resultado al modelo como un tensor del dispositivo sin copia. El fotograma sin procesar de 8 bits se sigue transfiriendo a la GPU mediante un búfer de preparación fijado en las GPU discretas; el kernel elimina el redimensionamiento, la normalización y la conversión de disposición en la CPU, así como la transferencia independiente del tensor preprocesado, algo especialmente importante para los lotes de alto rendimiento y los flujos en tiempo real.
# Build with fused GPU preprocessing (implies cuda + tensorrt)
cargo build --release --features cuda-preprocessLa ruta rápida se usa automáticamente, sin cambios en la API, cuando se cumplen todas estas condiciones: la característica está compilada, el dispositivo es CUDA o TensorRT, la tarea es detect, segment, pose, OBB, segmentación semántica (solo imágenes individuales) o estimación de profundidad, y el modelo usa una entrada FP32. Está habilitada de forma predeterminada y se puede desactivar para cada modelo:
use ultralytics_inference::{Device, InferenceConfig};
let config = InferenceConfig::new()
.with_device(Device::TensorRt(0))
.with_cuda_preprocess(false); // force CPU preprocessingcuda-preprocess requiere un kit de herramientas CUDA compatible en tiempo de compilación y usa NVRTC en tiempo de ejecución para el kernel de preprocesamiento fusionado. Consulta la guía de aceleración de CUDA y TensorRT para conocer los requisitos de versión y cómo solucionar problemas.
Características de Cargo#
Las características se habilitan en tiempo de compilación. Las características predeterminadas cubren la anotación y la visualización en directo.
| Característica | Predeterminado | Finalidad |
|---|---|---|
annotate | sí | Dibuja cajas, máscaras, puntos clave y etiquetas; necesario para --save. |
visualize | sí | Visualización en ventana en tiempo real para --show. |
video | no | Lee y escribe archivos de vídeo (requiere FFmpeg 6 a 9). |
cuda | no | Proveedor de ejecución de NVIDIA CUDA. |
tensorrt | no | Proveedor de ejecución de NVIDIA TensorRT. |
cuda-preprocess | no | Preprocesamiento fusionado en GPU (implica cuda, tensorrt). |
coreml | no | Proveedor de ejecución de Apple CoreML. |
openvino | no | Proveedor de ejecución de Intel OpenVINO. |
rocm | no | Proveedor de ejecución de AMD ROCm. |
directml | no | Proveedor de ejecución de Windows DirectML. |
Los grupos de conveniencia agrupan proveedores relacionados: nvidia (cuda, tensorrt), amd (rocm, migraphx), intel (openvino, onednn), mobile (nnapi, coreml, qnn) y all (annotate, visualize, video). También hay otros proveedores disponibles, como nnapi, qnn, xnnpack, webgpu, entre otros.
Habilita las características al instalar la CLI o añadir la biblioteca:
cargo install ultralytics-inference --features video
cargo install ultralytics-inference --features cuda,tensorrt[dependencies]
ultralytics-inference = { version = "0.0.50", features = ["video"] }Salida y guardado#
De forma predeterminada, las predicciones se anotan y se guardan en un directorio de ejecución cuyo nombre se incrementa automáticamente:
runs/
└── detect/
└── predict/ # then predict2, predict3, ...
└── image.jpg # annotated resultLa subcarpeta coincide con la tarea (runs/segment/, runs/pose/, etc.). Para las fuentes de vídeo, la salida anotada se guarda como archivo de vídeo; pasa --save-frames para guardar fotogramas individuales. Para la tarea semantic, --save-json guarda PNG de mapas de clases por píxel en una subcarpeta results/. Para la tarea depth, el mapa de profundidad coloreado se superpone a la imagen de origen, igual que en la salida plot() de Ultralytics Python. Para guardar imágenes y vídeos anotados se requiere la característica annotate; la exportación de PNG de mapas de clases semánticas no la requiere. La entrada y salida de vídeo requieren la característica video.
Preguntas frecuentes#
No. La crate ejecuta directamente los modelos ONNX exportados mediante ONNX Runtime. Python solo es necesario si antes entrenas o exportas modelos con el paquete Ultralytics.
Exporta desde el paquete Python, por ejemplo, con la integración de ONNX, o deja que la CLI descargue automáticamente un modelo nano estándar para la tarea elegida durante la primera ejecución.
Sí, con la función
videoactivada y FFmpeg 6 a 9 instalado en el sistema. Esto es compatible con archivos de vídeo, cámaras web y transmisiones RTSP/RTMP/HTTP.Ambas están activadas de forma predeterminada.
annotatedibuja recuadros, máscaras, puntos clave y etiquetas de clase en la imagen, y es necesaria para que--saveescriba los resultados anotados.visualizeabre una ventana en directo para--show. Para obtener una compilación más ligera y sin interfaz gráfica que solo devuelva resultados mediante programación, desactívalas concargo build --no-default-features(y vuelve a activar las funciones que necesites).Esta página ofrece una descripción general. La referencia completa de la API, desglosada por tipo, con todas las estructuras, métodos y opciones de configuración públicas, está publicada en docs.rs y se genera directamente a partir del código fuente.