OpenVINO

OpenVINO IRはIntelのランタイム形式で、model.xmlグラフとmodel.binの重みblobから構成されます。LibreYOLOは中間ONNXをエクスポートし、ov.convert_modelで変換して、同じディレクトリにmetadata.yamlを書き出します。

フラグ
export(format="openvino")
出力
model.xml、model.bin、metadata.yamlを含むディレクトリ
追加パッケージ
pip install "libreyolo[onnx,openvino]"
再読み込み
LibreYOLO("weights/LibreYOLO9t_openvino")
形状
中間ONNXに従う。dynamic=Trueの場合は動的バッチ
精度
FP32、FP16の重み圧縮(half=True)、NNCFによるINT8(int8=Trueとdata=)

インストール

インストール
# IRは中間ONNXから変換するため、両方の追加パッケージが必要pip install "libreyolo[onnx,openvino]"
INT8ではNNCFも必要
pip install nncf

変換は中間ONNXを経由するため、onnx追加パッケージは任意の補助ではなく要件の一部です。 NNCFは別にインストールし、int8=Trueの場合だけ必要です。

エクスポート

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # ディレクトリweights/LibreYOLO9t_openvinoを書き出しpath = model.export(format="openvino")print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format openvino
引数
model.export(    format="openvino",    imgsz=640,    batch=1,    dynamic=False,    # TrueはIR全体で動的バッチ軸を維持    half=False,       # TrueはFP16の重みを保存    int8=False,       # TrueはNNCFの学習後量子化を実行    data=None,        # int8=Trueの場合に必須    output_path=None, # Noneはweights/<stem>_openvinoに書き出し)

成果物はファイルではなくディレクトリです。weights/LibreYOLO9t_openvinoには model.xmlmodel.binmetadata.yamlが入り、half=Trueの場合は接尾辞の前に _fp16が挿入されます。ディレクトリ全体を移動またはコピーしてください。3個のファイルで 1つの成果物です。

half=Trueは保存時にcompress_to_fp16を設定します。これはIR内の重み圧縮であり、 実行時にデバイスが選ぶ推論精度の変更ではありません。

INT8

キャリブレーションデータを使うINT8
from libreyolo import LibreYOLO LibreYOLO("LibreYOLO9t.pt").export(    format="openvino",    int8=True,    data="coco128.yaml",   # 必須。この形式にはデフォルトなし    fraction=1.0,)

int8=Trueはmixedプリセットを使い、LibreYOLOのキャリブレーションローダーに対して NNCFの学習後量子化を実行します。dataは必須です。この形式には8枚の画像への フォールバックがありません。NNCFがない場合は、インストールコマンドを示すImportErrorが 発生します。

成果物を実行

LibreYOLO経由
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t_openvino")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
デバイスを選択
from libreyolo import LibreYOLO # "auto"と"cpu"はCPU、"gpu"と"cuda"はGPUに対応# それ以外は大文字に変換して渡す。例: "npu" -> NPUmodel = LibreYOLO("weights/LibreYOLO9t_openvino", device="gpu")
OpenVINOを直接使用
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()]) # クラス名、タスク、入力サイズはIRと並ぶmetadata.yamlに格納meta = yaml.safe_load(open("weights/LibreYOLO9t_openvino/metadata.yaml"))print(meta["model_family"], meta["task"], meta["names"]) # この経路では前処理と後処理を自分で実装

LibreYOLO()model.xmlを含むディレクトリを認識し、チェックポイントと同じ Resultsオブジェクトを返します。クラス名、タスク、入力サイズ、姿勢スキーマは metadata.yamlから読み取ります。

デバイス文字列はそのまま渡されず、対応付けられます。autocpuはどちらもCPU向け、 gpucudaはどちらもGPU向けにコンパイルします。それ以外の値は大文字に変換して OpenVINOへ渡され、この方法でNPUをターゲットにできます。

3番目のスニペットはLibreYOLOをインストールしていない場合に使います。この経路では前処理、 デコード、NMS、座標の再スケーリングを自分で実装します。クラス名はmetadata.yamlにだけ 存在します。

制約

metadata.yamlがないIRも読み込めますが、その場合バックエンドは80クラスの物体検出タスクへ フォールバックします。ほかの用途では誤った設定になるため、ディレクトリを完全な状態に保ってください。

トレース前に拒否される対象は、YOLO9セグメンテーション、RTMDet-Insセグメンテーション、 SSD、Faster R-CNNとRetinaNetの物体検出、BiRefNetまたはFeyNobgのマッティングです。 OpenVINO 2026.2は、共有マットデコーダーの標準ONNX演算DeformConv-19を変換できません。

検証済みでも拒否対象でもない組み合わせでは変換経路を利用できますが、プロジェクトはOpenVINO ランタイムとの同等性を記録していません。いくつかの組み合わせは明示的な条件付きで検証済みです。 たとえば、OpenVINO 2026.2でCPUのデフォルト推論精度を使う固定520×520入力のDeepLabV3 セマンティックセグメンテーションや、固定448×448の顔クロップを使うL2CS視線推定です。 libreyolo formatsは組み合わせごとにその条件を表示します。

ファミリーとタスクの完全な対応表は エクスポート対応表を参照してください。1つの組み合わせを調べるには次を実行します。

エクスポート前にファミリーとタスクを確認
libreyolo formats --family yolo9 --task detect

devブランチのlibreyolo/export/openvino.py、libreyolo/export/exporter.py、libreyolo/export/support.py、libreyolo/backends/openvino.py、pyproject.tomlを参照。