Elasticsearch 8.X进阶搜索之“图搜图”实战

Elasticsearch 8.X “图搜图”实战

1、什么是图搜图?

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

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

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

img

img

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 架构梳理

img

  • 数据层:图片数据分散在互联网上,需要采集实现。
  • 采集层:借助爬虫或者已有工具采集数据,存储到本地即可。
  • 存储层:借助向量转换工具或模型工具,遍历图片为向量存入Elasticsearch。
  • 业务层:实现图片转向量后,借助knn检索实现图搜图。

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

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

img

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

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

4.3 生成向量

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

model.encode(image)

生成的向量参考如下:

img

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 图搜图结果展示

img

img

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

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

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

相关文章

认识微服务---Spring Cloud

一、服务架构演变 1、单体架构:将业务的所有功能集中在一个项目开发,打包成一个部署。 优点: 架构简单部署成本低 缺点: 耦合度高不利于大型项目开发 2、分布式架构 :根据业务功能对系统进行拆分,每个…

自检服务器,无需服务器、不用编程。

自检服务器,无需服务器、不用编程。 大家好,我是JavaPub. 这几年自媒体原来热,很多人都知道了个人 IP 的重要性。连一个搞中医的朋友都要要做一个自己的网站,而且不想学编程、还不想花 RMB 租云服务。 老读者都知道&#xff0c…

Android : 使用GestureOverlayView进行手势识别—简单应用

示例图: GestureOverlayView介绍: GestureOverlayView 是 Android 开发中用于识别和显示手势的视图组件。它允许用户在屏幕上绘制手势,并且应用程序可以检测和响应这些手势。以下是关于 GestureOverlayView 的主要特点: 手势识别…

OpenHarmony南向之Camera简述

Camera驱动框架 该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层: HDI实现层:实现OHOS(OpenHarmony Operation System)相机标准南向接口。框架层:对接HDI实现层的控制、流的转发&#x…

无需翻墙|Stable Diffusion WebUI 安装|AI绘画

前言 最近终于有机会从围墙里往外看,了解到外面的世界已经有了天翻地覆的变化,感叹万千,笔者在本地mac,windows,linux,docker部署了不下20遍后,整理出来的linux极简避坑安装方案,供…

[Angular] 笔记 19:路由参数

油管视频 Route Parameters 路由参数是跟在 url 后面的数字,字符串,或者 数字字符串,例如如下 url 中的 123,此类参数会传给后端: www.facebook.com/profile/123 首先将 pokemon-template-form 组件移到 pokeman-ba…

Unity Meta Quest 一体机开发(十二):【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮

文章目录 📕教程说明📕给玩家配置 HandPokeInteractor📕用 3D 物体制作可以被点击的 UI 按钮⭐搭建物体层级⭐给物体添加脚本⭐为脚本变量赋值 📕模仿官方样例按钮的样式📕在按钮上添加文字📕修改按钮图片 …

计算机网络 VLAN

路由器将多个局域网连接起来,而交换机将一个局域网里的设备连接起来。 路由器的端口分配局域网的网段(子网网段),局域网的内部设备的ip都在这个网段里,再由交换机将数据派发到目的设备,交换机是按照MAC地址…

【Spark精讲】一文讲透SparkSQL物理执行计划

SparkSQL整体计划生成流程 大体分三步: (1)由 SparkSqlParser 中的 AstBuilder执行节点访问,将语法树的各种Context节点转换成对应的 LogicalPlan 节点,从而成为一棵未解析的逻辑算子树(Unresolved LogicalPlan),此时的逻辑算子树…

k8s之kudeadm

kubeadm来快速的搭建一个k8s的集群: 二进制搭建适合大集群,50台以上主机 kubeadm更适合中小企业的业务集群 master:192.168.233.91 docker kubelet lubeadm kubectl flannel node1:192.168.233.92 docker kubelet lubeadm kubectl flannel…

vscode连接linux服务器

目录 下载vscode,这是微软开源软件,打开后到下载扩展页面 在下载扩展页面下载中文和ssh远程连接扩展 安装后会在左边新生成一个图标点击齿轮 选择第一个 配置连接信息 远程隧道右边刷新,等刷出来hostname的主机后 连接ip出来后&#x…

EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了

EasyNTS上云平台可通过远程访问内网应用,包含网络桥接、云端运维、视频直播等功能,极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务,提供直播上云、设备上云、业务上云、运维上云服务,承上…

云计算:OpenStack 配置云主机实例的存储挂载并实现外网互通

目录 一、实验 1. 环境 2.配置存储挂载 3.云主机实例连接外部网络(SNAT) 4.外部网络连接云主机实例(DNAT) 二、问题 1.云主机 ping 不通外部网络 2.nova list 查看云主机列表报错 3.nova list 与 virsh list --all有何区…

jvm实战之-常用jvm命令的使用

各命令的使用 JMAP 1、查看内存信息,对象实例数、对象占有大小 jmap -histo 进程号>./log.txt2、查看堆的配置信息和使用情况 jmap - heap 进程号3、将堆的快照信息dump下来,使用java自带的jvisualvm.exe打开分析 jmap -dump:formatb,filedump.h…

安装Windows版本沐神的autocut

参考 下载完autocut以后 1 下载ffmpeg

楼宇智慧能源消耗监测管理系统,楼宇中的能源“管家”

随着人口的增加,楼宇数据呈上涨趋势,但是楼宇智能建设在我国普及性远远不足,相比传统楼宇控制,智能楼宇控制系统对于楼宇内部的用电设备控制,能够更加的节约能源,降低成本。对于现代化楼宇而言,…

SVM(支持向量机)-机器学习

支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习算法。它属于机器学习中的一类强大而灵活的模型,广泛应用于模式识别、图像分类、自然语言处理等领域。 基本原理: SVM的基本原理是通过找到能够有效分…

o2o生活通全开源尊享版+多城市切换+企业付款+交友IM+平台快报

搭建教程 1.把 pigo2ov282.sql 文件里面的网址 test.souho.net 全部批量替换为你的自己的 2.使用 phpmyadmin 导入 pigo2ov282.sql 到你的数据库(直接访问/phpmyadmin 即可) 3.修改数据库文件/conf/db.php 里的数据库连接信息(请勿使用记事本…

数据结构入门到入土——ArrayList与顺序表

目录 一,线性表 二,顺序表 1.接口实现 三,ArrayList简介 四,ArrayList使用 1.ArrayList的构造 2.ArrayList常见操作 3.ArrayList的遍历 4.ArrayList的扩容机制 五,ArrayLisit的具体使用 杨辉三角 一&#x…

如何使用ArcGIS Pro自动矢量化建筑

相信你在使用ArcGIS Pro的时候已经发现了一个问题,那就是ArcGIS Pro没有ArcScan,在ArcGIS Pro中,Esri确实已经移除了ArcScan,没有了ArcScan我们如何自动矢量化地图,从地图中提取建筑等要素呢,这里为大家介绍…