社区计算机视觉课程文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

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

简介

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

对比预训练

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

CLIP 对比预训练 图像来自 OpenAI

简单来说,我们希望使图像与其对应标题之间的相似度尽可能高,而图像与其他标题之间的相似度应该很小。我们也对标题应用这种逻辑,所以我们希望最大化标题与其对应图像之间的相似度,并最小化所有其他图像之间的相似度。

文本编码器和图像编码器

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

用例

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

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

使用

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

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)

执行这段代码后,我们得到了以下概率

  • “一张猫的照片”:99.49%
  • “一张狗的照片”:0.51%

局限性

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

结论

总之,OpenAI 的 CLIP 模型彻底改变了多模态领域。CLIP 的独特之处在于它在零样本学习方面的熟练程度,使其能够将图像分类为它没有明确训练过的类别。这种显着的泛化能力来自于其创新的训练方法,它学习将图像与文本标题匹配。

参考文献

< > 在 GitHub 上更新