Инференс Ultralytics для Rust#
Ultralytics Inference — высокопроизводительная библиотека инференса YOLO и инструмент командной строки, написанные на Rust. Она запускает экспортированные модели ONNX через ONNX Runtime, обеспечивая быстрые предсказания с безопасным управлением памятью для изображений, видео, веб-камер и потоков; среда выполнения Python для инференса не требуется.
Проект поставляется в виде единственного крейта ultralytics-inference, который можно использовать двумя способами: как CLI для быстрых предсказаний и пакетной обработки или как библиотеку, встроенную непосредственно в приложение на Rust. Он поддерживает все задачи Ultralytics и широкий набор аппаратных бэкендов через единый интерфейс устройств. Для инференса в браузере тот же репозиторий публикует npm-пакет @ultralytics/yolo; см. руководство по настройке.
Зачем использовать Rust для инференса?#
- Нативная скорость и компактность. Компилируется в нативный двоичный файл без интерпретатора — идеальный вариант для серверов, контейнеров и периферийных устройств.
- Безопасность памяти. Модель владения Rust устраняет целые классы ошибок времени выполнения без сборщика мусора.
- Все задачи YOLO. Детекция, сегментация, семантическая сегментация, оценка глубины, классификация, определение позы и OBB доступны через один API.
- Широкая поддержка оборудования. CPU, а также провайдеры выполнения CUDA, TensorRT, CoreML, OpenVINO, DirectML, ROCm и XNNPACK, выбираемые во время сборки.
- Предобработка на GPU. Дополнительное объединённое ядро CUDA выполняет letterbox, нормализацию и преобразование формата данных на GPU и передаёт результат модели, не покидая устройство.
- Автоматическая загрузка. Известные названия моделей YOLO и примеры ресурсов автоматически загружаются при первом использовании.
На этой странице описан автономный крейт Rust. Информацию о рабочем процессе Python (обучение, валидация, экспорт и предсказание) см. в основном разделе Краткое руководство и в разделе Режим предсказания. Экспортируй любую модель Ultralytics в ONNX с помощью интеграции ONNX, а затем запускай её здесь.
Установка#
Требуется Rust версии 1.89 или новее. Для функции video также необходимо установить в системе FFmpeg версии с 6 по 9.
# Install the command-line tool from crates.io
cargo install ultralytics-inference
# Or with GPU support compiled in
cargo install ultralytics-inference --features cuda,tensorrtДвоичный файл размещается по пути ~/.cargo/bin/ultralytics-inference (Linux и macOS) или %USERPROFILE%\.cargo\bin\ в Windows.
Краткое руководство по CLI#
CLI предоставляет подкоманду predict. Если не указать аргументы, она загружает нано-модель детекции и примеры изображений, запускает инференс и сохраняет изображения с аннотациями в 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 16Общие флаги:
| Флаг | По умолчанию | Описание |
|---|---|---|
--model, -m | yolo26n.onnx | Путь к модели ONNX; известная модель YOLO загружается автоматически. |
--task | detect | Один из вариантов: detect, segment, semantic, depth, classify, pose, obb. |
--source, -s | образец | Изображение, каталог, шаблон glob, видео, индекс веб-камеры или URL. |
--conf | 0.25 | Порог уверенности. |
--iou | 0.7 | Порог IoU для подавления немаксимумов. |
--imgsz | метаданные модели | Размер изображения для инференса. |
--device | авто | Устройство выполнения, например cuda:0, coreml, tensorrt:0. |
--max-det | 300 | Максимальное число обнаружений на изображение. |
--rect | true | Прямоугольный инференс с минимальным дополнением. |
--batch | 1 | Размер пакета для инференса. |
--quantize | по умолчанию для модели | Точность инференса: 8/int8, 16/fp16, 32/fp32, w8a16 или w8a32. |
--save | true | Сохранять результаты с аннотациями в runs/<task>/predict. |
--save-frames | false | Сохранять отдельные кадры для видео вместо видеофайла. |
--save-json | false | Сохранять PNG-карты классов для семантической сегментации. |
--show | false | Показывать результаты в окне. |
--verbose | true | Выводить результаты и время выполнения для каждого изображения. |
--classes | все | Фильтровать обнаружения по ID классов, например "0,1,2". |
Краткое руководство по библиотеке#
Загрузи модель и запусти предсказание. Метаданные модели, такие как названия классов, тип задачи и размер изображения, автоматически считываются из файла 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(())
}Используй InferenceConfig, чтобы задавать пороги, размер изображения, точность и устройство с помощью builder API:
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")?;Каждая задача заполняет отдельное поле в Results. Каждая вкладка ниже содержит полноценную программу, готовую к запуску; модель и примеры входных данных автоматически загружаются при первом запуске. Замени predict_default() на predict("image.jpg"), чтобы запустить программу на собственных файлах.
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(())
}Поддерживаемые задачи#
Поддерживаются все задачи Ultralytics. Если --model не указан, автоматически загружается подходящая nano-модель для выбранной задачи.
| Задача | --task | Результат | Модель по умолчанию |
|---|---|---|---|
| Обнаружение | detect | Ограничивающие рамки и классы | yolo26n.onnx |
| Сегментация экземпляров | segment | Рамки и маски для каждого экземпляра | yolo26n-seg.onnx |
| Семантическая сегментация | semantic | Карта классов для каждого пикселя | yolo26n-sem.onnx |
| Оценка глубины | depth | Карта глубины для каждого пикселя в метрах | yolo26n-depth.onnx |
| Классификация | classify | Вероятности классов | yolo26n-cls.onnx |
| Поза | pose | Рамки и ключевые точки | yolo26n-pose.onnx |
| Ориентированные рамки | obb | Повернутые ограничивающие рамки | yolo26n-obb.onnx |
Совместимость моделей#
Любую модель Ultralytics, экспортированную в ONNX, можно загрузить из локального файла. Автоматическая загрузка доступна для стандартных моделей YOLO26, YOLO11 и YOLOv8 размеров n, s, m, l и x:
| Семейство моделей | Варианты с автоматической загрузкой |
|---|---|
| YOLO26 | yolo26{n,s,m,l,x}.onnx, -seg, -pose, -obb, -cls, -sem и -depth |
| YOLO11 | yolo11{n,s,m,l,x}.onnx, -seg, -pose, -obb и -cls |
| YOLOv8 | yolov8{n,s,m,l,x}.onnx, -seg, -pose, -obb и -cls |
Семантическая сегментация (-sem) и оценка глубины (-depth) доступны только в YOLO26. Модели обнаружения RT-DETR тоже работают, но автоматически не загружаются: сначала экспортируй модель в ONNX.
Источники входных данных#
Аргумент --source (и тип Source в библиотеке) поддерживает множество типов входных данных, которые автоматически определяются по строке:
| Источник | Пример | Примечания |
|---|---|---|
| Изображение | image.jpg | Один файл. |
| Каталог | images/ | Все изображения в папке. |
| Glob | images/*.jpg | Шаблон в стиле оболочки. |
| Видео | video.mp4 | Требуется функция video. |
| Веб-камера | 0 | Требуется функция video. |
| Поток | rtsp://... | Требуется функция video. |
| URL | https://example.com/image.jpg | Загрузка удалённого изображения. |
Устройства и провайдеры выполнения#
Поддержка GPU и ускорителей компилируется в виде функций Cargo и выбирается во время выполнения с помощью --device (CLI) или Device (библиотека). Если устройство не указано, провайдеры, скомпилированные в сборку, регистрируются в фиксированном порядке предпочтения (сначала TensorRT, затем CUDA и так далее), поэтому сборка только с функциями по умолчанию запускается на CPU.
| Строка устройства | Вариант Device | Функция сборки | Оборудование |
|---|---|---|---|
cpu | Device::Cpu | встроено | Любой CPU |
cuda:0 | Device::Cuda(0) | cuda | GPU NVIDIA |
tensorrt:0 | Device::TensorRt(0) | tensorrt | Оптимизированный GPU NVIDIA |
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 |
# Build the CLI with the providers you need
cargo install ultralytics-inference --features cuda,tensorrtУскорение на GPU и предобработка с помощью CUDA#
На оборудовании NVIDIA функция cuda включает провайдер выполнения CUDA, а tensorrt добавляет провайдер TensorRT для дополнительной оптимизации. Для минимально возможной задержки функция cuda-preprocess переносит предобработку на GPU.
cuda-preprocess выполняет изменение размера с letterbox, нормализацию и преобразование формата HWC в CHW одним объединённым ядром CUDA, а затем передаёт результат модели как тензор устройства без копирования. Исходный 8-битный кадр всё равно передаётся на GPU, а на дискретных GPU — через закреплённый буфер промежуточного хранения; ядро позволяет обойтись без изменения размера, нормализации и преобразования формата на CPU, а также без отдельной передачи предобработанного тензора. Это особенно важно для пакетов с высокой пропускной способностью и потоков реального времени.
# Build with fused GPU preprocessing (implies cuda + tensorrt)
cargo build --release --features cuda-preprocessБыстрый путь используется автоматически, без изменений API, если выполняются все условия: функция включена при компиляции, устройством является CUDA или TensorRT, задача — detect, segment, pose, OBB, semantic segmentation (только для одиночных изображений) или depth estimation, а модель принимает данные в формате FP32. Эта возможность включена по умолчанию, но её можно отключить для каждой модели:
use ultralytics_inference::{Device, InferenceConfig};
let config = InferenceConfig::new()
.with_device(Device::TensorRt(0))
.with_cuda_preprocess(false); // force CPU preprocessingcuda-preprocess требует соответствующий CUDA Toolkit во время сборки и использует NVRTC во время выполнения для объединённого ядра предобработки. Требования к версиям и советы по устранению неполадок см. в руководстве по ускорению CUDA и TensorRT.
Функции Cargo#
Функции включаются во время сборки. По умолчанию доступны аннотирование и отображение в реальном времени.
| Характеристика | По умолчанию | Назначение |
|---|---|---|
annotate | да | Рисование рамок, масок, ключевых точек и меток; требуется для --save. |
visualize | да | Отображение в окне в реальном времени для --show. |
video | нет | Чтение и запись видеофайлов (требуется FFmpeg 6–9). |
cuda | нет | Провайдер выполнения NVIDIA CUDA. |
tensorrt | нет | Провайдер выполнения NVIDIA TensorRT. |
cuda-preprocess | нет | Объединённая предобработка на GPU (подразумевает cuda, tensorrt). |
coreml | нет | Провайдер выполнения Apple CoreML. |
openvino | нет | Провайдер выполнения Intel OpenVINO. |
rocm | нет | Провайдер выполнения AMD ROCm. |
directml | нет | Провайдер выполнения Windows DirectML. |
Группы функций для удобства объединяют связанные провайдеры: nvidia (cuda, tensorrt), amd (rocm, migraphx), intel (openvino, onednn), mobile (nnapi, coreml, qnn) и all (annotate, visualize, video). Доступны и другие провайдеры, например nnapi, qnn, xnnpack, webgpu и другие.
Включи функции при установке CLI или добавлении библиотеки:
cargo install ultralytics-inference --features video
cargo install ultralytics-inference --features cuda,tensorrt[dependencies]
ultralytics-inference = { version = "0.0.50", features = ["video"] }Вывод и сохранение#
По умолчанию предсказания аннотируются и сохраняются в папку запуска с автоматически увеличиваемым номером:
runs/
└── detect/
└── predict/ # then predict2, predict3, ...
└── image.jpg # annotated resultИмя подпапки соответствует задаче (runs/segment/, runs/pose/ и так далее). Для видеоисточников аннотированный результат записывается в видеофайл; укажи --save-frames, чтобы вместо этого сохранять отдельные кадры. Для задачи semantic параметр --save-json сохраняет PNG-карты классов для каждого пикселя в подпапке results/. Для задачи depth цветная карта глубины накладывается на исходное изображение, как и в выводе plot() из Ultralytics Python. Для сохранения аннотированных изображений и видео требуется функция annotate; экспорт PNG-карт классов для семантической сегментации от неё не зависит. Для ввода и вывода видео требуется функция video.
Часто задаваемые вопросы#
Нет. Crate напрямую запускает экспортированные модели ONNX через ONNX Runtime. Python нужен только в том случае, если ты заранее обучаешь или экспортируешь модели с помощью пакета Ultralytics.
Экспортируй модель из пакета Python, например с помощью интеграции ONNX, или при первом запуске позволь CLI загрузить стандартную nano-модель для выбранной задачи.
Да, если включена функция
videoи в системе установлена FFmpeg версии 6–9. Поддерживаются видеофайлы, веб-камеры и потоки RTSP/RTMP/HTTP.Обе функции включены по умолчанию.
annotateнаносит на изображение рамки, маски, ключевые точки и метки классов; эта функция необходима, чтобы--saveсохраняла результаты с аннотациями.visualizeоткрывает окно трансляции для--show. Чтобы получить более компактную сборку без графического интерфейса, которая только программно возвращает результаты, отключи эти функции с помощьюcargo build --no-default-features(при необходимости снова включи отдельные функции).На этой странице приведён общий обзор. Полная справка по API для каждого публичного типа структуры, метода и параметра конфигурации опубликована на сайте docs.rs и генерируется непосредственно из исходного кода.