YOLO Vision 2026:

Exportación de modelos con Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

Introducción#

El objetivo final de entrenar un modelo es desplegarlo para aplicaciones del mundo real. El modo de exportación en Ultralytics YOLO26 ofrece una gama versátil de opciones para exportar tu modelo entrenado a diferentes formatos, haciéndolo desplegable a través de varias plataformas y dispositivos. Esta guía completa tiene como objetivo explicarte los matices de la exportación de modelos, mostrando cómo lograr la máxima compatibilidad y rendimiento.



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

¿Por qué elegir el modo de exportación de YOLO26?#

  • Versatilidad: Exporta a múltiples formatos, incluidos ONNX, TensorRT, CoreML y más.
  • Rendimiento: Consigue una aceleración de hasta 5x en GPU con TensorRT y de 3x en CPU con ONNX o OpenVINO.
  • Compatibilidad: Haz que tu modelo sea desplegable universalmente a través de numerosos entornos de hardware y software.
  • Facilidad de uso: API de Python y CLI simples para una exportación de modelos rápida y directa.

Características clave del modo de exportación#

Aquí tienes algunas de las funcionalidades destacadas:

  • Exportación con un clic: Comandos simples para exportar a diferentes formatos.
  • Exportación por lotes: Exporta modelos capaces de realizar inferencias por lotes.
  • Inferencia optimizada: Los modelos exportados están optimizados para tiempos de inferencia más rápidos.
  • Vídeos tutoriales: Guías detalladas y tutoriales para una experiencia de exportación fluida.
Consejo
  • Exporta a ONNX o OpenVINO para obtener una aceleración de hasta 3x en CPU.
  • Exporta a TensorRT para obtener una aceleración de hasta 5x en GPU.

Ejemplos de uso#

Exporta un modelo YOLO26n a un formato diferente como ONNX o TensorRT. Consulta la sección de Argumentos a continuación para obtener una lista completa de los argumentos de exportación.

Ejemplo
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")

Argumentos#

Esta tabla detalla las configuraciones y opciones disponibles para exportar modelos YOLO a diferentes formatos. Estos ajustes son fundamentales para optimizar el rendimiento, tamaño y compatibilidad del modelo exportado en varias plataformas y entornos. Una configuración adecuada asegura que el modelo esté listo para el despliegue en la aplicación prevista con una eficiencia óptima.

