多模态模型之CLIP模型简介-程序员宅基地

技术标签: 多模态理解  人工智能  

介绍

OpenAI CLIP(Contrastive Language–Image Pretraining)是一种由OpenAI开发的多模态学习模型。它能够同时理解图像和文本,并在两者之间建立联系,实现了图像和文本之间的跨模态理解。

如何工作

CLIP模型的工作原理是将来自图像和文本的数据嵌入到一个共同的语义空间中。在这个语义空间中,相关的图像和文本会靠近彼此,而不相关的则会远离彼此。CLIP模型通过对比学习的方式,在这个共同的语义空间中对图像和文本进行编码,从而实现跨模态理解。

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

模型架构

CLIP模型由一个图像编码器和一个文本编码器组成,它们共享参数。图像编码器负责将图像嵌入到语义空间中,而文本编码器则负责将文本嵌入到同样的语义空间中。CLIP模型使用了Transformer架构来实现这两个编码器,这种架构能够处理长距离的依赖关系,并且在大规模数据上进行预训练。

在这里插入图片描述

应用

CLIP模型在多个任务上都表现出色,包括但不限于:

  • 图像分类:给定一张图像,预测图像所属的类别。
  • 图像检索:给定一段文本描述,检索出与描述相匹配的图像。
  • 文本分类:给定一段文本,预测文本所属的类别。
  • 文本生成:根据给定的文本描述,生成与描述相匹配的图像。

使用示例1

下面是一个使用CLIP模型进行图像分类的Python代码示例:

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}%")

使用示例2

下面是一个使用CLIP模型进行文本-图像相似度检索的Python代码示例:

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]]

总结

CLIP 模型通过对比学习实现了图像和文本之间的跨模态理解,为多种任务提供了强大的支持。

引用

源代码:https://github.com/openai/CLIP?tab=readme-ov-file
论文地址:https://arxiv.org/abs/2103.00020

个人水平有限,有问题随时交流~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yiqiedouhao11/article/details/136330917

智能推荐

克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...-程序员宅基地

文章浏览阅读1.1k次。前言openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子,这个也是学习 openlayers4 的好素材。openlayers4 入门开发系列的地图服务基于 Geoserver 发布的,关于 Geoserver 方面操作的博客,可以参考以下几篇文章:geos..._geoserver 克里金插值

14. golang之 JSON基本介绍_golang json 又名-程序员宅基地

