基于CLIP模型的图像相似度计算与检索

使用CLIP模型的对图像进行相似度计算。

1、CLIP中的图像相似度

使用CLIP计算两个图像之间的相似度是一个简单的过程,只需要两个步骤:首先提取两个图像的特征,然后计算它们的余弦相似度。
首先,确保已安装所需的软件包。建议设置和使用虚拟环境:

#Start by setting up a virtual environment
virtualenv venv-similarity
source venv-similarity/bin/activate
#Install required packages
pip install transformers Pillow torch

接下来,继续计算图像相似度:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import torch
from PIL import Image
from transformers import AutoProcessor, CLIPModel
import torch.nn as nn
import osos.environ["http_proxy"] = "http://127.0.0.1:21882"
os.environ["https_proxy"] = "http://127.0.0.1:21882"device = torch.device('cuda' if torch.cuda.is_available() else "cpu")
#####--------两种方法都可以
processor = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32",cache_dir="./CLIPModel")
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32",cache_dir="./CLIPModel").to(device)# processor = AutoProcessor.from_pretrained("CLIP-Model")
# model = CLIPModel.from_pretrained("CLIP-Model").to(device)
#Extract features from image1
image1 = Image.open('img1.jpg')
with torch.no_grad():inputs1 = processor(images=image1, return_tensors="pt").to(device)image_features1 = model.get_image_features(**inputs1)#Extract features from image2
image2 = Image.open('img2.jpg')
with torch.no_grad():inputs2 = processor(images=image2, return_tensors="pt").to(device)image_features2 = model.get_image_features(**inputs2)#Compute their cosine similarity and convert it into a score between 0 and 1
cos = nn.CosineSimilarity(dim=0)
sim = cos(image_features1[0],image_features2[0]).item()
sim = (sim+1)/2
print('Similarity:', sim)

在这里插入图片描述
在这里插入图片描述
2张相似的图像
使用两张相似图像的示例,获得的相似度得分为令人印象深刻的95.5%。
在这里插入图片描述

2、图像相似度检索

在深入评估它们的性能之前,让我们使用COCO数据集的验证集中的图像来比较CLIP的结果。我们采用的流程如下:

  • 遍历数据集以提取所有图像的特征。
  • 将嵌入存储在FAISS索引中。
  • 提取输入图像的特征。
  • 检索相似度最高的三张图像。
#!/usr/bin/env python
# -*- coding: utf-8 -*-import torch
from PIL import Image
from transformers import AutoProcessor, CLIPModel, AutoImageProcessor, AutoModel
import faiss
import os
import numpy as npdevice = torch.device('cuda' if torch.cuda.is_available() else "cpu")# Load CLIP model and processor
processor_clip = AutoProcessor.from_pretrained("CLIP-Model")
model_clip = CLIPModel.from_pretrained("CLIP-Model").to(device)
# model = CLIPModel.from_pretrained("CLIP_Model").to(device)#Input image
source='laptop.jpg'
image = Image.open(source)
# Retrieve all filenames
images = []
for root, dirs, files in os.walk('./test_data/'):for file in files:if file.endswith('jpg'):images.append(root + '/' + file)
print(images)# Define a function that normalizes embeddings and add them to the index
def add_vector_to_index(embedding, index):vector = embedding.detach().cpu().numpy()vector = np.float32(vector)faiss.normalize_L2(vector)index.add(vector)def extract_features_clip(image):with torch.no_grad():inputs = processor_clip(images=image, return_tensors="pt").to(device)image_features = model_clip.get_image_features(**inputs)return image_features# Create 2 indexes.
index_clip = faiss.IndexFlatL2(512)
for image_path in images:img = Image.open(image_path).convert('RGB')clip_features = extract_features_clip(img)add_vector_to_index(clip_features, index_clip)faiss.write_index(index_clip, "clip.index")with torch.no_grad():inputs_clip = processor_clip(images=image, return_tensors="pt").to(device)image_features_clip = model_clip.get_image_features(**inputs_clip)def normalizeL2(embeddings):vector = embeddings.detach().cpu().numpy()vector = np.float32(vector)faiss.normalize_L2(vector)return vectorimage_features_clip = normalizeL2(image_features_clip)
index_clip = faiss.read_index("clip.index")
d_clip, i_clip = index_clip.search(image_features_clip, 3)
print(d_clip)
print(i_clip)

