YOLO Vision 2026:

Экспорт моделей с Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

Введение#

Конечная цель обучения модели — это ее развертывание для решения реальных задач. Режим экспорта в Ultralytics YOLO26 предлагает широкий выбор опций для сохранения обученной модели в различных форматах, что позволяет развертывать ее на разнообразных платформах и устройствах. Это подробное руководство поможет тебе разобраться в тонкостях экспорта моделей и покажет, как достичь максимальной совместимости и производительности.



Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀

Почему стоит выбрать режим экспорта YOLO26?#

  • Универсальность: Экспорт в различные форматы, включая ONNX, TensorRT, CoreML и другие.
  • Производительность: Получи до 5x ускорения на GPU с TensorRT и до 3x ускорения на CPU с ONNX или OpenVINO.
  • Совместимость: Сделай свою модель универсально пригодной для развертывания в самых разных аппаратных и программных средах.
  • Простота использования: Удобные CLI и Python API для быстрого и понятного экспорта моделей.

Ключевые функции режима экспорта#

Вот некоторые из наиболее значимых функциональных возможностей:

  • Экспорт в один клик: Простые команды для экспорта в различные форматы.
  • Пакетный экспорт: Экспорт моделей, поддерживающих пакетный вывод (batch inference).
  • Оптимизированный вывод: Экспортированные модели оптимизированы для более быстрого выполнения инференса.
  • Обучающие видео: Подробные руководства и уроки для максимально комфортного процесса экспорта.
Совет
  • Экспортируй в ONNX или OpenVINO для получения до 3x ускорения на CPU.
  • Экспортируй в TensorRT для получения до 5x ускорения на GPU.

Примеры использования#

Экспортируй модель YOLO26n в другой формат, например, ONNX или TensorRT. Ознакомься с разделом «Аргументы» ниже для получения полного списка параметров экспорта.

Пример
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load an official model
model = YOLO("path/to/best.pt")  # load a custom-trained model

# Export the model
model.export(format="onnx")

Аргументы#

В этой таблице подробно описаны конфигурации и параметры, доступные для экспорта моделей YOLO в различные форматы. Эти настройки имеют решающее значение для оптимизации производительности, размера и совместимости экспортированной модели с различными платформами и средами. Правильная настройка гарантирует, что модель будет готова к развертыванию в целевом приложении с оптимальной эффективностью.

