CLIP 图文检索,相似度计算

news2024/11/24 1:18:49

CLIP 是OpenAI提出的神经网络,它可以从自然语言监督中有效地学习视觉概念。
CLIP 可以应用于任何视觉分类基准,只需提供要识别的视觉类别的名称,类似于 GPT-2 和 GPT-3 的“零样本”功能。

相关paper
用法可以参考github

这里举几个使用CLIP的例子。

首先你需要安装pytorch, 还有matplotlib, opencv等,
然后安装clip

pip install git+https://github.com/openai/CLIP.git

1.零样本图像分类

这里的分类并不是直接让CLIP预测一个标签,而是你给出一些标签的候选项,它会给这些候选项预测概率。

比如这张图片
请添加图片描述
给CLIP一些标签:“a dog”, “a cat”,“a man”,“a tree”, “food”,它会给每个标签预测一个概率,概率最高的就是最后的label.
你会看到"a cat"的得分最高。

同样的,如果用多张图片去匹配一个提示标签,可以用下面代码的logits_per_text.

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

image = preprocess(Image.open('cat.png')).unsqueeze(0).to(device)
text = clip.tokenize(["a dog", "a cat","a man","a tree", "food"]).to(device)

with torch.no_grad():
   #计算图像和token之间的分数
   #logits_per_image是image和每个token的分数,Tensor(1,5)
   #logits_per_text是每个token和image的分数,Tensor(5,1)
   logits_per_image, logits_per_text = model(image, text)
   probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print('Label probs:', probs)
#output:Label probs: [[3.159e-03 9.927e-01 1.589e-03 3.490e-04 2.241e-03]]

2. 用提示语搜索图片

现在用COCO数据集的图片来做测试,用val_2017数据,大概5000张图片。
用一个提示语"a red bus"搜索最相近的3张图片,看能得到什么。
这里计算image feature和text feature的相似度时,用了余弦相似度。

data_folder = 'coco/val2017'
images = []
for root,dirs,files in os.walk(data_folder):
     for file in files:
         if file.endswith('jpg'):
             images.append(root + '/' + file)
text = clip.tokenize(['a red bus']).to(device)
text_features = model.encode_text(text)
result = {}
cos = nn.CosineSimilarity(dim=0)

for img in images:
    with torch.no_grad():
        image_preprocess = preprocess(Image.open(img)).unsqueeze(0).to(device)
        image_features = model.encode_image(image_preprocess)
        sim = cos(image_features[0], text_features[0]).item()
        sim = (sim+1)/2 #(-1,1) --> (0,1)
        result[img] = sim

sorted_value = sorted(result.items(), key=lambda x:x[1], reverse=True)
sorted_res = dict(sorted_value)
top_3 = dict(itertools.islice(sorted_res.items(),3))
print(top_3)
#
# fig,axs =plt.subplots(1,3)
#
# i=0
# for key in top_3:
#     key_img = cv2.cvtColor(cv2.imread(key),cv2.COLOR_BGR2RGB)
#     axs[i].imshow(key_img)
#     axs[i].set_title('sim='+"{:.3f}".format(top_3[key]))
#     axs[i].axis('off')
#     i=i+1
# fig.suptitle('a red bus')
#
# plt.show()

根据提示语,按相似度从高到低,检索出如下3张图片。

请添加图片描述

3.图片的相似度

给出两张图片,计算它们的相似度。
现在要比的是上面“a red bus"中左边2个图片的相似度。
是通过计算image feature的余弦相似度实现的,而image feature是通过CLIP的encode得到。

img1 = 'bus1.jpg'
img2 = 'bus2.jpg'
cos = nn.CosineSimilarity(dim=0)

img1_process = preprocess(Image.open(img1)).unsqueeze(0).to(device)
img2_process = preprocess(Image.open(img2)).unsqueeze(0).to(device)

img1_feature = model.encode_image(img1_process)
img2_feature = model.encode_image(img2_process)

sim = cos(img1_feature[0], img2_feature[0]).item()
sim = (sim+1)/2
print("similarity: ", sim)
#output: similarity:  0.844970703125

4.用图片检索图片

还是用这个红色的bus, 看看用它能从COCO数据中检索出什么。

请添加图片描述

img1='bus1.jpg'
input_image = preprocess(Image.open(img1)).unsqueeze(0).to(device)
input_image_features = model.encode_image(input_image)

result = {}
for img in images:
    with torch.no_grad():
        image_preprocess = preprocess(Image.open(img)).unsqueeze(0).to(device)
        image_features = model.encode_image( image_preprocess)
        cos = torch.nn.CosineSimilarity(dim=0)
        sim = cos(image_features[0],input_image_features[0]).item()
        sim = (sim+1)/2
        result[img]=sim


sorted_value = sorted(result.items(), key=lambda x:x[1], reverse=True)
sorted_res = dict(sorted_value)

top_3 = dict(itertools.islice(sorted_res.items(), 3))

print(top_3)

请添加图片描述

参考资料:
https://medium.com/@jeremy-k/unlocking-openai-clip-part-1-intro-to-zero-shot-classification-f81194f4dff7
https://medium.com/@jeremy-k/unlocking-openai-clip-part-2-image-similarity-bf0224ab5bb0

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

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