结果如下:
在这里插入图片描述

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

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

相关文章

echarts 柱形图多个legend值 同一个柱形图分不同颜色展示

多个legend值 同一个柱形图分不同颜色展示 效果图: 如何实现: 原理:主要通过 series-bar 里面的 stack 数据堆叠来实现 series: [{name: Income,type: bar,stack: Total, //设置堆叠label: {show: true,position: top},data: [900, 345, 3…

【已解决】vue3+ts使用Element-Plus icon图标不显示|element plus 使用 icon 图标教程

文章目录 使用Element-Plus icon图标不显示的解决方案确保已正确安装和引入Element-Plus及其图标库:检查是否有命名冲突: element plus 使用 icon 图标教程1. 安装 Element Plus2. 引入 Element Plus 和图标全局引入按需引入 3. 在组件中使用图标4. 自定…

安装并使用MongoDB Compass管理MongoDB数据库

下载:https://www.mongodb.com/products/tools/compass 选择Windows版本: 双击启动: 进行连接:

操作便捷的城市内涝,水文水动力,排水软件,一天的工作量半小时搞定!

在城市排水防涝规划过程中,水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面,内涝耦合模型提供了相应的模拟及分析工具: 1.1丰富的数据处理功能,兼容C…

数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中 根据根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以存储为这样的形式: V(-1)^S*M*2^E。 (1)(-1)^…

PEReDi 完全隐私的央行数字货币方案

第一个对完全隐私保护建模的方案,基于账户模型,要求交易双方都在线。 角色分类 中央银行 B B B:负责发行数字货币和货币政策,但不控制用户账户的状态,没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…

【Nebula笔记】基础操作

目录 一、预备~ 二、基础操作 (一) 图空间 1. 创建图空间 2. 清空图空间 3. 其他 4. FAQ 执行DROP SPACE语句删除图空间后,为什么磁盘的大小没变化? (二) 点类型 1. 创建Tag 2. 删除Tag 3. 更新Tag 4. 其他 (三) 边类型 1. 创建Edge type…

Gin中的gin.Context与Golang原生的context.Context区别与联系

一.gin中的context gin.Context 1.概念 在 Gin 中,Context 是一个非常重要的概念,它是Gin的核心结构体之一,用于处理 HTTP 请求和响应,在 Gin 的处理流程中,Context 贯穿整个处理过程,用于传递请求和响应的信息Gin 的 Context 是…

hadoop安装及基本使用

环境准备 三台centos7虚拟机,设置固定ip(自己设置),设置ssh秘密登录(自己设置),安装jdk8(自己安装) 准备安装包hadoop-3.3.6.tar.gz 位置在/home/hadoop 准备服务器之间…

C语言:编译与链接

目录 前言1. 翻译环境与运行环境2.翻译环境:预编译编译汇编链接3. 运行环境 前言 我们写一个程序,例如test.c或是test.h这些源文件,头文件,事实上这些代码都是文本文件,但是计算机能够看得懂,并且直接执行…

从IO操作与多线程的思考到Redis-6.0

IO操作->线程阻塞->释放CPU资源->多线程技术提升CPU利用率 在没有涉及磁盘操作和网络请求的程序中,通常不会出现线程等待状态。线程等待状态通常是由于线程需要等待某些事件的发生,比如I/O操作完成、网络请求返回等。如果程序只是进行计算或者简…

vue前端标准

此文档的目的是让前端和产品、服务端开发,相互之间形成一种默契。 比如一些通用设计,不需要产品去说明,我们默认怎么做。 以及,我们开发之间的默契。 期盼大家的补充 开发原则: 感谢各位开发大佬共建原则&#xf…