OpenVINO

OpenVINO IR è il formato di runtime di Intel: un grafo model.xml accanto a un blob di pesi model.bin. LibreYOLO esporta un ONNX intermedio, lo converte con ov.convert_model e scrive un metadata.yaml nella stessa directory.

Flag
export(format="openvino")
Scrive
Una directory con model.xml, model.bin e metadata.yaml
Extra
pip install "libreyolo[onnx,openvino]"
Si ricarica con
LibreYOLO("weights/LibreYOLO9t_openvino")
Forme
Segue l'ONNX intermedio: batch dinamico quando dynamic=True
Precisione
FP32, compressione dei pesi in FP16 (half=True), INT8 tramite NNCF (int8=True con data=)

Installazione

Installazione
# L'IR viene convertito da un ONNX intermedio, quindi servono entrambi gli extra.pip install "libreyolo[onnx,openvino]"
INT8 richiede in più NNCF
pip install nncf

La conversione passa per un ONNX intermedio, quindi l'extra onnx fa parte del requisito e non è un accessorio opzionale. NNCF si installa a parte e serve solo per int8=True.

Esportazione

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Scrive la directory weights/LibreYOLO9t_openvinopath = model.export(format="openvino")print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format openvino
Argomenti
model.export(    format="openvino",    imgsz=640,    batch=1,    dynamic=False,    # True mantiene un asse di batch dinamico nell'IR    half=False,       # True salva i pesi in FP16    int8=False,       # True esegue la quantizzazione post-training di NNCF    data=None,        # obbligatorio quando int8=True    output_path=None, # None scrive weights/<stem>_openvino)

L'artefatto è una directory, non un file. weights/LibreYOLO9t_openvino contiene model.xml, model.bin e metadata.yaml, e _fp16 viene inserito prima del suffisso quando half=True. Sposta o copia l'intera directory: i tre file sono un unico artefatto.

half=True imposta compress_to_fp16 al salvataggio. È una compressione dei pesi nell'IR, non un cambiamento della precisione di inferenza che il dispositivo sceglie in esecuzione.

INT8

INT8 con dati di calibrazione
from libreyolo import LibreYOLO LibreYOLO("LibreYOLO9t.pt").export(    format="openvino",    int8=True,    data="coco128.yaml",   # obbligatorio: per questo formato non c'è un valore predefinito    fraction=1.0,)

int8=True esegue la quantizzazione post-training di NNCF su un loader di calibrazione LibreYOLO con il preset mixed, e data è obbligatorio: questo formato non ha un ripiego a otto immagini. Se NNCF manca viene sollevato un ImportError che indica il comando di installazione.

Eseguire l'artefatto

Tramite LibreYOLO
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t_openvino")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
Selezionare il dispositivo
from libreyolo import LibreYOLO # "auto" e "cpu" corrispondono alla CPU, "gpu" e "cuda" alla GPU,# qualsiasi altro valore viene passato in maiuscolo, per esempio "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()]) # I nomi delle classi, il task e la dimensione di input stanno in metadata.yaml accanto all'IR.meta = yaml.safe_load(open("weights/LibreYOLO9t_openvino/metadata.yaml"))print(meta["model_family"], meta["task"], meta["names"]) # Il preprocessing e il postprocessing su questo percorso sono a tuo carico.

LibreYOLO() riconosce qualsiasi directory che contenga model.xml e restituisce lo stesso oggetto Results del checkpoint, leggendo i nomi delle classi, il task, la dimensione di input e lo schema della posa da metadata.yaml.

La stringa del dispositivo viene mappata, non passata direttamente. auto e cpu compilano entrambi per la CPU, gpu e cuda compilano entrambi per la GPU, e qualsiasi altro valore viene convertito in maiuscolo e consegnato a OpenVINO: è così che si raggiunge un target NPU.

Il terzo snippet è per chi non ha LibreYOLO installato. Lì il preprocessing, il decoding, l'NMS e il riscalamento delle coordinate diventano a tuo carico, e i nomi delle classi esistono solo in metadata.yaml.

Vincoli

Un IR senza il suo metadata.yaml si carica comunque, ma il backend ripiega su 80 classi e sul task di rilevamento, il che è sbagliato per qualsiasi altro caso. Mantieni la directory intatta.

Bloccati prima del tracing: la segmentazione YOLO9, la segmentazione RTMDet-Ins, SSD, il rilevamento con Faster R-CNN e RetinaNet, e il matting con BiRefNet o FeyNobg, dove OpenVINO 2026.2 non riesce ad abbassare l'operazione ONNX standard DeformConv-19 del decoder di matte condiviso.

Quando una combinazione non è né validata né bloccata, il percorso del converter è disponibile e il progetto non ha registrato una parità di runtime OpenVINO per essa. Diverse combinazioni sono validate con un contesto esplicito allegato, per esempio la segmentazione semantica DeepLabV3 a un input fisso di 520 per 520 su OpenVINO 2026.2 con la precisione di inferenza predefinita della CPU, e lo sguardo L2CS a un ritaglio del volto fisso di 448 per 448. libreyolo formats stampa quel contesto per ogni combinazione.

Per la griglia completa di famiglie e task, vedi la matrice di esportazione. Per una sola combinazione:

Controllare una famiglia e un task prima di esportare
libreyolo formats --family yolo9 --task detect

Letto da libreyolo/export/openvino.py, libreyolo/export/exporter.py, libreyolo/export/support.py, libreyolo/backends/openvino.py e pyproject.toml sul branch dev.