Link to this sectionЭкспорт моделей с Ultralytics YOLO#
Link to this sectionВведение#
Конечная цель обучения модели — это ее развертывание для решения реальных задач. Режим экспорта в Ultralytics YOLO26 предлагает широкий выбор опций для сохранения обученной модели в различных форматах, что позволяет развертывать ее на разнообразных платформах и устройствах. Это подробное руководство поможет тебе разобраться в тонкостях экспорта моделей и покажет, как достичь максимальной совместимости и производительности.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Link to this sectionПочему стоит выбрать режим экспорта YOLO26?#
- Универсальность: Экспорт во множество форматов, включая ONNX, TensorRT, CoreML и другие.
- Производительность: Ускорение работы на GPU до 5 раз с помощью TensorRT и до 3 раз на CPU с помощью ONNX или OpenVINO.
- Совместимость: Сделай свою модель универсально пригодной для развертывания в самых разных аппаратных и программных средах.
- Простота использования: Удобные CLI и Python API для быстрого и понятного экспорта моделей.
Link to this sectionКлючевые функции режима экспорта#
Вот некоторые из наиболее значимых функциональных возможностей:
- Экспорт в один клик: Простые команды для экспорта в различные форматы.
- Пакетный экспорт: Экспорт моделей, поддерживающих пакетный вывод (batch inference).
- Оптимизированный вывод: Экспортированные модели оптимизированы для более быстрого выполнения инференса.
- Обучающие видео: Подробные руководства и уроки для максимально комфортного процесса экспорта.
Link to this sectionПримеры использования#
Экспортируй модель 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")Link to this sectionАргументы#
В этой таблице подробно описаны конфигурации и параметры, доступные для экспорта моделей YOLO в различные форматы. Эти настройки имеют решающее значение для оптимизации производительности, размера и совместимости экспортированной модели с различными платформами и средами. Правильная настройка гарантирует, что модель будет готова к развертыванию в целевом приложении с оптимальной эффективностью.
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
format | str | 'torchscript' | Целевой формат для экспортированной модели, такой как 'onnx', 'torchscript', 'engine' (TensorRT) или другие. Каждый формат обеспечивает совместимость с различными средами развертывания. |
imgsz | int или tuple | 640 | Желаемый размер изображения для входных данных модели. Может быть целым числом для квадратных изображений (например, 640 для 640×640) или кортежем (height, width) для задания конкретных размеров. |
keras | bool | False | Включает экспорт в формат Keras для TensorFlow SavedModel, обеспечивая совместимость с TensorFlow serving и API. |
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 парсерами и средами исполнения. Если не задано, используется последняя поддерживаемая версия. |
workspace | float или None | None | Устанавливает максимальный размер рабочего пространства в ГБ для оптимизаций TensorRT, балансируя использование памяти и производительность. Используй None для автоматического распределения ресурса движком TensorRT вплоть до максимума устройства. |
nms | bool | False | Добавляет Non-Maximum Suppression (NMS) к экспортированной модели, когда это поддерживается (смотри Форматы экспорта), повышая эффективность постобработки детектирования. Недоступно для end2end моделей. Для CoreML поддерживается только для моделей детектирования. |
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. |
data | str | None | Путь к файлу конфигурации датасета, необходимый для калибровки квантования INT8. Если он не указан при включенном INT8, Ultralytics выбирает специфичный для задачи калибровочный датасет там, где это требуется, или возвращается к датасету по умолчанию для данной задачи модели. |
fraction | float | 1.0 | Указывает часть датасета, которую нужно использовать для калибровки квантования INT8. Позволяет выполнять калибровку на подмножестве полного датасета, что полезно для экспериментов или при ограниченных ресурсах. Если не указано при включенном INT8, будет использован весь датасет. |
end2end | bool | None | Переопределяет режим end-to-end в моделях YOLO, которые поддерживают инференс без NMS (YOLO26, YOLOv10). Установка значения False позволяет экспортировать эти модели для совместимости с традиционным конвейером постобработки на основе NMS. Подробности см. в Руководстве по сквозному обнаружению. |
Настройка этих параметров позволяет адаптировать процесс экспорта под конкретные требования, такие как среда развертывания, аппаратные ограничения и целевые показатели производительности. Выбор подходящего формата и параметров имеет важное значение для достижения наилучшего баланса между размером модели, скоростью и точностью.
Link to this sectionФорматы экспорта#
Доступные форматы экспорта 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, 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, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, 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, 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, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, conf, iou |
Link to this sectionОпции квантования#
Используй аргумент 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. |
Для экспортов INT8 и W8A16 предоставь репрезентативные калибровочные данные с помощью параметра data, например data="coco8.yaml", если в документации целевой интеграции не указано поведение по умолчанию или автоматически включенное поведение. Схема "w8a32" (динамический INT8) в LiteRT не требует калибровочных данных.
Link to this sectionFAQ#
Link to this sectionКак экспортировать модель 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.
Link to this sectionКаковы преимущества использования TensorRT для экспорта моделей?#
Использование TensorRT для экспорта моделей обеспечивает значительное улучшение производительности. Модели YOLO26, экспортированные в TensorRT, могут достичь ускорения на GPU до 5 раз, что делает их идеальными для приложений реального времени.
- Универсальность: Оптимизация моделей под конкретную аппаратную конфигурацию.
- Скорость: Достижение более быстрого инференса за счет продвинутых оптимизаций.
- Совместимость: Плавная интеграция с оборудованием NVIDIA.
Чтобы узнать больше об интеграции TensorRT, ознакомься с руководством по интеграции TensorRT.
Link to this sectionКак включить квантование 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 и поддерживаемых форматах.
Link to this sectionПочему динамический размер входных данных важен при экспорте моделей?#
Динамический размер входных данных позволяет экспортированной модели работать с изображениями различных размеров, обеспечивая гибкость и оптимизируя эффективность обработки для разных сценариев использования. При экспорте в форматы, такие как ONNX или TensorRT, включение динамического размера входных данных гарантирует, что модель сможет легко адаптироваться к разным формам входных данных.
Чтобы включить эту функцию, используй флаг dynamic=True во время экспорта:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)Динамическое изменение размеров входных данных особенно полезно для приложений, где размеры могут варьироваться, например, при обработке видео или при работе с изображениями из разных источников.
Link to this sectionКакие ключевые аргументы экспорта следует учитывать для оптимизации производительности модели?#
Понимание и настройка аргументов экспорта имеют решающее значение для оптимизации производительности модели:
format:Целевой формат для экспортированной модели (например,onnx,torchscript,tensorflow).imgsz:Желаемый размер изображения для входных данных модели (например,640или(height, width)).quantize:Точность квантования, например8/"int8",16/"fp16",32/"fp32"или схемы смешанных весов/активаций"w8a16"и"w8a32"(динамический INT8 в LiteRT) для поддерживаемых форматов. См. Варианты квантования.optimize:Включает более высокую оптимизацию компилятора для экспорта DEEPX.
Для развертывания на специфических аппаратных платформах рассмотри использование специализированных форматов экспорта, таких как TensorRT для графических процессоров NVIDIA, CoreML для устройств Apple или Edge TPU для устройств Google Coral.
Link to this sectionЧто представляют собой выходные тензоры в экспортированных моделях 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). Некоторые форматы с ограничениями автоматически возвращаются к традиционной структуре вывода, если операторы end-to-end не поддерживаются.
Для моделей обнаружения без поддержки end-to-end или моделей 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 демонстрируют, как обрабатывать эти выходные данные для каждого типа модели.
Link to this sectionЕсть ли официальный C++ API для инференса Ultralytics?#
Ultralytics в настоящее время не предоставляет специализированный C++ API для инференса моделей 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++ пост-обработку, сопоставь макет выходного тензора с твоей задачей и настройками экспорта; сквозные (end-to-end) экспорты обнаружения YOLO26 обычно возвращают (batch, max_det, 6), в то время как экспорты, не являющиеся сквозными, возвращают необработанные тензоры предсказаний, которые требуют внешней пост-обработки.
Link to this sectionПочему output0 имеет формат FP32 при экспорте квантованных моделей с end2end=True?#
При экспорте с quantize=16 (FP16) или quantize=8 (INT8) большинство тензоров преобразуются в меньшую точность для уменьшения размера модели и повышения производительности. Однако, когда включен end2end=True, постобработка (включая индексы классов) встраивается непосредственно в экспортируемый граф.
Тензор output0 содержит индексы классов, которые внутренне представлены как значения с плавающей запятой. FP16 не может надежно представлять целочисленные значения выше 2048 из-за ограниченной точности мантиссы. Чтобы избежать потенциальной потери точности или неверных ID классов, output0 намеренно сохраняется в FP32.
Это ожидаемое поведение, которое также применяется к экспортам с пониженной точностью или квантованным экспортам, где необходимо сохранить точность индексов классов.
Если требуются полные выходы FP16, экспортируй с end2end=False и выполняй постобработку внешними средствами.