Ultralytics YOLO27:
Get Started

Exportación de modelos con Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

Introducción#

El objetivo final de entrenar un modelo es implementarlo en aplicaciones del mundo real. El modo de exportación de Ultralytics YOLO26 ofrece una amplia variedad de opciones para exportar el modelo entrenado a distintos formatos y permitir su implementación en diversas plataformas y dispositivos. Esta guía completa te ayudará a entender los detalles de la exportación de modelos y te mostrará cómo lograr la máxima compatibilidad y rendimiento.

Consulta la vista previa de YOLO27, aún no publicada para conocer la compatibilidad de exportación prevista.



Ver: Cómo exportar Ultralytics YOLO26 a distintos formatos para su implementación | ONNX, TensorRT, CoreML 🚀

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

  • Versatilidad: Exporta a varios formatos, como ONNX, TensorRT, CoreML, entre otros.
  • Rendimiento: Obtén hasta 5 veces más velocidad en la GPU con TensorRT y 3 veces más velocidad en la CPU con ONNX o OpenVINO.
  • Compatibilidad: Permite implementar tu modelo en numerosos entornos de hardware y software.
  • Facilidad de uso: CLI y API de Python sencillas para exportar modelos de forma rápida y directa.

Ejemplos de uso#

Exporta un modelo YOLO26n a otro formato, como ONNX o TensorRT. Consulta la sección Argumentos que aparece a continuación para ver la lista completa de argumentos de exportación.

Ejemplo
from ultralytics import YOLO

# Cargar un modelo
model = YOLO("yolo26n.pt")  # carga un modelo oficial
model = YOLO("path/to/best.pt")  # carga un modelo entrenado a medida

# Exporta el modelo
model.export(format="onnx")

Argumentos#

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

