Elastic 向量搜索实战指南——图像搜索

183 阅读17分钟

本章将探讨图像相似搜索相关的技术,回顾近年来图像搜索的发展历程,并深入解析图像搜索的工作机制。随着相似搜索在当今搜索领域的不断扩展,它正逐渐成为用户的核心期望之一。

我们将涵盖以下内容:

  • 图像搜索概述
  • 向量搜索在图像搜索中的作用
  • 如何创建图像的向量表示、存储到 Elasticsearch 中,并利用源图像执行 kNN 搜索
  • 当今图像及多媒体搜索的实际应用场景

图像搜索概述

图像搜索是一种专门的数据检索方法,侧重于通过分析和比较图像的视觉内容来寻找相关图像。近年来,互联网、社交媒体及各类数字平台上数字图像数量激增,推动了对高效图像搜索技术的巨大需求。

图像搜索的发展历程

图像搜索最初源于互联网早期,当时的搜索引擎只能分析与图像相关联的文本信息,如文件名、替代文本或周围的文本内容来匹配查询。然而,这些方法存在局限,因为图像的实际内容基本被忽略。

随着人工智能(AI)和机器学习(ML)的进步,图像搜索能力显著提升。现代图像搜索技术能够分析图像的视觉内容,这得益于卷积神经网络(CNN)、图像特征提取、视觉Transformer(ViT)以及向量相似搜索等技术的发展。

图像搜索的工作机制

在机器学习的语境中,图像可视为像素值的矩阵,这些值可作为机器学习模型的特征。为使数据便于处理,会采用降维(详见第三章“模型管理与向量考虑”)和特征提取技术。

降维技术将高维图像数据转换为低维表示,尽可能保留最显著的模式或结构,以实现更高效的数据处理和分析,目标是加快计算速度并提升模型性能。

特征提取则是处理图像以识别和描述其独特特征,如边缘、颜色、形状等,这些特征作为机器学习算法的输入。深度学习模型,特别是 CNN,是一种广泛应用于图像搜索的特征提取方法,能够自动学习图像的空间层级特征,在图像分类和目标检测任务中表现优异。

提取特征后,通常将其转换成向量表示,便于相似度比较。每个向量对应多维空间中的一个点,通过计算这些点间的“距离”来判断图像间的相似度,距离越小,图像越相似。

通过向量表示,系统能迅速筛选海量数据库,精准定位与查询图像最相似的匹配项。向量相似搜索正是赋能高效图像搜索体验的核心机制。

向量相似搜索的作用

在图像搜索中,向量相似搜索至关重要。图像转换为向量后,搜索查询也以向量形式出现,系统将其与数据库中的图像向量进行比对,找出最相似的“k”个邻居(kNN搜索)。

kNN搜索可采用暴力搜索等多种算法,亦可使用如分层导航小世界(HNSW)算法(详见第七章“由向量驱动的新一代可观测性”)等更高效的方法。暴力搜索需要将查询向量与数据库中每个向量对比,计算量大,效率低。HNSW 则是一种针对大规模数据库的优化算法,能够快速定位最近邻,特别适合图像搜索系统中的向量相似搜索。

图像搜索的实际效益遍布众多行业。其灵活性与适应性使其成为提升用户体验、确保数字安全甚至变革数字内容交互的重要工具。

图像搜索的实际应用

图像搜索应用广泛且深远。电商领域的反向图像搜索允许顾客上传产品照片,查找相似商品;数字取证中,图像搜索用于跨数据库检测非法内容;社交媒体中,图像搜索支持人脸识别、图像标注及内容推荐。

随着视觉内容的不断生成与分享,对高效图像搜索技术的需求只会持续增长。人工智能、机器学习与向量相似搜索的结合,为满足这一需求提供了强大工具,推动新一代能理解并分析视觉内容的图像搜索能力。

传统图像搜索引擎依赖与图像相关的文本元数据(如文件名、替代文本及上下文文本)来理解图像内容,但这种方法受限于元数据的准确性与完整性,无法解析图像本身的视觉信息。

随着 AI 与 ML 的发展,更先进的图像搜索方法得以实现,能够直接分析图像的视觉内容,即基于内容的图像检索(CBIR)。CBIR 通过提取图像的特征向量,利用这些向量查找视觉相似的图像。

