今天笔者带来一个企业级的以图搜图的实战教程。其主要目的是学习一下以图搜图如果产品化后,需要用到一些什么样得数据存储,数据检索工具。 此项目技术选项如下:
图片数据存储工具:
minio 一个轻量化的oss的分布式对象存储引擎
图片向量数据存储和检索工具:milvus 向量存储和检索引擎,内置了faiss,HNSW,annoy等多种ann向量检索算法。
图片向量化:resnet 算法进行图片向量抽取
前后端demo工具:gradio一个轻便的机器学习模型的demo部署包
上述工具的使用使得此以图搜图服务非常接近企业级别的可用程度,只需将前后端工具升级替换一下,就可以上线提供服务了。
接下来我就手把手的教大家开发一个以图搜图服务。
1.MilvusTools.py: milvus 客户端代码,实现了向量的插入,索引的构建,索引的加载和 向量检索功能
2.MinioTools.py: minio 客户端代码,目前没实现特别有价值的代码。
3.ResNetEmbeding.py: 图片向量化工具的脚本
项目地址在此https://github.com/wp931120/picSearch
project.png
进入milvus 目录后执行一下命令,milvus 和 minio服务就启动起来了。 备注:milvus 单机版已经包含minio服务。
docker-compose up -d
接下来我们在安装一下milvus的可视化客户端 attu,执行一下命令。
docker run --name attu -p 8000:3000 -d -e MILVUS_URL={your machine IP} zilliz/attu:latest
从docker的面板上就可以看到目前启动了4个容器,一个milvus;一个 minio,端口是9090和9000 ;一个 attu,端口是3000, 还有一个etcd(此服务是一个key-value存储服务,主要用于共享配置和服务发现)。
docker.png
通过localhost:3000即可访问attu服务,查看milvus存储的向量情况。
attu.png
通过localhost:9000即可访问minio web服务客户端去查看存储的对象文件。并可以进行文件的增删改查。
minio.png
新建一个picture bucket,为了此bucket能被公网访问,将隐私设置改为public。然后就可以将图片上传到此bucket。
minio.png
笔者将ILSVRC2012_img_val文件夹下的图片全部上传到minio。这样通过 http://localhost9000/picture/+图片名 即可访问到minio中的图片了。
iminio.png
运行MilvusTools.py中的主函数,代码如下,主要做了如下动作: 1.远程拿到minio中的图片 2.采用预训练的resnet 对图片的特征向量进行抽取 3.将图片向量存入milvus向量数据库,并构建索引 4.想图片向量索引加载到内存,提高检索服务
milvusTool = MilvusTools()
miniotool = MinioTools()
pics = miniotool.lists_bucket("picture") ### 列出minio picture bucket中所有存储的图片
resnet = ResNetEmbeding("../model/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5") ###加载resnet 预训练向量
paths = []
embs = []
for i in pics:
path = "http://localhost:9000/picture/" + i
emb = resnet.extract_feature(path) ###抽取图片向量
paths.append(path)
embs.append(emb)
data = [paths, embs]
print(len(data[1]))
milvusTool.create_collection("picture") ###创建cellection
milvusTool.insert_data("picture", data) ###插入图片向量
milvusTool.build_index("picture", "pic_vec")###构建index
milvusTool.load("picture")###加载cellection到内存,提供检索
完成上述步骤后,我们就可以通过attu看到我们刚刚插入并加载的图片向量。
collection.png
还可以看一看向量数据每个字段的具体取值。其中检索返回后返回的就是图片的minio地址。
vector.png
接下来运行SearchServer.py 的主函数,既可以通过7860端口范围以图搜图服务了。 百度找一张狗狗的图片搜一下试一试,返回的都是狗狗的图片。
search1.png
百度再找一张螃蟹的图搜一下试一试,返回的都是螃蟹的图片。
search2.png
至此,一个以图搜图服务就搭建完成了,它有着完备的图像存储,向量存储,向量检索功能,并取大部分数据存储和检索服务都是基于docker的云原生部署,方便通过k8s进行管理和扩容。感兴趣的可以git clone下来玩一玩。https://github.com/wp931120/picSearch
原网址: 访问
创建于: 2025-08-23 14:25:38
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论