ArgumentoTipoPredeterminadoDescripción
formatstr'torchscript'Formato de destino del modelo exportado, como 'onnx', 'torchscript', 'engine' (TensorRT) u otros. Cada formato permite la compatibilidad con distintos entornos de implementación.
namestrNoneNombre del hardware de destino para los formatos que lo requieren: arquitectura Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; de forma predeterminada, 'hailo8l'), chip Rockchip RKNN (de forma predeterminada, 'rk3588'), SoC Huawei Ascend (un --soc_version de CANN; de forma predeterminada, 'Ascend310B4'), destino Qualcomm QNN HTP (de forma predeterminada, '73') o dispositivo AMD Xilinx Versal AI Edge Series Gen 2 (de forma predeterminada, 've2-xc2ve3858', el kit de evaluación VEK385). Es distinto del par project/name de nomenclatura de ejecuciones que usan otros modos.
imgszint o tuple640Tamaño de imagen deseado para la entrada del modelo. Puede ser un entero para imágenes cuadradas (p. ej., 640 para 640×640) o una tupla (height, width) para dimensiones concretas. Si no se especifica, la 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 depth, 224 para classify, 1024 para OBB y 640 para las demás tareas; un ajuste fino registra el valor imgsz con el que se entrenó. Un modelo creado a partir de un YAML no tiene un tamaño de entrenamiento registrado y usa 640.
optimizeboolFalseActiva una optimización superior del compilador para DEEPX, lo que reduce la latencia de inferencia y 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 mínima de precisión, principalmente para dispositivos periféricos; requiere calibración data/fraction); 32/sin especificar equivale a FP32. Un checkpoint entrenado con quantize=8 siempre se exporta en INT8: onnx y engine se exportan a partir de los rangos que incorporan, sin calibración, y se rechazan otros formatos o precisiones. 'w8a8' y 'w16a16' son alias de 8 y 16; las precisiones mixtas 'w8a16' (pesos INT8 con activaciones de 16 bits: CoreML, LiteRT, QNN) y 'w8a32' (INT8 dinámico: LiteRT) solo se admiten en esos formatos. Sustituye las opciones obsoletas half/int8 (half=True → 16, int8=True → 8; las opciones antiguas aún se aceptan con un aviso de obsolescencia). Solo se permiten las precisiones compatibles con el formato de destino (consulta más abajo).
dynamicboolFalsePermite tamaños de entrada dinámicos en las exportaciones TorchScript, ONNX, OpenVINO, TensorRT, CoreML y MNN, lo que aporta flexibilidad para gestionar distintas dimensiones de imagen.
simplifyboolTrueSimplifica el grafo ONNX intermedio con onnxslim para las exportaciones que lo generan (consulta Formatos de exportación), lo que puede mejorar el rendimiento y la compatibilidad con motores de inferencia.
opsetintNoneEspecifica la versión de opset de ONNX para las exportaciones que generan un grafo ONNX (consulta Formatos de exportación), a fin de garantizar la compatibilidad con distintos analizadores y entornos de ejecución ONNX. Si no se establece, se usa 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. Usa None para que TensorRT lo asigne automáticamente hasta el máximo del dispositivo.
nmsbool, opcionalNoneNone exporta predicciones sin procesar de uno a varios para aplicar NMS externamente; True incorpora NMS cuando es compatible; False selecciona el cabezal sin NMS cuando está disponible. La NMS integrada de CoreML admite detect, segment y pose con formas estáticas. Consulta la guía de detección de extremo a extremo.
conffloatNoneUmbral de confianza que se usa siempre que se genera NMS durante la exportación: exportaciones nms=True; exportaciones detect de Hailo que no son de extremo a extremo; y exportaciones detect, pose y segment de IMX, que fuerzan internamente nms=True. Si no se establece, el valor predeterminado es 0.25.
ioufloat0.7Umbral de IoU que se usa siempre que se genera NMS durante la exportación: exportaciones nms=True; exportaciones detect de Hailo que no son de extremo a extremo; y exportaciones detect, pose y segment de IMX, que fuerzan internamente nms=True.
max_detint300Número máximo de detecciones que se conservan en la salida del modelo exportado. Se aplica a las exportaciones nms=True en todos los formatos, excepto a la detección de CoreML, cuya canalización de NMS nativa no limita el número de detecciones; también se aplica a las exportaciones de detección de extremo a extremo sin NMS (YOLO26, YOLOv10, limitado al número de anclas disponibles) y a las exportaciones detect, pose y segment de IMX.
agnostic_nmsboolFalseActiva NMS independiente de la clase siempre que la NMS de exportación se genere mediante la canalización estándar nms=True, incluida la fase de NMS propia de CoreML. Suprime los cuadros solapados con puntuaciones más bajas entre clases distintas, en lugar de hacerlo solo dentro de la misma clase. No se aplica a las configuraciones de NMS generadas por Hailo o IMX, que no tienen una opción independiente de la clase y siguen teniendo en cuenta la clase, independientemente de esta marca. También se incorpora en las exportaciones de extremo a extremo sin NMS (YOLO26, YOLOv10), donde solo impide que la misma detección aparezca con varias etiquetas de clase (duplicados con IoU=1.0), pero no suprime cuadros distintos según el umbral de IoU.
batchint1Especifica el tamaño del lote de inferencia del modelo exportado o el número máximo de imágenes que el modelo exportado procesará simultáneamente en modo predict. Los formatos cuyos argumentos de exportación no incluyen batch (Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx) exportan con un lote de 1 y rechazan otros valores.
devicestrNoneEspecifica 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 TensorRT usan automáticamente la GPU, pero TensorRT 11.0 no es compatible con DLA.
verboseboolFalseAumenta a VERBOSE la gravedad del registro del generador de TensorRT durante la exportación format='engine'. Los demás formatos de exportación ignoran esta opción.
datastrNoneRuta al YAML del conjunto de datos, imprescindible para la calibración de la cuantización INT8; para la clasificación, en cambio, se usa un directorio de conjunto de datos o el nombre de un conjunto de datos integrado. Si no se especifica y se activa INT8, Ultralytics selecciona un conjunto de datos de calibración específico para la tarea cuando es necesario o recurre al conjunto de datos predeterminado de la tarea del modelo. Un punto de control entrenado con quantize=8 incluye sus propios rangos INT8 y no necesita datos de calibración.
splitstr'val'Partición del conjunto de datos ('train', 'val' o 'test') que se usa para crear el cargador de datos de calibración de cuantización INT8 a partir de data.
fractionfloat, int o list1.0Subconjunto del conjunto de datos utilizado para la calibración INT8: una proporción, un número de imágenes o valores [train, val, test]. 1 indica la partición completa; los enteros superiores a 1 indican el número de imágenes; solo la entrada de prueba opcional acepta 0/0.0 para indicar que no se use ninguna. Las listas de dos elementos dejan test completo.

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

