多模态对比语言图像预训练CLIP:打破语言与视觉的界限

简介: 多模态对比语言图像预训练CLIP:打破语言与视觉的界限

多模态对比语言图像预训练CLIP:打破语言与视觉的界限

一种基于多模态(图像、文本)对比训练的神经网络。它可以在给定图像的情况下,使用自然语言来预测最相关的文本片段,而无需为特定任务进行优化。CLIP的设计类似于GPT-2和GPT-3,具备出色的零射击能力,可以应用于多种多模态任务。

  • 多模态对比语言图像预训练(CLIP)是一种神经网络模型,它通过多模态对比训练来学习图像和文本之间的关联。与传统的单模态预训练模型不同,CLIP能够同时处理图像和文本,从而更好地理解它们之间的语义关系。

  • CLIP的设计类似于GPT-2和GPT-3,是一种自回归语言模型。它通过对比学习来学习图像和文本之间的映射关系。在训练过程中,CLIP会接收一张图像和一个与之相关的文本片段,并学习如何将这两个模态的信息进行关联。通过这种方式,CLIP可以学会将图像与相应的文本片段进行匹配,从而在给定图像的情况下,使用自然语言来预测最相关的文本片段。

  • 由于CLIP采用了对比学习的方法,它可以在无需为特定任务进行优化的前提下,表现出色地完成多种多模态任务。这使得CLIP成为了一种通用的多模态预训练模型,可以广泛应用于图像标注、视觉问答、图像生成等领域。

CLIP(对比语言图像预训练)是一种基于多种(图像、文本)对进行训练的神经网络。在给定图像的情况下,它可以用自然语言来预测最相关的文本片段,而无需直接针对任务进行优化,类似于GPT-2和gpt - 3的零射击能力。我们发现CLIP在不使用任何原始的1.28M标记示例的情况下,在ImageNet“零射击”上匹配原始ResNet50的性能,克服了计算机视觉中的几个主要挑战。

1.安装

ftfy
regex
tqdm
torch
torchvision
$ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0
$ pip install ftfy regex tqdm
$ pip install git+https://github.com/openai/CLIP.git

Replace cudatoolkit=11.0 above with the appropriate CUDA version on your machine or cpuonly when installing on a machine without a GPU.

import torch
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("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = 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)  # prints: [[0.9927937  0.00421068 0.00299572]]
  • API

The CLIP module clip provides the following methods:

  • clip.available_models()

Returns the names of the available CLIP models.

  • clip.load(name, device=..., jit=False)

返回模型和模型所需的TorchVision转换,由' clip.available_models() '返回的模型名指定。它将根据需要下载模型。' name '参数也可以是本地检查点的路径。

可以选择性地指定运行模型的设备,默认是使用第一个CUDA设备(如果有的话),否则使用CPU。当' jit '为' False '时,将加载模型的非jit版本。

  • clip.tokenize(text: Union[str, List[str]], context_length=77)

返回一个LongTensor,其中包含给定文本输入的标记化序列。这可以用作模型的输入


' clip.load() '返回的模型支持以下方法:

  • model.encode_image(image: Tensor)

给定一批图像,返回由CLIP模型的视觉部分编码的图像特征。

  • model.encode_text(text: Tensor)

给定一批文本tokens,返回由CLIP模型的语言部分编码的文本特征。

  • model(image: Tensor, text: Tensor)

给定一批图像和一批文本标记,返回两个张量,包含对应于每个图像和文本输入的logit分数。其值是对应图像和文本特征之间的相似度的余弦值,乘以100。

2.案例介绍

2.1 零样本能力

下面的代码使用CLIP执行零样本预测,如本文附录B所示。本例从CIFAR-100数据集获取图像,并在数据集的100个文本标签中预测最可能的标签。

import os
import clip
import torch
from torchvision.datasets import CIFAR100

#Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)

#Download the dataset
cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)

#Prepare the inputs
image, class_id = cifar100[3637]
image_input = preprocess(image).unsqueeze(0).to(device)
text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)

#Calculate features
with torch.no_grad():
    image_features = model.encode_image(image_input)
    text_features = model.encode_text(text_inputs)

#Pick the top 5 most similar labels for the image
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
values, indices = similarity[0].topk(5)

#Print the result
print("\nTop predictions:\n")
for value, index in zip(values, indices):
    print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")

输出将如下所示(具体数字可能因计算设备的不同而略有不同):

Top predictions:

           snake: 65.31%
          turtle: 12.29%
    sweet_pepper: 3.83%
          lizard: 1.88%
       crocodile: 1.75%

Note that this example uses the encode_image() and encode_text() methods that return the encoded features of given inputs.

2.2 Linear-probe 评估

The example below uses scikit-learn to perform logistic regression on image features.

import os
import clip
import torch

import numpy as np
from sklearn.linear_model import LogisticRegression
from torch.utils.data import DataLoader
from torchvision.datasets import CIFAR100
from tqdm import tqdm

#Load the model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load('ViT-B/32', device)

#Load the dataset
root = os.path.expanduser("~/.cache")
train = CIFAR100(root, download=True, train=True, transform=preprocess)
test = CIFAR100(root, download=True, train=False, transform=preprocess)


def get_features(dataset):
    all_features = []
    all_labels = []

    with torch.no_grad():
        for images, labels in tqdm(DataLoader(dataset, batch_size=100)):
            features = model.encode_image(images.to(device))

            all_features.append(features)
            all_labels.append(labels)

    return torch.cat(all_features).cpu().numpy(), torch.cat(all_labels).cpu().numpy()

#Calculate the image features
train_features, train_labels = get_features(train)
test_features, test_labels = get_features(test)

