Link to this sectionExportación de modelos con Ultralytics YOLO#
Link to this sectionIntroducció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 🚀
Link to this section¿Por qué elegir el modo de exportación de YOLO26?#
- Versatilidad: Exporta a múltiples formatos, incluidos ONNX, TensorRT, CoreML y más.
- Rendimiento: Obtén hasta 5 veces más velocidad en GPU con TensorRT y 3 veces más velocidad 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.
Link to this sectionCaracterí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.
Link to this sectionEjemplos 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.
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 sectionArgumentos#
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.
| Argumento | Tipo | Predeterminado | Descripción |
|---|---|---|---|
format | str | 'torchscript' | Formato de destino para el modelo exportado, como 'onnx', 'torchscript', 'engine' (TensorRT), u otros. Cada formato permite la compatibilidad con diferentes entornos de despliegue. |
imgsz | int o tuple | 640 | Tamaño de imagen deseado para la entrada del modelo. Puede ser un número entero para imágenes cuadradas (p. ej., 640 para 640×640) o una tupla (height, width) para dimensiones específicas. |
keras | bool | False | Habilita la exportación al formato Keras para TensorFlow SavedModel, proporcionando compatibilidad con el servicio y las API de TensorFlow. |
optimize | bool | False | Aplica la optimización para dispositivos móviles al exportar a TorchScript, reduciendo potencialmente el tamaño del modelo y mejorando el rendimiento de la inferencia. No es compatible con el formato NCNN ni con dispositivos CUDA. Para DEEPX, habilita una optimización del compilador superior que reduce la latencia de inferencia y aumenta el tiempo de compilación. |
half | bool | False | Habilita la cuantización FP16 (precisión media), reduciendo el tamaño del modelo y acelerando potencialmente la inferencia en hardware compatible. No es compatible con la cuantización INT8 o exportaciones solo de CPU. Solo disponible para ciertos formatos, p. ej. ONNX (ver más abajo). |
int8 | bool | False | Activa la cuantización INT8, lo que comprime aún más el modelo y acelera la inferencia con una pérdida mínima de precisión, principalmente para dispositivos de borde. TensorRT 11+ utiliza la cuantización explícita Q/DQ de ModelOpt; TensorRT 7-10 utiliza PTQ con un calibrador. |
dynamic | bool | False | Permite 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. |
simplify | bool | True | Simplifica el grafo del modelo para exportaciones ONNX con onnxslim, lo que potencialmente mejora el rendimiento y la compatibilidad con motores de inferencia. |
opset | int | None | Especifica la versión del opset de ONNX para la compatibilidad con diferentes analizadores y motores de ejecución de ONNX. Si no se establece, utiliza la última versión compatible. |
workspace | float o None | None | Establece el tamaño máximo del espacio de trabajo en GiB para las optimizaciones de TensorRT, equilibrando el uso de memoria y el rendimiento. Usa None para la asignación automática por parte de TensorRT hasta el máximo del dispositivo. |
nms | bool | False | Añade la Non-Maximum Suppression (NMS) al modelo exportado cuando sea compatible (consulta Formatos de exportación), mejorando la eficiencia del post-procesamiento de detección. No está disponible para modelos de extremo a extremo (end2end). |
batch | int | 1 | Especifica el tamaño de 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 modo predict. Para las exportaciones de Edge TPU, esto se establece automáticamente en 1. |
device | str | None | Especifica el dispositivo para la exportación: GPU (device=0), CPU (device=cpu), MPS para Apple silicon (device=mps), NPU Huawei Ascend (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. |
data | str | None | Ruta al archivo de configuración del dataset, esencial para la calibración de cuantización INT8. Si no se especifica con INT8 habilitado, Ultralytics selecciona un dataset de calibración específico para la tarea cuando es necesario, o recurre al dataset predeterminado para la tarea del modelo. |
fraction | float | 1.0 | Especifica la fracción del conjunto de datos a utilizar para la calibración de cuantización INT8. Permite calibrar en un subconjunto del conjunto de datos completo, útil para experimentos o cuando los recursos son limitados. Si no se especifica con INT8 habilitado, se utilizará el conjunto de datos completo. |
end2end | bool | None | Anula el modo de extremo a extremo en modelos YOLO que admiten inferencia sin NMS (YOLO26, YOLOv10). Establecerlo en False te permite exportar estos modelos para que sean compatibles con la canalización tradicional de post-procesamiento basada en NMS. Consulta la Guía de detección de extremo a extremo para obtener detalles. |
Ajustar estos parámetros permite personalizar el proceso de exportación para adaptarse a requisitos específicos, como el entorno de despliegue, las restricciones de hardware y los objetivos de rendimiento. Seleccionar el formato y los ajustes adecuados es esencial para lograr el mejor equilibrio entre el tamaño del modelo, la velocidad y la precisión.
Link to this sectionFormatos de exportación#
Los formatos de exportación de YOLO26 disponibles se encuentran en la tabla a continuación. Puedes exportar a cualquier formato usando el argumento format, es decir, format='onnx' o format='engine'. Puedes realizar predicciones o validaciones 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.
| Formato | Argumento format | Modelo | Metadatos | Argumentos |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, half, dynamic, optimize, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, half, int8, dynamic, simplify, opset, nms, batch, data, fraction, 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, half, int8, data, fraction, 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 |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, int8, data, fraction, device |
Link to this sectionFAQ#
Link to this section¿Cómo exporto un modelo YOLO26 a formato ONNX?#
Exportar un modelo YOLO26 a formato ONNX es directo con Ultralytics. Proporciona métodos tanto de Python como de CLI para exportar modelos.
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 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.
Link to this section¿Cuáles son los beneficios de usar TensorRT para la exportación de modelos?#
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 aprender más sobre la integración de TensorRT, consulta la guía de integración de TensorRT.
Link to this section¿Cómo habilito la cuantización INT8 al exportar mi modelo YOLO26?#
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:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="onnx", int8=True, data="coco8.yaml")La cuantización INT8 se puede aplicar a varios formatos, como ONNX, TensorRT, OpenVINO, CoreML y Rockchip RKNN. Para obtener resultados de cuantización óptimos, proporciona un dataset representativo utilizando el parámetro data.
Link to this section¿Por qué es importante el tamaño de entrada dinámico al exportar modelos?#
El tamaño de entrada dinámico permite que el modelo exportado maneje dimensiones de imagen variables, proporcionando flexibilidad y optimizando la eficiencia del procesamiento para diferentes casos de uso. Al exportar a formatos como ONNX o TensorRT, habilitar el tamaño de entrada dinámico asegura que el modelo pueda adaptarse a diferentes formas de entrada sin problemas.
Para habilitar esta función, utiliza el flag dynamic=True durante la exportación:
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.
Link to this section¿Cuáles son los argumentos de exportación clave a considerar para optimizar el rendimiento del modelo?#
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,640o(height, width)).half:Habilita la cuantización FP16, reduciendo el tamaño del modelo y acelerando potencialmente la inferencia.optimize:Aplica optimizaciones específicas para dispositivos móviles o entornos restringidos.int8:Habilita la cuantización INT8, altamente beneficiosa para despliegues de IA en el borde.
Para el despliegue en plataformas de hardware específicas, considera usar formatos de exportación especializados como TensorRT para GPUs NVIDIA, CoreML para dispositivos Apple, o Edge TPU para dispositivos Google Coral.
Link to this section¿Qué representan los tensores de salida en los modelos YOLO exportados?#
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 los modelos de detección YOLO26 (p. ej., yolo26n.pt), la exportación de extremo a extremo está habilitada de forma predeterminada en los formatos que la admiten, por lo que la salida tiene la forma (batch_size, max_detections, 6) con valores de [x1, y1, x2, y2, confidence, class_id]. Con el valor predeterminado max_det=300, esto suele ser (batch_size, 300, 6). Algunos formatos restringidos recurren automáticamente al diseño de salida tradicional cuando los operadores de extremo a extremo no son compatibles.
Para modelos de detección que no son de extremo a extremo, o para modelos YOLO26 exportados con end2end=False, la salida es normalmente un único tensor con forma (batch_size, 4 + num_classes, num_predictions) donde los canales representan las coordenadas de la caja 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 modelos de segmentación (por ejemplo, yolo26n-seg.pt), normalmente obtendrás dos salidas: el primer tensor con forma (batch_size, 4 + num_classes + mask_dim, num_predictions) (cajas, puntuaciones de clase y coeficientes de máscara), y el segundo tensor con forma (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 exportación (y pueden ser dinámicos).
Para modelos de pose (por ejemplo, yolo26n-pose.pt), el tensor de salida suele tener forma (batch_size, 4 + num_classes + keypoint_dims, num_predictions), donde keypoint_dims depende de la especificación de la pose (por ejemplo, número de puntos clave y si se incluye la confianza), y num_predictions depende de la resolución de entrada de exportación (y puede ser dinámico).
Los ejemplos en los ejemplos de inferencia ONNX demuestran cómo procesar estas salidas para cada tipo de modelo.
Link to this section¿Por qué output0 es FP32 al exportar con half=True y end2end=True?#
Al exportar con half=True (o int8=True), 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 se habilita end2end=True, el post-procesamiento (incluidos los índices de clase) se integra directamente en el grafo exportado.
El tensor output0 contiene índices de clase, que se representan internamente como valores de punto 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 IDs 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 FP16 completas, exporta con end2end=False y realiza el post-procesamiento externamente.