OpenVINO

OpenVINO IR es el formato de runtime de Intel: un grafo model.xml junto a un blob de pesos model.bin. LibreYOLO exporta un ONNX intermedio, lo convierte con ov.convert_model y escribe un metadata.yaml en el mismo directorio.

Flag
export(format="openvino")
Escribe
Un directorio con model.xml, model.bin y metadata.yaml
Extra
pip install "libreyolo[onnx,openvino]"
Se recarga con
LibreYOLO("weights/LibreYOLO9t_openvino")
Formas
Sigue al ONNX intermedio: batch dinámico cuando dynamic=True
Precisión
FP32, compresión de pesos en FP16 (half=True), INT8 vía NNCF (int8=True con data=)

Instalación

Instalación
# El IR se convierte desde un ONNX intermedio, así que hacen falta ambos extras.pip install "libreyolo[onnx,openvino]"
INT8 necesita además NNCF
pip install nncf

La conversión pasa por un ONNX intermedio, así que el extra onnx forma parte del requisito y no es un acompañante opcional. NNCF se instala aparte y solo hace falta para int8=True.

Exportación

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Escribe el directorio weights/LibreYOLO9t_openvinopath = model.export(format="openvino")print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format openvino
Argumentos
model.export(    format="openvino",    imgsz=640,    batch=1,    dynamic=False,    # True mantiene un eje de batch dinámico a lo largo del IR    half=False,       # True guarda los pesos en FP16    int8=False,       # True ejecuta la cuantización post-entrenamiento de NNCF    data=None,        # obligatorio cuando int8=True    output_path=None, # None escribe weights/<stem>_openvino)

El artefacto es un directorio, no un archivo. weights/LibreYOLO9t_openvino contiene model.xml, model.bin y metadata.yaml, y se inserta _fp16 antes del sufijo cuando half=True. Mueve o copia el directorio entero; los tres archivos son un único artefacto.

half=True activa compress_to_fp16 al guardar. Eso es compresión de los pesos dentro del IR, no un cambio en la precisión de inferencia que el dispositivo elige en tiempo de ejecución.

INT8

INT8 con datos de calibración
from libreyolo import LibreYOLO LibreYOLO("LibreYOLO9t.pt").export(    format="openvino",    int8=True,    data="coco128.yaml",   # obligatorio: este formato no tiene valor por defecto    fraction=1.0,)

int8=True ejecuta la cuantización post-entrenamiento de NNCF sobre un loader de calibración de LibreYOLO con el preset mixed, y data es obligatorio: este formato no tiene un fallback de ocho imágenes. Si falta NNCF se lanza un ImportError que nombra el comando de instalación.

Ejecutar el artefacto

A través de LibreYOLO
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t_openvino")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
Seleccionar el dispositivo
from libreyolo import LibreYOLO # "auto" y "cpu" se mapean a CPU, "gpu" y "cuda" se mapean a GPU,# cualquier otro valor se pasa en mayúsculas, por ejemplo "npu" -> NPU.model = LibreYOLO("weights/LibreYOLO9t_openvino", device="gpu")
OpenVINO puro
import numpy as npimport openvino as ovimport yaml core = ov.Core()print(core.available_devices) compiled = core.compile_model("weights/LibreYOLO9t_openvino/model.xml", "CPU")outputs = compiled(np.zeros((1, 3, 640, 640), dtype=np.float32))print([tensor.shape for tensor in outputs.values()]) # Los nombres de clase, la tarea y el tamaño de entrada viven en metadata.yaml junto al IR.meta = yaml.safe_load(open("weights/LibreYOLO9t_openvino/metadata.yaml"))print(meta["model_family"], meta["task"], meta["names"]) # En esta vía, el preprocesado y el postprocesado corren de tu cuenta.

LibreYOLO() reconoce cualquier directorio que contenga model.xml y devuelve el mismo objeto Results que el checkpoint, leyendo los nombres de clase, la tarea, el tamaño de entrada y el esquema de pose de metadata.yaml.

La cadena del dispositivo se mapea en lugar de pasarse tal cual. auto y cpu compilan ambas para CPU, gpu y cuda compilan ambas para GPU, y cualquier otro valor se pasa en mayúsculas a OpenVINO, que es la forma de llegar a un destino NPU.

El tercer snippet es para quien no tenga LibreYOLO instalado. Ahí el preprocesado, la decodificación, el NMS y el reescalado de coordenadas corren de tu cuenta, y los nombres de clase solo existen en metadata.yaml.

Restricciones

Un IR sin su metadata.yaml se carga igualmente, pero entonces el backend recurre a 80 clases y a la tarea de detección, lo cual es incorrecto para cualquier otra cosa. Mantén el directorio intacto.

Bloqueadas antes del trazado: la segmentación YOLO9, la segmentación RTMDet-Ins, la detección con SSD, Faster R-CNN y RetinaNet, y el matting con BiRefNet o FeyNobg, donde OpenVINO 2026.2 no consigue traducir la operación estándar de ONNX DeformConv-19 del decodificador de mattes compartido.

Cuando una combinación no está ni validada ni bloqueada, la vía del conversor está disponible y el proyecto no ha registrado paridad de runtime en OpenVINO para ella. Varias combinaciones están validadas con un contexto explícito adjunto, por ejemplo la segmentación semántica DeepLabV3 con una entrada fija de 520 por 520 en OpenVINO 2026.2 con la precisión de inferencia por defecto de la CPU, y la estimación de mirada L2CS con un recorte de cara fijo de 448 por 448. libreyolo formats imprime ese contexto para cada combinación.

Para la tabla completa de familias y tareas, consulta la matriz de exportación. Para una combinación concreta:

Comprobar una familia y tarea antes de exportar
libreyolo formats --family yolo9 --task detect

Leído de libreyolo/export/openvino.py, libreyolo/export/exporter.py, libreyolo/export/support.py, libreyolo/backends/openvino.py y pyproject.toml en la rama dev.