Экспорт моделей с Ultralytics YOLO
Введение
Конечная цель обучения модели — развернуть её для реальных задач. Режим экспорта в Ultralytics YOLO26 предлагает широкий выбор опций для сохранения обученной модели в различных форматах, что позволяет использовать её на разнообразных платформах и устройствах. Это подробное руководство поможет тебе разобраться в нюансах экспорта моделей и покажет, как добиться максимальной совместимости и производительности.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Почему стоит выбрать режим экспорта YOLO26?
- Универсальность: Экспорт в несколько форматов, включая ONNX, TensorRT, CoreML и другие.
- Производительность: Получи ускорение GPU до 5 раз с TensorRT и ускорение CPU до 3 раз с ONNX или OpenVINO.
- Совместимость: Сделай свою модель пригодной для развертывания в любых аппаратных и программных средах.
- Простота использования: Удобные CLI и Python API для быстрого и понятного экспорта моделей.
Ключевые особенности режима экспорта
Вот некоторые из наиболее значимых функций:
- Экспорт в один клик: Простые команды для экспорта в различные форматы.
- Пакетный экспорт: Экспорт моделей, поддерживающих пакетный (batch) инференс.
- Оптимизированный инференс: Экспортированные модели оптимизированы для более быстрого выполнения инференса.
- Учебные видео: Подробные руководства и уроки для максимально комфортного процесса экспорта.
Примеры использования
Экспортируй модель 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) и другие. Каждый формат обеспечивает совместимость с различными средами развертывания. |
imgsz | int или tuple | 640 | Желаемый размер изображения для входа модели. Может быть целым числом для квадратных изображений (например, 640 для 640×640) или кортежем (height, width) для специфических размеров. |
keras | bool | False | Включает экспорт в формат Keras для TensorFlow SavedModel, обеспечивая совместимость с TensorFlow serving и API. |
optimize | bool | False | Применяет оптимизацию для мобильных устройств при экспорте в TorchScript, потенциально уменьшая размер модели и повышая производительность инференса. Несовместимо с форматом NCNN или устройствами CUDA. Для DeepX включает более высокую оптимизацию компилятора, что снижает задержку инференса, но увеличивает время компиляции. |
half | bool | False | Включает квантование FP16 (половинная точность), уменьшая размер модели и потенциально ускоряя инференс на поддерживаемом оборудовании. Несовместимо с квантованием INT8 или экспортом только для CPU. Доступно только для некоторых форматов, например ONNX (см. ниже). |
int8 | bool | False | Активирует квантование INT8, дополнительно сжимая модель и ускоряя инференс с минимальной потерей точности, в первую очередь для периферийных устройств. При использовании с TensorRT выполняет пост-тренировочное квантование (PTQ). |
dynamic | bool | False | Позволяет использовать динамические размеры входных данных для экспорта в TorchScript, ONNX, OpenVINO, TensorRT и CoreML, повышая гибкость при работе с изображениями разного размера. Автоматически устанавливается в True при использовании TensorRT с INT8. |
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 моделей. |
batch | int | 1 | Задает размер пакетного вывода (batch inference) экспортированной модели или максимальное количество изображений, которые модель будет обрабатывать одновременно в режиме 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. |
data | str | 'coco8.yaml' | Путь к файлу конфигурации набора данных, критически важному для калибровки квантования INT8. Если не указано при включенном INT8, coco8.yaml будет использоваться по умолчанию для калибровки. |
fraction | float | 1.0 | Задает долю набора данных для использования при калибровке квантования INT8. Позволяет выполнять калибровку на подмножестве полного набора данных, что полезно для экспериментов или при ограниченных ресурсах. Если не указано при включенном INT8, будет использован полный набор данных. |
end2end | bool | None | Переопределяет режим end-to-end в моделях YOLO, поддерживающих вывод без NMS (YOLO26, YOLOv10). Установка значения False позволяет экспортировать эти модели для совместимости с традиционным конвейером постобработки на основе NMS. Подробности см. в руководстве по End-to-End обнаружению. |
Настройка этих параметров позволяет адаптировать процесс экспорта под конкретные требования, такие как среда развертывания, аппаратные ограничения и целевые показатели производительности. Выбор подходящего формата и настроек необходим для достижения оптимального баланса между размером модели, скоростью и точностью.
Форматы экспорта
Доступные форматы экспорта YOLO26 приведены в таблице ниже. Ты можешь экспортировать в любой формат, используя аргумент format, например format='onnx' или format='engine'. Ты можешь выполнять предсказание или валидацию напрямую на экспортированных моделях, например yolo predict model=yolo26n.onnx. Примеры использования отображаются для твоей модели после завершения экспорта. Модели также можно экспортировать прямо из браузера на Ultralytics Platform без какой-либо локальной настройки.
| Формат | Аргумент format | Модель | Метаданные | Аргументы |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, half, dynamic, optimize, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, half, dynamic, simplify, opset, nms, batch, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, half, dynamic, int8, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, half, int8, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, int8, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, batch, device |
| TF Lite | tflite | yolo26n.tflite | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, int8, data, fraction, device |
| TF.js | tfjs | yolo26n_web_model/ | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, int8, half, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, half, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, int8, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, int8, data, fraction, device |
| DeepX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, int8, data, optimize, device |
Часто задаваемые вопросы (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 — отличный способ сжать модель и ускорить инференс, особенно на граничных устройствах (edge devices). Вот как ты можешь включить квантование INT8:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="engine", int8=True)Квантование INT8 можно применить к различным форматам, таким как TensorRT, OpenVINO и CoreML. Для получения оптимальных результатов квантования предоставь репрезентативный набор данных, используя параметр data.
Почему важен динамический размер входных данных при экспорте моделей?
Динамический размер входных данных позволяет экспортированной модели работать с изображениями разных размеров, обеспечивая гибкость и оптимизируя эффективность обработки для различных сценариев использования. При экспорте в такие форматы, как 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)).half:Включает квантование FP16, уменьшая размер модели и потенциально ускоряя инференс.optimize:Применяет специфические оптимизации для мобильных или ограниченных в ресурсах сред.int8:Включает квантование INT8, что крайне полезно для развертывания edge AI.
Для развертывания на специфических аппаратных платформах рассмотри возможность использования специализированных форматов экспорта, таких как TensorRT для GPU NVIDIA, CoreML для устройств Apple или Edge TPU для устройств Google Coral.
Что представляют собой выходные тензоры в экспортированных моделях YOLO?
Когда ты экспортируешь модель YOLO в форматы типа ONNX или TensorRT, структура выходного тензора зависит от задачи модели. Понимание этих выходных данных важно для реализации кастомного инференса.
Для моделей детектирования (например, yolo26n.pt) выходные данные обычно представляют собой один тензор с формой (batch_size, 4 + num_classes, num_predictions), где каналы представляют координаты ограничивающих рамок (BBox) плюс оценки для каждого класса, а 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 демонстрируют, как обрабатывать эти выходные данные для каждого типа моделей.
Почему output0 имеет формат FP32 при экспорте с параметрами half=True и end2end=True?
При экспорте с half=True (или int8=True) большинство тензоров конвертируются в пониженную точность для уменьшения размера модели и улучшения производительности. Однако, когда включен параметр end2end=True, постпроцессинг (включая индексы классов) встраивается непосредственно в экспортированный граф.
Тензор output0 содержит индексы классов, которые внутренне представлены как числа с плавающей запятой. FP16 не может надежно представлять целые числа выше 2048 из-за ограниченной точности мантиссы. Чтобы избежать потенциальной потери точности или некорректных идентификаторов классов, output0 намеренно сохраняется в формате FP32.
Такое поведение ожидаемо и также применяется к экспорту с пониженной точностью или квантованием, где необходимо сохранить точность индексов классов.
Если требуются полные выходы FP16, выполняй экспорт с end2end=False и проводи постпроцессинг внешними средствами.