Formatos de exportación#

Los formatos de exportación disponibles para YOLO26 se muestran en la tabla siguiente. Puedes exportar a cualquier formato con el argumento format, por ejemplo, format='onnx' o format='engine'. Puedes realizar predicciones o validaciones directamente en los modelos exportados, por ejemplo, yolo predict model=yolo26n.onnx. Cuando termine la exportación, se mostrarán ejemplos de uso para tu modelo. También puedes exportar modelos directamente desde el navegador en Ultralytics Platform sin configurar nada localmente.

FormatoArgumento formatModeloMetadatosArgumentos
PyTorch-yolo26n.pt✅-
TorchScripttorchscriptyolo26n.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n.mnn✅imgsz, 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.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

nms=None usa de forma predeterminada salidas sin procesar para NMS externa. Establece nms=False para seleccionar una cabeza sin NMS disponible; los formatos no compatibles recurren a su ruta de salida nativa. Las entradas nms anteriores identifican los formatos que pueden integrar NMS con nms=True.

Instalación automática de las dependencias de exportación

La mayoría de los formatos requieren paquetes que no se instalan con ultralytics. Si falta alguno, la exportación lo instala durante la ejecución con uv o pip, y en Linux con apt para paquetes del sistema, como Java para IMX. El compilador Edge TPU se descarga sin apt ni sudo. Para mantener el entorno sin cambios, por ejemplo, en una imagen de contenedor, un trabajo de CI o un servicio de producción, establece YOLO_AUTOINSTALL=False. La exportación seguirá comprobando si faltan paquetes e informará de ello, pero no modificará el entorno y fallará hasta que los instales.

export YOLO_AUTOINSTALL=False

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 solicitadosValor 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 si no se especifica, excepto en los programas ML de NMS de CoreML, que usan 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, sin necesidad de calibración)

Las marcas obsoletas half=True y int8=True todavía se aceptan con advertencias de obsolescencia y redirigen a quantize=16 y quantize=8.

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

