当前位置:   article > 正文

Milvus 向量数据库实践 - 1_miluvs

miluvs

假定你已经安装了docker、docker-compose 环境

参考的文档如下:

        Milvus技术探究 - 知乎

         MilvusClient() - Pymilvus v2.3.x for Milvus

         一文带你入门向量数据库milvus

一、在docker上安装单机模式milvus数据库

     1、 进入milvus官网: Install Milvus Standalone with Docker Compose Milvus documentation

     2、 复制并执行以下执行命令:            

  1. # 下载docker-compose文件
  2. wget https://github.com/milvus-io/milvus/releases/download/v2.3.10/milvus-standalone-docker-compose.yml -O docker-compose.yml
  3. # 执行docker-compose
  4. sudo docker compose up -d

     3、查看应用是否全部成功启动了:docker ps -a     

     4、 执行docker-compose命令后,可能会出现 milvus-standalone 服务无法正常启动的情况,此时可长时间更改 milvus 的版本后再试试

      5、安装 milvus 的可视化操作控制台:Attu

  1. # MILVUS_URL 是 milvus的连接地址,这个不重要,因为在可视化控制台可以修改
  2. docker run -p 8000:3000 -e MILVUS_URL=127.0.0.1:19530 zilliz/attu:v2.3.0

      6、浏览器打开:http://192.168.3.32:8000/

        

       

         7、预先创建一个collection,方便接下来用代码来测试实际效果        

         

 

二、使用python 测试图片的向量存储与检索:

   注意:实际使用发现 使用ResNet50模型更加方便一点,主要是dimension的维度不会特别大,milvus的向量维度最大支持:32768。 而使用MobileNetV2模型的话,提取的图片向量特征的dimension为62720。所以为了方便运行代码,体验milvus,直接使用ResNet50模型。

  1、直接上代码

  1. import tensorflow as tf
  2. from PIL import Image
  3. from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
  4. from tensorflow.keras.preprocessing import image
  5. import numpy as np
  6. from pymilvus import MilvusClient
  7. import os
  8. # 初始化Milvus连接
  9. milvus_client = MilvusClient(uri='http://192.168.3.32:19530')
  10. # 创建一个集合来存储图片向量
  11. collection_name = 'image_vectors'
  12. vector_dim = 1000 #向量维度
  13. field_name = 'vec' #向量字段
  14. # 加载预训练的ResNet50模型
  15. model = ResNet50(weights='imagenet', include_top=True)
  16. # 提取图片向量
  17. def getFilefeatureVector1(image_path):
  18. img = image.load_img(image_path, target_size=(224, 224))
  19. img_array = image.img_to_array(img)
  20. img_array = np.expand_dims(img_array, axis=0)
  21. img_array = preprocess_input(img_array)
  22. # 使用模型提取特征
  23. feature_vector = model.predict(img_array)
  24. feature_vector = np.squeeze(feature_vector, axis=0)
  25. return feature_vector;
  26. # 待测试图片的文件夹目录
  27. image_folder = '/data/files/milvus/'
  28. # 遍历文件夹下的所有图片,提取特征并存储到Milvus
  29. def saveFileFeatureVector():
  30. i=1
  31. for filename in os.listdir(image_folder):
  32. image_path = os.path.join(image_folder, filename)
  33. print(filename)
  34. # 获取向量
  35. feature_vector=getFilefeatureVector1(image_path)
  36. print(feature_vector)
  37. # 将特征向量插入到Milvus集合中
  38. insert_data = [{'id':i,'fileName':filename,field_name: feature_vector.tolist()}]
  39. milvus_client.insert(collection_name, insert_data)
  40. i=i+1
  41. # 用特定图片的向量特征从milvus中查询相似的图片
  42. def searchFile():
  43. # 取测试一张测试图片,获取到其向量特征后,作为查询条件
  44. image_path = os.path.join(image_folder, "IMG_20210716_212727_edit_1565328531531.jpg")
  45. # 获取向量
  46. feature_vector=getFilefeatureVector1(image_path)
  47. search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
  48. results=milvus_client.search(
  49. collection_name=collection_name,
  50. data = [feature_vector],
  51. limit=6, # 查询6条
  52. offset=0, # 当该参数不为空的时候,为分页查询,配合limit使用,下标从0开始
  53. output_fields=["fileName"],
  54. search_params= search_params
  55. )
  56. for hits in results:
  57. # get the IDs of all returned hits
  58. # print(hits)
  59. for hit in hits:
  60. # get the value of an output field specified in the search request.
  61. # dynamic fields are supported, but vector fields are not supported yet.
  62. print(hit)
  63. #
  64. print('开始打印')
  65. # 第一步,保存图片向量数据到milvus中(数据初始化成功后,可以注释掉该方法)
  66. saveFileFeatureVector()
  67. # 第二步,用指定图片的向量特征查询相似图片
  68. searchFile()
  69. # 关闭Milvus连接
  70. milvus_client.close()

  2、saveFileFeatureVector 保存图片特征没有保存的时候,我们可以直接在Attu控制台查看数据集        

3、用使用 指定特图片来查询与其相似的图片执行结果        

4、本地电脑待测试图片的文件目录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/823418
推荐阅读
相关标签
  

闽ICP备14008679号