CLIP 图文检索,相似度计算

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] = simsorted_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)/2result[img]=simsorted_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.hqwc.cn/news/588047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

JVM 组成

文章目录 概要JVM 是 Java程序的运行环境(java二进制字节码的运行环境)JVM 的主要组成部分运行流程:程序计数器堆元空间方法区常量池运行时常量池 概要 JVM 是 Java程序的运行环境(java二进制字节码的运行环境) 好处&…

在linux下conda 创建虚拟环境失败的解决方法

报错内容一&#xff1a; Solving environment: failed CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://conda.anaconda.org/conda-forge/noarch/repodata.json> Elapsed: - An HTTP error occurred when trying to retrieve this URL. HTTP errors are…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库&#xff0c;redis可以方便的实现持久化的功能&#xff08;保存至磁盘中&#xff09; 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…

可视化GIS开发:初识地图12大坐标系以及屏幕坐标

hello&#xff0c;我是贝格前端工场&#xff0c;地图在可视化开发中随处可见&#xff0c;地图需要用到坐标来标明位置关系&#xff0c;并映射的屏幕上&#xff0c;我们才能看到&#xff0c;本文先介绍地图中的常用坐标系&#xff0c;欢迎评论区补充&#xff0c;转发和分享。 在…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…

达梦配置ODBC连接

达梦配置ODBC连接 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 下载ODBC包 下载网址&#xff1a;https://www.unixodbc.org/ unixODBC-2.3.0.tar.gz2 编译并…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了&#xff0c;目前属于未登录状态&#xff0c;挺好&#xff01; 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

Mybatis——一对多关联映射

一对多关联映射 一对多关联映射有两种方式&#xff0c;都用到了collection元素 以购物网站中用户和订单之间的一对多关系为例 collection集合的嵌套结果映射 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import java.util.List;Data public cla…

Java零基础入门-java8新特性(中篇)

一、概述 ​上几期&#xff0c;我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念&#xff0c;而这一期&#xff0c;我们要来玩点好的东西&#xff0c;那就是java8&#xff0c;我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&…

红队笔记11:pWnOS1.0打靶流程解法2-ssh免密登录-rsa私钥破解-shellshock提权(vulnhub)

目录 开头 1.webmin文件泄露漏洞利用-/etc/passwd/ 2.ssh免密登录-私钥伪随机数碰撞&#xff1a; ssh免密登录原理&#xff1a; prng伪随机数生成ssh rsa 私钥公钥密码库 openssl和openssh的关系&#xff1a; ssh登录报错-解决思路-vv 3.提权-内核提权-shellshock提权 内…

Aurora8b10b(1)IP核介绍并基于IP核进行设计

文章目录 前言一、IP核设置二、基于IP核进行设计2.1、设计框图2.2、aurora_8b10b_0模块2.3、aurora_8b10b_0_CLOCK_MODULE2.4、aurora_8b10b_0_SUPPORT_RESET_LOGIC2.5、aurora8b10b_channel模块2.6、IBUFDS_GTE2模块2.7、aurora_8b10b_0_gt_common_wrapper模块2.8、aurora8b10…