基于 DINOv2 模型实现图搜图相似度检索任务

一、DINOv2 模型简介及使用

DINOv2是由Meta AI开发的第二代自监督视觉变换器模型,采用 Vision Transformer (ViT) 架构 。其核心特点是在无需人工标签的情况下,通过自监督学习技术,从海量无标注图像中学习有意义的视觉特征表示,类似于 NLP 领域的自监督 Base 模型,DINOv2 已经具有了对图像的理解能力,和强大的图像特征提取能力,因此它可以作为几乎所有计算机视觉任务的骨干模型。

下面是官方演示地址:

https://dinov2.metademolab.com/demos?category=segmentation

深度估计效果:

在这里插入图片描述

语义分割效果:

在这里插入图片描述

GitHub 开源地址:

https://github.com/facebookresearch/dinov2

huggingface 模型地址:

https://huggingface.co/facebook/dinov2-base/tree/main

在这里插入图片描述

本文借助 DINOv2 强大的特征提取能力,实现图图相似度检索任务,但开始前,首先 先了解一下如何基于 DINOv2 实现图像的相似度计算:

from transformers import AutoImageProcessor, AutoModel
from PIL import Image
import matplotlib.pyplot as plt
import torch
plt.rcParams['font.sans-serif'] = ['SimHei']
# 生成图像特征
def gen_image_features(processor, model, device, image):with torch.no_grad():inputs = processor(images=image, return_tensors="pt").to(device)outputs = model(**inputs)image_features = outputs.last_hidden_stateimage_features = image_features.mean(dim=1)return image_features[0]# 计算两个图像的相似度
def similarity_image(processor, model, device, image1, image2):features1 = gen_image_features(processor, model, device, image1)features2 = gen_image_features(processor, model, device, image2)cos_sim = torch.cosine_similarity(features1, features2, dim=0)cos_sim = (cos_sim + 1) / 2return cos_sim.item()def main():model_dir = "facebook/dinov2-base"processor = AutoImageProcessor.from_pretrained(model_dir)model = AutoModel.from_pretrained(model_dir)device = torch.device('cuda:0' if torch.cuda.is_available() else "cpu")model.to(device)image1 = Image.open("img/dog1.jpg")image2 = Image.open("img/dog2.jpg")similarity = similarity_image(processor, model, device, image1, image2)plt.figure()plt.axis('off')plt.title(f"相似度: {similarity}")plt.subplot(1, 2, 1)plt.imshow(image1)plt.subplot(1, 2, 2)plt.imshow(image2)plt.show()if __name__ == '__main__':main()

在这里插入图片描述

在这里插入图片描述

相似度计算的主要核心就是基于 DINOv2 生成特征向量,图图相似度检索也依赖这一点,不过需要多出一个特征向量的持久化存储端,整体实现架构如下图所示,其中特征向量存储采用 Milvus 数据库。

被检索图像数据集特征提取过程:

在这里插入图片描述

图像相似度检索过程:

在这里插入图片描述

关于 Milvus 的使用,可以参考下面这篇博客:

Milvus 向量数据库介绍及使用

二、图图相似度检索实现 - 图像特征持久化

首先准备图像数据集,这里我随便准备了几张猫和狗的图片:

在这里插入图片描述

创建 Milvus Collection,其中 DINOv2 特征向量维度为 768 维:

from pymilvus import MilvusClient, DataTypeclient = MilvusClient("http://192.168.0.5:19530")schema = MilvusClient.create_schema(auto_id=True,enable_dynamic_field=False,
)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=768)
schema.add_field(field_name="image_name", datatype=DataType.VARCHAR, max_length=256)
schema.verify()
index_params = client.prepare_index_params()
index_params.add_index(field_name="id",index_type="STL_SORT"
)
index_params.add_index(field_name="vector",index_type="IVF_FLAT",metric_type="L2",params={"nlist": 1024}
)
# 创建 collection
client.create_collection(collection_name="dinov2_collection",schema=schema,index_params=index_params
)

图像数据集提取特征向量后,持久化到 Milvus 中:

