社区计算机视觉课程文档
对比语言-图像预训练 (CLIP)
并获取增强的文档体验
开始
对比语言-图像预训练 (CLIP)
介绍
CLIP 是一种擅长通过自然语言监督来理解视觉概念的神经网络。它的运作方式是同时训练文本编码器和图像编码器,专注于一个预训练任务,该任务涉及将标题与相应的图像匹配。这种架构使 CLIP 能够无缝地适应各种视觉分类基准。它通过简单地接收要识别的视觉类别的名称来实现这一点,展示了类似于在 GPT-2 和 GPT-3 模型中观察到的“零样本”学习能力。
对比预训练
给定一批图像-文本对,CLIP 计算此批次内所有可能的(图像,文本)候选对之间的密集余弦相似度矩阵。核心思想是最大化正确对(在下图中以蓝色显示)之间的相似性,并最小化不正确对(在图像中以灰色显示)的相似性。为此,他们针对这些相似度分数优化对称交叉熵损失。
图片来自 OpenAI
简单来说,我们希望使图像与其对应标题之间的相似度尽可能高,同时使图像与其他标题之间的相似度尽可能小。 我们也将此逻辑应用于标题,因此我们希望最大化标题与其对应图像的相似度,并最小化与其他所有图像的相似度。
文本编码器和图像编码器
CLIP 的设计特点是图像和文本的独立编码器,从而允许在选择上具有灵活性。用户可以将标准图像编码器(如 Vision Transformer)切换为 ResNet 等替代方案,或者选择不同的文本编码器,从而增强适应性和实验性。 当然,如果您切换其中一个编码器,则需要再次训练模型,因为您的嵌入分布将有所不同。
用例
CLIP 可用于各种应用。以下是一些值得注意的用例
- 零样本图像分类;
- 相似性搜索;
- 扩散模型调节。
用法
对于实际应用,通常使用图像和预定义的类别作为输入。 提供的 Python 示例演示了如何使用 transformers 库来运行 CLIP。 在此示例中,我们想要对下面的图像在 `dog` 或 `cat` 之间进行零样本分类。
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
inputs = processor(
text=["a photo of a cat", "a photo of a dog"],
images=image,
return_tensors="pt",
padding=True,
)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
执行此代码后,我们得到以下概率
- “一张猫的照片”:99.49%
- “一张狗的照片”:0.51%
局限性
尽管 CLIP 在零样本分类方面表现出色,但它不太可能胜过专门的、微调的模型。 此外,它的泛化能力在某种程度上受到限制,尤其是在涉及训练期间未遇到的数据或示例的场景中。 该论文还表明,正如使用 Fairface 数据集进行的测试所证明的那样,CLIP 的有效性和偏差受到类别选择的影响。 在性别和种族分类中发现了显着差异,性别准确率超过 96%,种族准确率约为 93%。
结论
总而言之,OpenAI 的 CLIP 模型彻底改变了多模态领域。 CLIP 的独特之处在于其在零样本学习方面的精通,使其能够将图像分类为它未明确训练的类别。 这种卓越的泛化能力源于其创新的训练方法,即它学习将图像与文本标题匹配。