CLIP计算图片与文本相似度(多幅图片与一个文本)

一、CLIP介绍

  CLIP(Contrastive Language-Image Pre-training)模型是一种通过自然语言监督来学习可迁移视觉模型的方法。CLIP模型利用海量的图像和相关文本数据对图像编码器和文本编码器进行联合训练,目标是最大化图像和文本对的余弦相似性。通过这种训练方法,CLIP能够在没有针对特定任务训练的情况下(零样本学习),对多种视觉任务进行有效的预测。

CLIP代码链接

在这里插入图片描述
  CLIP(Contrastive Language-Image Pre-training)模型的技术路线包含以下几个核心方面:

  1. 数据集构建:

  CLIP模型的训练基于一个包含约4亿对图像和文本的大规模数据集。这些数据对从互联网收集而来,涵盖了极其丰富的视觉内容和对应的自然语言描述。这样广泛的数据覆盖确保了模型能够接触到多样的视觉概念和语言表达,为后续的模型训练奠定了基础。

  1. 对比学习:

  CLIP通过对比学习框架来进行训练,即通过最大化匹配的图像和文本对的相似度同时最小化不匹配对的相似度。具体来说,模型使用余弦相似性来度量图像和文本之间的匹配程度,并通过对比损失函数来优化模型参数,使得正确的图像-文本对相似度高于错误对。

  1. 双编码器架构:

  CLIP模型包括两个主要组件:图像编码器和文本编码器。图像编码器负责将输入图像转换为高维特征向量;文本编码器则将文本描述转换为同维度的向量。这两个编码器通常使用神经网络实现,如ResNet或Transformer模型。

  1. 零样本学习能力:

  在预训练结束后,CLIP能够直接利用训练好的文本编码器生成新的类别描述的特征,与图像特征进行匹配,实现零样本分类。这意味着CLIP可以在没有额外训练数据的情况下,直接根据文本描述进行图像分类或其他视觉任务。

  1. 跨任务迁移能力:

  由于CLIP在训练时不依赖于特定任务的标注,其学习到的视觉表示具有很强的通用性和迁移能力。这使得CLIP可以在多种视觉任务上表现出色,包括但不限于对象识别、场景分类、动作识别等。

  1. 效率和性能:

  CLIP的训练和应用都显示出较高的效率。在多个标准视觉任务上,CLIP与专门为特定任务训练的模型相比,展示了竞争性的或更优的性能,而且常常不需要针对特定数据集的再训练或微调。

二、代码实现

2.1代码思路

  1. 图像和文本的预处理

图像预处理

  • 功能:图像预处理的主要目的是将图像数据标准化,确保输入到模型的图像具有一致的大小和类型格式,以便模型能够正确解析和处理图像数据。

  • 操作步骤:

  尺寸调整:CLIP模型要求输入图像具有特定的尺寸(如224x224像素),预处理函数会将所有图像调整到这一尺寸。

  颜色转换:将图像从其原始颜色空间(如RGBA)转换到RGB,因为CLIP模型是在RGB图像上训练的。

  归一化:对图像的像素值进行归一化处理,通常是使其均值为0,标准差为1。这有助于模型更快地收敛,提高训练稳定性。

文本预处理

  • 功能:文本预处理确保文本数据被正确分词、编码,转换成模型能够理解的格式。

  • 操作步骤:

  分词:使用CLIP的内置tokenize函数,将一串文本分解成单独的词汇或符号。

  编码:将分词后的文本转换为模型能接受的数值ID。

  填充或截断:确保所有文本序列长度一致,以满足模型输入要求。

  1. 特征提取

图像特征

  • 处理流程:图像数据通过CLIP的图像编码器部分(一个预训练的Vision Transformer或ResNet模型)处理,转换成高维的特征向量。

  • 归一化:对特征向量进行归一化(L2归一化),确保特征向量的长度为1,这样相似度计算将只基于向量之间的角度差异。

文本特征

  • 处理流程:同样,文本数据通过CLIP的文本编码器(基于Transformer的模型)处理,每个标记或词被映射到高维空间以形成特征向量。

  • 归一化:文本特征向量也进行L2归一化,以便与图像特征在同一度量空间比较。

  1. 相似度计算
  • 内积:归一化后的图像和文本特征向量通过计算内积(点积)来衡量相似度。因为向量已归一化,所以内积结果反映了两个向量之间的余弦相似度,即它们之间的夹角。
  1. 可视化相似度矩阵
  • 生成热图:使用matplotlib生成热图,其中横坐标表示不同的图像,纵坐标表示不同的文本描述。每个格子的颜色深浅代表了对应图像和文本之间的相似度,颜色越深表示相似度越高。

  • 视觉表示:这种可视化方法直观地展示了模型是如何理解和关联图像与文本的。

  1. 保存与展示结果
  • 保存图像:热图被保存为PNG文件,以便于文档记录或进一步分析。

  • 显示图像:同时,热图在屏幕上显示,允许用户直接观察和分析模型输出的相似度结果。

