使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统

作者:来自 Elastic James Gallagher

了解如何使用 Roboflow Inference 和 Elasticsearch 构建强大的语义图像搜索引擎。

在本指南中,我们将介绍如何使用 Elasticsearch 中的 KNN 聚类和使用计算机视觉推理服务器 Roboflow Inference 计算的 CLIP 嵌入构建图像检索系统。

Roboflow Universe 是网络上最大的计算机视觉数据存储库,托管超过 1 亿张图像,它使用 CLIP 嵌入为我们的数据集搜索引擎提供高效的语义查询。

不用多说,让我们开始吧!

CLIP 和 Roboflow 推理简介

CLIP(Contrastive Language-Image Pretraining - 对比语言-图像预训练)是 OpenAI 开发的一种计算机视觉模型架构和模型。该模型于 2021 年根据 MIT 许可发布。

该模型的训练目的是 “根据图像预测最相关的文本片段”。在此过程中,CLIP 学会了通过模型使用的向量来识别图像和文本之间的相似性。 CLIP 将图像和文本映射到向量空间。这允许向量比较并找到与文本查询相似的图像,或与另一幅图像相似的图像。

CLIP 等多模式模型的进步使得构建语义图像搜索引擎变得比以往任何时候都更容易。

像 CLIP 这样的模型可用于创建捕获有关图像或文本查询的语义信息的 “嵌入”。向量嵌入是一种数据表示类型,它将单词、句子和其他数据转换为捕捉其含义和关系的数字。

Roboflow Inference 是一款高性能计算机视觉推理服务器。 Roboflow Inference 支持各种最先进的视觉模型,从用于物体检测的 YOLO11 到用于视觉问答的 PaliGemma 再到用于多模态嵌入的 CLIP。

你可以将 Roboflow Inference 与 Python SDK 一起使用,或者在 Docker 环境中使用。

在本指南中,我们将使用 Inference 计算 CLIP 嵌入,然后将它们存储在 Elasticsearch 集群中,以用于构建图像检索系统。

先决条件

要遵循本指南,你需要:

  • 支持 KNN 搜索的 Elasticsearch 实例
  • 免费的 Roboflow 帐户
  • Python 3.12+

我们准备了一个 Jupyter Notebook,你可以在计算机上或 Google Colab 上运行它,以便按照本指南使用。打开笔记本。

步骤#1:设置支持 KNN 的 Elasticsearch 索引

对于本指南,我们将使用 Elasticsearch Python SDK。你可以使用以下代码来安装它:

pip install elasticsearch

如果你尚未设置 Elasticsearch 集群,请参阅 Elasticsearch 文档以开始使用。

注:你也可以阅读文章 “使用 start-local 脚本在本地运行 Elasticsearch” 开始使用。

安装 SDK 并设置集群后,创建一个新的 Python 文件并添加以下代码以连接到客户端:

from elasticsearch import Elasticsearch

client = Elasticsearch(
	"https://localhost:9200",
	 api_key=“your-api-key",
)

要在 Elasticsearch 中运行嵌入搜索,我们需要一个包含 density_vector 属性类型的索引映射。对于本指南,我们将创建一个包含两个字段的索引:一个包含与图像相关的 CLIP 嵌入的密集向量,以及一个与图像相关的文件名。

运行以下代码来创建索引:

client.indices.create(
	index="knn",
	body={
    	"mappings": {
        	"properties": {
            	"vector": {
                	  "type": "dense_vector",
                	  "dims": 512,
                   "similarity": "cosine",
            	},
            	"filename": {
                	  "type": "keyword",
            	},
        	},
    	},
	}
)

输出应类似于以下内容:

ObjectApiResponse({'acknowledged': True, 'shards_acknowledged': True, 'index': 'knn'})

KNN 搜索使用的默认索引类型是 L2 Norm,也称为欧几里得距离。此距离度量不适用于 CLIP 相似度。因此,上面我们明确表示我们想要创建余弦相似度索引。CLIP 嵌入与余弦相似度相比效果最好。

对于本指南,我们将使用具有 512 个维度的 CLIP 模型。如果你使用其他 CLIP 模型,请确保将 dims 值设置为 CLIP 模型返回的向量的维数。

步骤 2:安装 Roboflow Inference

接下来,我们需要安装 Roboflow Inference 和 Supervision,这是一个用于处理视觉模型预测的工具。你可以使用以下命令安装所需的依赖项:

