Elasticsearch向量检索需要的数据集以及768维向量生成

打印 上一主题 下一主题

主题 1041|帖子 1041|积分 3123

Elasticsearch8.17.0在mac上的安装
Kibana8.17.0在mac上的安装
Elasticsearch检索方案之一:使用from+size实现分页
快速把握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)
Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
1、面临的重要题目

对于elasticsearch的向量检索的学习,我打算做一个图片检索的方案,图片检索在自动驾驶、ai识图、搜刮都有广泛的应用,因此就借着学习elasticsearch的时机,设计一个mvp版本的图像搜刮方案,以供有需要的各位小伙伴参考。
在学习向量检索之前,数据是基石,从那里找上几千张图片,而且还有有一定的代表性,又如何将这些图片转化成向量,都是首先要办理的题目。
2、探求数据集

12月中旬去阿里到场了elastic的线下meetup,当时阿里同学分享了一个向量测试的性能数据,我对这个数据印象非常深刻,于是在问答环节,请教了这个性能数据测试使用了多大的数据量,索引巨细多少等题目,当时说到了一个数据集:ANN_GIST1M 960维,我们可以从这里下载到它:
  1. http://corpus-texmex.irisa.fr/
复制代码
下载解压后:

这些文件数据,需要使用matlab读取,咱也不太懂,照旧找找图片的吧,再用模型跑一下就能出向量。
之后搜刮了一些公开的图片数据集,找到了一个小猫、小狗数据集,这个挺有意思,小猫1000张图片,小狗1000张图片,除了训练集还有200张评测集,就用它了,我将数据集上传到了github上,点击查看
https://github.com/liupengh3c/career/tree/main/cats_and_dogs_v2需要的同学可以自取。

 这样数据集的题目就办理了,接下来办理抽取图像特征的题目。
3、探求开源模型,抽取图像特征

本想着网上找个免费的api,输入图片,返回图片768维的特征向量,最后没有找到,只好求助于团队内算法同学,他给推荐了一个openai的开源模型:
  1. https://hf-mirror.com/openai/clip-vit-large-patch14/tree/main
复制代码
这里所有的文件都需要下载下来:

并汇总放到一个文件夹下,之后编写python代码,用此模型抽取图片特征:
  1. import torch
  2. from PIL import Image
  3. from transformers import CLIPProcessor, CLIPModel
  4. import numpy as np
  5. # 加载预训练的CLIP模型和处理器
  6. model = CLIPModel.from_pretrained("/Users/liupeng/Downloads/clip-vit-large-patch14")
  7. processor = CLIPProcessor.from_pretrained("/Users/liupeng/Downloads/clip-vit-large-patch14")
  8. # 加载图像并进行预处理
  9. image = Image.open("/Users/liupeng/Downloads/dog.11001.jpg")  # 替换为你的图像路径
  10. inputs = processor(images=image, return_tensors="pt")
  11. # 提取图像特征
  12. with torch.no_grad():
  13.     image_features = model.get_image_features(**inputs)
  14. print("shape:",image_features.shape)
  15. # 对图像特征进行 L2 归一化
  16. # 使用 .norm() 计算 L2 范数并进行归一化
  17. image_features_normalized = image_features / image_features.norm(p=2, dim=-1, keepdim=True)
  18. numpy_array = image_features_normalized.numpy()
  19. # 打印归一化后的特征和特征的模长(应该为 1)
  20. print("归一化后的图像特征:", numpy_array[0])
  21. print("归一化后的模长:", image_features_normalized.norm(p=2, dim=-1))  # 应该接近 1
复制代码
上面代码实现了单张图片特征提取,后面根据需求再美满。
4、向量索引设计

向量检索,最大的呆板瓶颈就是内存,因此我们在设计索引时,应该最大限度的包管内存的占用最低,即使牺牲掉部分精度。
而检索算法:KNN(近来邻检索),它的原理是:计算待查询向量与数据库中所有向量之间的间隔,然后按照间隔从小到大排序,选择间隔近来的 K 个向量作为查询结果。KNN 算法的长处是可以包管正确的结果,但是服从较低,不是elastic的默认检索算法,大家可以参考这篇文章:
ElasticSearch向量检索技能方案介绍,
为了提拔向量检索的服从、降低呆板内存占用,elastic采用HNSW算法支持向量检索,HNSW是一种近似紧邻检索,牺牲了一定的精度,但是大大提拔了检索的服从。
对于向量索引,我们只设计3个字段:
  1. name:本张图片小动物名称,猫or狗
  2. IFV:本章图片向量
  3. path:图片路径或地址
