基于 Milvus 的跨模态行人检索


  概述

近年来,由于跨模态数据的快速增长,跨模态检索备受关注。它以一种类型的数据作为查询,来检索另一种类型的相关数据。例如,用户可以用一段文字来检索相关的图片或视频。由于查询及其检索结果可以是不同的模态,如何衡量不同模态数据之间的内容相似性仍然是一个挑战。

图像与自然语言之间比较有代表性的应用有双向-图像文本检索、自然语言对象检索和视觉问题回答(VQA)等。这些应用的一个关键任务是衡量视觉数据和文字描述之间的相似性。现有的深度学习方法要么尝试在共享的潜在空间中学习图像和文本的联合嵌入(Joint Embedding), 要么建立相似性学习网络来计算图像-文本对的匹配得分。在测试阶段,基于联合嵌入的学习方法在学习辨别性的跨模态表征和计算效率方面表现出了巨大的潜力。

本项目参考了 Deep Cross-Modal Projection Learning for Image-Text Matching(DCPL) 论文以及其项目,通过引入了跨模态特征投影操作,学习具有鉴别性的图像-文本 Embedding。利用训练好的模型提取图像特征,将其插入 Milvus 中。输入行人描述后再使用 Milvus 进行搜索,即可获得目标行人图像,实现跨模态检索。

  算法

网络结构

本项目使用了 DCPL 论文中的网络架构。如图所示,图像-文本匹配架构由三部分组成:

  • 双向 LSTM(Bi-LSTM) 用于编码文本特征。

  • 视觉 CNN 用于提取图像特征。

  • 联合学习模块来关联跨模态表征。

给定一个句子,我们应用基本的 tokenizing 将其分割成单词,再利用 Bi-LSTM 依次处理。对前向和后向的隐藏状态进行串联,通过 max-pooling 策略得到初始文本表征。对于图像,我们采用 MobileNet,从最后一个池化层提取其初始特征。在关联模块中,将提取的图像和文本特征嵌入到一个共享的潜在空间中,在这个空间中,匹配样本之间的兼容性和未匹配样本之间的方差均被最大化。

                       

损失函数

DCPL 论文中主要对关联模块中的判别特征进行学习,提出了跨模态投影匹配(Cross-Modal Projection Matching, CMPM)和跨模态投影分类(Cross-Modal Projection Classification, CMPC)损失函数。

  • CMPM

文章中引入的一种新型的图像-文本匹配损失。它将跨模态投影纳入 KL divergence,以关联不同模态的特征表示。在不同 batch 大小的情况下,CMPM loss 在图像和文本的关联上表现出极大的稳定性和优越性,没有传统 bi-directional ranking loss 中的三联抽样和余量选择的阻碍。

  • CMPC

对于带有 identity-level 注释的图像-文本匹配,应用于每种模式的分类损失有助于学习更多的判别特征。然而,在单独的分类任务中,图像-文本对的匹配关系可能没有得到充分的利用。文章中引入了一种新的分类函数,将跨模态投影整合到 norm-softmax loss 中,以进一步提高匹配的 Embeddings 的紧凑性。

Milvus

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

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

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

  3. 接收到用户的向量搜索请求后,返回与输入向量相似的结果。


  系统介绍

             

系统架构

下面我们将介绍如何搭建基于 Milvus 的跨模态行人检索系统。如下图所示,本系统将包含数据导入和行人检索两个部分:

                      

数据集

本项目使用的数据集是 CUHK-PEDES (注1) 数据集,其包含了 13003 个行人的 40206 张行人图像,每张图像由两段文字描述。数据集分为 11003 个训练行人的 34054 张图像,1000 个验证行人的 3078 张图像和 1000 个测试行人的 3074 张图像。

数据格式为:

{
  "id": 1,
  "file_path": "test_query/p10376_s14337.jpg",
  "captions": [
    "She wears a purple long sleeved, ankle length dress. There is a pattern on the dress.",
    "This woman is heavy set. She is facing to the left of the camera. She is wearing an ankle length dress and is carrying something in her hand. She has her head down."
  ]
}

下载好数据集后,可以利用 datasets/process.py 对原始数据进行预处理。或者可以直接从 Google Drive (注2) 下载处理好的数据到 data/processed_data 目录下。

模型训练

1. 下载项目源码

$ git clone https://github.com/labyrinth7x/Deep-Cross-Modal-Projection-Learning-for-Image-Text-Matching.git

