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

devtools/2024/11/23 13:14:45/

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

开搞

还是老地方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/devtools/136303.html

相关文章

百度Q3财报:净利润增长17%超预期 文心大模型日调用量增30倍达15亿

发布 | 大力财经 11月21日晚,百度发布2024年第三季度财务报告,显示季度总营收336亿元,百度核心营收265亿元,归属百度核心的净利润75.4亿元,同比增长17%,超出市场预期。财报显示,11月&#xff0…

【大数据获客】销售拓客秘籍:线上渠道探寻与选择

在销售领域,很多人觉得完成不了业绩,很大原因在于不认识人,缺乏客情,感觉没有资源,导致前期工作难以开展。 其实,B 端销售找客户并非难事。新人入行,可跟随前辈学习。若已入行一段时间却苦于无…

如何用AI写小说(二):Gradio 超简单的网页前端交互

上一篇写了基本的生成小说的脚本,但脚本终归是很丑的代码,不符合优雅的调性,在 huggingface 大家经常用一个叫 gradio 的东西来写交互,虽然我没有什么前端基础,但是这个gradio最大的特点就是简单!简单&…

布隆过滤器(超详细!!!含图解)

前言 通过对于位图的认识,位图对于整形的适用比较好,当我们想要进行字符串的映射时,需要将字符串进行转化成整形,但是字符串的来说,当字符串的长度较长时就会显得苍白无力,表示字符的ASCII值有256种&#x…

力扣——寻找峰值

题目 162. 寻找峰值 - 力扣(LeetCode) 思路 第一想法就是直接遍历,时间复杂度为O(n),肯定超时了。 然后就想到用二分,但是数组又不一定是有序的。仔细一思考,好像也可以用,关键在于这个峰值…

yolo自动化项目实例解析(九) 导航

比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、终点) 一、录制轨迹 从平面角度来看,我们可以把区域视…

Linux搭建MiniO

1、第一步,进入/opt目录,创建minio文件夹 输入以下命令 cd /opt mkdir minio 2、wget下载安装包 wget https://dl.minio.io/server/minio/release/linux-amd64/minio 3、在minio文件夹中创建log文件 cd /minio touch minio.log 4、修改权限 chmod 77…

Mybatis框架之单例模式 (Singleton Pattern)

MyBatis 框架中也使用到了单例模式 (Singleton Pattern),主要体现在 SqlSessionFactory 的创建和管理上。通过单例模式,MyBatis 可以确保整个应用程序中只创建一个 SqlSessionFactory 实例,从而有效地管理数据库连接资源并提高性能。下面将详…