Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2,在计算机视觉领域取得了一个显着的里程碑,这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务(图像分类、实例检索、视频理解)以及像素级视觉任务(深度估计、语义分割)的通用特征。
Dinov2网站

Faiss是一个用于高效相似性搜索和密集向量聚类的库。它包含的算法可以搜索任意大小的向量集,甚至可能无法容纳在 RAM 中的向量集。

Faiss安装
可以选择 GPU 或 CPU 版本,这里选GPU版本

pip install faiss-gpu

embedding的预处理
使用 Faiss 时的一个重要考虑因素是它需要 Numpy 格式的embedding。因此,我们需要在将它们添加到索引之前对其进行转换。

处理embedding的步骤:

1.Detach the tensor并将其转换为 numpy 数组
2.转换为 numpy float 32 数组
3.使用 Faiss 使用 L2 归一化对 numpy 数组进行归一化

def add_vector_to_index(embedding, index):vector = embedding.detach().cpu().numpy()vector = np.float32(vector)faiss.normalize_L2(vector)index.add(vector)

存储 Faiss 索引
计算embedding然后存储它们。
这里以COCO数据集的val2017为例。
把每个图片的feature保存在index里面。

import torch
from transformers import AutoImageProcessor, AutoModel
from PIL import Image
import faiss
import numpy as np
import os
import matplotlib.pyplot as plt
import cv2device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#你可以换成dinov2-base/large/giant模型
processor = AutoImageProcessor.from_pretrained('./dinov2_small')
model = AutoModel.from_pretrained('./dinov2_small').to(device)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)#feature dim 是384维,所以建立dim=384的index,type是FlatL2
index = faiss.IndexFlatL2(384)
#t0 = time.time()
for image_path in images:img = Image.open(image_path).convert('RGB')with torch.no_grad():inputs = processor(images=img,return_tensors='pt').to(device)outputs = model(**inputs)features = outputs.last_hidden_stateadd_vector_to_index(features.mean(dim=1), index)#print('Extraction done in: ', time.time() - t0)
faiss.write_index(index, 'coco.index')

下面以这张图片为例来检索图片。

请添加图片描述

先提取图片的特征,转为Faiss要求的格式。

image = Image.open('ski.jpg')
#Extract the features
with torch.no_grad():inputs = processor(images=image, return_tensors="pt").to(device)outputs = model(**inputs)#Normalize the features before search
embeddings = outputs.last_hidden_state
embeddings = embeddings.mean(dim=1)
vector = embeddings.detach().cpu().numpy()
vector = np.float32(vector)
faiss.normalize_L2(vector)

用之前保存的index, 检索top3相似的图片。

index = faiss.read_index("coco.index")
d,i = index.search(vector,3)
print('distances:', d, 'indexes:', i)#images[[i][0][k]]为检索到的图片,k为0,1,2

检索效果
请添加图片描述
Faiss本身检索速度很快,GPU下COCO数据集检索仅需0.7ms,
但Dinov2提取特征需要时间。

参考资料

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

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

相关文章

【leetcode面试经典150题】57. 环形链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

服务的状态

1、服务的状态 有状态的服务: 即服务器保存服务有关的个性化参数。 比如客户登陆后,将 客户的权限信息 保存在服务器,每次拿到客户请求后,服务器从自身的数据存储中取出客户角色信息。判断是否响应客户请求。 无状态的服务&…

c++string简单使用

sting下标从0开始 子字符串 substr(pos, len) 得到从 p o s pos pos开始长 l e n len len的字符串。 string s "bcdefg";cout<<s.substr(2, 4); // out: defg插入 insert(pos, str_t) 在字符串 p o s pos pos前插入字符串str_t。 string s "bcdefg…

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 &#xff0c; 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 &#xff0c; 并且可支持位宽为 32 或 64 …

免费的数据恢复软件有哪些?推荐10款免费的数据恢复软件!

通过使用功能强大的免费和最好的数据恢复软件&#xff0c;您可以取消删除重要文件和文档。丢失文件是每个人在许多情况下面临的常见问题&#xff0c;这些数据恢复程序可以充当完美的救星。 我们编制了 2024年的最佳软件列表。这些工具易于使用&#xff0c;您可以通过如何在 PC…

GBase 8s 中的关键字(表达式)

GBase 8s中有一些特殊的关键字&#xff0c;比如rowid,rownum这样的&#xff0c;可以直接在查询语句中直接使用&#xff0c;表示特定的含义。 这种类型的关键字&#xff0c;在使用到表上时需要特别小心&#xff0c;否则可能得非预想要的结果。 如&#xff1a; select * from ta…