ArgumentoTipoPredeterminadoDescripción
formatstr'torchscript'Formato de destino para el modelo exportado, como 'onnx', 'torchscript', 'engine' (TensorRT) u otros. Cada formato permite la compatibilidad con diferentes deployment environments.
namestrNoneNombre del objetivo de hardware para los formatos que requieren uno: arquitectura Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; el valor predeterminado es 'hailo8l'), chip Rockchip RKNN (el valor predeterminado es 'rk3588'), SoC Huawei Ascend (un --soc_version de CANN; el valor predeterminado es 'Ascend310B4'), o el objetivo Qualcomm QNN HTP (el valor predeterminado es '73'). Es distinto del par de nombres de ejecución project/name utilizado por otros modos.
imgszint o tuple640Tamaño de imagen deseado para la entrada del modelo. Puede ser un número entero para imágenes cuadradas (por ejemplo, 640 para 640×640) o una tupla (height, width) para dimensiones específicas. Cuando no se pasa, una exportación reutiliza el tamaño de entrenamiento registrado en el punto de control cargado: los puntos de control oficiales de YOLO26 registran 768 para profundidad, 224 para clasificación, 1024 para OBB y 640 para las otras tareas, mientras que un ajuste fino registra el imgsz con el que se entrenó. Un modelo construido a partir de un YAML no tiene tamaño de entrenamiento registrado y utiliza 640.
kerasboolFalseHabilita la exportación al formato Keras para SavedModel de TensorFlow, proporcionando compatibilidad con las API y el servicio de TensorFlow.
optimizeboolFalseHabilita una mayor optimización del compilador para DEEPX, lo que reduce la latencia de inferencia mientras aumenta el tiempo de compilación.
quantizeint o strNonePrecisión de cuantización: 16 (FP16, reduce el tamaño del modelo y puede acelerar la inferencia en hardware compatible) o 8 (INT8/PTQ, comprime aún más el modelo con una pérdida de accuracy mínima, principalmente para edge devices; necesita calibración data/fraction); 32/sin establecer es FP32. Los formatos de exportación que admiten precisión mixta de pesos y activaciones también aceptan la notación 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Sustituye a los indicadores obsoletos half/int8 (half=True16, int8=True8, que todavía se aceptan con una advertencia de obsolescencia). Solo se permiten las precisiones compatibles con el formato de destino (véase más abajo).
dynamicboolFalsePermite tamaños de entrada dinámicos para exportaciones de TorchScript, ONNX, OpenVINO, TensorRT y CoreML, mejorando la flexibilidad en el manejo de dimensiones de imagen variables.
simplifyboolTrueSimplifica el grafo ONNX intermedio con onnxslim para las exportaciones que construyen uno (consulta Export Formats), mejorando potencialmente el rendimiento y la compatibilidad con los motores de inferencia.
opsetintNoneEspecifica la versión del conjunto de operadores (opset) de ONNX para las exportaciones que construyen un grafo ONNX (consulta Export Formats), para garantizar la compatibilidad con diferentes analizadores y tiempos de ejecución de ONNX. Si no se establece, utiliza la última versión compatible.
workspacefloat o NoneNoneEstablece el tamaño máximo del espacio de trabajo en GiB para las optimizaciones de TensorRT, equilibrando el uso de memoria y el rendimiento. Utiliza None para la asignación automática por parte de TensorRT hasta el máximo del dispositivo.
nmsboolFalseAñade Non-Maximum Suppression (NMS) al modelo exportado cuando sea compatible (consulta Export Formats), mejorando la eficiencia del postprocesamiento de detecciones. No disponible para modelos end2end. En el caso de CoreML, solo es compatible con modelos de detección.
conffloatNoneUmbral de confianza utilizado siempre que se genera NMS en el tiempo de exportación: exportaciones de nms=True; exportaciones de detección sin fin a fin de Hailo; y exportaciones de detección, pose y segmentación de IMX, que fuerzan nms=True internamente. Por defecto es 0.25 cuando no se establece, excepto para las exportaciones de IMX, cuyo valor por defecto es 0.001.
ioufloat0.7Umbral de IoU utilizado siempre que se genera NMS en el tiempo de exportación: exportaciones de nms=True; exportaciones de detección sin fin a fin de Hailo; y exportaciones de detección, pose y segmentación de IMX, que fuerzan nms=True internamente.
max_detint300Número máximo de detecciones conservadas en la salida del modelo exportado. Se aplica a las exportaciones de nms=True en todos los formatos excepto CoreML, cuyo pipeline de NMS no tiene límite de detecciones, además de las exportaciones de detección fin a fin sin NMS (YOLO26, YOLOv10, limitadas al número de anclajes disponibles) y las exportaciones de detección, pose y segmentación de IMX.
agnostic_nmsboolFalseHabilita NMS agnóstica de clases donde la NMS en el momento de la exportación se genera a través de la canalización estándar de nms=True, incluida la propia etapa de NMS de CoreML, suprimiendo cajas superpuestas con puntuaciones más bajas entre diferentes clases en lugar de solo dentro de la misma clase. No es compatible con las configuraciones de NMS generadas por Hailo o IMX, las cuales no tienen una opción agnóstica de clases y siguen siendo sensibles a las clases independientemente de este indicador. También está integrado en las exportaciones de extremo a extremo sin NMS (YOLO26, YOLOv10), donde solo evita que la misma detección aparezca bajo múltiples etiquetas de clase (duplicados con IoU=1.0), y no la supresión por umbral de IoU entre cajas distintas.
batchint1Especifica el tamaño de la inferencia por lotes del modelo de exportación o el número máximo de imágenes que el modelo exportado procesará simultáneamente en el modo predict. Para las exportaciones a Edge TPU, esto se establece automáticamente en 1.
devicestrNoneEspecifica el dispositivo para la exportación: GPU (device=0), CPU (device=cpu), MPS para silicio de Apple (device=mps), NPU Ascend de Huawei (device=npu o device=npu:0), o DLA para NVIDIA Jetson (device=dla:0 o device=dla:1). Las exportaciones de TensorRT utilizan automáticamente la GPU, pero TensorRT 11.0 no es compatible con DLA.
verboseboolFalseEleva el registro del constructor de TensorRT a la gravedad VERBOSE durante la exportación de format='engine'. Otros formatos de exportación lo ignoran.
datastrNoneRuta al YAML del dataset, esencial para la calibración de cuantización INT8; la clasificación en su lugar toma un directorio de dataset o un nombre de dataset integrado. Si no se especifica con INT8 habilitado, Ultralytics selecciona un dataset de calibración específico de la tarea cuando es necesario, o recurre al dataset predeterminado para la tarea del modelo.
splitstr'val'División del dataset ('train', 'val' o 'test') utilizada para construir el cargador de datos de calibración de cuantización INT8 a partir de data.
fractionfloat, int o list1.0Subconjunto de dataset utilizado para la calibración INT8: una proporción, un recuento de imágenes o [train, val] proporciones/recuentos. El entero 1 selecciona una imagen, mientras que el flotante 1.0 selecciona todas las imágenes. Una lista limita train o val; test permanece completo.
end2endboolNoneAnula el modo de extremo a extremo (end-to-end) en los modelos YOLO que admiten inferencia sin NMS (YOLO26, YOLOv10). Configurarlo en False te permite exportar estos modelos para que sean compatibles con la canalización de postprocesamiento tradicional basada en NMS. Consulta la End-to-End Detection guide para obtener más detalles.

