Milvus 实战 | 基于 Milvus 的食谱检索系统

概述

现在,社交媒体、电商网站以及短视频应用源源不断地产生大量多模态数据。这些数据包含了自然语言、视觉信号、声音信号等多种类型。由于单一模式的数据分析已经不能满足日益复杂的查询需求,如何高效利用这些多模态数据变得至关重要。

跨模态检索是指用一种类型的数据去查询另一种不同类型的数据。处理跨模态检索问题通过把不同模态的数据映射到同一高维向量空间进行比较来完成检索任务。跨模态检索有着丰富的应用场景,如使用图像与文本检索监控视频,电商网站搜索商品等问题。

本文将介绍如何使用 Milvus 实现一个通过食物图片查询相应食谱的跨模态检索系统。

 

关键模型与技术

本项目实现的食谱检索系统是根据食物图像在库中查询出该图像对应的食谱,食谱中主要包含的信息有食物配料和烹饪指南。

这个项目主要用到了 im2recipe 模型、Milvus,以及 MySQL 数据库。我们通过 im2recipe 模型将食谱和食物图像向量化,利用 Milvus 向量搜索引擎进行图像向量和食谱向量的相似度检索,利用 MySQL 查询食谱。

  • 模型 im2recipe

模型 im2recipe 是基于食谱和食物图像表征的联合嵌入的神经网络模型。

食谱:食谱表征主要由两个部分组成:配料和烹饪指南。

配料:对由 word2vec 算法获得的预训练嵌入向量用双向 LSTM(由于配料列表是一个无序集,所以选择使用双向的 LSTM 模型,它同时考虑正向和逆向排序),这里 LSTM 对配料文本中的每个单词执行逻辑回归。

烹饪指南:每个食谱都包含一个烹饪指南,每个烹饪指南中通常包含了多条烹饪步骤。由于每条步骤比较长(最长可达 208 个单词),单个 LSTM 并不足以表示这些烹饪步骤。因此,im2recipe 采用了一个两阶段的 LSTM 模型用于编码序列的序列。首先将每条烹饪步骤表示为一个向量,然后用这些向量的序列训练一个 LSTM,以获得表征所有步骤的向量。

食物图像:对于食物图像表征, im2recipe 模型采用了两种深度卷积网络 VGG-16 和 Resnet-50,删除最后一个 softmax 分类层,并将其余部分连接到一个联合嵌入模型。

神经联合嵌入模型:如下图所示,食谱模型包括两个编码器:一个用于配料 (ingredients),另一个用于烹饪指南(instructions)。连接两个编码器的输出嵌入到一个食谱-图像的共享空间中。图像表征也通过简单地线性变换映射到了同一空间中[1]。

 

im2recipe 模型的 GitHub 仓库地址:https://github.com/torralba-lab/im2recipe-Pytorch

  • Milvus

Milvus是一款开源的向量相似度搜索引擎,支持由多种 AI 模型转化的非结构化数据向量,并为向量数据提供搜索分析服务,可广泛应用于图像处理、机器视觉、自然语言处理、语音识别、推荐系统以及新药发现。具体实现方式是:

  1. 通过深度学习模型将非结构化数据转化为特征向量,并导入 Milvus 库。

  2. 存储特征向量并建立索引。

  3. 返回与查询向量最相似的 top_k 个结果。

数据集

本项目中使用到的数据集是一个大型结构化语料库 Recipe1M+,该语料库包含超过 100 万种烹饪食谱和 1300 万幅食物图像。作为最大的可公开的配方数据集合,Recipe1M+ 提供了在校准的多模态数据上训练大容量模型的能力。

原始数据下载链接:http://im2recipe.csail.mit.edu/dataset/login/

 

实现过程

本项目主要分为数据导入和食谱检索两个过程。数据导入时,将食谱通过模型 im2recipe 转化为向量,将向量导入 Milvus 中,Milvus 会返回和向量一一对应的一个 id ,然后将向量 id 和对应的食谱信息存入 MySQL 中,如下图蓝色线表示的过程。在实现食谱检索时,首先会使用模型 im2recipe 将实物图片转化为向量,然后使用该图片向量在 Milvus 中检索出与其相似的食谱向量,并得到食谱向量的 id, 最后在 MySQL 中找到食谱向量 id 对应的食谱信息,如下图橙色线表示的过程。

1. 数据预处理

在食谱数据进入模型前,需要对原始的食谱数据进行预处理。原始的食谱数据存在一个 json 文件中,我们将原始数据中的食谱配料和烹饪指南这两个信息使用 word2vec 算法获得包含配料以及烹饪指南的预训练向量,然后将这些向量以及向量对应的食谱 id 存入 lmdb 数据库中。这里的 lmdb 是一个内存映射数据库,属于 key-value 数据库。

2. 食谱向量转化

使用 im2recipe 中预训练过的模型 model_e500_v-8.950.pth.tar 提取存储在 Imdb 数据库中的预训练嵌入向量并转化为新的表示食谱的向量。模型一共有四个输入:食谱的烹饪指南,步骤数,食谱配料,配料数量。输出得到该食谱的向量表示。

模型下载链接:http://wednesday.csail.mit.edu/pretrained/?C=D;O=A

3. 导入食谱向量

将食谱向量和对应的 milvus_id 导入 Milvus 中,然后通过 milvus_id 在食谱的原始数据中找到该 id 对应的其它相关的信息导入 MySQL。

MySQL 表中信息:

NameDescription
milvus_id食谱向量 id
recipe_id食谱 id
title食谱名称
ingredients食谱配料
instructions食谱烹饪指南
url食谱链接

将食谱对应的食谱向量和食谱原始数据分别导入 Milvus 和 MySQL 中。

4. 图片向量

使用 im2recipe 中预训练过的模型 model_e500_v-8.950.pth.tar 将 RGB 表示的图片转化成图片向量。

5. 食谱检索

本步骤将实现使用图片向量在库中检索出对应食谱。使用上一步得到的图片向量在 Milvus 库中检索出与其相似的前 top_k 个相似的食谱向量及其对应的食谱 id。这里使用余弦相似度来计算向量间的相似度。然后在 MySQL 中查询出前面得到的食谱 id 对应的食谱的具体信息,包括该食谱名称、配料、做法等。

 

结果展示

本项目的结果如下图所示,选择一张食物图像进行检索,右侧会显示本项目检索出的库中与该图像最相似的食谱。

Ingredients 下对应的是该食谱所需配料。

instructions 下对应的是该食谱的烹饪指南。

结语

和传统意义上通过以图搜图找出相似图片对应的食谱不同的是,本项目直接通过图片去检索食谱,将图片和食谱向量映射在一个共享空间上,用余弦距离来比较食谱和图像之间的相似度。

本文使用的 Milvus 向量相似度搜索引擎,其充分利用现代处理器的并行计算能力,可以在单台通用服务器上完成对十亿级数据的毫秒级搜索,助力用户高效完成对非结构化数据的检索。

 

参考文献

[1]Salvador A, Hynes N, Aytar Y, et al. Learning cross-modal embeddings for cooking recipes and food images[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 3020-3028.

 

欢迎加入 Milvus 社区

github.com/milvus-io/milvus | 源码

milvus.io | 官网

milvusio.slack.com | Slack 社区

zhihu.com/org/zilliz-11| 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili

已标记关键词 清除标记