FormatoFP32 (32/sin especificar)FP16 (16)INT8 (8)W8A16 ("w8a16")Notas
PyTorch✅N/DN/DN/DFormato nativo de entrenamiento y puntos de control.
TorchScript✅✅ Solo GPU❌❌La exportación TorchScript en FP16 requiere device=0; la exportación en CPU es FP32.
ONNX✅✅✅❌INT8 usa la cuantización estática de ONNX Runtime y datos de calibración.
OpenVINO✅✅✅❌INT8 usa la cuantización posterior al entrenamiento de NNCF.
TensorRT✅✅✅❌INT8 necesita datos de calibración representativos.
CoreML✅¹✅✅✅INT8 de CoreML es cuantización de pesos; W8A16 usa pesos INT8 con activaciones FP16. ¹ Si no se especifica, los programas ML de NMS usan FP16 de forma predeterminada y las exportaciones nms=True de segmentación/pose siempre son FP16.
Core AI✅✅❌❌FP32 de forma predeterminada o un recurso FP16 .aimodel con quantize=16; no hay una opción INT8.
TF SavedModel✅❌✅❌La exportación INT8 usa la calibración de TensorFlow.
TF GraphDef✅❌❌❌No se convierte la precisión durante la exportación.
Edge TPU❌❌✅ automático❌Edge TPU requiere INT8; se activa automáticamente si no se especifica.
LiteRT✅❌✅✅INT8 estático (8) y "w8a16" (pesos int8 + activaciones int16) usan datos de calibración; también admite INT8 dinámico "w8a32" (sin calibración). quantize=16 no es una exportación independiente; un modelo FP32 se ejecuta en FP16 durante la ejecución mediante el delegado de GPU.
PaddlePaddle✅❌❌❌No se convierte la precisión durante la exportación.
MNN✅✅✅❌INT8 es cuantización de pesos mediante la conversión de MNN.
NCNN✅✅❌❌Formato de ejecución para móviles y sistemas integrados.
IMX500❌❌✅ automático❌IMX500 requiere cuantización; INT8 se activa automáticamente si no se especifica.
RKNN❌✅ depende del chip✅❌RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B admiten FP16 o INT8; las variantes RV1103/RV1106 solo admiten INT8.
ExecuTorch✅❌❌❌No se convierte la precisión durante la exportación.
Axelera❌❌✅ automático❌La exportación de Axelera requiere INT8; se activa automáticamente si no se especifica.
DEEPX❌❌✅ automático❌La exportación de DEEPX requiere INT8; se activa automáticamente si no se especifica.
Qualcomm QNN❌❌❌✅ automáticoLa exportación QNN HTP usa siempre pesos INT8 con activaciones de 16 bits.
Hailo❌❌✅ automático❌La exportación de Hailo requiere INT8; se activa automáticamente si no se especifica.
Huawei Ascend❌✅ automático❌❌Las convoluciones de Ascend AI Core solo aceptan entradas FP16/INT8, por lo que ATC compila en FP16; se activa automáticamente si no se especifica.
AMD Xilinx❌❌✅ automático❌La exportación de AMD Xilinx requiere Vitis AI INT8 (VINT8); se activa automáticamente si no se especifica.

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

Entrenamiento consciente de la cuantización#

Las exportaciones INT8 anteriores usan cuantización posterior al entrenamiento (PTQ): los rangos se observan en una única pasada de calibración sobre data. En cambio, el entrenamiento consciente de la cuantización (QAT) aprende pesos que toleran INT8 mediante un ajuste fino con cuantización simulada en el bucle, lo que recupera la precisión que se pierde solo con la calibración. Pasa quantize=8 a train para ajustar un punto de control preentrenado y, después, expórtalo como de costumbre:

Ejemplo
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="coco.yaml",
    quantize=8,
    epochs=5,
    batch=64,
    optimizer="AdamW",
    lr0=0.00001,
    lrf=0.1,
    warmup_epochs=0.5,
    cos_lr=True,
    mosaic=0.0,
)
model.export(format="engine", quantize=8)  # # los rangos se guardan con el punto de control, no hacen falta datos de calibración

Usa una tasa de aprendizaje baja al ajustar un punto de control preentrenado. Al principio, QAT puede reducir la precisión, y sus ventajas frente a la cuantización posterior al entrenamiento dependen del modelo, el conjunto de datos y el presupuesto de entrenamiento. Valida el modelo exportado tanto frente al punto de control original como frente a una exportación cuantizada después del entrenamiento; las puntuaciones de cuantización simulada durante el entrenamiento no demuestran la precisión en producción.

La utilidad de QAT depende de lo bien que la calibración propia del backend de exportación gestione el modelo. Los valores siguientes son mAP50-95 en COCO val2017, medidos con motores TensorRT 10.16 en imgsz=640 y lote 1; cada punto de control QAT se entrenó con epochs=20 patience=3:

ModeloMotor FP32Motor INT8 con PTQMotor INT8 con QAT
yolo26n0.40320.39340.3935
yolo26s0.47940.44120.4711
yolo26m0.52690.46960.5137
yolo26l0.54400.48890.5307
yolo26x0.57010.51380.5527

