CLIP
CLIPは固定ラベルセットの代わりに、テキストプロンプトに対して画像を評価するdual-towerモデルです。LibreYOLOでは学習処理なしで、ゼロショット分類と画像・テキスト埋め込みに対応します。
- タスク
- classify, embed
- サイズ
- インストール
pip install libreyolo- サポートティア
- 姉妹ティア、v以降。独自のファクトリと契約を持つ、独立した製品インターフェースです。
- ライセンス
- コード:MIT、重み:MIT。商用利用
インストール
CLIPには専用の追加パッケージが必要です。同梱されたBPE tokenizerが正確なtoken IDを再現するために使うパッケージがインストールされます。
pip install "libreyolo[clip]"推論
重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。
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))# 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=Truefrom 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がありません。
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"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160エクスポート
| タスク | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify 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:対応 |
| embed | embed 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以降が必要で、エクスポーターがデフォルトで設定します。
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()ラベルと入力解像度をグラフへ組み込み# どちらかを変更したら再エクスポート# ここではset_classes()を呼び出さないため、モデルが読み込むデフォルトの# 1,000個のImageNetクラスを組み込みlibreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed"は画像towerだけをトレース。クラスは不要model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")チェックポイント
このファミリーで公開されているすべての重みファイルです。どちらもCOCOで学習したものではなく、OpenCLIPのLAION-2B学習済みチェックポイント(ViT-B-32とViT-B-16)から変換されています。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
上記のすべてのファイルは現在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の引用ブロックからコピーしています。