Elasticsearch 8.X “图搜图”实战

news2024/11/24 22:31:55

1、什么是图搜图?

"图搜图"指的是通过图像搜索的一种方法,用户可以通过上传一张图片,搜索引擎会返回类似或者相关的图片结果。这种搜索方式不需要用户输入文字,而是通过比较图片的视觉信息来找到相似或相关的图片。这项技术在许多不同的应用中都很有用,如找到相同或相似的图片,寻找图片的来源,或者识别图片中的物体等等。

图像搜索的技术基础主要包括图像处理和机器学习等方面。通过图像处理,可以提取图像的特征(如颜色、形状、纹理等),然后通过机器学习模型比较这些特征来寻找相似的图片。近年来,深度学习也在图像搜索中发挥了重要作用,使得搜索结果更加精确和高效。

举例:谷歌“按图搜索”、百度识图。

25f40f8b90fad1e82cd93bbfcda136a4.png 152249f0f36b73543f070068f1882656.png

2、为什么要图搜索?传统搜索不香吗?

图像搜索和传统的文本搜索都有它们各自的优点和适用场合。以下是一些使用图像搜索的原因:

  • 寻找相似的图片

如果你有一张图片,想找到类似的图片,或者找到这张图片的其他版本(如不同的分辨率或是否有水印等),图像搜索是最直接的方法。

  • 找到图片的来源

如果你找到一张你喜欢的图片,但不知道它来自哪里,图像搜索可以帮你找到它的原始来源,比如说是来自哪个网站或者是谁拍摄的。

  • 识别图片中的内容

图像搜索也可以帮助你识别图片中的物体或人物。比如说,你有一张含有未知物体的图片,你可以通过图像搜索来识别它是什么。

  • 超越语言和文化障碍

有时候,你可能无法用文字准确描述你要搜索的内容,或者你不知道它的正确名称。在这种情况下,图像搜索可以帮助你找到你需要的信息,不需要考虑语言和文化的差异。

举个例子:小区里带孩子玩,遇到一个虫子,小朋友们都围过去,好奇的小朋友就问到“这个虫子叫什么名字?”家长们也都不知道,有点像小时候见过的豆虫,但又不完全一样,最终借助“百度识图”搞定答案。

总的来说,图像搜索是一个非常有用的工具,能够补充和增强传统的文本搜索。不过,它也并不是万能的,有时候还是需要配合文本搜索一起使用才能得到最好的搜索结果。

3、Elasticsearch 8.X 如何实现图搜图?

从宏观角度,类似把“大象放冰箱”的几个大步骤,Elasticsearch 8.X 要实现图搜图需要两个核心步骤:

步骤1:特征提取

使用图像处理和机器学习的方法(如卷积神经网络)来提取图像的特征。这些特征通常会被编码为一个向量,可以用来衡量图像的相似度。有一些开源的工具库可以用于图像特征提取,部分举例如下:

工具库语言主要特性
OpenCVC++,Python,Java提供多种特征提取算法,如SIFT,SURF,ORB等;同时提供一系列图像处理功能
TensorFlowPython提供预训练的深度神经网络模型,如ResNet,VGG,Inception等,用于提取图像特征
PyTorchPython提供预训练的深度神经网络模型,如ResNet,VGG,Inception等,用于提取图像特征
VLFeatC,MATLAB提供多种特征提取算法,如SIFT,HOG,LBP等

这些库都为图像特征提取提供了大量的工具和函数,可以帮助开发者快速地实现图像特征提取。需要注意的是,不同的特征提取方法可能适用于不同的任务,选择何种方法取决于特定的应用需求。

步骤2:索引和搜索

将提取出来的特征向量存储在Elasticsearch中,然后利用Elasticsearch的搜索能力来找出相似的图像。Elasticsearch的向量数据类型可以用来存储向量,而script_score查询可以用来计算相似度。

4、Elasticsearch 8.X “图搜图”实战

4.1 架构梳理

cf8a304f50e0bd5e0302b3e453addb0a.png
  • 数据层:图片数据分散在互联网上,需要采集实现。

  • 采集层:借助爬虫或者已有工具采集数据,存储到本地即可。

  • 存储层:借助向量转换工具或模型工具,遍历图片为向量存入Elasticsearch。

  • 业务层:实现图片转向量后,借助knn检索实现图搜图。

4.2 clip-ViT-B-32-multilingual-v1工具选择

sentence-transformers/clip-ViT-B-32-multilingual-v1是OpenAI的CLIP-ViT-B32模型的多语言版本。

bc59fd4bab9da2e1d2dee089f2866006.png

该模型可以将文本(50多种语言)和图像映射到一个公共的密集向量空间中,使得图像和匹配的文本紧密相连。这个模型可以用于图像搜索(用户通过大量的图像进行搜索)和多语言的图像分类(图像标签被定义为文本)。

模型地址:https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1

4.3 生成向量

如下的函数能将已有数据集图片生成向量。

model.encode(image)

生成的向量参考如下:

beac2f703fb801f2c4a7dda297a81d43.png