АргументТипПо умолчаниюОписание
formatstr'torchscript'Целевой формат для экспортированной модели, такой как 'onnx', 'torchscript', 'engine' (TensorRT) или другие. Каждый формат обеспечивает совместимость с различными средами развертывания.
namestrNoneИмя аппаратной цели для форматов, которые ее требуют: архитектура Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; по умолчанию 'hailo8l'), чип Rockchip RKNN (по умолчанию 'rk3588'), SoC Huawei Ascend (CANN --soc_version; по умолчанию 'Ascend310B4') или цель Qualcomm QNN HTP (по умолчанию '73'). Отличается от пары наименования запусков project/name, используемой в других режимах.
imgszint или tuple640Желаемый размер изображения для входа модели. Может быть целым числом для квадратных изображений (например, 640 для 640×640) или кортежем (height, width) для конкретных размеров.
kerasboolFalseВключает экспорт в формат Keras для SavedModel TensorFlow, обеспечивая совместимость с сервировкой и API TensorFlow.
optimizeboolFalseВключает более высокую оптимизацию компилятора для DEEPX, сокращая задержку вывода при увеличении времени компиляции.
quantizeint или strNoneТочность квантования: 16 (FP16, уменьшает размер модели и может ускорить инференс на поддерживаемом оборудовании) или 8 (INT8/PTQ, дополнительно сжимает модель с минимальной потерь точности, в основном для периферийных устройств; требуется калибровка data/fraction); 32/не задано — это FP32. Форматы экспорта, поддерживающие смешанную точность весов и активаций, также принимают нотацию 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Заменяет устаревшие флаги half/int8 (half=True16, int8=True8, все еще принимаются с предупреждением об устаревании). Допускаются только те точности, которые поддерживаются целевым форматом (см. ниже).
dynamicboolFalseРазрешает использование динамических размеров входных данных для экспорта в TorchScript, ONNX, OpenVINO, TensorRT и CoreML, повышая гибкость при обработке изображений разных размеров.
simplifyboolTrueУпрощает промежуточный граф ONNX с помощью onnxslim для тех экспортов, которые его строят (см. Форматы экспорта), потенциально повышая производительность и совместимость с движками инференса.
opsetintNoneЗадает версию опсета (opset) ONNX для экспортов, которые строят граф ONNX (см. Форматы экспорта), для совместимости с различными парсерами и рантаймами ONNX. Если не задано, используется последняя поддерживаемая версия.
workspacefloat или NoneNoneУстанавливает максимальный размер рабочего пространства в ГиБ для оптимизаций TensorRT, балансируя использование памяти и производительность. Используйте None для автоматического выделения ресурсов TensorRT вплоть до максимума устройства.
nmsboolFalseДобавляет немаксимальное подавление (NMS) к экспортированной модели, если это поддерживается (см. Форматы экспорта), повышая эффективность постобработки обнаружений. Недоступно для сквозных (end2end) моделей. Для CoreML поддерживается только для моделей обнаружения.
conffloatNoneПорог уверенности, используемый везде, где генерируется NMS во время экспорта: экспорты nms=True; несквозные экспорты детекции Hailo; а также экспорты детекции, позы и сегментации IMX, которые принудительно задают nms=True внутри. По умолчанию равен 0.25, если не задан, за исключением экспортов IMX, для которых по умолчанию используется 0.001.
ioufloat0.7Порог IoU, используемый везде, где генерируется NMS во время экспорта: экспорты nms=True; несквозные экспорты детекции Hailo; а также экспорты детекции, позы и сегментации IMX, которые принудительно задают nms=True внутри.
max_detint300Максимальное количество детектирований, сохраняемых в выводе экспортированной модели. Применимо к экспортам nms=True во всех форматах, кроме CoreML, чей пайплайн NMS не имеет ограничения на количество детектирований, а также к экспортам сквозной детекции без NMS (YOLO26, YOLOv10, с ограничением до числа доступных анкеров) и экспортам детекции, позы и сегментации IMX.
agnostic_nmsboolFalseВключает классово-агностический NMS везде, где NMS на этапе экспорта генерируется с помощью стандартного конвейера nms=True, включая собственный этап NMS в CoreML, подавляя перекрывающиеся боксы с более низким скором для разных классов, а не только в рамках одного класса. Не поддерживается сгенерированными конфигами NMS для Hailo или IMX, которые не имеют классово-агностической опции и остаются чувствительными к классам независимо от этого флага. Также встроено в экспорты без NMS (end-to-end) (YOLO26, YOLOv10), где это лишь предотвращает появление одного и того же детектирования под несколькими метками классов (дубликаты с IoU=1.0), а не подавление по порогу IoU между различными боксами.
batchint1Задает размер батча инференса экспортированной модели или максимальное количество изображений, которое экспортированная модель будет обрабатывать одновременно в режиме predict. Для экспортов Edge TPU это значение автоматически устанавливается равным 1.
devicestrNoneЗадает устройство для экспорта: GPU (device=0), CPU (device=cpu), MPS для Apple silicon (device=mps), Huawei Ascend NPU (device=npu или device=npu:0) или DLA для NVIDIA Jetson (device=dla:0 или device=dla:1). Экспорты TensorRT автоматически используют GPU, но TensorRT 11.0 не поддерживает DLA.
verboseboolTrueПовышает уровень логирования сборщика TensorRT до степени важности VERBOSE во время экспорта format='engine'. Другие форматы экспорта игнорируют это.
datastrNoneПуть к YAML-файлу датасета, необходимый для калибровки квантования INT8; для классификации вместо этого указывается каталог датасета или встроенное имя датасета. Если не указано при включенном INT8, Ultralytics выбирает специфичный для задачи калибровочный датасет там, где это необходимо, или возвращается к датасету по умолчанию для задачи модели.
splitstr'val'Сплит датасета ('train', 'val' или 'test'), используемый для построения загрузчика данных калибровки квантования INT8 из data.
fractionfloat1.0Указывает часть датасета, которую нужно использовать для калибровки квантования INT8. Позволяет выполнять калибровку на подмножестве полного датасета, что полезно для экспериментов или при ограниченных ресурсах. Если не указано при включенном INT8, будет использован весь датасет.
end2endboolNoneПереопределяет сквозной (end-to-end) режим в моделях YOLO, поддерживающих инференс без NMS (YOLO26, YOLOv10). Установка значения False позволяет экспортировать эти модели так, чтобы они были совместимы с традиционным пайплайном постобработки на основе NMS. Подробности см. в руководстве по сквозному обнаружению.