2.2完整代码

import os
from PIL import Image
import numpy as np
import torch
import clip
import matplotlib.pyplot as plt

# 加载 CLIP 模型
model, preprocess = clip.load("ViT-B/32")
# print(model)
model.cuda().eval()

# 准备你的图像和文本
your_image_folder = "img"  # 替换为你的图像文件夹路径
your_texts = ["plates with knives"]  # 替换为你的文本列表

images = []
for filename in os.listdir(your_image_folder):
    if filename.endswith(".png") or filename.endswith(".jpg"):
        path = os.path.join(your_image_folder, filename)
        image = Image.open(path).convert("RGB")
        images.append(preprocess(image))

# 图像和文本预处理
image_input = torch.tensor(np.stack(images)).cuda()
text_tokens = clip.tokenize(your_texts).cuda()

# 计算特征
with torch.no_grad():
    image_features = model.encode_image(image_input).float()
    text_features = model.encode_text(text_tokens).float()

# 计算相似度
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)

similarity = (text_features.cpu().numpy() @ image_features.cpu().numpy().T)
print('similarity:',similarity)

# 可视化相似度
plt.imshow(similarity, cmap="hot", interpolation="nearest")
plt.colorbar()
plt.xlabel("Images")
plt.ylabel("Texts")
plt.title("Similarity between Texts and Images")
plt.xticks(range(len(images)), range(len(images)), rotation=90)
plt.yticks(range(len(your_texts)), your_texts, rotation='vertical', va='center')  # 设置标签竖向显示并居中

# 保存图像到文件
plt.savefig("similarity.png", bbox_inches='tight')  # 确保所有内容都在保存的图片里

# 显示图像
plt.show()

2.3运行结果

  我们比较了文本 plates with knives 和以下三幅图片之间的相似度:

在这里插入图片描述
  得到的相似度结果如下:

similarity: [[0.29848784 0.19507146 0.21618465]]

  将相似度结果进行可视化后的图片如下:

在这里插入图片描述

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

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

相关文章

IP纯净度对跨境电商有影响吗?

当我们谈论代理IP时,通常会提到一个重要概念,那就是“IP纯净度”。 IP纯净度是指代理IP服务中所提供的IP地址的质量、干净程度和安全性,纯净度高的IP地址通常具备低恶意软件攻击的风险、良好的访问效果、稳定性和速度以及隐私保护等特点。在…

TEE的密码学算法都支持哪些?你们都是如何实现的?

先说TEE OS中都支持哪些密码学算法?需要支持哪些密码学算法? 我们从GP规范的角度来看。在一般的tee中,都号称支持GP规范。GP规范里要求的强制支持的算法,一般都会实现。对于GP规范里可选的算法,并不是每一家TEE都能支持的。 强制要求的算法 可选支持的算法有 再来看TEE O…

whistle手机抓包

环境:whistle:2.9.59 whistle手机抓包(ios可以抓小程序的包;安卓机不能抓小程序的包,但是小程序的有开发者工具就够用了) 以安卓手机为例(手机跟电脑要连同一个wifi) 1.电脑安装w…

Jmeter压测 —— 1秒发送1次请求

场景:有时候测试场景需要设置请求频率为一秒一次(或几秒一次)实现方法一:1、首先需要在线程组下设置循环次数(可以理解为请求的次数) 次数设置为请求300次,其中线程数跟时间自行设置 2、在设置…

git 大文件上传失败 Please remove the file from history and try again.

根据提示执行命令 --- 查找到当前文件 git rev-list --objects --all | grep b24e74b34e7d482e2bc687e017c8ab28cd1d24b6git filter-branch --tree-filter rm -f 文件名 --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force

11.爬虫---BeautifulSoup安装并解析爬取数据

11.BeautifulSoup安装并解析爬取数据 1.简介2.安装3.基本使用3.1 获取第一个div标签的html代码3.2 获取第一个li标签3.3 获取第一个li标签内容3.4 返回第一个li的字典,里面是多个属性和值3.5 查看第一个li返回的数据类型3.6 根据属性,获取标签的属性值&a…

Android 安装调试 TelephonyProvider不生效

直接安装TelephonyProvider的时候&#xff0c;&#xff08;没有重启&#xff09;发现数据库没有生效。 猜测应该是原本的数据库没有删除后重建更新。 解决方法&#xff1a;杀掉phone进程 adb shell am force-stop com.android.phone 查看device进程 adb shell ps | grep <…