QAT reduce entre 0.008 y 0.017 el mAP50-95 frente a FP32 en todo el rango, mientras que la cuantización posterior al entrenamiento lo reduce en 0.010 en yolo26n y entre 0.038 y 0.057 en los modelos más grandes. Por tanto, QAT apenas aporta nada en el modelo más pequeño, donde la calibración ya funciona bien, y mejora entre 0.030 y 0.044 en el resto. Los resultados variarán con otro conjunto de datos, formato de exportación o versión de TensorRT; mide los tuyos.

Los modelos QAT requieren compile=False; los módulos cuantizados de ModelOpt no admiten torch.compile.

Las convoluciones de salida finales de la cabeza se dejan deliberadamente en coma flotante para limitar la pérdida de precisión de INT8; TensorRT activa la precisión mixta FP16 para sus capas no cuantizadas. QAT se ejecuta mediante NVIDIA TensorRT Model Optimizer, que se instala automáticamente la primera vez que se usa, y debe estar instalado para cargar el punto de control resultante. Los rangos se guardan con el punto de control, y las exportaciones onnx y engine los emiten como nodos Q/DQ; los demás formatos leen los datos de calibración y rechazan los puntos de control QAT.

Qué hacer a continuación#

Consulta la guía de integración de tu destino de implementación —ONNX, TensorRT, CoreML, entre otros, están en la lista completa de integraciones— para saber cómo ejecutar el modelo exportado.

