Экспорт моделей с Ultralytics YOLO#
Введение#
Конечная цель обучения модели — это ее развертывание для решения реальных задач. Режим экспорта в 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).
- Оптимизированный вывод: Экспортированные модели оптимизированы для более быстрого выполнения инференса.
- Обучающие видео: Подробные руководства и уроки для максимально комфортного процесса экспорта.
Примеры использования#
Экспортируй модель 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 в различные форматы. Эти настройки имеют решающее значение для оптимизации производительности, размера и совместимости экспортированной модели с различными платформами и средами. Правильная настройка гарантирует, что модель будет готова к развертыванию в целевом приложении с оптимальной эффективностью.
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
format | str | 'torchscript' | Целевой формат для экспортированной модели, такой как 'onnx', 'torchscript', 'engine' (TensorRT) или другие. Каждый формат обеспечивает совместимость с различными средами развертывания. |
name | str | None | Имя аппаратной цели для форматов, которые ее требуют: архитектура Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; по умолчанию 'hailo8l'), чип Rockchip RKNN (по умолчанию 'rk3588'), SoC Huawei Ascend (CANN --soc_version; по умолчанию 'Ascend310B4') или цель Qualcomm QNN HTP (по умолчанию '73'). Отличается от пары наименования запусков project/name, используемой в других режимах. |
imgsz | int или tuple | 640 | Желаемый размер изображения для входа модели. Может быть целым числом для квадратных изображений (например, 640 для 640×640) или кортежем (height, width) для конкретных размеров. |
keras | bool | False | Включает экспорт в формат Keras для SavedModel TensorFlow, обеспечивая совместимость с сервировкой и API TensorFlow. |
optimize | bool | False | Включает более высокую оптимизацию компилятора для DEEPX, сокращая задержку вывода при увеличении времени компиляции. |
quantize | int или str | None | Точность квантования: 16 (FP16, уменьшает размер модели и может ускорить инференс на поддерживаемом оборудовании) или 8 (INT8/PTQ, дополнительно сжимает модель с минимальной потерь точности, в основном для периферийных устройств; требуется калибровка data/fraction); 32/не задано — это FP32. Форматы экспорта, поддерживающие смешанную точность весов и активаций, также принимают нотацию 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Заменяет устаревшие флаги half/int8 (half=True → 16, int8=True → 8, все еще принимаются с предупреждением об устаревании). Допускаются только те точности, которые поддерживаются целевым форматом (см. ниже). |
dynamic | bool | False | Разрешает использование динамических размеров входных данных для экспорта в TorchScript, ONNX, OpenVINO, TensorRT и CoreML, повышая гибкость при обработке изображений разных размеров. |
simplify | bool | True | Упрощает промежуточный граф ONNX с помощью onnxslim для тех экспортов, которые его строят (см. Форматы экспорта), потенциально повышая производительность и совместимость с движками инференса. |
opset | int | None | Задает версию опсета (opset) ONNX для экспортов, которые строят граф ONNX (см. Форматы экспорта), для совместимости с различными парсерами и рантаймами ONNX. Если не задано, используется последняя поддерживаемая версия. |
workspace | float или None | None | Устанавливает максимальный размер рабочего пространства в ГиБ для оптимизаций TensorRT, балансируя использование памяти и производительность. Используйте None для автоматического выделения ресурсов TensorRT вплоть до максимума устройства. |
nms | bool | False | Добавляет немаксимальное подавление (NMS) к экспортированной модели, если это поддерживается (см. Форматы экспорта), повышая эффективность постобработки обнаружений. Недоступно для сквозных (end2end) моделей. Для CoreML поддерживается только для моделей обнаружения. |
conf | float | None | Порог уверенности, используемый везде, где генерируется NMS во время экспорта: экспорты nms=True; несквозные экспорты детекции Hailo; а также экспорты детекции, позы и сегментации IMX, которые принудительно задают nms=True внутри. По умолчанию равен 0.25, если не задан, за исключением экспортов IMX, для которых по умолчанию используется 0.001. |
iou | float | 0.7 | Порог IoU, используемый везде, где генерируется NMS во время экспорта: экспорты nms=True; несквозные экспорты детекции Hailo; а также экспорты детекции, позы и сегментации IMX, которые принудительно задают nms=True внутри. |
max_det | int | 300 | Максимальное количество детектирований, сохраняемых в выводе экспортированной модели. Применимо к экспортам nms=True во всех форматах, кроме CoreML, чей пайплайн NMS не имеет ограничения на количество детектирований, а также к экспортам сквозной детекции без NMS (YOLO26, YOLOv10, с ограничением до числа доступных анкеров) и экспортам детекции, позы и сегментации IMX. |
agnostic_nms | bool | False | Включает классово-агностический NMS везде, где NMS на этапе экспорта генерируется с помощью стандартного конвейера nms=True, включая собственный этап NMS в CoreML, подавляя перекрывающиеся боксы с более низким скором для разных классов, а не только в рамках одного класса. Не поддерживается сгенерированными конфигами NMS для Hailo или IMX, которые не имеют классово-агностической опции и остаются чувствительными к классам независимо от этого флага. Также встроено в экспорты без NMS (end-to-end) (YOLO26, YOLOv10), где это лишь предотвращает появление одного и того же детектирования под несколькими метками классов (дубликаты с IoU=1.0), а не подавление по порогу IoU между различными боксами. |
batch | int | 1 | Задает размер батча инференса экспортированной модели или максимальное количество изображений, которое экспортированная модель будет обрабатывать одновременно в режиме predict. Для экспортов Edge TPU это значение автоматически устанавливается равным 1. |
device | str | None | Задает устройство для экспорта: 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. |
verbose | bool | True | Повышает уровень логирования сборщика TensorRT до степени важности VERBOSE во время экспорта format='engine'. Другие форматы экспорта игнорируют это. |
data | str | None | Путь к YAML-файлу датасета, необходимый для калибровки квантования INT8; для классификации вместо этого указывается каталог датасета или встроенное имя датасета. Если не указано при включенном INT8, Ultralytics выбирает специфичный для задачи калибровочный датасет там, где это необходимо, или возвращается к датасету по умолчанию для задачи модели. |
split | str | 'val' | Сплит датасета ('train', 'val' или 'test'), используемый для построения загрузчика данных калибровки квантования INT8 из data. |
fraction | float | 1.0 | Указывает часть датасета, которую нужно использовать для калибровки квантования INT8. Позволяет выполнять калибровку на подмножестве полного датасета, что полезно для экспериментов или при ограниченных ресурсах. Если не указано при включенном INT8, будет использован весь датасет. |
end2end | bool | None | Переопределяет сквозной (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 | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_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. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 использует статическую квантизацию ONNX Runtime и данные калибровки. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 использует 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 | ✅ | ❌ | ❌ | ❌ | Преобразование точности во время экспорта не выполняется. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 — это квантизация весов при конвертации 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 и выполняй постобработку во внешнем коде.