Ultralytics YOLO27:

如何使用 OpenAI CLIP 构建语义图像搜索#

本指南将带你使用 OpenAI CLIPFlask 构建一个语义图像搜索引擎。将 CLIP 的视觉-语言 嵌入 与由 NumPy 驱动的快速 余弦相似度 搜索相结合,你可以构建一个 Web 界面,根据自然语言查询检索相关图像,无需标签或类别。



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

包含语义搜索结果概览的 Flask 网页

Ultralytics Python 包通过两个类封装了整个流程,因此你只需几行代码即可启动一个可运行的搜索应用,或以编程方式执行查询。本指南涵盖语义搜索的实用价值工作原理运行 Web 应用以编程方式进行搜索以及配置参数

为什么使用语义图像搜索?#

使用 CLIP 构建自己的语义图像搜索系统具有多项显著优势:

  • **零样本能力:**你无需使用自己的数据集进行训练。CLIP 的零样本学习支持你使用自由形式的自然语言查询任意图像集合,从而节省时间和资源。
  • **类似人类的理解能力:**与关键词搜索不同,CLIP 能够理解语义上下文,并根据“自然环境中的快乐儿童”或“夜晚的未来城市天际线”等抽象、情感或关系型查询检索图像。
  • **无需标签或元数据:**这种方法只需要原始图像。CLIP 无需人工标注即可生成嵌入。
  • **轻量且精确的搜索:**在 NumPy 中进行一次归一化矩阵乘法,即可根据余弦相似度为每张图像排序,在数千个嵌入上实时返回精确结果,且无需安装或管理额外的搜索依赖。
  • **跨领域应用:**无论你是在构建个人照片存档、创意灵感工具、产品搜索引擎还是艺术推荐系统,同一技术栈只需极少调整即可适用。

语义图像搜索的工作原理#

该流程由三个组件组成,每个组件负责将图像和文本转换为排序结果的一个阶段:

  • CLIP 对图像使用视觉编码器(例如 ResNet 或 ViT),对语言使用基于 Transformer 的文本编码器,将二者投影到同一个多模态嵌入空间中。这样便可使用余弦相似度直接比较文本和图像。
  • NumPy 将图像嵌入存储为单个数组,并通过一次矩阵乘法将其与查询嵌入进行排序,按照余弦相似度返回最接近的向量,无需额外的索引依赖。
  • Flask 提供简单的 Web 界面,用于提交自然语言查询,并从索引中显示语义匹配的图像。

OpenAI Clip 图像检索工作流

由于图像和文本都位于同一个向量空间中,检索过程是零样本的:你不需要标签或类别,只需要图像数据和一个合适的提示词。

运行语义搜索 Web 应用#

SearchApp 类会启动完整的 Flask 界面。首次运行时,它会下载示例图像集、构建嵌入索引,并提供一个页面,让你输入查询并查看排序后的结果。

图像路径警告

如果你使用自己的图像,请确保为图像目录提供绝对路径。否则,由于 Flask 文件服务的限制,图像可能不会显示在网页上。

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

以编程方式搜索图像#

VisualAISearch 类负责执行所有后端操作,不包含 Web 层:

  • 从本地图像加载或构建嵌入索引。
  • 使用 CLIP 提取图像和文本嵌入
  • 使用余弦相似度执行相似度搜索。

使用自然语言查询调用搜索器,即可获得按相似度排序的匹配图像文件名列表:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

配置 VisualAISearch 参数#

下表列出了 VisualAISearch 可用的参数:

参数类型默认值描述
datastr'images'要建立索引并进行搜索的图像目录路径。
devicestr'cpu'用于 CLIP 推理的设备(例如 cpucuda0)。
在云端管理你的数据

如果你希望在生产规模下搜索图像集合,而无需管理本地文件,可以先在 Ultralytics Platform 中整理图像并进行版本管理,然后使用 CLIP 为其建立索引。

结论#

借助 CLIP 和 Ultralytics Python 包,你只需几行代码即可搭建零样本语义图像搜索引擎,既可以作为 Flask Web 应用,也可以作为编程式搜索后端。从这里开始,将 data 指向你自己的图像目录以建立索引,然后探索其他 Ultralytics Solutions,在你的计算机视觉工作流之上继续构建。

常见问题#

  • CLIP(对比语言-图像预训练)是由 OpenAI 开发的模型,旨在学习连接视觉信息和语言信息。它使用配有自然语言描述的大规模图像数据集进行训练。这种训练使其能够将图像和文本映射到共享的嵌入空间中,因此你可以使用向量相似度直接比较二者。

  • CLIP 的突出之处在于其泛化能力。它不是只针对特定标签或任务进行训练,而是直接从自然语言中学习。这使它能够处理“一个男人在骑水上摩托艇”或“超现实的梦境”等灵活查询,从分类到创意语义搜索都能发挥作用,而且无需重新训练。

  • CLIP 将你的图像转换为嵌入后,Ultralytics 包会对其进行 L2 归一化,并将其存储在单个 NumPy 数组中。系统通过一次矩阵乘法计算查询嵌入与每个图像嵌入之间的余弦相似度,然后对分数进行排序。这种暴力搜索是精确的,对于典型的图像集合而言速度也很快,无需安装或管理额外的向量数据库依赖。

  • 虽然 CLIP 由 OpenAI 开发,但 Ultralytics Python 包 将嵌入生成、索引和余弦相似度搜索封装成完整的语义图像搜索流程,只需几行代码即可运行:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    这一高级实现负责处理:

    • 基于 CLIP 生成图像和文本嵌入。
    • 嵌入索引的创建和管理。
    • 使用余弦相似度进行高效语义搜索。
    • 基于目录加载图像并进行可视化
  • 可以。当前设置使用 Flask 和基础 HTML 前端,但你可以将其替换为自己的 HTML,或使用 React、Vue 或其他前端框架构建更动态的 UI。Flask 可以作为自定义界面的后端 API。

  • 不能直接搜索。一个简单的变通方法是从视频中提取单独的帧(例如每秒提取一帧),将它们作为独立图像处理,然后输入系统。这样,搜索引擎就可以对视频中的视觉片段进行语义索引。

评论