SigLIP2

SigLIP2は、固定ラベルセット全体で共有するsoftmaxではなく、クラスごとに独立したsigmoidを使って画像とテキストプロンプトのスコアを算出するデュアルタワーモデルです。LibreYOLOは、学習ステップなしでゼロショット分類と画像・テキスト埋め込みに対応します。

タスク
classify, embed
サイズ
インストール
pip install libreyolo
サポートティア
姉妹ティア、v以降。独自のファクトリと契約を持つ、独立した製品インターフェースです。
アップストリーム
Google DeepMindのSigLIP 2、Apache-2.0。論文ソース
ライセンス
コード:MIT、重み:Apache-2.0。商用利用

インストール

SigLIP2には専用の追加パッケージが必要です。このパッケージにより、多言語トークナイザーが使うSentencePieceパッケージもインストールされます。

bash
pip install "libreyolo[siglip2]"

推論

重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])result = model(SAMPLE_IMAGE, save=True) print(model.names[result.probs.top1], float(result.probs.top1conf))
CLI
# set_classes()を呼び出さない場合、CLI predictはモデルがデフォルトで読み込む# 1,000個のImageNetクラス名を使用libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
マルチラベルsigmoidスコアリング
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a dog", "a cat", "outdoors"], multi_label=True)r = model(SAMPLE_IMAGE) # クラスごとに独立した確率: 複数またはどのクラスも同時に高スコアになり得る# 一方、Softmax (デフォルト) は単一ラベル分布に正規化し# LibreCLIPの動作と一致for i, name in model.names.items():    print(name, float(r.probs.data[i]))
画像とテキストの埋め込み
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")image_embed = model(SAMPLE_IMAGE).embeddings.datatext_embed = model.embed_text("a photo of a forklift") # どちらもL2正規化済みのため、通常の内積がコサイン類似度になるsimilarity = (image_embed @ text_embed.T).item()

set_classes()は、このモデルをオープンボキャブラリ分類器として機能させる基本操作です。各ラベルをすべてのプロンプトテンプレートに展開し、エンコードした結果を平均して、得られた [K, D] 行列を分類ヘッドとしてキャッシュするため、画像ごとに再計算されません。クラスを変更するには、いつでも再度呼び出してください。呼び出さない場合、LibreSigLIP2は1,000個のImageNet-1kクラス名が設定された状態で読み込まれます。

SigLIPは各クラスを独立してスコアリングします:logit = scale * (image . text) + bias。デフォルトでは、そのロジットの集合は引き続きsoftmaxに渡され、LibreCLIPの top1top5 の動作に一致する単一ラベル分布になります。set_classes()multi_label=True を渡すか、構築時に指定すると、代わりに独立したsigmoid確率へ切り替わるため、同じ画像で複数のクラス、またはどのクラスも高スコアになり得ます。トークナイザーは多言語SentencePieceモデル(Gemma語彙)なので、英語以外のクラス名も同じように機能します。

task="embed" では、推論によってクラス確率ではなく、入力ごとにL2正規化された画像ベクトルが1つ返されます。また、embed_text()は同じベクトル空間の正規化済みテキスト行を返すため、両者の通常の内積がコサイン類似度になります。どちらのタスクでも iou は効果がなく、NMSステップはありません。ソース、ストリーミング、結果の処理については推論を参照してください。

検証

val()はImageFolderの train/ 分割以下にあるクラスフォルダー名を読み取り、それらを指定して set_classes() を呼び出した後、softmaxスコアリングでゼロショットのtop-1精度とtop-5精度を測定します。学習するものがないため、精度は重みの更新ではなく、クラス名がプロンプトとしてどう解釈されるかに左右されます。検証の対象は task="classify" だけです。task="embed" にはデータセット検証機能がありません。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # dataはtrain/分割を持つImageFolderルートで、フォルダー名が# この実行のゼロショットクラスプロンプトになるmetrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160

エクスポート

タスクONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX:対応classify to TorchScript:対応classify to ExecuTorch:対応classify to TensorRT:対応classify to OpenVINO:対応classify to Paddle:非対応classify to MNN:非対応classify to RKNN:非対応classify to ncnn:非対応classify to TFLite:対応classify to CoreML:非対応classify to Core AI:対応
embedembed to ONNX:対応embed to TorchScript:対応embed to ExecuTorch:対応embed to TensorRT:対応embed to OpenVINO:対応embed to Paddle:非対応embed to MNN:非対応embed to RKNN:非対応embed to ncnn:非対応embed to TFLite:対応embed to CoreML:非対応embed to Core AI:非対応

エクスポートでは、モデルの現在の状態が固定グラフに埋め込まれます。task="classify" では、set_classes() で最後に設定したラベルとエクスポート時の解像度が、学習済みのscaleおよびbiasを持つ最終線形層に埋め込まれます。そのため、エクスポートされたグラフはテキストタワーもトークナイザーも含まない通常の [B, K] 画像分類器になります。クラスまたはサイズを変更した後は、再度エクスポートしてください。multi_label=True モードでのエクスポートは実装されていません。先に False に戻してください。task="embed" のエクスポートでは、画像タワーだけをトレースします。どちらにもONNX opset 14以降が必要で、エクスポーターがデフォルトで設定します。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # 現在のset_classes()ラベルと入力解像度がグラフに埋め込まれる# いずれかを変更した後は再エクスポートする。エクスポート時にはmulti_labelを# False (デフォルト) にする必要がある
CLI
# ここではset_classes()を呼び出さないため、モデルが読み込むデフォルトの# 1,000個のImageNetクラスが埋め込まれるlibreyolo export model=LibreSigLIP2b16-cls.pt format=onnx
埋め込みのエクスポート
from libreyolo import LibreYOLO # task="embed"は画像タワーだけをトレースするため、クラスは不要model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")

チェックポイント

このファミリーで公開されているすべての重みファイルです。どちらもGoogleのApache-2.0ライセンスの siglip2-base-patch16-256 および siglip2-so400m-patch14-384 チェックポイントから変換されたもので、COCO学習の実行結果ではありません。

ファイル入力(px)重みのライセンス
classify
LibreSigLIP2b16-cls.ptapache-2.0
LibreSigLIP2so400m-cls.ptapache-2.0

上記のすべてのファイルは現在LibreYOLO orgにあり、初回使用時にダウンロードされます。

ライセンス

ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。

これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。

原著作物
SigLIP 2, Google DeepMind
アップストリームのライセンス
Apache-2.0
アップストリームのソース
github.com/huggingface/transformers
LibreYOLOのコード
MIT
重み
Apache-2.0、huggingface.co/LibreYOLOで再公開
解釈
Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code. LibreSigLIP2's image and text towers are a clean-room re-implementation structured to match Hugging Face Transformers' SigLIP reference implementation, built without transformers as a runtime dependency; the multilingual SentencePiece tokenizer (Gemma vocabulary) is shipped verbatim from the Apache-2.0 google/siglip2-* release. The shipped checkpoints (b16, so400m) are converted from Google's Apache-2.0 siglip2-base-patch16-256 and siglip2-so400m-patch14-384 weights, a metadata wrap with the learned parameters unchanged. Training is not offered for this family: LibreSigLIP2 is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.

引用

@misc{tschannen2025siglip2multilingualvisionlanguage,
      title={SigLIP 2: Multilingual Vision-Language Encoders with Improved Semantic Understanding, Localization, and Dense Features}, 
      author={Michael Tschannen and Alexey Gritsenko and Xiao Wang and Muhammad Ferjad Naeem and Ibrahim Alabdulmohsin and Nikhil Parthasarathy and Talfan Evans and Lucas Beyer and Ye Xia and Basil Mustafa and Olivier Hénaff and Jeremiah Harmsen and Andreas Steiner and Xiaohua Zhai},
      year={2025},
      eprint={2502.14786},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2502.14786}, 
}

著者によるhuggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-infoの引用ブロックからコピーしています。

LibreYOLO v1.5.0で検証済みです。このページのサポート表、チェックポイント、ベンチマーク値は手作業で記述したものではなく、リリース済みライブラリと公開済みの重みから生成されています。