Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

embedded/2024/11/26 21:31:47/

上集说到语义搜索,这集接着玩一下图搜图,这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索,代码逻辑结构都很类似…

开搞

还是老地方modelscope找个Vision Transformer模型,这里选用vit-base-patch16-224,如果还想玩玩文搜图,可以选用支持多模态的multi-modal_clip-vit-base-patch16_zh

D:\python2023>modelscope download --model AI-ModelScope/vit-base-patch16-224

准备测试数据

在这里插入图片描述

运行代码

from PIL import Image
from transformers import ViTFeatureExtractor, ViTModel
import torch
import time
from elasticsearch import Elasticsearch# 初始化模型和图片特征提取器
MODEL_PATH = 'C:\\Users\\Administrator\\.cache\\modelscope\\hub\\AI-ModelScope\\vit-base-patch16-224'
feature_extractor = ViTFeatureExtractor.from_pretrained(MODEL_PATH)
model = ViTModel.from_pretrained(MODEL_PATH)def extract_features(image_path):image = Image.open(image_path)inputs = feature_extractor(images=image, return_tensors="pt")with torch.no_grad():outputs = model(**inputs)last_hidden_states = outputs.last_hidden_state# 取出CLS token的输出作为图片的特征向量features = last_hidden_states[:, 0].squeeze()return features.numpy()def store_image_features(image_id, features):doc = {'image_id': image_id,'features': features.tolist()}res = es.index(index=index_name, id=image_id, body=doc)print(res['result'])def search_similar_images(query_image_path, top_k=5):query_features = extract_features(query_image_path)body = {"size": top_k,"query": {"script_score": {"query": {"match_all": {}},"script": {"source": "cosineSimilarity(params.query_vector, 'features') + 1.0","params": {"query_vector": query_features.tolist()}}}}}response = es.search(index=index_name, body=body)similar_images = [hit['_id'] for hit in response['hits']['hits']]return similar_images# 假设有一个图片ID和路径的字典
images = {'img_dog': 'D:\\1\\dog.jpg','img_wolf': 'D:\\1\\wolf.jpg','img_person': 'D:\\1\\person.jpg','img_montain': 'D:\\1\\montain.jpg',
}
# 调用ES api创建索引
es = Elasticsearch([{'scheme':'http','host':'192.168.72.128','port':9200}])
index_name = 'image_search'
body = {"mappings": {"properties": {"features": {"type": "dense_vector","dims": 768  # ViT base模型的特征向量维度}}}
}
if not es.indices.exists(index=index_name):es.indices.create(index=index_name, body=body)
# 存储图片特征到ES
for img_id, img_path in images.items():img_features = extract_features(img_path)store_image_features(img_id, img_features)# ES向量搜索找到某张图片最相似的图片集
time.sleep(3)
similar_ids = search_similar_images("D:\\1\\test_dog.jpg")
print(f"找到的相似图片ID: {similar_ids}")

可以看到最相似的还是狗,狼也像狗所以次之,然后是人,其实相关度已经很低了,最不相关的是风景图
在这里插入图片描述

看看索引情况

图片向量ES内存使用还不大,和文本数据基本一样,主要是因为图片特征向量维度都使用了768,如果不搜索不不准确,可以调高维度,但ES内存使用会增加。反之图片干扰特征少一点,特征向量维度小一些也会有较好的搜索效果。
在这里插入图片描述


http://www.ppmy.cn/embedded/140725.html

相关文章

设计模式学习[8]---原型模式

文章目录 前言1.原理阐述2.举例 总结 前言 这个设计模式第一次听到,以为有点类似于软件工程中的一个开发模式,原型化开发模式。 原型化开发是软件开发的一种常用方法。开发人员对用户提出的问题进行总结,就系统的主要需求取得一致意见后&am…

将django+vue项目发布部署到服务器

1.部署django后端服务 部署架构 1.1 下载依赖插件 pip3.8 freeze > requirements.txt1.2 安装依赖插件 pip3 install -r requirements.txt1.3 安装mysql数据库 apt install mysql-server初始化数据库 CREATE USER admin% IDENTIFIED WITH mysql_native_password BY 123…

数据结构---队列详解

一、队列的概念与结构 概念:概念:只允许在⼀端进行插入数据操作,在另⼀端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) **入队列:**进行插入操作的一端称为队尾。 出队列:进行…

嵌入式系统与单片机工作原理详解

随着现代科技的发展,嵌入式系统已经深入到我们日常生活中的方方面面。无论是智能家居、汽车电子,还是工业控制、医疗设备,都离不开嵌入式系统的支持。而单片机作为嵌入式系统的核心组件,是实现这些功能的关键之一。本文将详细介绍…

设计模式——简单工厂模型、工厂模式、抽象工厂模式、单例模式、代理模式、模板模式

设计模式 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说&#x…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…

【机器学习】——朴素贝叶斯模型

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

《硬件架构的艺术》笔记(七):处理字节顺序

介绍 本章主要介绍字节顺序的的基本规则。(感觉偏软件了,不知道为啥那么会放进《硬件架构的艺术》这本书)。 定义 字节顺序定义数据在计算机系统中的存储格式,描述存储器中的MSB和LSB的位置。对于数据始终以32位形式保存在存储器…