Настройка этих параметров позволяет адаптировать процесс экспорта под конкретные требования, такие как среда развертывания, аппаратные ограничения и целевые показатели производительности. Выбор подходящего формата и настроек важен для достижения наилучшего баланса между размером модели, скоростью и точностью.

Форматы экспорта#

Доступные форматы экспорта YOLO26 приведены в таблице ниже. Ты можешь экспортировать в любой формат, используя аргумент format, т.е. format='onnx' или format='engine'. Ты можешь выполнять предсказания или валидацию непосредственно на экспортированных моделях, т.е. yolo predict model=yolo26n.onnx. Примеры использования отображаются для твоей модели после завершения экспорта. Модели также можно экспортировать прямо из браузера на Ultralytics Platform без какой-либо локальной настройки.

ФорматАргумент formatМодельМетаданныеАргументы
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnximgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engineimgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackageimgsz, dynamic, quantize, nms, batch, device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz, keras, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pbimgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz, quantize, opset, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz, batch, device
MNNmnnyolo26n.mnnimgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n_ncnn_model/imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz, batch, device
Axeleraaxelerayolo26n_axelera_model/imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnximgsz, batch, name, quantize, simplify, opset, data, fraction, device
LiteRTlitertyolo26n.tfliteimgsz, quantize, batch, data, fraction, device
Hailohailoyolo26n_hailo_model/imgsz, name, quantize, data, fraction, simplify, conf, iou
Huawei Ascendascendyolo26n_ascend_model/imgsz, batch, name, quantize, opset, simplify, nms

Опции квантования#

Используй аргумент quantize для запроса точности экспорта. Значения строк не зависят от регистра, и Ultralytics приводит принятые псевдонимы к каноническому виду перед экспортом:

Значения запросаКаноническое значениеЗначение
8, "8", "int8", "w8a8"8Веса и активации INT8
16, "16", "fp16", "w16a16"16Веса и активации FP16
32, "32", "fp32", "w32a32"32Экспорт в FP32; то же самое, что и при отсутствии настроек, за исключением CoreML NMS ML Programs, для которых по умолчанию используется FP16
"w8a16""w8a16"Веса INT8 с 16-битными активациями (FP16; INT16 в LiteRT)
"w8a32""w8a32"Веса INT8 с активациями FP32 (динамический INT8 в LiteRT, калибровка не требуется)

Устаревшие флаги half=True и int8=True по-прежнему принимаются с предупреждениями об устаревании и перенаправляются на quantize=16 и quantize=8.

Не каждый формат экспорта поддерживает любую точность. Явные запросы quantize либо обеспечивают эту точность, либо завершаются ошибкой до начала экспорта:

ФорматFP32 (32/не задано)FP16 (16)INT8 (8)W8A16 ("w8a16")Примечания
PyTorchН/ДН/ДН/ДНативный формат обучения/чекпоинта.
TorchScript✅ Только GPUЭкспорт FP16 TorchScript требует device=0; экспорт для CPU выполняется в формате FP32.
ONNXINT8 использует статическую квантизацию ONNX Runtime и данные калибровки.
OpenVINOINT8 использует NNCF пост-тренировочную квантизацию.
TensorRTДля INT8 требуются репрезентативные данные калибровки.
CoreML✅¹CoreML INT8 — это квантование весов; W8A16 использует веса INT8 с активациями FP16. ¹Для NMS ML Programs, если настройки не заданы, по умолчанию используется FP16.
TF SavedModelЭкспорт INT8 использует калибровку TensorFlow.
TF GraphDefПреобразование точности во время экспорта не выполняется.
Edge TPU✅ автоEdge TPU требует INT8; если параметр не задан, он включается автоматически.
PaddlePaddleПреобразование точности во время экспорта не выполняется.
MNNINT8 — это квантизация весов при конвертации MNN.
NCNNФормат среды выполнения для мобильных/встраиваемых систем.
IMX500✅ автоIMX500 требует квантизации; если параметр не задан, INT8 включается автоматически.
RKNN✅ зависит от чипаRK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B поддерживают FP16 или INT8; варианты RV1103/RV1106 поддерживают только INT8.
ExecuTorchПреобразование точности во время экспорта не выполняется.
Axelera✅ автоЭкспорт Axelera требует INT8; если параметр не задан, он включается автоматически.
DEEPX✅ автоЭкспорт DEEPX требует INT8; если параметр не задан, он включается автоматически.
Qualcomm QNN✅ автоЭкспорт QNN HTP зафиксирован на весах INT8 с 16-битными активациями.
LiteRTСтатический INT8 (8) и "w8a16" (веса int8 + int16 активации) используют калибровочные данные; также поддерживается динамический INT8 "w8a32" (без калибровки). quantize=16 не является отдельным экспортом; модель FP32 работает в формате FP16 во время выполнения через делегат GPU.
Huawei Ascend✅ автоСвертки Ascend AI Core принимают только входы FP16/INT8, поэтому ATC компилирует FP16; это включается автоматически, если параметр не задан.