Ajustar estos parámetros permite personalizar el proceso de exportación para adaptarlo a requisitos específicos, como el entorno de despliegue, las limitaciones de hardware y los objetivos de rendimiento. Seleccionar el formato y los ajustes adecuados es fundamental para lograr el mejor equilibrio entre el tamaño del modelo, la velocidad y la precisión.

Formatos de exportación#

Los formatos de exportación de YOLO26 disponibles se encuentran en la tabla siguiente. Puedes exportar a cualquier formato usando el argumento format, es decir, format='onnx' o format='engine'. Puedes predecir o validar directamente en modelos exportados, es decir, yolo predict model=yolo26n.onnx. Se muestran ejemplos de uso para tu modelo una vez finalizada la exportación. Los modelos también se pueden exportar directamente desde el navegador en Ultralytics Platform sin necesidad de configuración local.

FormatoArgumento de formatModeloMetadatosArgumentos
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
Apple Core AIcoreaiyolo26n.aimodelimgsz, batch, quantize

Opciones de cuantización#

Usa el argumento quantize para solicitar la precisión de exportación. Los valores de cadena no distinguen entre mayúsculas y minúsculas, y Ultralytics normaliza los alias aceptados antes de la exportación:

Valores de solicitudValor normalizadoSignificado
8, "8", "int8", "w8a8"8Pesos y activaciones INT8
16, "16", "fp16", "w16a16"16Pesos y activaciones FP16
32, "32", "fp32", "w32a32"32Exportación FP32; igual que sin definir, excepto para ML Programs de NMS en CoreML, que utilizan FP16 de forma predeterminada
"w8a16""w8a16"Pesos INT8 con activaciones de 16 bits (FP16; INT16 en LiteRT)
"w8a32""w8a32"Pesos INT8 con activaciones FP32 (INT8 dinámico de LiteRT, no requiere calibración)

Los flags obsoletos half=True y int8=True todavía se aceptan con advertencias de obsolescencia y se reenvían a quantize=16 y quantize=8.

No todos los formatos de exportación admiten todas las precisiones. Las solicitudes explícitas de quantize generan dicha precisión o fallan antes de la exportación:

FormatoFP32 (32/no establecido)FP16 (16)INT8 (8)W8A16 ("w8a16")Notas
PyTorchN/AN/AN/AFormato nativo de entrenamiento/punto de control.
TorchScript✅ Solo GPULa exportación a TorchScript en FP16 requiere device=0; la exportación a CPU es en FP32.
ONNXINT8 utiliza cuantización estática y datos de calibración de ONNX Runtime.
OpenVINOINT8 utiliza cuantización post-entrenamiento de NNCF.
TensorRTINT8 necesita datos de calibración representativos.
CoreML✅¹CoreML INT8 es cuantización de pesos; W8A16 utiliza pesos INT8 con activaciones FP16. ¹Los ML Programs de NMS sin definir utilizan FP16 de forma predeterminada.
TF SavedModelLa exportación INT8 utiliza la calibración de TensorFlow.
TF GraphDefSin conversión de precisión durante la exportación.
Edge TPU✅ automáticoEdge TPU requiere INT8; se habilita automáticamente cuando no está definido.
PaddlePaddleSin conversión de precisión durante la exportación.
MNNINT8 es cuantización de pesos mediante la conversión a MNN.
NCNNFormato de ejecución para móviles/integrados.
IMX500✅ automáticoIMX500 requiere cuantización; INT8 se habilita automáticamente cuando no está definido.
RKNN✅ depende del chipRK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B admiten FP16 o INT8; las variantes RV1103/RV1106 son solo INT8.
ExecuTorchSin conversión de precisión durante la exportación.
Axelera✅ automáticoLa exportación a Axelera requiere INT8; se habilita automáticamente cuando no está definido.
DEEPX✅ automáticoLa exportación a DEEPX requiere INT8; se habilita automáticamente cuando no está definido.
Qualcomm QNN✅ automáticoLa exportación QNN HTP está fijada a pesos INT8 con activaciones de 16 bits.
LiteRTEl INT8 estático (8) y "w8a16" (pesos int8 + activaciones int16) usan datos de calibración; también admite "w8a32" INT8 dinámico (sin calibración). quantize=16 no es una exportación separada; un modelo en FP32 se ejecuta en FP16 en tiempo de ejecución a través del delegado de GPU.
Huawei Ascend✅ automáticoLas convoluciones del núcleo de Ascend AI aceptan solo entradas FP16/INT8, por lo que ATC compila en FP16; se activa automáticamente si no se define.

