代码示例
from transformers import CLIPProcessor, CLIPModel
# 加载预训练的CLIP模型和处理器
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 显示图像
from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
# 加载图像
from PIL import Image
image = Image.open("data_examples/truck.jpg")
# 准备文本标签
cls_list = ["dog", "woman", "man", "car", "truck",
"a black truck", "bird", "a white truck", "black cat"]
# 使用处理器预处理图像和文本
inputs = processor(text=cls_list, images=image,
return_tensors="pt", padding=True)
# 使用模型计算图像和文本的匹配度
outputs = model(**inputs)
print(outputs.keys())
# 提取图像和文本的相似性分数
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
# 输出每个标签的相似性概率
for i in range(len(cls_list)):
print(f"{cls_list[i]}: {probs[0][i]}")
详细解释和API说明
1. 导入CLIP模型和处理器
from transformers import CLIPProcessor, CLIPModel
CLIPModel
:这个类提供了CLIP模型的加载和调用方法。CLIP模型能理解和关联图像和文本两种输入。CLIPProcessor
:这个类提供了图像和文本数据的预处理功能。它将原始的图像和文本转换为模型可以理解的格式。
2. 加载预训练的CLIP模型和处理器
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
from_pretrained
:这是一个用于加载预训练模型的函数。在这里,我们加载了OpenAI预训练的CLIP模型和处理器版本"openai/clip-vit-base-patch32"
。这种预训练使模型在特定的大数据集上提前学习了一般性的图像和文本关系。"openai/clip-vit-base-patch32"
:这是指定的模型版本。ViT-B/32
是CLIP模型的一种架构,基于视觉变换器(Vision Transformer),patch size为32x32。
3. 显示图像
from IPython.display import Image, display
display(Image(filename="data_examples/truck.jpg"))
display
:这是一个IPython提供的函数,用于在Jupyter笔记本或类似环境中显示图像或其他媒体内容。Image
:用于加载和显示图像文件。在这里,我们加载并展示名为“truck.jpg”的图像。
4. 加载图像
from PIL import Image
image = Image.open("data_examples/truck.jpg")
Image.open
:这是PIL库中的一个函数,用于从文件中加载图像。在这里,我们打开名为“truck.jpg”的图像并将其存储在变量image
中。
5. 准备文本标签
cls_list = ["dog", "woman", "man", "car", "truck",
"a black truck", "bird", "a white truck", "black cat"]
cls_list
:这是一个包含多个文本标签的列表,用于描述图像中可能的内容。在这个例子中,我们准备了一些描述性的短语来描述可能的图像内容。
6. 使用处理器预处理图像和文本
inputs = processor(text=cls_list, images=image,
return_tensors="pt", padding=True)
processor
:处理器将文本和图像转换为模型可以理解的格式。text=cls_list
:传递文本描述列表给处理器。images=image
:传递图像给处理器。return_tensors="pt"
:指定返回的格式为PyTorch张量(pt
表示PyTorch)。padding=True
:这个参数在处理文本时添加必要的填充(padding),使得所有文本序列长度一致,便于模型处理。
7. 使用模型计算图像和文本的匹配度
outputs = model(**inputs)
print(outputs.keys())
model(**inputs)
:这里我们将预处理后的输入(图像和文本)传递给CLIP模型。**inputs
的语法将字典中的键值对作为关键字参数传递给函数。模型输出的是图像和文本之间的匹配度分数。outputs.keys()
:这是输出的一个字典,keys()
显示了输出的键,这里包含了logits_per_image
和logits_per_text
,分别表示图像和文本的相似性得分。
8. 提取图像和文本的相似性分数
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
logits_per_image
:这是模型输出的图像与每个文本标签的匹配度得分。分数越高,图像和对应文本标签的相似度越高。softmax(dim=1)
:这是一个函数,将每个得分转换为概率。dim=1
表示对每一行进行归一化处理,使得每一行的所有得分之和为1,这样可以直观地理解为概率分布。
9. 输出每个标签的相似性概率
for i in range(len(cls_list)):
print(f"{cls_list[i]}: {probs[0][i]}")
for i in range(len(cls_list))
:这是一个循环,遍历每个文本标签。probs[0][i]
:这里我们提取每个文本标签与图像的相似性概率。print(f"{cls_list[i]}: {probs[0][i]}")
:打印出每个文本标签的相似性概率。
API说明和使用方法
-
CLIPModel.from_pretrained
- 功能:加载一个预训练的CLIP模型。
- 参数:
pretrained_model_name_or_path
:模型名称或路径。
- 使用场景:当需要使用CLIP模型处理图像和文本时,首先需要加载预训练模型。
-
CLIPProcessor.from_pretrained
- 功能:加载一个预训练的CLIP处理器,用于数据预处理。
- 参数:
pretrained_model_name_or_path
:处理器名称或路径。
- 使用场景:当需要将原始图像和文本转换为模型可以接受的格式时,使用处理器。
-
processor(text, images, return_tensors, padding)
- 功能:预处理图像和文本。
- 参数:
text
:文本描述或标签。images
:输入的图像。return_tensors
:指定返回的张量类型(如PyTorch)。padding
:是否添加填充,使文本序列长度一致。
- 使用场景:在将数据输入到模型之前,使用这个函数来预处理图像和文本。
-
softmax(dim)
- 功能:将输入转换为概率分布。
- 参数:
dim
:指定沿哪个维度进行归一化。
- 使用场景:当需要将模型的输出得分转换为概率时使用。
代码执行输出
Unused or unrecognized kwargs: padding.
odict_keys(['logits_per_image', 'logits_per_text', 'text_embeds', 'image_embeds', 'text_model_output', 'vision_model_output'])
dog: 4.405162326293066e-05
woman: 3.664665564429015e-05
man: 0.00025887592346407473
car: 0.013572390191257
truck: 0.0647275298833847
a black truck: 0.02343730442225933
bird: 7.969647413119674e-05
a white truck: 0.8978394269943237
black cat: 4.128721229790244e-06
好的!让我们逐步解析代码输出,理解每一部分的含义:
输出部分一:警告信息
Unused or unrecognized kwargs: padding.
-
含义:
这是一个警告信息,表示在调用processor
时,传递的参数padding=True
没有被使用或识别。虽然这个警告不影响主要功能,但它提示我们在使用API时需要检查并确保传递的参数是有效的。 -
原因:
在CLIP的处理器中,padding
参数可能并不适用或者没有实现作用。通常,padding
在处理文本序列(如长短不一的句子)时用来对齐长度,但在当前的CLIP处理器实现中,它可能不需要这个参数或有不同的处理方式。 -
解决办法:
可以去掉padding=True
参数,或者查看CLIP的文档,确定是否有其他替代方法来处理需要填充的情况。如果我们确实需要对齐文本长度,可以手动进行处理,或者依赖CLIP自动处理。
输出部分二:模型输出的键
odict_keys(['logits_per_image', 'logits_per_text', 'text_embeds', 'image_embeds', 'text_model_output', 'vision_model_output'])
-
含义:
这是CLIP模型在处理图像和文本后返回的结果。odict_keys
表示有序字典的键(键顺序保持输入顺序),这些键对应的值是模型的输出结果。每个键的含义如下:logits_per_image
:图像和文本之间的相似性得分,每个得分表示输入图像与各个文本描述的匹配程度。logits_per_text
:文本和图像之间的相似性得分,每个得分表示输入文本与各个图像的匹配程度(在这个例子中,我们主要使用logits_per_image
)。text_embeds
:文本的嵌入向量,表示文本在模型中的特征表示。image_embeds
:图像的嵌入向量,表示图像在模型中的特征表示。text_model_output
:文本编码器的完整输出,包括中间层的表示和注意力分数等。vision_model_output
:视觉编码器的完整输出,包括中间层的表示和注意力分数等。
输出部分三:相似性概率
dog: 4.405162326293066e-05
woman: 3.664665564429015e-05
man: 0.00025887592346407473
car: 0.013572390191257
truck: 0.0647275298833847
a black truck: 0.02343730442225933
bird: 7.969647413119674e-05
a white truck: 0.8978394269943237
black cat: 4.128721229790244e-06
-
含义:
这些是每个文本标签与图像的相似性概率。概率越高,表示模型认为图像与该文本标签的匹配度越高。所有的概率值都是通过softmax
函数归一化后的结果,因此它们的和为1。 -
解释:
dog: 4.405162326293066e-05
:图像与“dog”的匹配概率非常低,接近0,表示模型认为图像中没有狗。a white truck: 0.8978394269943237
:图像与“a white truck”的匹配概率最高,为0.8978,表示模型高度认为图像中包含白色卡车。truck: 0.0647275298833847
和a black truck: 0.02343730442225933
:这两个标签的概率也不高,但比其他的高一些,表示图像中可能有卡车,但具体是黑色的还是白色的(模型更倾向于白色)。
-
理解:
- 概率的对比:从结果看,
a white truck
的概率远高于其他标签,这意味着图像最有可能是白色卡车。 - 用途:通过这些概率,用户可以判断输入的图像更符合哪些描述,这在图像分类、内容推荐等场景非常有用。
- 概率的对比:从结果看,
总结
- 警告信息:警告提示我们参数
padding=True
在当前环境下无效。可以去掉或检查文档获取更多信息。 - 模型输出的键:提供了模型的多个输出,其中我们主要关注
logits_per_image
,它表示图像和文本的匹配度得分。 - 相似性概率:显示了每个标签与图像的匹配概率,概率最高的标签表示模型认为最符合图像内容的描述。