文章浏览阅读529次。1. 概述JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。key-valJSON是在2001年开始推广使用的数据格式,目前已经称为主流的数据格式。JSON易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成JSON字符串,到接收方得到JSON字符串时,再反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。2. 应用场景(_golang json 又名

PEP 3119 – Introducing Abstract Base Classes_pep3119-程序员宅基地

文章浏览阅读302次。PEP 3119 – Introducing Abstract Base Classes介绍抽象基类原文地址:https://www.python.org/dev/peps/pep-3119/PEP:3119Title:Introducing Abstract Base ClassesAuthor:Guido van Rossum ContentsAbstractAcknowledgementsRationaleSpecificationO_pep3119

2D Pose人体关键点实时检测(Python/Android /C++ Demo)_human-pose-estimation-lite-cpp-程序员宅基地

文章浏览阅读3.9w次,点赞45次,收藏393次。​人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。本博客提供2D Pose的Python代码,以及C++版本的推理代码,还提供Android Demo APP,已经集成了轻量化版本的人体检测模型和人体姿态估计模型,在_human-pose-estimation-lite-cpp

网络安全技术及应用第3版 主编贾铁军等——教材习题 期末重点 复习题 知识提炼(第4章 黑客攻防与检测防御)_网络安全实用技术第三版答案贾铁军-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏15次。参考教材:网络安全技术及应用 第3版 主编贾铁军等第4章 黑客攻防与检测防御填空题简答题论述题填空题(1)端口扫描的 防范也称为 系统“加固”,主要有 防止IP地址的扫描 和(关闭 闲置及有潜在危险 端口)。(2)(分布式拒绝服务攻击DDoS)就是利用更多的傀儡机对目标发起进攻,以比从前更大的规模进攻受害者。(3)按数据来源和系统结构分类,入侵检测系统分为 基于主机、基于网络 和(分布式)3类。简答题(1)黑客的攻击五部曲是?隐藏IP、踩点扫描、获得特权攻击、种植后门、隐身退出(2)黑客攻_网络安全实用技术第三版答案贾铁军

树结构使用实例---实现数组和树结构的转换_将树形结构转换成数组-程序员宅基地

文章浏览阅读3.4k次。树是一种非散列数据结构,和非散列表一样,它对于存储需要快速查找的数据非常有用。树是一种分层数据的抽象模型。现实生活中最常见的树的例子是家谱,或是公司的组织架构本文将讲述一个实例,构造一棵树来实现数组和tree的相互转换,这在前端树结构中是经常遇到的。需求场景:将数组转化树结构,并将树结构转化为数组数组const list= [ { id: 1001, parentId: 0, name: 'AA' }, { id: 1002, parentId: 1001, ..._将树形结构转换成数组

随便推点

linux中select和epoll原理,Linux下select&poll&epoll的实现原理(一)-程序员宅基地

文章浏览阅读198次。最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现。此处做一些记录。其基本的原理是相同的,流程如下先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束如果..._setuselinuxnativeepoll

做好项目管理的10个关键点和5大措施_项目管理的关键-程序员宅基地

文章浏览阅读896次。做好项目管理的10个关键点和5大措施_项目管理的关键

【华为OD机考 统一考试机试】最大连续文件之和 / 区块链文件转储系统(C++ Java JavaScript Python )_od 攀登者2-程序员宅基地

文章浏览阅读3.4k次。区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2,...,Fn。随着时间的推移,所占存储会越来越大。云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。_od 攀登者2

配置Super-VLAN下的DHCP服务器示例_dhcp 超级作用域 vlan-程序员宅基地

文章浏览阅读381次。所示,某公司拥有两个部门,为了节省IP地址,部门A和部门B规划为同一网段;为了提升业务安全性,将不同部门的用户划分到不同VLAN中。同时,由于业务需要,不同部门间的用户需要实现三层互通。在Router上配置Sub-VLAN,实现不同Sub-VLAN间的二层隔离。同时,不同Sub-VLAN采用同一个网段,节省了IP地址。在Router上配置Super-VLAN的Proxy ARP,实现Sub-VLAN间的三层互通。在Super-VLAN上配置DHCP服务器,实现为部门A和部门B的终端动态分配IP地址。_dhcp 超级作用域 vlan

三相 单相光伏逆变simlink仿真(MPPT)最大功率点追踪算法(MPPT)仿真模型,本设计基于扰动观察法(P&O)-程序员宅基地

文章浏览阅读351次。在光伏逆变技术中,MPPT算法起着至关重要的作用,可以实现光伏电池最大功率点的追踪,并将其输出到负载或电网中。三、三相单相光伏逆变simlink仿真模型 在本设计中,我们构建了两种光伏逆变模型,一是单级结构,包括光伏电池+Buck电路和光伏电池+Boost电路;以下将分别进行介绍。最大功率点追踪算法(MPPT)仿真模型,本设计基于扰动观察法(P&O)最大功率点跟踪算法追踪光伏电池的发电曲线,实现最大功率点追踪输出的仿真模型。关键词: 光伏逆变,MPPT,P&O算法,Buck电路,Boost电路,全桥逆变。

Linux如何查看端口状态_linux 操作系统下 20443端口如何判断在运行-程序员宅基地

文章浏览阅读1k次。netstat命令各个参数说明如下:  -t : 指明显示TCP端口  -u : 指明显示UDP端口  -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)  -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。  -n : 不进行DNS轮询,显示IP(可以加速操作)即可显示当前服务器上所有端口及进程..._linux 操作系统下 20443端口如何判断在运行

推荐文章

热门文章

相关标签