Preguntas frecuentes#

  • Exportar un modelo YOLO26 al formato ONNX es sencillo con Ultralytics. Ofrece métodos de exportación de modelos tanto con Python como con CLI.

    Ejemplo
    from ultralytics import YOLO
    
    # Cargar un modelo
    model = YOLO("yolo26n.pt")  # carga un modelo oficial
    model = YOLO("path/to/best.pt")  # carga un modelo entrenado a medida
    
    # Exporta el modelo
    model.export(format="onnx")

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

  • Usar TensorRT para exportar modelos ofrece mejoras de rendimiento significativas. Los modelos YOLO26 exportados a TensorRT pueden alcanzar hasta 5 veces más velocidad en GPU, por lo que son ideales para aplicaciones de inferencia en tiempo real.

    • Versatilidad: Optimiza los modelos para una configuración de hardware específica.
    • Velocidad: Consigue una inferencia más rápida mediante optimizaciones avanzadas.
    • Compatibilidad: Integra fácilmente los modelos con hardware de 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 forma excelente de comprimir el modelo y acelerar la inferencia, sobre todo en dispositivos periféricos. Así puedes activar la cuantización INT8:

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

    La cuantización INT8 puede aplicarse a formatos como ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN y AMD Xilinx. Para obtener resultados de cuantización óptimos, proporciona un conjunto de datos representativo mediante 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 imágenes de distintas dimensiones, lo que ofrece flexibilidad y optimiza la eficiencia de procesamiento para diferentes casos de uso. Al exportar a formatos como ONNX o TensorRT, activar el tamaño de entrada dinámico garantiza que el modelo se adapte sin problemas a distintas formas de entrada.

    Para activar esta función, usa la marca dynamic=True durante la exportación:

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

    El tamaño de entrada dinámico resulta especialmente útil en aplicaciones donde las dimensiones de entrada pueden variar, como el procesamiento de vídeo o el manejo de imágenes procedentes de distintas fuentes.

  • De forma predeterminada, los modelos PyTorch y las exportaciones dinámicas usan relleno con rectángulo mínimo, mientras que las exportaciones estáticas rellenan hasta imgsz completo, por lo que las detecciones cercanas al umbral de confianza pueden diferir. Usa rect=False para que la inferencia nativa coincida con una exportación estática, o exporta con dynamic=True cuando sea compatible.

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

    • format: El formato de destino del modelo exportado (p. ej., onnx, torchscript, saved_model).
    • imgsz: Tamaño de imagen deseado para la entrada del modelo (p. ej., 640 o (height, width)).
    • quantize: Precisión de cuantización, como 8/"int8", 16/"fp16", 32/"fp32" o los esquemas mixtos de pesos/activaciones "w8a16" y "w8a32" (INT8 dinámico de LiteRT) en los formatos compatibles. Consulta Opciones de cuantización.
    • dynamic: Acepta tamaños de entrada variables en los formatos que admiten formas dinámicas, como ONNX, OpenVINO y TensorRT.
    • nms: Selecciona salidas sin procesar para NMS externo (None), NMS integrado (True) o la cabeza sin NMS (False).
    • device: Dispositivo usado para trazar el modelo durante la exportación, como cpu o 0 para la primera GPU CUDA; TorchScript FP16 requiere una GPU.

    Para implementar en plataformas de hardware específicas, plantéate usar formatos de exportación especializados, como TensorRT para GPU NVIDIA, CoreML para dispositivos Apple o Edge TPU para dispositivos Google Coral.

  • Al exportar un modelo YOLO a formatos como ONNX o TensorRT, la estructura del tensor de salida depende de la tarea del modelo. Comprender estas salidas es importante para implementar inferencias personalizadas.

    Para los modelos de detección YOLO26 (p. ej., yolo26n.pt) exportados con nms=False, los formatos compatibles generan una salida sin NMS con una forma como (batch_size, max_detections, 6) y [x1, y1, x2, y2, confidence, class_id] valores. Con el valor predeterminado max_det=300, suele ser (batch_size, 300, 6). Algunos formatos restringidos vuelven automáticamente al diseño de salida tradicional cuando no admiten operadores de extremo a extremo.

    De forma predeterminada (nms=None), los modelos de detección, incluido YOLO26, exportan predicciones sin procesar de uno a muchos: la salida suele ser un único tensor con una forma como (batch_size, 4 + num_classes, num_predictions), donde los canales representan las coordenadas de las cajas y las puntuaciones por clase, y num_predictions depende de la resolución de entrada de la exportación (y puede ser dinámica). La guía de detección de extremo a extremo explica qué formatos conservan la salida de extremo a extremo.

    Para los modelos de segmentación (p. ej., yolo26n-seg.pt), normalmente obtendrás dos salidas: el primer tensor, con una forma como (batch_size, 4 + num_classes + mask_dim, num_predictions) (cajas, puntuaciones por clase y coeficientes de máscara), y el segundo tensor, con una forma como (batch_size, mask_dim, proto_h, proto_w), que contiene prototipos de máscara que se utilizan 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 (p. ej., yolo26n-pose.pt), el tensor de salida suele tener una forma como (batch_size, 4 + num_classes + keypoint_dims, num_predictions), donde keypoint_dims depende de la especificación de pose (p. ej., del número de puntos clave y de si se incluye la confianza), y num_predictions depende de la resolución de entrada de la exportación (y puede ser dinámica).

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

  • Ultralytics no ofrece actualmente una API de inferencia de C++ específica para modelos YOLO. Para implementaciones en C++, exporta el modelo a un formato de ejecución como ONNX, TensorRT, TorchScript o MNN; después, carga el artefacto exportado con la API nativa de C++ de ese entorno 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 C++ de TensorRT. Si utilizas un posprocesamiento personalizado en C++, adapta el diseño del tensor de salida a la tarea y a la configuración de exportación; las exportaciones de detección YOLO26 predeterminadas devuelven tensores de predicción sin procesar que requieren NMS externo. Exporta con nms=False para obtener detecciones sin NMS con forma (batch, max_det, 6), o con nms=True para integrar NMS en los formatos compatibles.

  • 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 nms=False está activado, el posprocesamiento (incluidos los índices de clase) se integra directamente en el grafo exportado.

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

    Si necesitas salidas totalmente en FP16, exporta con nms=None en una GPU y realiza el posprocesamiento externamente. Las exportaciones ONNX FP16 en CPU mantienen las entradas y salidas en FP32 en cualquier caso; solo convierten el grafo interno.

Comentarios