#Perform logistic regression
classifier = LogisticRegression(random_state=0, C=0.316, max_iter=1000, verbose=1)
classifier.fit(train_features, train_labels)

#Evaluate using the logistic regression classifier
predictions = classifier.predict(test_features)
accuracy = np.mean((test_labels == predictions).astype(float)) * 100.
print(f"Accuracy = {accuracy:.3f}")

Note that the C value should be determined via a hyperparameter sweep using a validation split.

3.更多资料参考:

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

相关文章
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型的多样性:从语言处理到多模态智能
本文介绍了大模型在多个领域的应用,包括自然语言处理(如Transformer、GPT、BERT、T5)、计算机视觉(如CNN、ViT、GAN)、多模态智能(如CLIP、DALL-E)、语音识别与合成(如Wav2Vec、Tacotron)以及强化学习(如AlphaGo、PPO)。这些模型展现了卓越的性能,推动了人工智能技术的发展。
15 1
|
15天前
|
机器学习/深度学习 编解码 负载均衡
MoH:融合混合专家机制的高效多头注意力模型及其在视觉语言任务中的应用
本文提出了一种名为混合头注意力(MoH)的新架构,旨在提高Transformer模型中注意力机制的效率。MoH通过动态注意力头路由机制,使每个token能够自适应选择合适的注意力头,从而在减少激活头数量的同时保持或提升模型性能。实验结果显示,MoH在图像分类、类条件图像生成和大语言模型等多个任务中均表现出色,尤其在减少计算资源消耗方面有显著优势。
35 1
|
13天前
|
编解码 人工智能 数据可视化
imagen: 具有深度语言理解的逼真的文本到图像扩散模型
imagen: 具有深度语言理解的逼真的文本到图像扩散模型
14 0
|
2月前
|
自然语言处理 数据处理
情感分析的终极形态:全景式细粒度多模态对话情感分析基准PanoSent
【9月更文挑战第24天】PanoSent是一种全新的多模态对话情感分析框架,旨在全景式地提取和分析情感元素,包括情感六元组提取与情感翻转分析两大任务。此框架依托大规模、高质量的多模态数据集PanoSent,涵盖文本、图像、音频等多种模态及多种语言,适应不同应用场景。为解决这些任务,研究人员提出了Chain-of-Sentiment推理框架,结合多模态大语言模型Sentica,实现细粒度的情感分析。尽管PanoSent在情感分析任务上表现优异,但仍面临多模态数据处理和跨领域适用性的挑战。
40 2
|
6月前
|
机器学习/深度学习 算法 搜索推荐
基于深度学习的图像风格转换技术
【5月更文挑战第31天】 在数字图像处理领域,风格转换技术已从传统算法演变至以深度学习为核心的智能化方法。本文深入探讨了基于卷积神经网络(CNN)的图像风格转换技术,分析了其核心原理、关键技术及应用前景。通过引入感知损失与风格损失的概念,实现了图像内容与风格的解耦和重组,使得源图像能够获得目标风格特征。此外,文章还讨论了目前技术面临的主要挑战,包括风格迁移的精度、效率以及多样化问题,并提出了潜在的改进方向。
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
MoE-LLaVA:具有高效缩放和多模态专业知识的大型视觉语言模型
视觉和语言模型的交叉导致了人工智能的变革性进步,使应用程序能够以类似于人类感知的方式理解和解释世界。大型视觉语言模型(LVLMs)在图像识别、视觉问题回答和多模态交互方面提供了无与伦比的能力。
314 0
|
机器学习/深度学习 数据采集 人工智能
ONE-PEACE:探索通往无限模态的通用表征模型
过去几年里,表征模型在自然语言处理、计算机视觉、语音处理等领域取得了巨大的成功。经过大量数据学习的表征模型,不仅可以在各种下游任务上取得良好的效果,还可以作为大规模语言模型(LLM)的基座模型,为LLM提供多模态理解能力。随着多模态技术的发展,尤其CLIP[1]之后大家都意识到一个好的多模态表征模型在很多单模态任务上都会发挥着至关重要的基础模型的作用。学习了大量模态alignment的数据之后的模型逐渐在学会去理解各个模态和模态间蕴含的知识,甚至通过对大量模态的学习促进对其它模态的理解。
21909 7
|
机器学习/深度学习 存储 自然语言处理
Data2Vec:视觉、语音和语言的语境化目标表征的高效自监督学习
目前的自监督学习算法通常是特定模态的,需要大量的计算资源。为了解决这些问题,我们提高了data2vec的训练效率,这是一个跨越多种模式的学习目标
217 0
|
自然语言处理 数据挖掘 语音技术
INTERSPEECH 论文解读〡口语语言处理的音素与文本融合技术及区分式自训练技术
INTERSPEECH 是由国际语音通讯协会(International Speech Communication Association, ISCA)创办的语音信号处理领域顶级旗舰国际会议。历届 INTERSPEECH 会议都备受全球各地语音语言领域人士的广泛关注。 本文介绍我们在 INTERSPEECH 2021 发表的两篇论文工作:一种在预训练 (pre-training) 和微调 (fine-tuning) 中融合音素和文本信息的技术,提升下游 SLP 任务对于 ASR 错误的鲁棒性,以及一种区分式自训练技术 (discriminative self-training) ,减缓对于有
153 0
INTERSPEECH 论文解读〡口语语言处理的音素与文本融合技术及区分式自训练技术
|
传感器 人工智能 测试技术
用图像对齐所有模态,Meta开源多感官AI基础模型,实现大一统
用图像对齐所有模态,Meta开源多感官AI基础模型,实现大一统
234 0