pip install "inference[clip]" supervision

这将安装 Roboflow Inference 和我们将用于计算向量的 CLIP 模型扩展。

安装 Roboflow Inference 后,我们可以开始计算和存储 CLIP 嵌入。

步骤 3:计算和存储 CLIP 嵌入

在本指南中,我们将为 COCO 128 数据集构建一个语义搜索引擎。此数据集包含从更大的 Microsoft COCO 数据集中采样的 128 张图像。COCO 128 中的图像多种多样,使其成为用于测试我们的语义搜索引擎的理想数据集。

要下载 COCO 128,首先创建一个免费的 Roboflow 帐户。然后,导航到 Roboflow Universe(Roboflow 的开放计算机视觉数据集社区)上的 COCO 128 数据集页面。

单击 “Download Dataset”:

选择 “YOLOv8” 格式。选择显示下载代码的选项:

复制终端命令以下载数据集。该命令应如下所示:

curl -L "https://universe.roboflow.com…r" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

运行该命令时,数据集将下载到你的计算机并解压。

我们现在可以开始计算 CLIP 嵌入。

从之前的 Python 文件中添加以下代码,然后运行完整文件:

from inference.models import Clip
import os

IMAGE_DIRECTORY = "./COCO-128-2/train/images"

# See a full list of supported models at
# https://inference.roboflow.com/foundation/clip/#how-can-i-use-clip-model-in-inference
clip = Clip(model_id="clip/ViT-B-16")

# create index if it doesn't exist for KNN with two fields: vector and file name
for file in os.listdir(IMAGE_DIRECTORY):
	if not file.endswith(".jpg"):
    	continue
 	 
	image_path = os.path.join(IMAGE_DIRECTORY, file)
	vector = clip.embed_image(image_path)

	client.index(
    	index="demo",
    	body={
        	"vector": vector.tolist()[0],
        	"filename": file,
    	}
	)

这段代码会遍历 COCO 128 数据集训练集中的所有图像,并通过 Roboflow Inference 使用 CLIP 模型对它们进行处理。然后,我们将生成的向量与每个向量关联的文件名一起索引到 Elasticsearch 中。

CLIP 模型权重可能需要 1-2 分钟才能下载。完成此操作时,你的脚本将暂时暂停。然后,CLIP 模型权重将缓存在你的系统中以供将来使用。

注意:运行上述代码时,你可能会看到一些与 ExecutionProviders 相关的警告。这与 Inference 中针对不同设备的可用优化有关。例如,如果你在 CUDA 上部署,CoreMLExecutionProvide 将不可用,因此会发出警告。看到这些警告时无需采取任何措施。

步骤 4:从 Elasticsearch 检索数据

索引数据后,即可运行测试查询!

要使用文本作为输入,你可以使用此代码检索用于运行搜索的输入向量:

query_vector = clip.embed_text("coffee")

要使用图像作为输入,你可以使用以下代码:

query_vector = clip.embed_image(“path/to/image”)

在本指南中,我们使用查询“coffee”运行文本搜索。

我们将使用 k-最近邻 (k-nearest neighbours - KNN) 搜索。此搜索类型接受输入嵌入并在我们的数据库中查找嵌入与输入相似的值。KNN 搜索通常用于向量比较。

KNN 搜索始终返回前 k 个最近邻。如果 k = 3,Elasticsearch 将返回与输入向量最相似的三个文档。

使用 Elasticsearch, 你可以在几毫秒内从大型向量存储中检索结果。

我们可以使用以下代码运行 KNN 搜索:

import supervision as sv
from PIL import Image

response = client.search(
	index="demo",
	body={
    	"query": {
        	"knn": {
            	"field": "vector",
            	"query_vector": query_vector.tolist()[0],  # The input vector
            	"k": 3
        	}
    	}
	}
)

images = [Image.open(os.path.join(IMAGE_DIRECTORY, i["_source"]["filename"])) for i in response["hits"]["hits"][:3]]

sv.plot_images_grid(images, grid_size=(1, 3))

上面的 k 值表示应从每个分片中检索多少个最近的向量。查询的大小参数决定要返回多少个结果。由于我们在此演示中使用一个分片,因此查询将返回三个结果。

我们的代码返回:

