社区计算机视觉课程文档

对比语言-图像预训练(CLIP)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

对比语言-图像预训练(CLIP)

简介

CLIP是一种能够通过自然语言监督来理解视觉概念的神经网络。它通过同时训练一个文本编码器和一个图像编码器来运作,专注于一个涉及将字幕与相应图像匹配的预训练任务。这种架构使得CLIP能够无缝适应各种视觉分类基准。它只需接收要识别的视觉类别的名称,就展示出类似于GPT-2和GPT-3模型中观察到的“零样本”学习能力。

对比预训练

给定一批图像-文本对,CLIP计算该批次中所有可能的(图像,文本)候选对之间的密集余弦相似度矩阵。其核心思想是最大化正确对(下图中蓝色所示)的相似度,并最小化不正确对(图像中灰色所示)的相似度。为此,他们优化了这些相似度分数上的对称交叉熵损失。

CLIP contrastive pre-training 图片来自OpenAI

简单来说,我们希望图像与其对应字幕之间的相似度尽可能高,而图像与其他字幕之间的相似度应该很小。我们将此逻辑也应用于字幕,因此我们希望最大化字幕与其对应图像的相似度,并最小化与其他所有图像之间的相似度。

文本编码器和图像编码器

CLIP的设计特点是图像和文本各自拥有独立的编码器,这使得它们的选择非常灵活。用户可以将标准的图像编码器(如Vision Transformer)替换为ResNet等替代方案,或者选择不同的文本编码器,从而增强适应性和实验性。当然,如果更换其中一个编码器,您将需要重新训练模型,因为您的嵌入分布会发生变化。

用例

CLIP可用于各种应用。以下是一些值得注意的用例:

  • 零样本图像分类;
  • 相似度搜索;
  • 扩散模型条件化。

用法

对于实际应用,通常使用图像和预定义类别作为输入。所提供的Python示例演示了如何使用transformers库运行CLIP。在此示例中,我们希望对下图进行零样本分类,判断是还是

A photo of cats

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)

执行此代码后,我们得到以下概率:

  • “a photo of a cat”(一张猫的照片):99.49%
  • “a photo of a dog”(一张狗的照片):0.51%

局限性

尽管CLIP在零样本分类方面表现出色,但它不太可能超越专门的、经过微调的模型。此外,它的泛化能力受到一定限制,特别是在涉及训练期间未遇到的数据或示例的场景中。该论文还表明,CLIP的有效性和偏差受到类别选择的影响,正如在使用Fairface数据集进行的测试中所展示的。在性别和种族分类中发现了显著差异,性别准确率超过96%,种族准确率约为93%。

结论

总而言之,OpenAI的CLIP模型彻底改变了多模态领域。CLIP的独特之处在于其零样本学习能力,使其能够将图像分类到其未明确训练过的类别中。这种卓越的泛化能力源于其创新的训练方法,即学习将图像与文本字幕进行匹配。

参考文献

< > 在 GitHub 上更新