AI视频教程下载:用LangChain开发 ChatGPT和 LLMs 应用

在这个快速变化的人工智能时代&#xff0c;我们为您带来了一场关于语言模型和生成式人工智能的革命性课程。这不仅仅是一个课程&#xff0c;而是一次探险&#xff0c;一次深入人工智能核心的奇妙之旅。 在这里&#xff0c;您将开启一段激动人心的旅程&#xff0c;探索语言模型…

【必会面试题】JVM内存分区?垃圾回收(GC)算法?如何处理OOM?

目录 JVM分区模型GC&#xff08;垃圾回收&#xff09;算法&#xff1a;处理OOM&#xff08;Out Of Memory&#xff09;&#xff1a; JVM分区模型 JVM&#xff08;Java虚拟机&#xff09;内存划分为多个区域&#xff0c;以支持其运行时环境和对象的生命周期管理。以下是主要的内…

Linux磁盘分区(fdisk)和卷管理详解(VG-LV-PV)

先看整体图&#xff0c;再讲解概念 一、磁盘分区 一个磁盘disk可以分多个区part&#xff0c;用fdisk命令&#xff0c;举例把/dev/vdb划分为/dev/vdb1和/dev/vdb2 二、创建虚拟卷 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;他是磁盘…

vue数组在浏览器里可以看到值, 但是length为空

arr数组 length为0, 检查了代码在created 里调用了 this.getEnergyList(); 和 this.initChart(); 问题就在这里, this.initChart用到了getEnergyList里的数据, 造成了数据异步, 把this.initChart(); 放入 this.getEnergyList(); 方法里即可解决问题

如何在没有密码的情况下解锁iPhone

通常&#xff0c;您可以使用密码、FaceID 或 Touch ID 轻松解锁 iPhone。但是&#xff0c;有时您可能会忘记密码、iPhone 已停用或您的二手手机已锁定。在这种情况下&#xff0c;您必须绕过 iPhone 密码才能访问您的设备。在本文中&#xff0c;我们将向您介绍 5 种经过测试的方…

一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较

引言 近年来&#xff0c;“Ops”一词在 IT 运维领域的使用迅速增加。IT 运维正在向自动化过程转变&#xff0c;以改善客户交付。传统的应用程序开发采用 DevOps 实施持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。但对于数据密集型的机器学习和人…

09.1手工制作docker镜像-多服务ssh+nginx

手工制作docker镜像-多服务sshnginx 一个容器多个服务 基于centos6.9系统添加yum源与epel源 安装nginx、ssh服务 yum install nginx openssh-server -y因镜像系统为纯系统&#xff0c;没有root密码&#xff0c;所以需要配置密码 echo 123456 | passwd --stdin root注&#x…

iPhone 16 Pro 将打破智能手机上最窄边框的记录

iPhone 16 Pro 据悉&#xff0c;苹果即将发布的 iPhone 16 Pro 将拥有令人瞩目的超窄边框设计&#xff0c;这一创新将超越目前市场上所有智能手机的边框宽度&#xff0c;甚至相较于其前代产品 iPhone 15 Pro 而言也更为出色。 根据多方消息透露&#xff0c;虽然整体设计变化…

Python一些小操作

矢量图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats(svg)matplotlib中文问题 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]["SimHei"] #设置字体 plt.rcParams["axes.unicode_minus…

[数据集][目标检测]盲道检测数据集VOC+YOLO格式2173张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2173 标注数量(xml文件个数)&#xff1a;2173 标注数量(txt文件个数)&#xff1a;2173 标注…

室内外融合定位是如何做到成为定位领域的新宠

在信息化高速发展的今天&#xff0c;定位技术已成为人们生活和工作中不可或缺的一部分。随着物联网、智慧城市等领域的蓬勃发展&#xff0c;传统的单一定位方式已无法满足复杂多变的环境需求。在这样的背景下&#xff0c;室内外融合定位技术应运而生&#xff0c;以其独特的优势…

RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析

RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析 摘要&#xff1a;本文将基于RockPI 4A单板&#xff0c;介绍Linux 4.4内核下RK3399 GPIO&#xff08;通用输入输出&#xff09;功能的使用方法。通过详细的代码解析和示例&#xff0c;帮助读者理解如何在Linux内核中使用GPI…

Docker部署深度学习模型

基础概念 Docker Docker是一个打包、分发和运行应用程序的平台&#xff0c;允许将你的应用程序和应用程序所依赖的整个环境打包在一起。比如我有一个目标检测的项目&#xff0c;我想分享给朋友&#xff0c;那么他首先需要在自己的电脑上配置好显卡驱动、CUDA、CuDNN&#xff…