本文主要介绍基于 Milvus 搭建的多模态图文检索系统。检索流程为:
1. 通过 TIRG(Text Image Residual Gating)模型将图片特征和文本特征转化为多模态特征向量。
2. 结合开源向量数据库 Milvus 对目标图像特征向量和多模态特征向量进行相似度检索。
关键技术
图像检索的关键在于图像的查询方式。不同于一般的图像检索系统,本文中的基于 Milvus 搭建的图文检索系统需要用户先输入一张图像和一段相关的图像约束文本后再进行图像查询。用户查询图像时除了输入图片,还能输入期望的图像大小、位置、颜色、形状变化等图像约束文本,图文检索系统会相应地返回满足约束条件的图像结果。对于相同的查询图像,不同的图像约束文本会得到不同的图像检索结果。
TIRG
基于 Milvus 图文检索系统使用的深度学习模型 TIRG (Text Image Residual Gating) 模型源于 2019 年收录在 CVPR(Conference on Computer Vision and Pattern Recognition )的一篇文章 《Composing Text and Image for Image Retrieval - An Empirical Odyssey》。
TIRG 模型是一种融合了文本特征和图像特征的深度学习模型,其整体实现流程如下:
1. 使用 CNN 模型 ResNet-17 提取给定查询图像的特征。
2. 使用 LSTM (Long Short Term Memory networks)模型提取图像约束文本的特征。
3. 使用门控机制(gated feature)和残差网络(residual feature)结合图像特征和文本特征。
TIRG 模型门控机制能够利用图像约束文本修改原始图像特征。更多 TIRG 模型详情,请见论文《Composing Text and Image for Image Retrieval 》[1]。
Milvus
Milvus 是一款开源的向量相似度搜索引擎,可与多种 AI 模型相结合。Milvus 提供向量化的非结构数据检索服务,目前广泛应用于图像处理、计算机视觉、自然语言处理、语音识别、推荐系统以及新药研发等领域。
Milvus 适用于多种场景,与深度学习相融合的架构如下图所示:
采用 Milvus 的数据处理流程包括以下几个步骤:
1. 与深度学习模型相结合,将非结构化数据转化为特征向量。
2. 将特征向量存储到 Milvus 并建立索引。
3. 返回向量相似性搜索结果。
系统介绍
本文中的图文检索系统基于 Milvus 结合 TIRG 模型和 MySQL 数据库搭建而成。
具体实现过程如下图所示:
1. 插入目标图像的特征向量:
将数据集中所有目标图像的特征向量存储至 Milvus 中。Milvus 对特征向量建立索引,并生成对应的 ID。将 ID 和对应特征向量存储于 MySQL 中。
⚠️ 目标图像指的是满足文本约束的相似图像
2. 生成多模态特征向量:
查询图像时,用户需要输入一张图片和一段特定的图像约束文本。使用深度学习模型 CNN 和 LSTM 分别提取图片特征和文本特征,通过 TIRG 模型将图片和文本特征结合成多模态特征向量。
3. 特征向量间的相似度检索:
Milvus 对多模态特征向量和 Milvus 库中目标图像的特征向量进行相似度计算,返回最为相似的图片 ID 。根据此 ID 可以在 MySQL 中获得对应的相似图像,将最终检索结果返回给用户。
系统搭建
通过以下关键步骤,我们将结合 TIRG 模型与 Milvus 搭建一个跨模态的图文检索系统。具体步骤,详见 GitHub 项目(https://github.com/milvus-io/bootcamp/blob/1.0/solutions/ctirg/Readme.md)。
本项目提供以下三个数据集,可任选其一也可采用全部数据集:
- Fashion200k[2]
- MIT-States[3]
- 新合成的数据集 CSS (本项目中仅使用了本数据集)
1. 下载 TIRG 模型,部署 Python 环境,并训练模型。训练好的模型会自动保存。
代码语言:javascript复制git clone https://github.com/google/tirg.git
pip install -r requirement
python main.py --dataset=css3d --dataset_path=./CSSDataset --num_iters=160000 --model=tirg --loss=soft_triplet --comment=css3d_tirg
2. 查看模型训练情况(包含训练损失, 训练集检索情况, 测试集检索情况)并视情况调整参数。
代码语言:javascript复制tensorboard --logdir ./runs/ --port 8888
3. 将所有目标图像向量导入 Milvus 中并生成对应的 ID。ID 和对应特征向量存储于 MySQL 中。
代码语言:javascript复制status, _ = insert_vectors(index_client, milvus_table, vectors, ids)
load_images_to_mysql(conn,cursor,milvus_table,ids,Image_path)
4. 通过多模态向量在 Milvus 中对目标图像向量进行相似度检索并返回相似图片的 ID。在 MySQL 数据库中使用该 ID 查找对应的目标图片信息。
代码语言:javascript复制sql = "select * from " imgs_table " where milvus_id=" str_ids ";"
results = cursor.execute(sql).fetchall()
总结
本文中基于 Milvus 搭建的图文检索系统是计算机视觉领域中的新兴研究热点和发展方向。未来,Zilliz 还将不断改进此图文检索系统,提高检索的准确率。
Milvus 向量相似度检索引擎可以兼容各种深度学习平台,搜索十亿向量仅需毫秒响应时间。Milvus 可以运用于图像检索和产品搜索 (Image retrieval and product search)、视觉问答(Visual Question Answering)、成分学习(Compositional Learning)等场景。更多应用场景,详见 Milvus 应用场景(https://milvus.io/cn/scenarios)。
欢迎任何对 Milvus 感兴趣的小伙伴加入我们一起解锁更多的应用场景和更有趣的玩法!
参考文献
[1] Composing Text and Image for Image Retrieval - An Empirical CVPR 2019.
[2] X. Han, Z. Wu, P. X. Huang, X. Zhang, M. Zhu, Y. Li, Y. Zhao, and L. S. Davis. Automatic spatially-aware fashion concept discovery. In ICCV, 2017
[3] P. Isola, J. J. Lim, and E. H. Adelson. Discovering states and transformations in image collections. In CVPR, 2015