CLIP大模型图文检索——原理解读及代码实现

图片

一. 核心思想

通过自然语言处理获得的监督信号可用于训练迁移效果出色的视觉模型。本论文的作者团队构建了一个庞大的图像文本配对数据集,其中包含400 million个图片文本的配对。利用最大规模的ViT-large模型,他们提出了CLIP(Contrastive Language-Image Pre-training)方法,这是一种有效的从自然语言监督中学习的方法。研究团队在30个数据集上进行了实验,结果显示CLIP模型的性能与之前的有监督模型相当,甚至更好。

二. 模型实现

图片

(1)CLIP的训练过程

CLIP的训练过程是基于图像和文字配对的数据,其中图像输入经过图像编码器得到特征,而文本输入则经过文本编码器得到特征。每个训练批次包含n个图像-文本配对,从而获得n个图像特征和n个文本特征。随后,利用这些特征进行对比学习,其中对比学习的灵活性要求定义正样本和负样本。在这里,配对的图像-文本对即为正样本,因为它们描述的是同一物体。在特征矩阵中,对角线上的元素表示正样本,而非对角线上的元素则表示负样本。有了正负样本,模型便可以通过对比学习的方式进行无监督训练。这种无监督训练方式需要大量的训练数据支持。

(2)CLIP的推理过程

在预训练之后,CLIP模型只能得到图像和文本的特征,而没有分类头。为了进行分类,作者提出了一种利用自然语言的方法,即"prompt template"。例如,对于ImageNet的类别,可以将其转化为类似"A photo of a {object}"这样的句子,对于ImageNet的1000个类别,就可以生成1000个这样的句子。然后,通过之前预训练好的文本编码器,可以得到这1000个句子对应的文本特征。虽然也可以直接使用类别单词提取文本特征,但在预训练阶段,图像与文本的配对是以句子形式出现的,因此在推理阶段使用单词效果会下降。推理时,将需要分类的图像送入图像编码器以获取特征,然后计算图像特征与1000个文本特征的余弦相似度,选择最相似的文本特征对应的句子,从而完成分类任务。CLIP模型不仅局限于这1000个类别,任何类别都可以进行分类,因此彻底摆脱了分类标签的限制,无需在训练和推理阶段提前定义好标签列表。

(3)CLIP的损失函数

CLIP的损失函数使用了对称的损失函数,其中包括图像编码器、文本编码器、学习的投影矩阵、以及温度参数。具体步骤包括提取各模态的特征表示,计算它们之间的余弦相似度,然后应用交叉熵损失函数计算图像和文本的损失。通过将两个损失的平均值作为最终损失,得到了模型的整体损失。

# Image encoder - ResNet or Vision Transformer
# Text encoder - CBOW or Text Transformer
# Input: minibatch of aligned images I[n, h, w, c] and minibatch of aligned text T[n, 1]
# Parameters: W_i[d_i, d_e] learned projection of image to embed, W_t[d_t, d_e] learned projection 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 = 1/2 * normalize(np.dot(I_f, W_i), axis=1)
T_e = 1/2 * 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

模型接收两个输入,一个是图片,一个是文本。图片的维度为[n,h,w,c],文本的维度为[n,l],其中l是序列长度。这些输入分别通过图片编码器和文本编码器提取特征,然后经过一个投射层学习如何从单模态变为多模态。投射完成后,对特征进行l2范数归一化,得到最终用于对比的特征。接下来,计算余弦相似度得到对比学习的logits。最后,使用对称的损失函数计算loss,其中正样本为对角线上的元素。损失函数包括图片损失和文本损失,将两者加起来并取平均。这种操作在对比学习中很常见,是一种对称的目标函数。

三.API代码实现

论文地址:https://arxiv.org/pdf/2103.00020.pdf

代码地址:https://github.com/openai/CLIP

文末可快速免费获取论文和代码~~~

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预训练完成后,系统具备两个编码器:一个用于图像,一个用于文本。在推理过程中,给定一张图片,通过图像编码器可得到该图片的特征。对于文本方面的输入,则包括用户感兴趣的标签,例如"plane"、"car"、"dog"等。这些标签经过prompt工程处理,转换成对应的句子,如"A photo of a plane"、"A photo of a dog"等。一旦得到这些句子,它们就会被送入文本编码器,以获取相应的文本特征。假设有三个标签,分别是"plane"、"car"、"dog",那么通过文本编码器得到对应的文本特征。接下来,将这三个文本特征与图片的特征进行余弦相似度计算,得到相似度后再经过softmax处理,得到一个概率分布。其中概率最大的那个句子,就是最可能描述这张图片的句子。

👇👇👇

免费领取方式

在下方公众号内回复关键词:CLIP

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

5a8015ddde1e41418a38e958eb12ecbd.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day38 代码随想录(1刷)动态规划

目录 343. 整数拆分 96. 不同的二叉搜索树 343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1…

SQLite 在Android安装与定制方案(十七)

返回:SQLite—系列文章目录 上一篇:SQLite超详细的编译时选项(十六) 下一篇:SQLite Android 绑定(十八) 安装 有三种方法可以将 SQLite Android 绑定添加到应用程序: 1、通过…

迭代器模式:统一访问集合元素的优雅方式

在面向对象的软件开发中,迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。这种模式是集合处理特别是遍历集合的核心机制。本文将详细介绍迭代器模式的定义、实现、应用场…