4.4 执行检索

POST my-image-embeddings/_search
{
  "knn"           : {
  "field"         : "image_embedding",
  "k"             : 5,
  "num_candidates": 10,
  "query_vector"  : [
      -0.7245588302612305,
      0.018258392810821533,
      -0.14531010389328003,
      -0.08420199155807495,
     .....省略.......
    ]
  },
  "fields": [
    "image_id",
    "image_name",
    "relative_path"
  ]
}

如上搜索请求使用了Elasticsearch的k-NN (k-最近邻) 插件来查找与query_vector最接近的图像。

具体的参数含义如下:

参数含义
knn表示将使用k-最近邻搜索。
field定义了执行k-NN搜索的字段。在此例中,image_embedding 字段应包含图像的嵌入向量。
num_candidates是一个控制搜索精度和性能权衡的选项。在一个大的索引中,寻找确切的k个最近邻居可能会很慢。因此,k-NN插件首先找到num_candidates个候选,然后在这些候选中找到k个最近邻居。在此例中,num_candidates: 10 ,表示首先找到10个候选,然后在这些候选中找到5个最近邻居。
query_vector要比较的查询向量。k-NN插件会计算这个向量与索引中的每个向量的距离,然后返回距离最近的k个向量。在此例中,query_vector 是一个大的浮点数列表,代表图像的嵌入向量。
fields定义了返回的字段。在此例中,搜索结果将只包含image_id,image_name,和relative_path字段。如果不指定 fields参数,搜索结果将包含所有字段。

4.5 图搜图结果展示

07ce0e92da29645631aefe4d2b60ec45.gif

de3794bae9d546bc1f7e4286e3f911cc.png

5、小结

总结一下,图搜图功能的实现重点在于两个关键的组件:Elasticsearch和预训练模型 sentence-transformers/clip-ViT-B-32-multilingual-v1。

Elasticsearch,作为一个基于Lucene的搜索服务器,为分布式多用户全文搜索提供了一个基于RESTful web接口的平台。另一方面,sentence-transformers/clip-ViT-B-32-multilingual-v1,这个预训练模型,基于OpenAI的CLIP模型,可以生成文本和图像的向量表示,这对于比较文本和图像的相似性至关重要。

在具体实现过程中,每个图像的特征都由预训练模型提取,得到的向量可以视作图像的数学表示。这些向量将存储在Elasticsearch中,为图搜图功能提供了一个高效的最近邻搜索机制。当有新的图像上传进行搜索时,同样使用预训练模型提取特征,得到向量,并与Elasticsearch中存储的图像向量进行比较,以找出最相似的图像。

整个过程体现了预训练模型在图像特征提取中的重要作用,以及Elasticsearch在进行高效最近邻搜索中的强大能力。两者的结合为图搜图功能的实现提供了一个可靠的技术支持。

参考

  • 1、https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1

  • 2、https://github.com/rkouye/es-clip-image-search

  • 3、https://github.com/radoondas/flask-elastic-image-search

  • 4、https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html

  • 5、https://unsplash.com/data

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单

  3. 如何系统的学习 Elasticsearch ?

  4. 2023,做点事

  5. Elasticsearch:普通检索和向量检索的异同?

  6. 干货 | Elasticsearch 向量搜索的工程化实战

  7. 高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索

a16c62a0e5c9a8307b5db3f5db93ddb1.jpeg

更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

c74d100ba0f9c05ab64475b103e5b302.gif

大模型时代,抢先一步学习进阶干货!

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

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

相关文章

Tomcat服务器的安装即相关介绍

一、Tomcat的安装步骤 1、访问官网下载点击此处进入Tomcat官网; 2、在下图所示位置点击想要下载的版本下载,这边演示的是以Tomcat8为演示对象; 3、进入下载页面如下图所示,根据系统类型和版本选择合适的安装包; 4、下…

Wampsever升级增加php5.6的方法过程

1、下载wampserver2.5,文件包名:wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b.exe https://sourceforge.net/projects/wampserver/files/WampServer%202/Wampserver%202.5/ 这个版本只有40M,包含: Apache-2.4.9&#x…

SpringCloud OpenFeign 学习

SpringCloud OpenFeign 文章目录 SpringCloud OpenFeign1 OpenFeign介绍2 OpenFeign-应用实例3 OpenFeign 测试 1 OpenFeign介绍 OpenFeign 是个声明式 WebService 客户端,使用 OpenFeign 让编写 Web Service 客户端 更简单 它的使用方法是定义一个服务接口然后在上…

【Java 抽象类抽象方法】什么是抽象类方法,如何定义,起什么作用?

博主:_LJaXi Or 東方幻想郷 专栏: Java | 从入门到入坟 Java 抽象类 & 抽象方法 抽象类的概念 👅抽象方法的概念 🐬抽象类和抽象方法结合使用 🦄 Java中的抽象类和抽象方法是面向对象编程中的重要概念,…

【系统学习】Java基础4之lamda表达式和函数式接口