Para las exportaciones INT8 y W8A16, proporciona datos de calibración representativos con data, como data="coco8.yaml", a menos que la integración de destino documente un comportamiento predeterminado o activado automáticamente. El esquema LiteRT "w8a32" (INT8 dinámico) no necesita datos de calibración.

Qué sigue#

Encuentra la guía de integración de tu destino de despliegue —ONNX, TensorRT, CoreML y más están en la lista completa de integraciones— para saber cómo ejecutar el modelo exportado.

FAQ#

  • Exportar un modelo YOLO26 a formato ONNX es directo con Ultralytics. Proporciona métodos tanto de Python como de CLI para exportar modelos.

    Ejemplo
    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")

    Para obtener más detalles sobre el proceso, incluidas opciones avanzadas como el manejo de diferentes tamaños de entrada, consulta la guía de integración de ONNX.

  • Usar TensorRT para la exportación de modelos ofrece mejoras de rendimiento significativas. Los modelos YOLO26 exportados a TensorRT pueden lograr hasta una aceleración de 5 veces en GPU, lo que lo hace ideal para aplicaciones de inferencia en tiempo real.

    • Versatilidad: Optimiza modelos para una configuración de hardware específica.
    • Velocidad: Logra una inferencia más rápida a través de optimizaciones avanzadas.
    • Compatibilidad: Integra sin problemas con hardware NVIDIA.

    Para obtener más información sobre la integración de TensorRT, consulta la guía de integración de TensorRT.

  • La cuantización INT8 es una excelente manera de comprimir el modelo y acelerar la inferencia, especialmente en dispositivos de borde. Aquí tienes cómo puedes habilitar la cuantización INT8:

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

    La cuantización INT8 se puede aplicar a formatos como ONNX, TensorRT, OpenVINO, CoreML y Rockchip RKNN. Para obtener resultados óptimos de cuantización, proporciona un conjunto de datos representativo utilizando el parámetro data. Consulta Opciones de cuantización para ver los valores aceptados de quantize y los formatos compatibles.

  • El tamaño de entrada dinámico permite que el modelo exportado gestione dimensiones de imagen variables, lo que proporciona flexibilidad y optimiza la eficiencia de procesamiento para diferentes casos de uso. Al exportar a formatos como ONNX o TensorRT, habilitar el tamaño de entrada dinámico garantiza que el modelo pueda adaptarse a diferentes formas de entrada sin problemas.

    Para habilitar esta característica, usa el flag dynamic=True durante la exportación:

    Ejemplo
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="onnx", dynamic=True)

    El dimensionamiento de entrada dinámico es particularmente útil para aplicaciones donde las dimensiones de entrada pueden variar, como en el procesamiento de vídeo o cuando se manejan imágenes de diferentes fuentes.

  • Entender y configurar los argumentos de exportación es crucial para optimizar el rendimiento del modelo:

    • format: El formato de destino para el modelo exportado (por ejemplo, onnx, torchscript, tensorflow).
    • imgsz: Tamaño de imagen deseado para la entrada del modelo (por ejemplo, 640 o (height, width)).
    • quantize: Precisión de cuantización, como 8/"int8", 16/"fp16", 32/"fp32", o los esquemas mixtos de peso/activación "w8a16" y "w8a32" (LiteRT INT8 dinámico) en formatos compatibles. Consulta Opciones de cuantización.
    • optimize: Habilita una mayor optimización del compilador para las exportaciones DEEPX.

    Para el despliegue en plataformas de hardware específicas, considera el uso de formatos de exportación especializados como TensorRT para GPUs NVIDIA, CoreML para dispositivos Apple, o Edge TPU para dispositivos Google Coral.

  • Cuando exportas un modelo YOLO a formatos como ONNX o TensorRT, la estructura del tensor de salida depende de la tarea del modelo. Entender estas salidas es importante para implementaciones de inferencia personalizadas.

    Para modelos de detección YOLO26 (por ejemplo, yolo26n.pt), la exportación de extremo a extremo está habilitada por defecto en los formatos que la admiten, por lo que la salida tiene una forma similar a (batch_size, max_detections, 6) con valores [x1, y1, x2, y2, confidence, class_id]. Con el valor predeterminado max_det=300, esto suele ser (batch_size, 300, 6). Algunos formatos restringidos vuelven automáticamente al diseño de salida tradicional cuando los operadores de extremo a extremo no son compatibles.

    Para los modelos de detección que no son de extremo a extremo, o para los modelos YOLO26 exportados con end2end=False, la salida suele ser un único tensor con una forma similar a (batch_size, 4 + num_classes, num_predictions) en el que los canales representan las coordenadas de las cajas más las puntuaciones por clase, y num_predictions depende de la resolución de entrada de la exportación (y puede ser dinámico).

    Para los modelos de segmentación (por ejemplo, yolo26n-seg.pt), normalmente obtendrás dos salidas: el primer tensor con una forma similar a (batch_size, 4 + num_classes + mask_dim, num_predictions) (cajas, puntuaciones de clase y coeficientes de máscara) y el segundo tensor con una forma similar a (batch_size, mask_dim, proto_h, proto_w) que contiene prototipos de máscara utilizados con los coeficientes para generar máscaras de instancia. Los tamaños dependen de la resolución de entrada de la exportación (y pueden ser dinámicos).

    Para los modelos de pose (por ejemplo, yolo26n-pose.pt), el tensor de salida suele tener una forma similar a (batch_size, 4 + num_classes + keypoint_dims, num_predictions), donde keypoint_dims depende de la especificación de pose (por ejemplo, el número de puntos clave y si se incluye la confianza), y num_predictions depende de la resolución de entrada de la exportación (y puede ser dinámico).

    Los ejemplos de los ejemplos de inferencia de ONNX demuestran cómo procesar estas salidas para cada tipo de modelo.

  • Ultralytics no proporciona actualmente una API de inferencia en C++ dedicada para los modelos YOLO. Para despliegues en C++, exporta el modelo a un formato de tiempo de ejecución como ONNX, TensorRT, TorchScript o MNN, y luego carga el artefacto exportado con la API nativa de C++ de ese tiempo de ejecución.

    Por ejemplo, exporta un modelo de detección con yolo export model=yolo26n.pt format=onnx y ejecuta el archivo .onnx con ONNX Runtime C++, o exporta con format=engine y ejecuta el motor de TensorRT desde una aplicación de TensorRT en C++. Cuando utilices un postprocesamiento en C++ personalizado, haz que coincida con el diseño del tensor de salida para tu tarea y tus ajustes de exportación; las exportaciones de detección de extremo a extremo de YOLO26 suelen devolver (batch, max_det, 6), mientras que las exportaciones que no son de extremo a extremo devuelven tensores de predicción brutos que requieren un postprocesamiento externo.

  • Al exportar con quantize=16 (FP16) o quantize=8 (INT8), la mayoría de los tensores se convierten a una precisión menor para reducir el tamaño del modelo y mejorar el rendimiento. Sin embargo, cuando end2end=True está habilitado, el postprocesamiento (incluidos los índices de clase) se incrusta directamente en el grafo exportado.

    El tensor output0 contiene índices de clase, que se representan internamente como valores de coma flotante. FP16 no puede representar de forma fiable valores enteros superiores a 2048 debido a su limitada precisión de mantisa. Para evitar una posible pérdida de precisión o ID de clase incorrectos, output0 se mantiene intencionadamente en FP32.

    Este comportamiento es esperado y también se aplica a exportaciones de menor precisión o cuantizadas donde la fidelidad del índice de clase debe preservarse.

    Si se requieren salidas completas en FP16, exporta con end2end=False y realiza el postprocesamiento externamente.

Comentarios