我们已成功运行语义搜索并找到与输入查询相似的图像!上面,我们可以看到三张最相似的图像:一张户外桌子上的咖啡杯和蛋糕的照片,然后是我们索引中的两张桌子上有咖啡杯的重复图像。

结论

借助 Elasticsearch 和 Roboflow Inference 中的 CLIP 功能,你可以创建一个多模态搜索引擎。你可以使用搜索引擎进行图像检索、图像比较和重复数据删除、带有视觉提示的多模态检索增强生成等。

Roboflow 大规模使用 Elasticsearch 和 CLIP。我们存储了超过 1 亿个 CLIP 嵌入并对其进行索引,以供希望大规模搜索数据集的客户进行多模态搜索。随着我们平台上的数据从数百张图像增长到数亿张,Elasticsearch 实现了无缝扩展。

要了解有关使用 Roboflow Inference 的更多信息,请参阅 Roboflow Inference 文档。要为你的下一个计算机视觉项目查找数据,请查看 Roboflow Universe。

想要获得 Elastic 认证?了解下一次 Elasticsearch 工程师培训何时开始!

Elasticsearch 包含许多新功能,可帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在本地机器上试用 Elastic。

原文:Build a multimodal image retrieval system using KNN search and CLIP embeddings - Elasticsearch Labs

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LogicFlow 一款流程图编辑框架

LogicFlow是什么 LogicFlow是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…

《HelloGitHub》第 106 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…

【微服务与分布式实践】探索 Dubbo

核心组件 服务注册与发现原理 服务提供者启动时,会将其服务信息(如服务名、版本、所在节点的网络地址等)注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表,并与之通信。注册中心会存储服务的信息&#xff0c…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)

7.3. 查询计划相关操作符 38)Flow Distinct:该操作符扫描其输入并对其去重。该操作符从其输入得到每行数据时即将其返回(除非其为重复数据行,此时,该数据行会被抛弃),而Distinct操作符在产生任何输出前将消费所有输入。该操作符为逻辑操作符。该操作符具体如图7.2-38中…

【AI】【本地部署】OpenWebUI的升级并移植旧有用户信息

【背景】 OpenWebUI的版本升级频率很高,并会修改旧版本的Bug,不过对于已经在使用的系统,升级后现有用户信息都会丢失,于是研究如何在升级后将现有的用户信息移植到升级后版本。 【准备工作】 OpenWebUI的升级步骤在Docker中有现…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.19 排序革命:argsort的十大高阶用法

1.19 排序革命:argsort的十大高阶用法 目录 #mermaid-svg-Qu8PcmLkIc1pOQJ7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qu8PcmLkIc1pOQJ7 .error-icon{fill:#552222;}#mermaid-svg-Qu8PcmLkIc1pOQJ…

分布式数据库应用实践:架构设计与性能优化

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在当今数据驱动的世界中,分布式数据库因其高可用性、可扩展性和强大的容错能力,已成为现代企业存储…

实战纪实 | 真实HW漏洞流量告警分析

视频教程在我主页简介和专栏里 目录: 一、web.xml 文件泄露 二、Fastjson 远程代码执行漏洞 三、hydra工具爆破 四、绕过验证,SQL攻击成功 五、Struts2代码执行 今年七月,我去到了北京某大厂参加HW行动,因为是重点领域—-jr&…

一组开源、免费、Metro风格的 WPF UI 控件库

前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库:MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库,提供了现代化、平滑和美观的控件和样式,帮助开发人员轻松创建具有现代感的 Win…

12 款开源OCR发 PDF 识别框架

2024 年 12 款开源文档解析框架的选型对比评测:PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章,聚焦于智能文档处理(特别是 PDF 解析)。无论是在模型预训练的数据收集阶段,还是基于 RAG…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL 🏠 基本查询回顾 假设有以下表结构: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为…

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里,jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…

【Docker】快速部署 Nacos 注册中心

【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能,帮助开发者更轻松地构建微服务架构。 步骤 拉取镜像 docker pull nacos/nacos-server启动容器…

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法,利用光流信息和相邻帧的信息来恢复纹理和对象,同时通过视觉Transformer完成被遮挡区域的修复。然而,这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…

【JavaEE进阶】图书管理系统 - 壹

目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…

[权限提升] 操作系统权限介绍

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,我们通过 Web 漏洞拿到的 Web 进程的…

【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析&#xff0c…

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码,你可以按照以下步骤操作: 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后,使用 passwd 命令来修改密码: passwd 系统会提…