特征向量是对图像视觉内容的数值表示,生成过程涉及分析图像的颜色、纹理与形状。近年来,CNN 由于其捕捉图像复杂模式的能力,成为特征提取的热门工具。

提取特征向量后,通常将其索引至数据库。提交新的查询图像时,比较其特征向量与已索引向量的相似度,返回最相似图像。向量相似度常用欧氏距离或余弦相似度衡量。

尽管 CBIR 系统功能强大,但在实现过程中仍面临诸多挑战,比如由于视觉感知的主观性,图像语义的解释与理解复杂;高维图像数据导致搜索计算开销大,尤其是面对大型数据库时。

为应对这些挑战,常用近似最近邻(ANN)算法(如 HNSW 图)优化搜索过程,这类算法牺牲少量准确性换取大幅提升搜索速度,是大规模图像搜索的实用选择。

借助 Elasticsearch 的 dense_vector 类型,现在可以在 Elasticsearch 集群中直接索引和搜索高维向量。结合合适的特征提取模型,这为构建高效且可扩展的图像搜索系统提供了有力工具。

接下来章节将深入探讨图像特征提取、向量索引及搜索技术,并展示如何结合 Elasticsearch 和预训练 CNN 模型实现图像搜索系统,旨在为读者提供一套基于先进技术的图像搜索系统构建与优化的完整指南。

图像的向量搜索

向量搜索是 Elasticsearch 及其他向量存储中的一项变革性功能,它提供了一种在复杂数据类型(如图像)中进行搜索的方法。通过这一方法,图像被转换为向量,能够被索引、搜索并相互比较,彻底改变了我们检索和分析图像数据的方式。这种生成嵌入表示的特性同样适用于其他媒体类型。本节将深入介绍图像向量搜索的流程,包括图像向量化、Elasticsearch 中的向量索引、kNN 搜索、向量相似度度量以及 kNN 算法的调优。

图像向量化

向量搜索过程的第一步是将图像数据转换为向量,这一过程称为图像向量化。通常使用深度学习模型,尤其是卷积神经网络(CNN)来完成这一任务。CNN 设计用于理解和捕捉图像的复杂特征,如颜色分布、形状、纹理和模式。通过卷积层、池化层和全连接层的逐层处理,CNN 能将图像表示为一个高维向量。该向量包含了图像的关键特征,是其数值化的表达。

预训练 CNN 的输出层(通常称为嵌入向量或特征向量)常被用来表示图像。向量中的每个维度代表从图像中学习到的某一特征,例如某一维度可能对应某种特定颜色或纹理模式的存在程度。向量中的数值量化了这些特征在图像中的表现强度。

image.png

如上图所示,卷积神经网络(CNN)模型的层次包括:

  • 接受图像的原始像素值作为输入。
  • 每一层提取特定特征,如边缘、角点、纹理等。
  • 引入非线性,基于误差进行学习,逼近更复杂的函数。
  • 通过下采样减少特征图的维度,从而降低计算复杂度。
  • 包含前面各层的权重和偏置,用于分类过程。
  • 输出各类别的概率分布。

在 Elasticsearch 中索引图像向量

获得图像向量后,下一步是将这些向量索引到 Elasticsearch 中以便后续搜索。Elasticsearch 提供了专门的字段类型 dense_vector,用于存储这些高维向量。

dense_vector 字段定义为一个数字数组,通常为浮点数,且需要指定维度(dims)。目前索引向量的最大维度限制为 2048,未来可能会提升。需要注意的是,每个 dense_vector 字段只能存储单一值,不能存储多个向量。

在图像搜索的场景中,每张图像(已表示为向量)会被索引为一个 Elasticsearch 文档。每个文档中可存储一个或多个向量,图像向量被存放在 dense_vector 字段内。除此之外,图像的其他相关信息或元数据也可以存储在同一文档的其他字段中。

完整的示例代码可在本书 GitHub 仓库第 5 章的 Jupyter Notebook 中找到:github.com/PacktPublis…。这里我们讨论相关部分。

首先,使用 SentenceTransformer 库初始化一个预训练模型。clip-ViT-B-32-multilingual-v1 模型将在本章后续详细介绍:

model = SentenceTransformer('clip-ViT-B-32-multilingual-v1')

接下来,准备图像预处理函数:

transform = transforms.Compose([
    transforms.Resize(224),
    transforms.CenterCrop(224),
    lambda image: image.convert("RGB"),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])

Transforms.Compose() 结合了以下转换步骤:

  • transforms.Resize(224):将图像短边缩放至 224 像素,保持长宽比。
  • transforms.CenterCrop(224):从图像中心裁剪出 224x224 大小的区域。
  • lambda image: image.convert("RGB"):将图像转换为 RGB 格式,适用于灰度图或带透明通道的图像。
  • transforms.ToTensor():将 PIL 图像转换为 PyTorch 张量,并将数值范围从 [0, 255] 映射到 [0.0, 1.0]
  • transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)):对张量的每个通道进行归一化,均值和标准差均为 0.5,使数据范围映射到 [-1.0, 1.0]

可以用以下代码将预处理应用于图像文件,并用模型生成图像向量。完整代码见本章的 Python Notebook,可对真实图像文件运行:

from PIL import Image
img = Image.open("image_file.jpg")
image = transform(img).unsqueeze(0)
image_vector = model.encode(image)

生成的向量及其他相关数据随后可以索引到 Elasticsearch,以支持 kNN 搜索:

document = {
    '_index': index_name,
    '_source': {
        "filename": filename,
        "image_vector": vector
    }
}

完整代码见本书 GitHub 第 5 章目录。

k 最近邻 (kNN) 搜索

向量索引到 Elasticsearch 后,下一步就是利用 kNN 搜索。关于 kNN 和 HNSW 的详细讨论请参考第 2 章《Elastic 中的向量搜索入门》。

与基于文本的向量搜索类似,图像向量搜索时,需要先将查询图像转换为向量。转换过程与索引时的转换相同。

将图像转为向量后,将其作为 query_vector 参数传入 kNN 搜索:

knn = {
    "field": "image_vector",
    "query_vector": search_image_vector[0],
    "k": 1,
    "num_candidates": 10
}

参数说明:

  • field:索引中存储图像向量的字段名。
  • query_vector:查询图像的向量表示。
  • k:希望返回的最相近图像数量,这里为 1。
  • num_candidates:每个分片搜索的近似邻居候选数量。

图像搜索的挑战和局限

尽管图像向量搜索在检索图像方面极具能力,但也面临一定挑战。主要问题之一是图像向量的高维度,导致计算效率低下,并且难以可视化和解释数据。

此外,预训练的特征提取模型虽能捕获丰富特征,但未必总是贴合具体应用场景中的关键特征,可能导致搜索结果不理想。一个可能的解决方案是使用迁移学习,在特定任务上微调特征提取模型,但这需要额外的数据和计算资源。

多模态向量搜索模型

将文本与图像分类结合起来,可以更全面地理解多种数据类型之间的关系。我们已经生成了图像的向量并学习了如何搜索相似图像,接下来让我们探讨什么是多模态向量搜索及其实用案例。

引言与背景

多模态模型的出现,彻底改变了我们对数据分析和表示的理解。新闻机构、电商网站和社交媒体平台是这一创新技术应用的典型代表。这些行业通过多媒体搜索的灵活性和适应性,显著提升用户体验并推动业务增长。

多模态模型的核心目标是整合并解释不同类型的数据(如文本和图像)。这种整合式方法能够捕捉多种数据类型间的细微交互,往往能产生“1+1>2”的效果。例如,将文本描述和图像分类在同一向量空间内结合,就是这种协同的有力体现。

这种方法的优势多样。首先,大幅增强搜索能力,查询可以基于文本和视觉信息同时进行。例如,搜索“绿色苹果”时,可以返回绿色苹果的图片、相关文本描述,或者两者的结合。

其次,因模型同时考虑文本和视觉信息,搜索结果的相关性显著提升。模型能从多个角度更丰富地理解查询内容,过滤无关结果并优先返回最匹配的内容。

最后,多模态方法促进了跨模态搜索,比如文本到图像和图像到文本的检索。用户既可以输入文本查询获取图片结果,也能用图像查询对应文本,极大提升了搜索系统的灵活性和用户友好性。