Для экспорта в INT8 и W8A16 предоставь репрезентативные калибровочные данные с помощью data, например data="coco8.yaml", если в документации целевой интеграции не указано поведение по умолчанию или автоактивация. Схеме LiteRT "w8a32" (динамический INT8) калибровочные данные не требуются.

Что дальше#

Найди руководство по интеграции для твоего целевого устройства — ONNX, TensorRT, CoreML и другие доступны в полном списке интеграций — чтобы узнать, как запустить экспортированную модель.

FAQ#

Как экспортировать модель YOLO26 в формат ONNX?#

Экспорт модели YOLO26 в формат ONNX очень прост с Ultralytics. Платформа предоставляет как Python, так и CLI методы для экспорта моделей.

Пример
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load an official model
model = YOLO("path/to/best.pt")  # load a custom-trained model

# Export the model
model.export(format="onnx")

Дополнительные сведения о процессе, включая расширенные опции вроде обработки различных размеров входа, см. в руководстве по интеграции ONNX.

Каковы преимущества использования TensorRT для экспорта моделей?#

Использование TensorRT для экспорта моделей обеспечивает значительное улучшение производительности. Модели YOLO26, экспортированные в TensorRT, могут достичь ускорения на GPU до 5 раз, что делает их идеальными для приложений реального времени.

  • Универсальность: Оптимизация моделей под конкретную аппаратную конфигурацию.
  • Скорость: Достижение более быстрого инференса за счет продвинутых оптимизаций.
  • Совместимость: Плавная интеграция с оборудованием NVIDIA.

Чтобы узнать больше об интеграции TensorRT, см. руководство по интеграции TensorRT.

Как включить квантование INT8 при экспорте модели YOLO26?#

Квантование INT8 — это отличный способ сжать модель и ускорить инференс, особенно на периферийных устройствах. Вот как ты можешь включить квантование INT8:

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # Load a model
model.export(format="onnx", quantize=8, data="coco8.yaml")

Квантование INT8 может применяться к таким форматам, как ONNX, TensorRT, OpenVINO, CoreML и Rockchip RKNN. Для достижения оптимальных результатов квантования предоставь репрезентативный датасет, используя параметр data. Дополнительные сведения о принимаемых значениях quantize и поддерживаемых форматах см. в разделе Параметры квантования.

Почему динамический размер входных данных важен при экспорте моделей?#

Динамический размер входа позволяет экспортированной модели работать с переменными размерами изображений, обеспечивая гибкость и оптимизируя эффективность обработки для различных сценариев использования. При экспорте в такие форматы, как ONNX или TensorRT, включение динамического размера входа гарантирует, что модель сможет беспрепятственно адаптироваться под разные входные формы.

Чтобы включить эту функцию, используй флаг dynamic=True во время экспорта:

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)

Динамическое изменение размеров входных данных особенно полезно для приложений, где размеры могут варьироваться, например, при обработке видео или при работе с изображениями из разных источников.

Какие ключевые аргументы экспорта следует учитывать для оптимизации производительности модели?#

Понимание и настройка аргументов экспорта имеют решающее значение для оптимизации производительности модели:

  • format: Целевой формат для экспортированной модели (например, onnx, torchscript, tensorflow).
  • imgsz: Желаемый размер изображения для входа модели (например, 640 или (height, width)).
  • quantize: Точность квантования, например 8/"int8", 16/"fp16", 32/"fp32" или смешанные схемы весов/активаций "w8a16" и "w8a32" (LiteRT динамический INT8) в поддерживаемых форматах. См. Параметры квантования.
  • optimize: Включает более высокую оптимизацию компилятора для экспорта DEEPX.