from transformers import AutoImageProcessor, AutoModel
from PIL import Image
from pymilvus import MilvusClient
from tqdm import tqdm
import torch
import os# 生成特征向量
def gen_image_features(processor, model, device, image):with torch.no_grad():inputs = processor(images=image, return_tensors="pt").to(device)outputs = model(**inputs)image_features = outputs.last_hidden_stateimage_features = image_features.mean(dim=1)return image_features[0]def main():# 创建Milvus客户端client = MilvusClient("http://192.168.0.5:19530")# 加载模型model_dir = "facebook/dinov2-base"processor = AutoImageProcessor.from_pretrained(model_dir)model = AutoModel.from_pretrained(model_dir)device = torch.device('cuda:0' if torch.cuda.is_available() else "cpu")model.to(device)# 读取数据集dataset_path = "./img"for image_name in tqdm(os.listdir(dataset_path)):image_path = os.path.join(dataset_path, image_name)image = Image.open(image_path)# 提取特征向量features = gen_image_features(processor, model, device, image)# 存吃至 milvusclient.insert(collection_name="dinov2_collection",data={"vector": features,"image_name": image_name})if __name__ == '__main__':main()

运行后,在 Milvus insight 工具中,可以看到存储的内容:

在这里插入图片描述

三、图图相似度检索实现 - 图像特征检索

检索就是拿着当前图像的特征,去向量数据库中检索相似的特征信息,实现过程如下:

from transformers import AutoImageProcessor, AutoModel
from PIL import Image
from pymilvus import MilvusClient
import matplotlib.pyplot as plt
import torch
import os# 生成特征向量
def gen_image_features(processor, model, device, image):with torch.no_grad():inputs = processor(images=image, return_tensors="pt").to(device)outputs = model(**inputs)image_features = outputs.last_hidden_stateimage_features = image_features.mean(dim=1)return image_features[0].tolist()def main():# 创建Milvus客户端client = MilvusClient("http://192.168.0.5:19530")# 加载模型model_dir = "facebook/dinov2-base"processor = AutoImageProcessor.from_pretrained(model_dir)model = AutoModel.from_pretrained(model_dir)device = torch.device('cuda:0' if torch.cuda.is_available() else "cpu")model.to(device)# 检索图像, 采用不在Milvus数据集中的图像image = Image.open("./img2/dog.jpeg")# 提取特征向量features = gen_image_features(processor, model, device, image)# 特征召回results = client.search(collection_name="dinov2_collection",data=[features],limit=2,output_fields=["image_name"],search_params={"metric_type": "L2","params": {}})plt.figure()plt.axis('off')for i, res in enumerate(results[0]):image_name = res["entity"]["image_name"]image_path = os.path.join("./img", image_name)image = Image.open(image_path)plt.subplot(1, 2, (i+1))plt.imshow(image)plt.show()if __name__ == '__main__':main()

测试输入检索图像:

在这里插入图片描述

召回图像:

在这里插入图片描述

测试输入检索图像:

在这里插入图片描述

召回图像:

在这里插入图片描述

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

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

相关文章

STM32高级 以太网通讯案例1:网络搭建(register代码)

需求描述 驱动W5500芯片,设置好IP,测试网络是否连通。 思考: 驱动W5500芯片是通过spi协议,所以和spi相关的有四个引脚,MOSI(主出从入)MISO(主入从出)SCK(时…

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型,它为所测试的元件提供了激励信号,可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中,也可以从…

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插:****节点尾插:****新节点插入指定节点后:**节点删除: d、单链表修改节点e、单链表遍历,并打印…

浅谈某平台多场景下反爬虫与风控业务

文章目录 1. 写在前面2. 内容反爬3. 账号风控3. 接口验签 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码? 前言什么是 GitHub1s?使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Web Bluetooth API 开发记录

搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址:https://github.com/Nor…

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题:Windows上缺少xaudio2_9.dll是什么原因? xaudio2_9.dll是DirectX音频处理库的一个组件,它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时,如果系统提示缺少xaudio2_9.dll文件&#xf…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力:空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言:马斯克Grok 2.0的横空出世 在人工智能(AI)领域,竞争从未停止。随着大型语言模型(LLM)的快速发展,各大科技巨头纷纷推出自己的AI模型,试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…

2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)

nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器,同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网:https://nginx.org/ Nginx 应用场景 静态…

C 实现植物大战僵尸(二)

C 实现植物大战僵尸(二) 前文链接,C 实现植物大战僵尸(一) 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

域内的三种委派方式

域委派:使得上游服务能使用用户凭据访问下游服务,使得下游服务根据域用户判断权限,例如: web 用户 hack ---------------访问------------------> web 服务器 ( www-data 域服务账户运行)-------------…