使用elasticSearch的向量检索实现以图搜图
前言
项目地址:https://github.com/xjhqre/sis/tree/v1.0
在搭建本地以图搜图服务文章中实现了以图搜图,但还是存在一些问题,程序启动时需要加载大量的特征文件到内存中,每次程序启动时都需要花上十几分钟。
而在使用elasticSearch实现以图搜图文章中使用了elasticsearch来检索图片的描述。但是精准度不高,而且图片的训练速度有点慢
于是我想直接把特征数组直接存入elasticsearch来做检索。于是我查了一下elasticsearch能否存储向量数据,刚好找到了dense_vector
这个数据结构,并且elasticsearch也提供了几种算法来计算向量之间的相似度。
快速开始
安装elasticsearch和kibana
需要注意dense_vector向量数据结构是在elasticsearch7.2版本之后加入的。
安装步骤可以直接看我的这篇文章全文检索-ElasticSearch里的docker安装目录
创建索引
在kibana里创建索引
# 创建索引结构
PUT imgsearch
{
"mappings": {
"properties": {
"feature": {
"type": "dense_vector",
"dims": 1024
},
"url": {
"type": "keyword"
},
"name": {
"type": "keyword"
}
}
}
}
其他的命令:
# 删除索引数据
DELETE imgsearch
# 查询索引数据
GET imgsearch/_search
# 查询索引
GET imgsearch
下载项目
https://github.com/xjhqre/sis/tree/v1.0
项目里有三个主要文件:
- config.py:修改配置
- offline.py:提取图片特征保存到elasticsearch
- server_oss.py:启动web服务检索图片
1、修改elasticsearch配置,将以上两个文件里的elasticsearch的IP地址改为自己的
2、修改两个文件中的图片路径,我的图片是放在OSS上的。可以把地址修改为./static/img/
3、运行offline.py文件查看elasticsearch是否存入数据
4、若以上步骤无误后启动server_oss.py,访问http://localhost:5000/即可
效果展示
总结
优点:
- 不需要.npy文件
- 程序秒启动
- 图片检索速度快
- 特征数据备份方便,只需要备份elasticsearch的索引
缺点:
- 图片检索准确度可能会有所降低,因为elasticsearch的dense_vector数据结构最多支持的数组大小为1024。而图片提取的特征尺寸为4096,对特征数组做了切片
参考资料
- Elasticsearch——向量检索
- https://blog.csdn.net/qq_35550345/article/details/120531684