介绍

当你听到”按图像搜索”时,你第一次想到谷歌和百度等搜索引擎的反向图像搜索功能了吗?事实上,你可以建立自己的图像搜索系统:建立自己的图片库;选择一张图片在库中自己搜索,并获取与它相似的几张图片。

作为大型要素矢量的相似性搜索引擎,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 服务器的体系结构如下所示:

Webserver architecture

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 模型来实现:

Java

 

 
1
vggnet 导入 VGGNet

2
norm_feat=模型vgg_extract_featimg_path
3

获取图像的特征矢量后,使用米尔武斯insert_vectors界面将这些矢量导入米尔武斯:

Java

 

xxxxxxx
1

1
索引器索引导入milvus_clientinsert_vectorsinsert_vectors
2
状态ID ==insert_vectorsindex_clienttable_nametable_name向量

将这些要素矢量导入米尔武斯后,Milvus 将为每个矢量分配一个唯一 ID。为了更好地在后续检索过程中基于矢量 ID 查找图像,您需要保存矢量 ID 和相应图像之间的关系:

Java

 

xxxxxxx
1

1
磁盘缓存导入缓存
2
fori范围len名称) ):
3
缓存=ids =i=名称=i|

(2) 流程

进程 API 的方法为 GET,不需要在调用中传递其他参数。可以调用进程 API 来查看图像加载的进度,例如已加载的转换映像数和传入路径中的图像总数。

(3) 计数

计数 API 的方法为 POST,不需要在调用中传递其他参数。可以调用计数 API 以查看当前 Milvus 中的矢量总数。每个矢量都从图像转换。

(4) 搜索

下表显示了搜索 API 的参数:

方法numFilePOSTTopk(int)图像文件

在将要查询的图像导入系统之前,请调用 VGG 模型将映像转换为矢量:

Java

 

xxxxxxx
1
 
1
预处理器vggnet导入VGGNet
2
norm_feat=模型vgg_extract_featimg_path

获取查询矢量后,调用 Milvus 的search_vectors接口进行类似的矢量搜索:

Java

 

xxxxxxx
1
 
1
米尔夫斯导入米尔武斯索引类型指标类型状态
2
状态结果=客户端search_vectorstable_name=table_namequery_recordsquery_records=矢量top_k=top_knprobe=16
xxxxxxx
1
 
1
磁盘缓存导入缓存
2
defquery_name_from_idsvids):
3
res= |
4

5
ivids
6
如果我i缓存中 :
7
res.追加缓存=i+)
8
返回res

(5) 删除

删除 API 的方法为 POST,不需要在调用中传递其他参数。删除 API 可用于删除 Milvus 中的表并清理以前导入的矢量数据。

5. Docker 映像生成

(1) 构建图片搜索-网络服务器图像

首先拉米尔武斯训练营代码,然后使用我们提供的 Dockerfile 构建 Web 服务器的图像:

Java

 

xxxxxxx
1
 
1
$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
1

1
$docker米尔沃斯训练营/图片-搜索-网络服务器0.1.0

(2) 构建图片搜索网络客户端图像

首先拉米尔夫斯训练营代码,然后使用我们提供的 Dockerfile 构建 Web 客户端映像:

Java

 

xxxxxxx
1

1
$git克隆https//github.com/milvus-io/bootcamp.git
2
$cd训练营/解决方案/pic_search/网络客户端
3
生成映像
4
$docker构建-t图片-搜索-Web客户端
5
查看生成的generated图像
$码头图片images grep 图片-搜索-网络客户端

当然,您也可以直接使用我们上传到 dockerhub 的图像:

Java

 

xxxxxxx
1
 
1
$码头拉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
1

1
$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
1

1
$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.