🚀 LLM2CLIP:通过大语言模型拓展CLIP的能力边界
LLM2CLIP是一种创新方法,借助大语言模型(LLMs)挖掘CLIP的潜力。通过在字幕空间中使用对比学习微调LLM,将其文本能力融入输出嵌入,显著提升输出层的文本判别能力。同时,设计了高效训练流程,让微调后的LLM作为CLIP视觉编码器的强大“导师”,突破了传统CLIP文本编码器上下文窗口和能力的限制,在跨模态任务中取得显著改进。
🚀 快速开始
在本文中,我们提出了LLM2CLIP,这是一种利用大语言模型(LLMs)的强大能力来挖掘CLIP潜力的新方法。通过在字幕空间中使用对比学习对LLM进行微调,我们将其文本能力提取到输出嵌入中,显著提高了输出层的文本判别能力。然后,我们设计了一个高效的训练过程,其中微调后的LLM作为CLIP视觉编码器的强大“导师”。由于有了LLM,我们现在可以纳入更长、更复杂的字幕,而不受原始CLIP文本编码器的上下文窗口和能力限制。我们的实验表明,这种方法在跨模态任务中带来了显著的改进。我们的方法直接将之前的SOTA EVA02模型在长文本和短文本检索任务中的性能提高了16.5%,将仅在英语数据上训练的CLIP模型转变为最先进的跨语言模型。此外,当与Llava 1.5等模型集成到多模态训练中时,它在几乎所有基准测试中都始终优于CLIP,展示了全面的性能提升。
✨ 主要特性
LLM2CLIP性能
⚠️ 重要提示
请注意,论文中呈现的所有结果均使用PyTorch权重进行评估。使用Hugging Face (hf)模型时,性能可能会有所不同。
📦 安装指南
文档未提及安装步骤,故跳过此章节。
💻 使用示例
基础用法
Huggingface版本 - 图像嵌入
from PIL import Image
from transformers import AutoModel
from transformers import CLIPImageProcessor
import torch
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
image_path = "CLIP.png"
model_name_or_path = "microsoft/LLM2CLIP-Openai-L-14-224"
processor = CLIPImageProcessor.from_pretrained("openai/clip-vit-large-patch14")
model = AutoModel.from_pretrained(
model_name_or_path,
torch_dtype=torch.bfloat16,
trust_remote_code=True).to('cuda').eval()
image = Image.open(image_path)
input_pixels = processor(images=image, return_tensors="pt").pixel_values.to('cuda')
with torch.no_grad(), torch.cuda.amp.autocast():
outputs = model.get_image_features(input_pixels)
Huggingface版本 - 检索
from PIL import Image
from transformers import AutoModel, AutoConfig, AutoTokenizer
from transformers import CLIPImageProcessor
import torch
from llm2vec import LLM2Vec
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
processor = CLIPImageProcessor.from_pretrained("openai/clip-vit-large-patch14")
model_name_or_path = "microsoft/LLM2CLIP-Openai-L-14-224"
model = AutoModel.from_pretrained(
model_name_or_path,
torch_dtype=torch.bfloat16,
trust_remote_code=True).to('cuda').eval()
llm_model_name = 'microsoft/LLM2CLIP-Llama-3-8B-Instruct-CC-Finetuned'
config = AutoConfig.from_pretrained(
llm_model_name, trust_remote_code=True
)
llm_model = AutoModel.from_pretrained(llm_model_name, torch_dtype=torch.bfloat16, config=config,trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(llm_model_name)
llm_model.config._name_or_path = 'meta-llama/Meta-Llama-3-8B-Instruct'
l2v = LLM2Vec(llm_model, tokenizer, pooling_mode="mean", max_length=512, doc_max_length=512)
captions = ["a diagram", "a dog", "a cat"]
image_path = "CLIP.png"
image = Image.open(image_path)
input_pixels = processor(images=image, return_tensors="pt").pixel_values.to('cuda')
text_features = l2v.encode(captions, convert_to_tensor=True).to('cuda')
with torch.no_grad(), torch.cuda.amp.autocast():
image_features = model.get_image_features(input_pixels)
text_features = model.get_text_features(text_features)
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print("Label probs:", text_probs)
📚 详细文档
模型详情
属性 |
详情 |
模型类型 |
视觉基础模型,特征主干 |
预训练数据集 |
CC3M、CC12M、YFCC15M和Recap-DataComp-1B(30M子集) |
📄 许可证
本项目采用Apache-2.0许可证。
📖 BibTeX引用
@misc{huang2024llm2clippowerfullanguagemodel,
title={LLM2CLIP: Powerful Language Model Unlock Richer Visual Representation},
author={Weiquan Huang and Aoqi Wu and Yifan Yang and Xufang Luo and Yuqing Yang and Liang Hu and Qi Dai and Xiyang Dai and Dongdong Chen and Chong Luo and Lili Qiu},
year={2024},
eprint={2411.04997},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2411.04997},
}