2. 下载 CUHK-PEDES 数据集和预训练好的图片模型(注3) 

3. 训练

$ sh scripts/train.sh

Note:在运行 scripts/train.sh 之前,请修改相应参数,具体请参考我们的 bootcamp (注4) 。

系统实现

1. 载入模型

model, _ = network_config(args, 'test', None, True, model_file, True)

2. 图片导入

在这里我们利用模型生成图片的 Embedding,与图片文件名一同返回。接着调用 Milvus 的 insert_vectors 接口将这些 Embeddings 载入 Milvus:

# Get embeddings and filenames of pictures.
vectors, names = feature_extract(data_loader, model, args)
index_client = milvus_client()
# Load data in Milvus.
status, ids = insert_vectors(index_client, table_name, vectors)
create_index(index_client, table_name)

此时,Milvus 会给每个向量分配一个唯一的 id,为了后面检索时方便根据特征向量 id 查找其对应的图片,需要存储每个特征向量的 id 和其对应图片的对应关系:

for i in range(len(names)):
    cache[ids[i]] = names[i]
return "Load finished"

3. 处理输入文本

导入图片后,我们即可输入描述行人的文本进行搜索。输入文本后,我们需要对其进行预处理。

vocab = load_vocab(args)caption = removePunctuation(caption)caption_id = []for word in caption:   caption_id.append(vocab.word_to_id(word))caption_id, length = fix_length(caption_id, args)

Note: caption_id是该单词在本数据集总共出现的次数。

4. 查询

处理好文本后,我们将其传入模型进行特征提取。归一化向量后我们利用 Milvus 搜索该向量。搜索出相似的向量 id 之后,再根据先前存储的向量 id 和图片名称的对应关系检索出对应的图片名称:

# Extract Embedding of caption.feat = extract_caption_feat(caption, model, args)# Feature normalization.feat = (feat / feat.norm()).tolist()# Get pedestrian pictures with Milvus._, vectors = search_vectors(index_client, table_name, [feat], 2 * topk)vids = [x.id for x in vectors[0]]res_id = [x.decode('utf-8') for x in query_name_from_ids(vids)]

  结果展示

本项目提供了前端展示,用户通过输入目标行人的特征,即可获得相应的图片。

                      

  总结

本项目利用联合学习模块来关联通过 CNN 提取的图像特征和通过双向 LSTM 提取的文本特征的两种特征。通过将他们嵌入到一个共享的潜在空间,匹配特征之间的兼容性,最大化不匹配特征之间的方差以训练模型。

本项目使用了 CUHK-PEDES 图片数据集,首先将这些行人图片传入模型得到相应的 Embedding,并将其插入 Milvus 特征向量相似度搜索引擎。再输入文本描述,将其转换为与图片特征存在于同一空间的文本 Embedding,进行行人图片检索。

通过使用 Milvus,我们大大加速了向量检索速度,提升了系统性能。目前,Milvus 可以对接各种深度学习平台,并运用于众多 AI 领域。其充分利用现代处理器的并行计算能力,助力用户高效完成非结构化数据检索。

备注

注1: 

https://github.com/ShuangLI59/Person-Search-with-Natural-Language-Description

注2: 

https://drive.google.com/drive/folders/1Nbx5Oa5746_uAcuRi73DmuhQhrxvrAc9

注3: 

https://drive.google.com/drive/folders/1LtTjWeGuLNvQYMTjdrYbdVjbxr7bLQQC

注4: 

https://github.com/milvus-io/bootcamp/tree/0.10.0/EN_solutions/pedestrian_search

参考文献

  1. Wang, Kaiye, et al. "A comprehensive survey on cross-modal retrieval." arXiv preprint arXiv:1607.06215 (2016).

  2. Zhang, Ying, and Huchuan Lu. "Deep cross-modal projection learning for image-text matching." Proceedings of the European Conference on Computer Vision (ECCV). 2018.

  3. Li, S., Xiao, T., Li, H., Zhou, B., Yue, D., Wang, X.: Person search with naturallanguage description. In: CVPR. pp. 5187–5196 (2017)

延伸阅读

直播回放|跨境追踪(Re-ID)技术与Milvus的完美邂逅

Milvus实战 | 轻松搭建以图搜图系统

  欢迎加入 Milvus 社区

github.com/milvus-io/milvus    源码

milvus.io    官网

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

zilliz.blog.csdn.net    CSDN 博客

space.bilibili.com/478166626    Bilibili

已标记关键词 清除标记