《零基础入行IT:步步为营的转型攻略与实践策略》

在信息化社会,IT行业以其强劲的发展势头、广阔的就业前景和丰厚的薪酬待遇,吸引了无数希望转行或初入职场人士的目光。然而,对于毫无相关背景知识的人来说,如何成功叩开IT行业的大门,似乎是一项颇具挑战性的任务。本文…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理(禁用),下面我以我这边的需求为例, 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1)根据用户选中的开始日期,置灰不可选的日期范围&…

[RK3399 Linux] 使用ubuntu 20.04.5制作rootfs

一、ubuntu base ubuntu base是用于为特定需求创建自定义映像的最小rootfs,是ubuntu可以运行的最小环境。 1.1 下载源码 下载ubuntu-base的方式有很多,可以从官方的地址:ttp://cdimage.ubuntu.com/ubuntu-base/releases。 也可以其它镜像地址下载,如清华源:https://mi…

【小技巧】机器学习中可视化高维向量的两种方法PCA和t-SNE,以及其原理介绍和代码示例(附代码)

使用情景:比如说现在我有一批numpy的多维向量,比如说都是256维度的,X.shape(n, 256), 已知它们都是经过训练能够在256dim的超球面上实现分类或聚类的,现在我想把它们可视化出来看看各个簇在超球面上的分布是怎样的? 1…

Ollama、FastGPT大模型RAG结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…

【TI毫米波雷达】I2C初始化配置和主机数据收发,用SDA来模拟UART数据输出,可直接连接IWR6843AOP开发板引脚

【TI毫米波雷达】I2C初始化配置和主机数据收发,用SDA来模拟UART数据输出,可直接连接IWR6843AOP开发板引脚 文章目录 导入库引脚复用初始化I2C配置数据发送用SDA来模拟UART数据输出附录:结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo…

代理服务器端口分配测试

上游服务器需要一个短暂或临时端口请求下游服务器&#xff0c;测试端口分配方式。 参考nginx 摘录-腾讯云开发者社区-腾讯云 框架为 <dependency><groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</ar…

数据结构课程设计(七)---求图的中心顶点 [图]

1.7.1 题目内容 1.7.1-A [问题描述] 假设有一个公司在某个地区有n个产品销售点&#xff0c;现根据业务需要打算在其中某个销售点上建立一个中心仓库&#xff0c;负责向其它销售点提供产品。由于运输线路不同&#xff0c;运输费用也不同。假定每天需要向每个销售点运输一次产品…

Android网络抓包--Charles

一、Android抓包方式 对Https降级进行抓包&#xff0c;降级成Http使用抓包工具对Https进行抓包 二、常用的抓包工具 wireshark&#xff1a;侧重于TCP、UDP传输层&#xff0c;HTTP/HTTPS也能抓包&#xff0c;但不能解密HTTPS报文。比较复杂fiddler&#xff1a;支持HTTP/HTTPS…

Ubuntu 20.04 设置开启 root 远程登录连接

Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 操作步骤 1、首先使用普通用户登录 2、设置root密码 macw:~$ sudo passwd …

Docker部署Logstash同步Mysql数据到ES

1、准备配置文件文件夹 2、部署logstash & elasticsearch docker pull docker.elastic.co/logstash/logstash:7.15.0 ## 替换{你的ES地址}为ES地址 docker run -d --name logstash -p 5044:5044 -p 9600:9600 -v D:\logstash\data\:/usr/share/logstash/data -v D:\logst…

【并发】 第五篇 原子操作(二) - CAS 详解

导航 一. 简介二. CAS原子操作原理三. CAS 实现自旋锁四. CAS原子操作的优点1. 非阻塞2. 原子性3. 高效性五. CAS原子操作的缺点1. ABA问题2. 自旋开销3. 只能保证一个共享变量的原子性操作一. 简介 CAS是"比较并交换"(Compare and Swap)的缩写。是一种并发控制机…

【网络】服务器间FTP传输文件被限速问题的排查(未达最优解)

服务器间FTP传输文件被限速问题的排查 问题描述具体问题软硬件环境文件传输方式的2种策略FTP相关信息问题表现问题解决结论 发散探讨——基于此问题进行发散研究相关知识从FileZilla软件入手从Windows入手从Linux入手从协议入手Windows和Linux的文件共享&#xff0c;分别是使用…

重看Spring聚焦ApplicationContext分析

目录 一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 &#xff08;二&#xff09;ApplicationContext 结构类图 二、ApplicationContext根接口 &#xff08;一&#xff09;源码展示 &#xff08;二&#xff09;分析说明 三、子接口Configu…

IPSec简介

起源 随着Internet的发展&#xff0c;越来越多的企业直接通过Internet进行互联&#xff0c;但由于IP协议未考虑安全性&#xff0c;而且Internet上有大量的不可靠用户和网络设备&#xff0c;所以用户业务数据要穿越这些未知网络&#xff0c;根本无法保证数据的安全性&#xff0…

00_如何使用国内镜像源下载QT

如何使用国内镜像源下载QT 如何使用国内镜像源下载QT 如何使用国内镜像源下载QT 第一步&#xff1a;下载下载qt online installer 网站&#xff1a;https://download.qt.io/official_releases/online_installers/ 添加链接描述 下载windows版本 第二步&#xff1a; 剪切放…

竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…