多模态模型中的向量空间概念

多模态模型运作及其能力的基石是其向量空间,常称为“共享”或“通用”向量空间。这一概念源自线性代数,提供了一个平台,使不同类型的数据能被统一表示和处理。

在该共享向量空间中,向量(具有大小和方向的参数化数学实体)用于表示不同的数据模态,如文本描述和图像。每个向量对应多维空间中的一个点,代表特定的文本或图像。这种表示方式既优雅又实用,因为向量间的几何距离可用来衡量对应实体的相似度或差异度。

几何距离并非随意设定,而是基于度量空间理论,利用距离函数(或度量)来量化空间内任意两对象的差异。在多模态向量空间中,常用余弦相似度或欧氏距离作为度量。距离越小(或余弦相似度越大),两向量及其对应实体的相似度越高。

实现该理念的过程是向量化,即本章前文提及的编码过程。模型通过两个不同编码器分别将文本描述和图像转换为向量,这类似于翻译过程,将文本和图像的复杂特性浓缩成向量这一模型易于理解和分析的“语言”。

与传统计算机视觉模型需依赖人工标注图像数据集不同,CLIP 利用海量网络文本-图像对灵活理解和分类图像。这一独特方法使 CLIP 可广泛应用于多任务,无需针对具体任务的微调,彰显多模态模型在视觉与语言桥接上的潜力。

OpenAI clip-ViT-B-32-multilingual-v1 模型简介

OpenAI 的 clip-ViT-B-32-multilingual-v1(简称 CLIP)是多模态模型的典范。该模型于 2021 年 1 月 5 日发布,通过自然语言监督高效学习视觉概念(详见 openai.com/research/clip)。换言之,CLIP 基于互联网上各种文本描述训练,能识别多种图像。

不同于多数训练于人工标注数据集的视觉模型,CLIP 利用网络上可得的文本-图像对进行训练,从而学到丰富的视觉概念及其对应名称,支持多种分类任务。然而,CLIP 也存在限制,其性能依赖于训练数据的质量和多样性,对于训练数据未充分涵盖的细节或上下文理解较弱。

多模态向量搜索的实际应用

理解了多模态和多媒体搜索基础后,我们进一步探讨其对不同内容类型的应用:

  • 文本:通过 TF-IDF 或词、句子、文档嵌入技术将文档转换为向量,用户查询时,系统查找与查询向量最接近的文本向量。
  • 图像:利用深度学习模型提取图像特征向量,用户用图像查询时,系统返回与查询图像向量最相似的图像。
  • 视频:视频包含视觉和音频信息,可提取对应的特征向量,基于这些向量进行相关视频的检索。

多媒体搜索的行业价值

  • 新闻机构:助力内容发现和丰富报道。记者可访问与主题相关的文章、图片、视频、信息图表及音频,提升报道深度。消费者则能享受多媒体内容组合呈现,获得沉浸式体验。
  • 电商平台:提升商品推荐精准度。分析文本描述和顾客评价,同时结合图像识别用户喜好,推送相关产品,增强用户体验和销售转化。
  • 社交媒体:改善内容发现和用户互动。比如识别用户上传的自制比萨照片,并推荐相关教程或食谱。同时,结合文本、图像、视频内容增强内容审核,提升平台安全。

这些示例展示了多媒体搜索在多个领域的变革潜力,通过增强用户参与度、内容发现和个性化,彻底革新数字内容交互方式。随着模型持续进步及新行业探索,多模态向量搜索的应用场景将日益丰富。

总结

本章中,我们探讨了图像相似度搜索的演进历程及其实践原理。我们讨论了基于向量的图像搜索在当今快节奏数字环境中的变革力量。我们掌握了如何创建图像的向量表示并将其整合进 Elasticsearch。我们了解到利用 kNN 搜索的强大能力,为提升用户体验提供了诸多可能性。同时,我们也见识到图像和多媒体搜索在众多领域的广泛应用,彰显了其在现代数字时代的重要性。

下一章,我们将讨论如何结合 NLP 模型与 Elasticsearch 的其他功能,在数据被导入 Elasticsearch 之前,对个人身份信息进行脱敏处理。