lamda表达式与函数式接口 lamda表达式 语法格式一:无参,无返回值 Lambda 需要一个参数,但是没有返回值 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断” 语法格式四:…

MySQL和Redis之间的存储区别

概述 MySQL是一种关系型数据库,而Redis是一种键值对存储数据库。虽然它们都是用来存储和管理数据的,但是它们在很多方面都有不同,但是它们在存储策略、日志存储方式、硬盘存储、数据恢复等方面都有一定的区别。 数据类型 MySQL支持多种数据…

电脑怎么通过网络传输文件?

可以通过网络在电脑之间传输文件吗? “由于天气的原因,我的老板决定让所有员工在家工作。但是我很多工作文件都在公司的电脑中,怎么才能将公司的文件远程传输到我家里的电脑上?电脑可以通过网络远程传输文件吗?” …

计算机网络 | I/O模型、网络模型(OSI七层及TCP/IP四层)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Python快速实现网页工具的利器

Python快速实现网页工具的利器 Streamlit是一个基于Python的Web应用程序开发框架,它具有快速开发、交互式、易于使用等特点。使用Streamlit,开发者可以很容易地将Python代码转换为漂亮的、交互式的Web应用程序,无需繁琐的前端开发经验。 如果…

什么是浪涌保护器SPD

浪涌保护器(SPD),也称为电涌保护器,是为各种电子设备,仪器和通信线路提供安全保护的电子设备。当由于外部干扰在电路或通信电路中突然产生尖峰电流或电压时,浪涌保护装置可以在很短的时间内传导和分流&…

设计模式之~策略模式

策略模式(Strategy): 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 结构图: 实例: 优点: 策略模式…

MySQL行锁浅析

概述 MySQL是非常流行的关系型数据库,许多系统都使用它来存储和管理数据。在高并发环境下,为了保证数据的一致性和可靠性,数据库需要实现并发控制,其中包括锁机制。MySQL提供了两种锁类型,一种是表级锁,另…

Java遍历Map集合,获取key、value等方式

首先构建一个Map集合&#xff1a; Map<String, Integer> buynew HashMap<>();buy.put("苹果手机", 2);//添加键值对buy.put("智能手表", 1);buy.put("java书", 1);buy.put("c语言书", 1);buy.put("西瓜", 2);打…

Git已经在本地提交过文件了,但又给撤销了,恢复已经撤销的内容

Git&#xff0c;我已经在本地提交过文件了&#xff0c;也就是已经执行了git commit -m "xxx"&#xff0c;但提交完之后又给撤销了&#xff0c;撤销的还能回来嘛&#xff1f; 这种情况仍然有机会恢复它。撤销提交的方法取决于你撤销提交的方式。 说白了就是&#xff0…

背景 | 基于 Transformers 的编码器-解码器模型

!pip install transformers4.2.1 !pip install sentencepiece0.1.95 Vaswani 等人在其名作 Attention is all you need 中首创了 基于 transformer 的编码器-解码器模型&#xff0c;如今已成为自然语言处理 (natural language processing&#xff0c;NLP) 领域编码器-解码器架构…

深度解读生命周期函数

目录 前言什么是生命周期&#xff1f;生命周期的流程创建组件初始化事件和生命周期初始化组件判断渲染结构的数据与模板生成HTML结构渲染HTML结构数据更新初步销毁组件销毁组件 生命周期函数beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 前…

视觉SLAM数据集(二):EuRoC DataSet

本文展示了在微型飞行器&#xff08;MAV&#xff09;上收集的视觉惯性数据集。数据集包含立体图像、同步 IMU 测量以及精确的运动和结构地面实况。 这些数据集发表于&#xff1a;M. Burri&#xff0c;J. Nikolic&#xff0c;P. Gohl&#xff0c;T. Schneider&#xff0c;J. Reh…

运维监控Zabbix部署——详细图文讲解

运维监控Zabbix部署 简介 Zabbix 由 Alexei Vladishev 创建&#xff0c;目前由其成立的公司—— Zabbix SIA 积极的持续开发更新维护&#xff0c; 并为用户提供技术支持服务。 Zabbix 是一个企业级分布式开源监控解决方案。 Zabbix 软件能够监控众多网络参数和服务器的健康…

StarRocks案例2: 升级后性能变慢

文章目录 一. 问题描述二. 解决方案2.1 从慢查询定位2.2 定位CPU解析时间就的问题 一. 问题描述 2023-05-18 将StarRocks从2.3.0升级到2.5.5。 升级完成后&#xff0c;所有的查询均比较慢&#xff0c;前端报表页面点开也卡。 二. 解决方案 2.1 从慢查询定位 StarRocks慢查询…

智慧档案馆十防一体化建设主要设计依据

1、《中华人民共和国档案法》 2、《中华人民共和国档案实施办法》 3、GB/T 9386-1988《计算机软件测试文件编制规范》 4、GB/T 15532-1995《计算机软件单元测试规范》 5、GB/T 30961-2014 嵌入式软件质量度量 6、GB2421-89 电工电子产品基本环境试验规程 7、GB16796-2009…