向量检索milvus之一:以图搜图

本文详细介绍了如何安装和使用Milvus进行向量检索,特别是针对以图搜图的场景。首先,概述了Milvus作为向量检索平台的作用,接着讲解了安装、启动过程中的注意事项。接着,通过创建索引实现高效搜索,并展示了如何利用pic-search-webserver将图片向量化以及pic-search-webclient进行页面交互。最后,对整个实验过程进行了总结,并提供了相关参考资料。

安装milvus

关于milvus

milvus作为一个集成的开源平台,目标就是向量检索的集成平台。类似于elasticsearch集成了搜索。细节大家可以直接看官网。https://www.milvus.io/cn/docs/v0.11.0/overview.md

安装

说起来其实挺容易,方法也比较清晰。不过下载比较慢。

>> docker pull milvusdb/milvus:0.11.0-cpu-d101620-4c44c0
0.11.0-cpu-d101620-4c44c0: Pulling from milvusdb/milvus
75f829a71a1c: Pull complete
e654e509dcd3: Pull complete
482d74c614ad: Pull complete
85d20808a7e5: Pull complete
2f8820d4255e: Pull complete
Digest: sha256:6a5dc00b26dc18be5e5bfddc8cfb36370188e4c951e62ffafa30fbe3f4b1ad60
Status: Downloaded newer image for milvusdb/milvus:0.11.0-cpu-d101620-4c44c0
docker.io/milvusdb/milvus:0.11.0-cpu-d101620-4c44c0

启动

