使用milvus和towhee实现简陋版的以图搜图

上次我们尝试用 towheemilvus 实现了图片的向量化,那么顺势我们就能在这个基础上实现以图搜图
首先我们找一些图片,

然后我们先把他们都向量化,存储在milvus里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from towhee import AutoPipes, AutoConfig, ops
import towhee
import os
from pymilvus import MilvusClient
import json

# 1. 设置一个Milvus客户端
client = MilvusClient(
uri="http://localhost:19530"
)
insert_conf = AutoConfig.load_config('insert_milvus')
insert_conf.collection_name = 'text_image_search'


insert_pipe = AutoPipes.pipeline('insert_milvus', insert_conf)

# 创建图像嵌入管道
image_embedding_pipe = AutoPipes.pipeline('image-embedding')
files = os.listdir("./images")
for file in files:
file_path = os.path.join("./images", file)
if os.path.isfile(file_path):
embedding = image_embedding_pipe(file_path).get()[0]
insert_pipe([file_path, embedding])

然后我们找一张神仙姐姐的其他图片,先把它 embedding 后在 milvus 里进行向量检索

1
2
3
4
5
6
7
8
9
10
11
12
13
image_embedding_pipe = AutoPipes.pipeline('image-embedding')

# 生成嵌入
embedding = image_embedding_pipe('./to_search.jpg').get()[0]
print(embedding)
res = client.search(
collection_name="text_image_search",
data=[embedding],
limit=5,
search_params={"metric_type": "IP", "params": {}}
)
result = json.dumps(res, indent=4)
print(result)

我们检索出来5个结果,

可以通过distance找到距离最近的这个是id=451291280409722600
可以发现也是神仙姐姐的,只是作为参考
to_search 目标图片是

搜索的最短距离就是id对应的图片

这张图片就是神仙姐姐