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

news2024/11/28 1:37:16

在这里插入图片描述

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用 CSDN 平台,自主完成项目设计升级,提升自身的硬实力。

在这里插入图片描述

  1. 专栏订阅:项目大全提升自身的硬实力

  2. [专栏详细介绍:项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

多模态对比语言图像预训练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.更多资料参考:

  • OpenCLIP: includes larger and independently trained CLIP models up to ViT-G/14
  • Hugging Face implementation of CLIP: for easier integration with the HF ecosystem

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美国人工智能政策公布

美国总统拜登 30 号上午发布了一项关于人工智能(AI)的行政命令(EO)。该行政命令最初以白宫情况说明书的形式向公众提供,“为人工智能安全和安保制定了新标准,保护美国人的隐私,促进公平和公民权…

【C++指针】类的指针

/*** file * author jUicE_g2R(qq:3406291309) * brief 类的指针* copyright 2023.10* COPYRIGHT 原创学习笔记:转载需获得博主本人同意,且需标明转载源* language C*/1 类 类 类 需要在 . h 文件 .h文件 .h文件 先声明 //…

MyBatis批量插入数据优化,新增参数大幅提升操作效率

项目中进行接口压测,发现批量插入的速度有点超出预期,感觉很奇怪,经过定位后发现mybatise-plus批量保存的处理十分缓慢,使用的是saveBatch方法,这点有点想不通。于是就进行了相关内容分析。 根据mybatise-plus中saveB…

ecplise中导入或更新项目之后出现的jsp文件一直显示红叉

解决办法:右键---build path或者properties中找java build path 先检查项目本身的jre版本是不是不与你本身的加热版本相同,如果不相同,则选中这个jre Systemlibrary -----右边有一个remove删除点。。。 (2)重新添加一…

(自适应手机端)厨师招聘信息发布类网站模板

(自适应手机端)厨师招聘信息发布类网站模板 PbootCMS内核开发的网站模板,该模板适用于信息发布网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可; 自适应手机端,同一个后台,数据即时同…

chatgpt中文翻译英文

chatgpt中文翻译英文 chatgpt很适合用于将翻译英文,在英文论文写作上,日常翻译任务都有很大帮助。 使用方法 给出下面这段话: 下面我让你来充当翻译家,你的目标是把中文翻译成英文,请翻译时不要带翻译腔&#xff0c…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品,最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求,所有季节性和装饰性灯串均应经过检测,并且遵守下列法规、标准和要求&…

【数电知识点_2023.10.28】

数制与码制 十进制转二进制 8 bits 1 Byte 2|12 //121100自下而上 商为0为止 2|_ 6_…0 2|_ 3_…0 2|1…1 0…1 0.375 //0.3750.011自上而下 小数点为0为止 x 2 ———— 0.75…0 x 2 ———— 1.5…1 x 2 ———— 1…1 BCD码:每4位二进制表示一位十进制 8421…

装修怎么快速除甲醛 房间装修除装修异味方法

装修怎么快速除甲醛 房间装修除装修异味方法 甲醛问题在装修中引起关注,装修房子是每个家庭都会经历的事情,而甲醛污染也是其中的一个难题。甲醛是一种有害物质,对人体健康造成严重影响,尤其对婴幼儿更为敏感。在装修过程中&#…

从零开始学习PX4源码0(固件下载及编译)

目录 文章目录 目录摘要1.重点学习网址2.固件下载1.下载最新版本固件2.下载之前版本固件 摘要 本节主要记录从零开始学习PX4源码1(固件下载)的过程,欢迎批评指正!!! 下载固件主要分为两个版本,之前稳定版本和最新官网…

【C++项目】高并发内存池项目第八讲 项目总结和面试问题分享

项目总结面试分享 1.项目总结1.1优点1.2不足1.3面试常见问题 2.面试分享项目部分C语法部分 项目源代码:高并发内存池 1.项目总结 1.1优点 增加动态申请的效率减少陷入内核的次数减少系统内存碎片提升内存使用率尽量减少锁竞争应用于多核多线程场景 1.2不足 当前…

西南建筑电气年会暨大运场馆电气设计技术论坛-安科瑞 蒋静

2023年10月19-20日,由中国建筑西南设计研究院有限公司、西南建筑电气工程设计情报网、四川省土木建筑学会建筑电气专业委员会、四川省电工技术学会工业与建筑供电专业委员会、建筑电气杂志社联合主办的第九届(2023年)“西南建筑电气年会暨大运场馆电气设计技术论坛”…

C/C++ “variable set but not used“的 警告问题解决方案

在编程的过程中,会有一些预留的变量暂时不用,但是编译过程编译器警告 会报错无法编译通过针对这个问题,采用下面的解决方案比较方便。 错误如下形式: 三种解决方法: 1.可以在变量前加上(void)就…

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及,越来越多的企业开始使用钉钉作为内部沟通工具。然而,对于企业管理者来说,如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法,帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

《研发效能(DevOps)工程师》课程简介(二)丨IDCF

为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定&#…

sqlserver 数据迁移之bcp

BCP(Bulk Copy Program)是 SQL Server 中用于大量数据导入和导出的工具。在进行数据迁移时,我们可以使用 BCP 来提高数据迁移的效率和性能。以下是一些优化 BCP 的常见方法: 1.使用合适的数据类型: 在导出和导入数据…

Docker 运行swagger-editor实现在线接口文档维护与调试

文章目录 一、序二, Docker部署准备1. 编辑docker-compose.yml2. 新增启动、停止脚本3. 样例 swagger.yaml 三, 启动swagger-editor1. 使用说明2. 完整代码备份 一、序 因工作需要,需要搭建python运行环境,项目中python基于flask…

​测绘人注意,你可能会改变历史!

你也许想不到,曾经有一个测绘人员在进行实地测量作业时,在地图上就这么随手一标注,却让这个地方成为了如今的网红打卡地。 这个地方就是外地游客慕名而来的“宽窄巷子”,如果连这个地方都不知道的成都人,就应该不能算…

后期云端制作:激发影视行业创新力的新时代

在前几年,全球疫情席卷而来,许多影视项目不得不陷入停滞。但是,有一部分影视人却不甘被困,他们选择了一种全新的“云”工作方式。这种方式不仅能够提供制作、存储和处理平台,而且还将推动影视行业的创新与发展。今天&a…

系列四、Springboot中使用DevTools

一、概述 日常开发中&#xff0c;修改了一个类的很小一部分&#xff0c;例如HelloService中有这样的一个方法listAllCity()&#xff0c;代码如下&#xff1a; Service public class HelloService {public List<String> listAllCity() {List<String> cities Arrays…