このプロジェクトはLong-CLIPのファインチューニング版です。Long-CLIPは、長文テキストを扱う能力を持つCLIPモデルです。
📦 データセットとベースモデル
項目 |
詳細 |
データセット |
SPRIGHT-T2I/spright_coco |
ベースモデル |
BeichenZhang/LongCLIP-L |
🚀 クイックスタート
- ❤️ このCLIPが気に入ったら、できる限り支援してください。CLIPはデータだけでなく、時間と高価な電力を消費します。ありがとうございます!🤗
- 自分で支援したい場合は、ファインチューニングなどのすべてのコードは私のGitHubにあります。
💡 使用に関する注意事項
Long-CLIPをFlux.1、SDXL、Stable Diffusionのテキストエンコーダとして使用する場合
ComfyUI用のLong-CLIPノードはこちらから入手できます: https://github.com/SeaArtLab/ComfyUI-Long-CLIP
Comfyを使用していない場合でも、逆エンジニアリングやコードへの適用の起点として役立つでしょう!🤗
HuggingFace Transformersでロードする際の重要な注意事項 👀
model_id = "zer0int/LongCLIP-GmP-ViT-L-14"
model = CLIPModel.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
Transformersライブラリで定義された77トークンとの不一致によりエラーが発生する場合があります。
オプション1 (簡単だが性能が劣る):
77トークンに切り捨てます。
CLIPModel.from_pretrained(model_id, ignore_mismatched_sizes=True)
tensor([[0.16484, 0.0749, 0.1618, 0.0774]], device='cuda:0') 📉
オプション2, 適切な統合: 💖 おすすめ 💖
248トークンの実装に関する解決策です。@kk3dmax に感謝します!🤗
Flux.1推論でこの解決策を使用した完全なサンプルスクリプトは私のGitHubにあります。
model_id = ("zer0int/LongCLIP-GmP-ViT-L-14")
config = CLIPConfig.from_pretrained(model_id)
config.text_config.max_position_embeddings = 248
clip_model = CLIPModel.from_pretrained(model_id, torch_dtype=dtype, config=config)
clip_processor = CLIPProcessor.from_pretrained(model_id, padding="max_length", max_length=248)
pipe.tokenizer = clip_processor.tokenizer
pipe.text_encoder = clip_model.text_model
pipe.tokenizer_max_length = 248
pipe.text_encoder.dtype = torch.bfloat16
tensor([[0.2128, 0.0978, 0.1957, 0.1133]], device='cuda:0') ✅
📈 2024年8月12日の更新
新しい BEST モデルが登場しました。これはラベルスムージングを用いたカスタム損失関数を使用しています。
多様で高品質な大規模データセットではわずかな改善が見られますが、過学習しやすいファインチューニング(小バッチサイズ、1GPU、例えば「スニーカー」などの狭いデータセット)では大幅な相対的な改善が期待できます!
GmP-Smooth用の提供されたコードでモデルをファインチューニングしてください: https://github.com/zer0int/Long-CLIP

📊 精度の向上
このファインチューニング版は、ImageNet/ObjectNetの精度が0.89に向上しています(著者によるオリジナルのLong-CLIPは約0.81)**。
これは幾何学的パラメータ化 (GmP) によって可能になりました。
(mlp): Sequential(
|-(c_fc): Linear(in_features=1024, out_features=4096, bias=True)
| (gelu): QuickGELU()
|-}-(c_proj): Linear(in_features=4096, out_features=1024, bias=True)
| |
| |-- visual.transformer.resblocks.0.mlp.c_fc.weight
| |-- visual.transformer.resblocks.0.mlp.c_fc.bias
|
|---- visual.transformer.resblocks.0.mlp.c_proj.weight
|---- visual.transformer.resblocks.0.mlp.c_proj.bias
重みを以下に分解します:
- 事前学習された重みのノルムとしての半径成分 'r'
- 正規化された方向としての角度成分 'theta'
-> 重みベクトルの方向性と大きさを保持します
(mlp): Sequential(
|-(c_fc): GeometricLinear()
| (gelu): QuickGELU()
|-}-(c_proj): GeometricLinear()
| |
| |-- visual.transformer.resblocks.0.mlp.c_fc.r
| |-- visual.transformer.resblocks.0.mlp.c_fc.theta
| |-- visual.transformer.resblocks.0.mlp.c_fc.bias
|
|---- visual.transformer.resblocks.0.mlp.c_proj.r
|---- visual.transformer.resblocks.0.mlp.c_proj.theta
|---- visual.transformer.resblocks.0.mlp.c_proj.bias
([text] transformer.resblocksについても同様)

✅ 私が共有しているモデル / state_dictは、ファインチューニング後に .weightに変換されています。したがって、他のstate_dictと同じように使用できます。例えば、SeaArtLab/ComfyUI-Long-CLIPのカスタムノードを使用して、ComfyUIでSDXL / SD3のテキストエンコーダとして使用できます!🤗
** トレーニングや評価の詳細、または自分でモデルをファインチューニングするには、こちらを参照してください: https://github.com/zer0int/Long-CLIP
📄 引用
@article{zhang2024longclip,
title={Long-CLIP: Unlocking the Long-Text Capability of CLIP},
author={Beichen Zhang and Pan Zhang and Xiaoyi Dong and Yuhang Zang and Jiaqi Wang},
journal={arXiv preprint arXiv:2403.15378},
year={2024}
}
📄 ライセンス
OpenAIによる事前学習済みCLIPモデルは、MITライセンスの下で提供されています。