介绍
当你听到”按图像搜索”时,你第一次想到谷歌和百度等搜索引擎的反向图像搜索功能了吗?事实上,你可以建立自己的图像搜索系统:建立自己的图片库;选择一张图片在库中自己搜索,并获取与它相似的几张图片。
作为大型要素矢量的相似性搜索引擎,Milvus 旨在帮助分析越来越大的非结构化数据并发现其背后的巨大价值。为了让Milvus应用于类似的图像检索场景,我们设计了一个基于米尔夫斯和图像特征提取模型VGG的反向图像搜索系统。
本文分为以下几部分:
- 数据准备:介绍系统的数据支持。
- 系统概述:介绍整体系统体系结构。
- VGG模型:介绍结构、特征、块结构和重量参数。
- API 简介:描述系统 API 的五项基本工作原理。
- 映像构造:说明如何从源代码构建客户端和服务器 Docker 映像。
- 系统部署:分三步演示如何设置系统。
- 接口显示:显示系统 GUI。
1. 数据准备
本文以 PASCAL VOC 图像数据集为例,为反向图像搜索构建端到端解决方案。数据集包含 17,125 张图片,涵盖 20 个目录:人员;动物(鸟、猫、牛、狗、马、羊);车辆(飞机、自行车、船、公共汽车、汽车、摩托车、火车);室内(瓶、椅子、餐桌、盆栽、sa、电视)。数据集大小约为 2GB。您可以通过此链接下载培训/验证数据:http://host
ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
注意:您还可以使用其他图像数据集。当前支持的图像格式为 .jpg 格式和 .png 格式。
2. 系统概述
为了允许用户在网页上进行交互,我们采用了C/ S架构。Web 客户端负责接收用户的请求并将其发送到 Web 服务器。Web 服务器在收到来自 Web 客户端的 HTTP 请求后,执行该操作并将结果返回给 Web 客户端。
网络服务器主要由图像特征提取模型VGG和矢量搜索引擎Milvus两部分组成。VGG 模型将图像转换为矢量,Milvus 负责存储矢量和执行类似的矢量检索。Web 服务器的体系结构如下所示:
3. VGG 型号
VGGNet是由牛津大学视觉几何组和谷歌深度思维的研究人员提出的。它是本地化任务中的获胜者,也是 ILSVRC-2014 分类任务中的第一个亚军。其杰出贡献是证明使用小卷积(3 + 3)和增加网络深度可以有效地提高模型的性能。VGGNet 具有高度可扩展性,其迁移到其他数据集的通用性能力非常好。VGG 模型在多个传输学习任务中优于 GoogleNet,它是使用 CNN 从图像中提取功能的首选算法。因此,选择 VGG 作为此解决方案中的深度学习模型。
VGGNet探讨了CNN深度与其表现之间的关系。通过反复堆叠 3 * 3 个小卷积内核和 2 × 2 最大池层,VGGNet 成功构建了深度为 16–19 层的 CNN。在此解决方案中使用了 Keras 的应用程序模块 (keras.应用程序) 提供的 VGG16 模型。
(1) VGG16 结构
VGG16 包含 13 个卷积层、3个完全连接层和 5 个池层
加权图层的总数为 13 × 3 = 16,这解释了为什么结构称为 VGG16。(池图层不涉及权重,因此不属于权重图层,不计算)。
(2) VGG16 功能
- 卷积层都使用相同的卷积内核参数。
- 所有池层使用相同的池内核参数。
- 该模型是通过堆叠多个卷积层和池层来构建的,这相对容易形成更深的网络结构。
(3) VGG16 块结构
VGG16 的卷积层和池层可以划分为不同的块,这些块编号为 Block1 = Block5,从正面到背面的顺序。每个块包含多个卷积层和一个池层。例如:Block2 包含 2 个卷积层(conv3_256)和 1 个池图层(maxpool)。在同一块中,卷积层的通道数相同。根据下面给出的 VGG16 结构图,VGG16 的输入图像为 224x224x3。在此过程中,通道数翻倍,从 64 个逐渐到 128 个,然后变为 256 个,直到最后达到 512 个不再更改。图像的高度和宽度从 224 × 112 × 56 × 28 × 14 × 7 减半。
(4) 重量参数
VGG 结构简单,但包含大量权重,达到 139,357,544 个参数。这些参数包括卷积内核权重和完全连接的图层权重
4. API 导言
整个系统的 Web 服务器提供五个 API,对应于训练、进程、计数、搜索和删除操作。用户可以执行图像加载、加载进度查询、米尔武斯矢量编号查询、图像检索和 Milvus 表删除。这五个 API 涵盖了反向图像搜索系统的所有基本功能。本文的其余部分将详细解释这些函数中的每一个。
(1) 火车
训练 API 的参数显示在下表中:
方法 名称类型POST文件字符串
在执行类似的图像检索之前,您需要将映像库加载到 Milvus 中,然后调用训练 API 将映像的路径传递到系统。由于 Milvus 仅支持检索矢量数据,因此有必要将图像转换为要素矢量。转换过程主要通过使用 Python 调用 VGG 模型来实现:
vggnet 导入 VGGNet2norm_feat=模型。vgg_extract_feat (img_path)
3获取图像的特征矢量后,使用米尔武斯insert_vectors界面将这些矢量导入米尔武斯:
Java
xxxxxxx
11从索引器。索引导入milvus_clientinsert_vectorsinsert_vectors
2状态ID ==insert_vectors (index_clienttable_nametable_name向量)
将这些要素矢量导入米尔武斯后,Milvus 将为每个矢量分配一个唯一 ID。为了更好地在后续检索过程中基于矢量 ID 查找图像,您需要保存矢量 ID 和相应图像之间的关系:
Java
xxxxxxx
11从磁盘缓存导入缓存
2fori在范围(len (名称) ):
3缓存=ids =i=名称=i|
(2) 流程
进程 API 的方法为 GET,不需要在调用中传递其他参数。可以调用进程 API 来查看图像加载的进度,例如已加载的转换映像数和传入路径中的图像总数。
(3) 计数
计数 API 的方法为 POST,不需要在调用中传递其他参数。可以调用计数 API 以查看当前 Milvus 中的矢量总数。每个矢量都从图像转换。
(4) 搜索
下表显示了搜索 API 的参数:
方法numFilePOSTTopk(int)图像文件
在将要查询的图像导入系统之前,请调用 VGG 模型将映像转换为矢量:
Java
xxxxxxx
11从预处理器。vggnet导入VGGNet
2norm_feat=模型。vgg_extract_feat (img_path)
获取查询矢量后,调用 Milvus 的search_vectors接口进行类似的矢量搜索:
Java
xxxxxxx
11从米尔夫斯导入米尔武斯索引类型指标类型状态
2状态结果=客户端。search_vectors (table_name=table_namequery_recordsquery_records=矢量top_k=top_knprobe=16)
xxxxxxx
11从磁盘缓存导入缓存
2defquery_name_from_ids (vids):
3res= |
4
5我i在vids:
6如果我i在缓存中 :
7res.追加(缓存=i+)
8返回res
(5) 删除
删除 API 的方法为 POST,不需要在调用中传递其他参数。删除 API 可用于删除 Milvus 中的表并清理以前导入的矢量数据。
5. Docker 映像生成
(1) 构建图片搜索-网络服务器图像
首先拉米尔武斯训练营代码,然后使用我们提供的 Dockerfile 构建 Web 服务器的图像:
Java
xxxxxxx
11$git克隆https://github.com/milvus-io/bootcamp.git
2$cd训练营/解决方案/pic_search/网络服务器
3
4$docker构建-t图片-搜索-Web服务器。
5•查看生成的generated图像
6$docker图像|grep图片-搜索-网络服务器
当然,您也可以直接使用我们上传到 dockerhub 的图像:
Java
xxxxxxx
11$docker拉米尔沃斯训练营/图片-搜索-网络服务器0.1.0
(2) 构建图片搜索网络客户端图像
首先拉米尔夫斯训练营代码,然后使用我们提供的 Dockerfile 构建 Web 客户端映像:
Java
xxxxxxx
11$git克隆https://github.com/milvus-io/bootcamp.git
2$cd训练营/解决方案/pic_search/网络客户端
3•生成映像
4$docker构建-t图片-搜索-Web客户端。
5•查看生成的generated图像
$码头图片images• grep 图片-搜索-网络客户端当然,您也可以直接使用我们上传到 dockerhub 的图像:
Java
xxxxxxx
11$码头拉pull米尔沃斯训练营/图片-搜索-网络客户端0
0
6. 系统部署
我们提供 GPU 部署方案和 CPU 部署方案,用户可以自行选择。可通过此链接提供详细的部署过程:https://github.com/milvus-io/bootcamp/blob/0.6.0/solutions/pic_search/README.md
步骤 1- 启动米尔武斯码头
有关详细步骤,请参阅链接:https://milvus.io/en/docs/v0.6.0/guides/get_started/install_milvus/install_milvus.md
步骤 2- 开始图片搜索-网络服务器 Docker
Java
xxxxxxx
11$docker运行-d-名称zilliz_search_images_demo|
2-vIMAGE_PATH1/tmp/pic1|
3-vIMAGE_PATH2/tmp/pic2|
4-p350005000|
5-e"DATA_PATH = / tmp / 图像数据"|
-e "MILVUS_HOST = 192.168.1.123" |7米尔沃斯训练营/图片-搜索-网络服务器0.1.0
步骤 3- 开始图片搜索-网络客户端 Docker
Java
xxxxxxx
11$Docker运行--名称zilliz_search_images_demo_web|
2-d-rm-p800180|
3-eAPI_URL=http//192.168.1.123: 35000 |
4米尔沃斯训练营/图片-搜索-网络客户端0.1.0
7. 接口显示
完成上述部署过程后,在浏览器中输入"本地主机:8001"以访问反向图像搜索界面
jpeg" 数据-新="假"数据大小="35470"数据大小格式化="35.5 kB"数据类型="临时"数据 url="/存储/临时/13539227-4.jpeg"src="http://www.cheeli.com.cn/wp-内容/上传/2020/06/13539227-4.jpeg"样式="宽度:729px;"/>
填写图像的路径,然后等待所有图像转换为矢量。将矢量加载到 Milvus 中,您可以开始搜索图像:
结论
本文演示如何使用 Milvus 和 VGG 构建反向图像搜索系统。Milvus 与各种深度学习平台兼容,搜索数十亿个矢量只需毫秒。您可以使用米尔武斯探索更多 AI 应用程序!
如果您有任何建议或意见,您可以在我们的 GitHub 存储库中提出问题,或在 Slack 社区中与我们联系。
米尔夫斯源代码:https://github.com/milvus-io/milvus
米尔武斯官方网站:https://milvus.io/
米尔武斯训练营:https://github.com/milvus-io/bootcamp
米尔夫斯·斯莱克社区:http://milvusio.slack.com/
有关 VGG 型号的详细信息,请访问:
VGG官方网站:http://www.robots.ox.ac.uk/~vgg/research/very_deep/
VGG GitHub:https://github.com/machrisaa/tensorflow-vgg https://github.com/machrisaa/tensorflow-vgg
Comments are closed.