Colab的准备
确保你运行的是GPU运行时;如果不是,请在菜单中的“运行时>更改运行时类型”中选择“GPU”作为硬件加速器。下一个单元将安装CLIP及其依赖项,并检查是否安装了PyTorch 1.7.1或更高版本。
! pip install ftfy regex tqdm
! pip install git+https://github.com/openai/CLIP.git
import numpy as np
import torch
from pkg_resources import packaging
print("Torch version:", torch.__version__)
加载模型
CLIP .available_models()将列出可用CLIP模型的名称。
import clip
clip.available_models()
import clip
from PIL import Image
device= "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32",device=device)
上传红包图片到挂载的云端云盘,修改地址 。网上随便找的红包图片与视频中的不同,看一下能否得出相近结果。
image = preprocess(Image.open("/content/drive/MyDrive/Colab Notebooks/red_envelope.png")).unsqueeze(0).to(device)
text = clip.tokenize(["plane","dog","car","bird","red_envelope"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image)
text_feature = model.encode_text(text)
logits_per_image, logits_per_text = model(image,text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("Label probs:",probs)
-
图像预处理和文本编码:
preprocess
函数用于对图像进行预处理,这通常包括调整图像大小、归一化等步骤,以便模型可以正确处理图像数据。Image.open
用于打开指定路径的图像文件,这里打开的是名为 "red_envelope.png" 的图像。unsqueeze(0)
是一个PyTorch操作,用于在指定维度(这里是第0维)增加一个维度,因为模型可能需要一个批次维度。to(device)
将图像张量移动到指定的设备上,device
变量通常是一个字符串,表示要使用的计算设备,比如 "cuda" 表示GPU或 "cpu" 表示CPU。
-
CLIP模型的文本编码:
clip.tokenize
函数用于将文本转换为模型可以理解的格式,通常是将单词转换为对应的token ID。["plane","dog","car","bird","red_envelope"]
是一个列表,包含了要与图像关联的文本标签。
-
模型推理:
model.encode_image(image)
编码图像特征。model.encode_text(text)
编码文本特征。model(image, text)
将图像和文本特征输入到CLIP模型中进行联合推理,得到每个类别的logits。
-
结果处理:
logits_per_image
和logits_per_text
是模型输出的logits,分别对应图像和文本的预测结果。softmax(dim=-1)
是一个操作,用于将logits转换为概率分布,便于理解和比较。cpu().numpy()
将概率转换为NumPy数组,以便可以打印和进一步处理。
-
输出结果:
print("Label probs:", probs)
打印出每个类别的概率。
实验过程
先调戏一下,让CLIP在无关token中判断概率
加上 red_envelope,概率接近1
将bird改为envelope,把car换成red,,看看CLIP能否分清三者的关系,结果还是坚定的选择了红包,但是没有出现视频里置信度为1的情况。
把plane,改成money,dog改成new year,,再加上china,并且删除red envelope选项,CLIP是否还能分清呢
显示China的置信度明显更高,而并非分类上的信封hhh