相关文章

context switch的切换过程(TTBR0的切换/ASID的介绍)

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 context switch的切换 操作系统中可能存在多个任务, 内核调度器周期性地将执行从一项任务转移到另一项任务。在这个过程中,操作系统会保存上一个进程的执…

ISELED-演示项目代码

目录 一、main函数二、点灯函数 一、main函数 int main(void) {/* Write your local variable definition here */iseledInitType.crcEnable 1;iseledInitType.firstLedAdr 1;iseledInitType.tempCmpEnable 0;iseledInitType.voltSwing 0;/*** End of Processor Expert in…

windows下通过vscode访问ubuntu(绝大部分Linux下开发所采用的方案)

前言 本篇博客是介绍VSCode远程连接Ubuntu进行开发的解决方案,前提是安装好了VMWare,Ubuntu,windows下的VSCode。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案,然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性(Self-consistency) 多个思维链,然后取…

使用Thymeleaf配置国际化页面

在国际化(i18n,即 Internationalization 的缩写,其中“i”和“n”之间有18个字母)的上下文中,Thymeleaf 和 Spring Boot 可以很容易地一起工作,以支持多种语言的页面显示。下面是如何在 Spring Boot 应用中…

干货教程【AI篇】| AI大模型文字生成视频环境部署小白级教程

只需要一个主题、一个词语,或者一段描述,就可以生成一个完整的短视频的工具来啦! 在文章下方公众号中回复关键词【aivd】即可获取完整代码和配套软件 工具获取 ps:本文不涉及任何代码开发工作,仅仅作为软件推荐。 如…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(二、三)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 实验二: 1. 为nvme0n2p1设备建立配额属性和文件(EXT) 2. 要求自己名字的用户只能存储不超过200M的文件,总数量不能大于10个 quotacheck [选项] 文件系统 edquota quotaon [选项] 文件系…

java数据结构与算法刷题-----LeetCode127. 单词接龙

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 广度优先双分裂蛇 广度优先双分裂蛇 解题思路:时间复…

monitor link 联合smart link配合应对复杂的网络

monitor link关键词:上行和下行端口,当上行端口异常,下行端口立即down掉,也就是一种联动机制 如果上行端口里面是smart link方式,则当主从端口都出问题时候,下行端口才会down掉 monitor link 配置步骤 1创…

剑指Offer题目笔记24(集合的组合、排序)

面试题79: 问题: ​ 输入一个不含重复数字的数据集合,找出它的所有子集。 解决方案: ​ 使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中…

苹果安卓双端短视频直播系统源码,带后台-支持二开和采集

搭建教程 1.PHP5.6-7.2 mysql 5.6 redis5.0 nginx1.15 2.宝塔就完全满足了 我刚开了台服务器,建议用阿里云的 我这个是腾讯云 先让服务器 自己装着 时间比较长 3.搭建前需要准备的东西 腾讯云直播、七牛存储、百度语音、腾讯地图等好多东西 七牛存储…

Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于GRU-Adaboost门控循环单元结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如门控循环…

LeetCode-142. 环形链表 II【哈希表 链表 双指针】

LeetCode-142. 环形链表 II【哈希表 链表 双指针】 题目描述:解题思路一:快慢指针 判断是否有环见解题思路二:set()解题思路三:0 题目描述: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如…

Qt5.15以上版本在线安装步骤,可选择更多早期版本

以ubuntu系统为例: 1、先去下载在线安装程序: https://download.qt.io/official_releases/online_installers/ 选择合适的版本,这里是在x64机器的ubuntu虚拟机里安装QT,所以选择如下版本: 或者直接在终端执行如下命令…

VScode-配置文件

导入配置文件 ShiftCtrlp 输入: import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件

视频素材库哪个好?推荐8个网站助你精彩创作

大家好!在视频创作的世界里,一个好的素材库就像是你在寻宝,能让你的作品焕然一新。那么,视频素材库哪个好呢?今天,我就来给大家分享8个超棒的视频素材网站,让你不再为了视频素材库哪个好&#x…

Boost之Log: (3)、简单封装

设计目标: 1、每个Logging source对应一个目录,可以设置日志文件数,日志大小,目录名,文件名等 2、所有logging source日志目录都在一个根目录下。 3、可以动态创建和删除logging source 4、打印出日期时间和日志严重等级 示例代码…

不同设备使用同一个Git账号

想要在公司和家里的电脑上用同一个git账号来pull, push代码 1. 查看原设备的用户名和邮箱 第1种方法, 依次输入 git config user.name git config user.email第2种方法, 输入 cat ~/.gitconfig2. 配置新设备的用户名和邮箱 用户名和邮箱与原设备保持…

(十一)RabbitMQ及SpringAMQP

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,…

自动驾驶的世界模型:综述

自动驾驶的世界模型:综述 附赠自动驾驶学习资料和量产经验:链接 24年3月澳门大学和夏威夷大学的论文“World Models for Autonomous Driving: An Initial Survey”。 在快速发展的自动驾驶领域,准确预测未来事件并评估其影响的能力对安全性…