Spring Boot 目前还是最先进的吗?

当谈到现代Java开发框架时&#xff0c;Spring Boot一直处于领先地位。它目前不仅是最先进的&#xff0c;而且在Java生态系统中拥有着巨大的影响力。 1. 什么是Spring Boot&#xff1f; Spring Boot是由Spring团队开发的开源框架&#xff0c;旨在简化基于Spring的应用程序的开…

机器学习之时序差分学习(Temporal Different Learning)

时序差分学习(Temporal Difference Learning)是一种强化学习算法,常用于解决序列决策问题。它结合了动态规划和蒙特卡洛方法的优点,在未来奖励和当前估计之间进行自举式更新。 该算法的核心思想是通过不断地估计状态值或动作值的更新来学习。具体来说,它通过比较当前状态…

#LLM入门|AI测试# 3.6_创建测试集,人工/LLM评估

评估是确保语言模型&#xff08;LLM&#xff09;问答系统质量的重要步骤&#xff0c;它有助于检测模型在不同文档上的表现&#xff0c;发现不足之处&#xff0c;并通过比较不同模型选择最优方案。定期评估还能监测模型性能是否下降。 评估目的包括确认LLM是否满足验收标准&…

接收区块链的CCF会议--ICSOC 2024 截止7.24

ICSOC是CCF B类会议&#xff08;软件工程/系统软件/程序设计语言&#xff09; 2023年长文短文录用率22% Focus Area 4: Emerging Technologies Quantum Service Computing Digital Twins 3D Printing/additive Manufacturing Techniques Blockchain Robotic Process Autom…

N元语言模型

第1关&#xff1a;预测句子概率 任务描述 本关任务&#xff1a;利用二元语言模型计算句子的概率 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.条件概率计算方式。 2.二元语言模型相关知识。 条件概率计算公式 条件概率是指事件A在事件B发生的条件下发…

代码随想录-哈希表 | 242 有效的字母异位词

代码随想录-哈希表 | 242 有效的字母异位词 LeetCode 242-有效的字母异位词解题思路代码复杂度难点总结 LeetCode 242-有效的字母异位词 题目链接 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每…

【队列的算法题记录】239. 滑动窗口最大值

239. 滑动窗口最大值 题目链接 思路 提到滑动窗口就不难不想到队列&#xff0c;这题是要获得滑动窗口每一步的最大值&#xff0c;所以我们可以通过保证队列的单调性&#xff08;即单调递减&#xff0c;使得最大值永远处在队列前端&#xff09;来实现&#xff1a; class MyQ…

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【数学】推荐一种用尺规绘制正五边形,简单而又精确的作法

【说明】 正五边形的尺规作图方法很多&#xff0c;但大多比较繁琐&#xff0c;下面介绍一种作法&#xff0c;这种方法步骤少&#xff0c;简便易行。 【具体步骤】 1.作相互垂直的两条直线&#xff0c;交点为O&#xff1b; 2.以O为圆心作圆&#xff0c;交横线与AB两点&#…

风速Weibull分布和光伏Beta分布的参数拟合方法(含matlab算例)

在风光场景生成、随机优化调度等研究中&#xff0c;常常假设风速服从Weibull分布&#xff0c;太阳辐照度服从Beta分布。那我们如何得到两个分布的参数呢&#xff1f;文本首先介绍了风速Weibull分布和辐照度Beta分布的基本概率模型及其性性质&#xff0c;之后以MATLAB代码为例阐…

读所罗门的密码笔记21_读后总结与感想兼导读

1. 基本信息 所罗门的密码&#xff1a;AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字&#xff0c;笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …

学习笔记-微服务高级(黑马程序员)

Sentinel 测试软件 jmeter 雪崩问题 个微服务往往依赖于多个其它微服务,服务提供者I发生了故障&#xff0c;依赖于当前服务的其它服务随着时间的推移形成级联失败 超时处理 设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息 仓壁模式 限定每个业务能使用的线…

基于SpringBoot的“校园新闻网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园新闻网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录 校园新…

揭秘!回归测试覆盖率究竟是什么?

回归测试覆盖率是软件测试中的一个重要概念&#xff0c;它衡量的是回归测试过程中&#xff0c;能够覆盖到旧代码的比例。在软件开发的生命周期中&#xff0c;每当有新的代码提交或是修改后&#xff0c;都需要进行回归测试以确保新代码不会对原有的功能产生负面影响。 1.什么是…