CLIP

CLIPは固定ラベルセットの代わりに、テキストプロンプトに対して画像を評価するdual-towerモデルです。LibreYOLOでは学習処理なしで、ゼロショット分類と画像・テキスト埋め込みに対応します。

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

インストール

CLIPには専用の追加パッケージが必要です。同梱されたBPE tokenizerが正確なtoken IDを再現するために使うパッケージがインストールされます。

bash
pip install "libreyolo[clip]"

推論

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

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-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=LibreCLIPb32-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
画像とテキストの埋め込み
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-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]行列を分類器ヘッドとしてキャッシュするため、画像ごとに再計算しません。クラスはいつでも再度呼び出して変更できます。呼び出さない場合、LibreCLIPは1,000個のImageNet-1kクラス名を設定済みの状態で読み込まれます。

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

検証

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

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # dataはtrain/分割を持つImageFolderルート。そのフォルダー名が# この実行のゼロショットクラスプロンプトになるmetrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreCLIPb32-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()が最後に設定したラベルとエクスポート時の解像度を最終linear層へ組み込みます。そのため、エクスポートしたONNXまたはTensorRTグラフは、テキストtowerもtokenizerもない通常の[B, K]画像分類器です。クラスまたはサイズを変更したら再エクスポートしてください。task="embed"のエクスポートは画像towerだけをトレースします。どちらもONNX opset 14以降が必要で、エクスポーターがデフォルトで設定します。

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

チェックポイント

このファミリーで公開されているすべての重みファイルです。どちらもCOCOで学習したものではなく、OpenCLIPのLAION-2B学習済みチェックポイント(ViT-B-32ViT-B-16)から変換されています。

ファイル入力(px)重みのライセンス
classify
LibreCLIPb32-cls.ptmit
LibreCLIPb16-cls.ptmit

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

LAION-2Bの学習データには、CSAMコンテンツが含まれていたことが記録されています(Stanford Internet Observatory、2023年12月)。その後LAIONは、クリーンアップした再公開版のRe-LAIONを公開しました。これらの重みを別の場所で再配布する場合、利用可能ならRe-LAION由来のチェックポイントを優先してください。

ライセンス

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

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

原著作物
CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
アップストリームのライセンス
MIT
アップストリームのソース
github.com/mlfoundations/open_clip
LibreYOLOのコード
MIT
重み
MIT、huggingface.co/LibreYOLOで再公開
解釈
MIT is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep the license text and copyright notice with any copy you redistribute, and it places no obligation on your own application code. LibreCLIP's tokenizer is vendored from the OpenAI CLIP / OpenCLIP byte-pair-encoding tokenizer (also MIT); its image and text towers are a clean-room re-implementation of the standard CLIP architecture, built without open_clip as a runtime dependency. The shipped checkpoints (b32, b16) are converted from OpenCLIP's LAION-2B-trained weights, which OpenCLIP publishes as MIT-redistributable. Training is not offered for this family: LibreCLIP is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.

引用

@software{ilharco_gabriel_2021_5143773,
  author       = {Ilharco, Gabriel and
                  Wortsman, Mitchell and
                  Wightman, Ross and
                  Gordon, Cade and
                  Carlini, Nicholas and
                  Taori, Rohan and
                  Dave, Achal and
                  Shankar, Vaishaal and
                  Namkoong, Hongseok and
                  Miller, John and
                  Hajishirzi, Hannaneh and
                  Farhadi, Ali and
                  Schmidt, Ludwig},
  title        = {OpenCLIP},
  month        = jul,
  year         = 2021,
  note         = {If you use this software, please cite it as below.},
  publisher    = {Zenodo},
  version      = {0.1},
  doi          = {10.5281/zenodo.5143773},
  url          = {https://doi.org/10.5281/zenodo.5143773}
}

著者によるgithub.com/mlfoundations/open_clip#citingの引用ブロックからコピーしています。

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