docker run -d --name milvus_cpu_0.11.0 \
	-p 19530:19530 \
	-p 19121:19121 \
	-v /home/$yourname/milvus/db:/var/lib/milvus/db \
	-v /home/$yourname/milvus/conf:/var/lib/milvus/conf \
	-v /home/$yourname/milvus/logs:/var/lib/milvus/logs \
	-v /home/$yourname/milvus/wal:/var/lib/milvus/wal \
	milvusdb/milvus:0.11.0-cpu-d101620-4c44c0```

这个地方有个小细节,就是不要-d启动,观察错误,等没问题之后再用-d启动,这样可以观察细节。

另外,milvus.yaml如果下载不了就翻墙吧。 我还是放一份在这里吧。https://download.youkuaiyun.com/download/iterate7/13081889

安装对应的admin观察界面

>> docker pull milvusdb/milvus-em:v0.5.0
>> docker run -d -p 3000:80 -e API_URL=http://192.168.13.218:3000 milvusdb/milvus-em:v0.5.0

然后就可以在界面观察milvus了。
在这里插入图片描述

实验向量搜索

主要是增删改查。 直接看代码更直接。

import numpy as np
import random
from milvus import Milvus
from milvus import Status

_HOST = '192.168.xx.xx'
_PORT = 19530

# Connect to Milvus Server
milvus = Milvus(_HOST, _PORT)

# Close client instance
# milvus.close()

# Returns the status of the Milvus server.
server_status = milvus.server_status(timeout=4)
print(server_status)


# Vector parameters
_DIM = 8  # dimension of vector

_INDEX_FILE_SIZE = 32  # max file size of stored index

# the demo name.
collection_name = 'example_collection_'
partition_tag = 'demo_tag_'
segment_name= ''

# 10 vectors with 8 dimension, per element is float32 type, vectors should be a 2-D array
vectors = [[random.random() for _ in range(_DIM)] for _ in range(10)]
ids = [i for i in range(10)]

print(vectors)

# Returns the version of the client.
client_version= milvus.client_version()
print(client_version)

# Returns the version of the Milvus server.
server_version = milvus.server_version(timeout=10)
print(server_version)

print("has collection:",milvus.has_collection(collection_name=collection_name, timeout=10))


from milvus import DataType
# Information needed to create a collection.Defult index_file_size=1024 and metric_type=MetricType.L2
collection_param = {
   
   
    "fields": [
        #  Milvus doesn't support string type now, but we are considering supporting it soon.
        #  {"name": "title", "type": DataType.STRING},
        {
   
   "name": "duration", "type": DataType.INT32, "params": {
   
   "unit": "minute"}},
        {
   
   "name"<
### Milvus 实现图像搜索和文本搜图的功能 #### 一、Milvus 的核心特性及其适用场景 Milvus 是一款专注于大规模向量数据相似性搜索的开源数据库,适用于多种领域中的复杂任务。它不仅支持高效的向量存储与检索,还能够在不同环境下灵活部署[^1]。具体到图像搜索和文本搜图的应用中,Milvus 提供了一种通用框架来处理高维向量之间的距离计算。 --- #### 二、以图搜图Image Search以图搜图的核心在于将输入图片转化为固定长度的特征向量,并将其存入 Milvus 数据库中以便后续查询。以下是实现该功能的主要流程: 1. **图片预处理** 利用深度学习模型(如 ResNet 或 VGG),提取每张图片的关键特征并生成对应的特征向量。 2. **构建索引** 将这些特征向量批量导入 Milvus 中,并创建适合的索引来加速最近邻搜索操作[^2]。 3. **执行搜索** 当接收到新的目标图片时,重复上述步骤获取其特征向量,随后调用 Milvus API 执行相似度比较,返回最接近的结果集合。 ```python from milvus import Milvus, IndexType, MetricType # 初始化客户端连接至本地运行的服务端实例 client = Milvus(host='localhost', port='19530') # 创建集合定义参数 collection_name = 'image_search' dimension = 128 # 假设我们的特征维度为 128 维 param = {'collection_name': collection_name, 'dimension': dimension, 'index_file_size': 1024, 'metric_type': MetricType.L2} # 如果尚未存在则新建集合 if not client.has_collection(collection_name)[0]: status = client.create_collection(param) # 插入样本数据 (此处省略实际编码过程) vector_data = [[...], [...]] # 替代真实特征列表 ids = range(len(vector_data)) status, _ = client.insert(collection_name=collection_name, records=vector_data, ids=ids) # 构建 IVF_FLAT 类型索引提高效率 index_param = { 'nlist': 16384 } status = client.create_index(collection_name, index_type=IndexType.IVF_FLAT, params=index_param) # 查询逻辑演示 search_vector = [...] # 待查对象的具体数值形式 top_k = 5 # 返回前五个最佳匹配项 search_params = {"nprobe": 16} # 控制精度/速度权衡因子 results = client.search(collection_name=collection_name, query_records=[search_vector], top_k=top_k, params=search_params) print(results) ``` --- #### 三、文本搜图(Text-to-Image Retrieval) 对于跨模态的任务——即给定一段文字描述寻找关联性强的照片来说,则需借助多模态表征技术完成映射统一化工作。典型做法如下所示: 1. **文本转嵌入** 运用 BERT 等先进的 NLP 工具把原始字符串转变为低冗余且携带语义信息丰富的分布式表达式。 2. **同步入库管理** 把之前提到过的视觉部分以及当前得到的文字侧成果共同保存于同一个命名空间下形成联合体结构。 3. **混合检索机制** 结合两套独立但又相互联系的数据源开展综合评估作业最终达成预期效果展示目的。 ```python import numpy as np from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') def text_to_embedding(text): inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512) outputs = model(**inputs) sentence_embedding = outputs.last_hidden_state.mean(dim=1).detach().numpy()[0] return list(sentence_embedding.flatten()) text_query = "A cat sitting on a table" embedding = text_to_embedding(text_query) # 调整后的搜索函数兼容异构请求类型 mixed_results = client.search( collection_name=collection_name, query_records=[embedding], top_k=top_k, params={"nprobe": 16}, partition_tags=None ) for result in mixed_results: print(f"ID={result.id}, Distance={result.distance}") ``` --- #### 四、总结说明 以上分别介绍了如何利用 Milvus 来搭建基础版别的单模态与双模态搜索引擎架构方案。值得注意的是,在实践过程中还需要考虑诸如性能优化策略调整、资源分配规划等方面因素才能更好地满足业务需求[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值