复制代码
其中检索算法采用hnsw,并使用int8量化,以减少内存占用,这样会牺牲一定的精度,同时磁盘占用量会增加25%左右,向量间隔计算逻辑为欧氏间隔: 
  1. PUT /vector_search_202412
  2. {
  3.     "mappings": {
  4.         "properties": {
  5.             "name": {
  6.                 "type": "keyword",
  7.                 "ignore_above": 256
  8.             },
  9.             "path": {
  10.                 "type": "keyword",
  11.                 "ignore_above": 256
  12.             },
  13.             "IFV": {
  14.                 "type": "dense_vector",
  15.                 "index": true,
  16.                 "dims": 768,
  17.                 "similarity": "l2_norm",
  18.                 "index_options": {
  19.                     "type": "int8_hnsw"
  20.                 }
  21.             }
  22.         }
  23.     }
  24. }
复制代码
5、全部数据集抽取特征并入库

首先调解我们抽取特征脚本,增加遍历文件夹所有图片+写入es部分:
  1. import torch
  2. from PIL import Image
  3. from transformers import CLIPProcessor, CLIPModel
  4. import numpy as np
  5. import os
  6. from elasticsearch import Elasticsearch, helpers
  7. # Elasticsearch服务器地址和端口
  8. host = 'https://localhost:9200'
  9. # 用户名和密码
  10. username = 'elastic'
  11. password = 'xpE4DQGWE9bCkoj7WXYE'
  12. # 创建Elasticsearch客户端实例,并提供用户名和密码
  13. es = Elasticsearch(hosts=[host], http_auth=(username, password), verify_certs=False,ca_certs="/Users/liupeng/Documents/study/elasticsearch-8.17.0/config/certs/http_ca.crt")
  14. # 检查连接是否成功
  15. if not es.ping():
  16.     print("无法连接到Elasticsearch")
  17.     exit()
  18. else:
  19.     print("成功连接到Elasticsearch")
  20. # 现在你可以使用es变量来与Elasticsearch进行交互了
  21. # 加载预训练的CLIP模型和处理器
  22. model = CLIPModel.from_pretrained("/Users/liupeng/Documents/career/clip-vit-large-patch14")
  23. processor = CLIPProcessor.from_pretrained("/Users/liupeng/Documents/career/clip-vit-large-patch14")
  24. # 加载图像并进行预处理
  25. # folder = "/Users/liupeng/Documents/career/cats_and_dogs_v2/train/cats"
  26. folder = "/Users/liupeng/Documents/career/cats_and_dogs_v2/train/dogs"
  27. for root, dirs, files in os.walk(folder):
  28.     index_id = 1000
  29.     for file in files:
  30.         index_id += 1
  31.         print(os.path.join(root, file))
  32.         image = Image.open(os.path.join(root, file))  
  33.         inputs = processor(images=image, return_tensors="pt")
  34.         # 提取图像特征
  35.         with torch.no_grad():
  36.             image_features = model.get_image_features(**inputs)
  37.         print("shape:",image_features.shape)
  38.         # 对图像特征进行 L2 归一化
  39.         # 使用 .norm() 计算 L2 范数并进行归一化
  40.         image_features_normalized = image_features / image_features.norm(p=2, dim=-1, keepdim=True)
  41.         numpy_array = image_features_normalized.numpy()
  42.         # 打印归一化后的特征和特征的模长(应该为 1)
  43.         # print("归一化后的图像特征:", numpy_array[0])
  44.         # print("归一化后的模长:", image_features_normalized.norm(p=2, dim=-1))  # 应该接近 1
  45.         documents = [
  46.             {"name": "cat_"+str(index_id), "IFV": numpy_array[0].tolist(),"path":file},
  47.         ]
  48.         helpers.bulk(es, [
  49.             {
  50.                 "_index": "vector_search_202412",
  51.                 "_id": index_id,
  52.                 "_source": doc
  53.             }
  54.             for doc in documents
  55.         ])
复制代码
上面代码,由于数据集中小猫和小狗是两个差别的文件夹,以是需要跑2次,小猫和小狗各一次。
同期间码都已上传到github上: 
  1. https://github.com/liupengh3c/career/blob/main/features/main.py
复制代码
推理过程很泯灭资源,mac的风扇呼呼的转呀。

占用的空间巨细35M:

 到这里向量数据就全部入库完成了。

新的一年。就让我们对过去所有开心的事做个总结,对不开心的所有事也做个告终,微笑着迎接属于我们所有人的2025年,祝我可爱的小伙伴们新年快乐。 

天亮了,去跑个20.25km迎接新一年的到来~~~~~~~~~~~~~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表