Для развертывания на определенных аппаратных платформах рассмотри использование специализированных форматов экспорта, таких как TensorRT для GPU NVIDIA, CoreML для устройств Apple или Edge TPU для устройств Google Coral.

Что представляют собой выходные тензоры в экспортированных моделях YOLO?#

Когда ты экспортируешь модель YOLO в такие форматы, как ONNX или TensorRT, структура выходного тензора зависит от задачи модели. Понимание этих выходных данных важно для реализации собственного инференса.

Для моделей детекции YOLO26 (например, yolo26n.pt) сквозной (end-to-end) экспорт включен по умолчанию в форматах, которые его поддерживают, поэтому выходные данные имеют форму (batch_size, max_detections, 6) со значениями [x1, y1, x2, y2, confidence, class_id]. При использовании значения по умолчанию max_det=300 это обычно выглядит как (batch_size, 300, 6). Некоторые ограниченные форматы автоматически возвращаются к традиционной структуре выводов, если сквозные операторы не поддерживаются.

Для моделей детекции без сквозного экспорта или моделей YOLO26, экспортированных с end2end=False, выходом обычно является один тензор формы (batch_size, 4 + num_classes, num_predictions), где каналы представляют координаты рамок плюс оценки по классам, а num_predictions зависит от входного разрешения экспорта (и может быть динамическим).

Для моделей сегментации (например, yolo26n-seg.pt) ты обычно получаешь два выхода: первый тензор формы (batch_size, 4 + num_classes + mask_dim, num_predictions) (рамки, оценки классов и коэффициенты масок) и второй тензор формы (batch_size, mask_dim, proto_h, proto_w), содержащий прототипы масок, которые используются с коэффициентами для генерации масок экземпляров. Размеры зависят от входного разрешения экспорта (и могут быть динамическими).

Для моделей позы (например, yolo26n-pose.pt) выходной тензор обычно имеет форму (batch_size, 4 + num_classes + keypoint_dims, num_predictions), где keypoint_dims зависит от спецификации позы (например, количества ключевых точек и того, включена ли уверенность), а num_predictions зависит от входного разрешения экспорта (и может быть динамическим).

Примеры в разделе Примеры инференса ONNX показывают, как обрабатывать эти выходы для каждого типа модели.

Есть ли официальный C++ API для инференса Ultralytics?#

В настоящее время Ultralytics не предоставляет отдельный API инференса на C++ для моделей YOLO. Для развертывания на C++ экспортируй модель в формат рантайма, такой как ONNX, TensorRT, TorchScript или MNN, а затем загрузи экспортированный артефакт с помощью нативного C++ API этого рантайма.

Например, экспортируй модель детекции с yolo export model=yolo26n.pt format=onnx и запусти файл .onnx с помощью ONNX Runtime C++, или экспортируй с format=engine и запусти движок TensorRT из C++ приложения TensorRT. Когда ты используешь пользовательскую постобработку на C++, сопоставь структуру выходного тензора для своей задачи и настроек экспорта; сквозные экспорты детекции YOLO26 обычно возвращают (batch, max_det, 6), в то время как несквозные экспорты возвращают «сырые» тензоры предсказаний, требующие внешней постобработки.

Почему output0 имеет формат FP32 при экспорте квантованных моделей с end2end=True?#

При экспорте с quantize=16 (FP16) или quantize=8 (INT8) большинство тензоров преобразуются в более низкую точность для уменьшения размера модели и повышения производительности. Однако при включении end2end=True постобработка (включая индексы классов) внедряется непосредственно в экспортированный граф.

Тензор output0 содержит индексы классов, которые внутри представляются в виде чисел с плавающей запятой. FP16 не может надежно представлять целочисленные значения выше 2048 из-за ограниченной точности мантиссы. Чтобы избежать потенциальной потери точности или неверных ID классов, output0 намеренно сохраняется в формате FP32.

Это ожидаемое поведение, которое также применяется к экспортам с пониженной точностью или квантованным экспортам, где необходимо сохранить точность индексов классов.

Если требуются полноценные выходы FP16, выполни экспорт с end2end=False и выполняй постобработку во внешнем коде.

Комментарии