使用 OpenAI CLIP 和 Meta FAISS 进行语义图像搜索

介绍

本指南将引导你构建一个语义图像搜索引擎,该引擎使用 OpenAI CLIPMeta FAISSFlask。通过将 CLIP 强大的视觉语言嵌入(embeddings)与 FAISS 高效的最近邻搜索相结合,你可以创建一个功能完备的 Web 界面,使用自然语言查询检索相关图像。



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

语义图像搜索视觉预览

Flask 网页及语义搜索结果概览

工作原理

  • CLIP 使用视觉编码器(例如 ResNet 或 ViT)处理图像,并使用文本编码器(基于 Transformer)处理语言,将两者投影到同一个多模态嵌入空间中。这允许使用 余弦相似度 直接对文本和图像进行比较。
  • FAISS (Facebook AI Similarity Search) 构建图像嵌入索引,并能够针对给定查询快速、可扩展地检索最接近的向量。
  • Flask 提供了一个简单的 Web 界面,用于提交自然语言查询并显示索引中语义匹配的图像。

这种架构支持零样本(zero-shot)搜索,这意味着你不需要标签或类别,只需要图像数据和一个好的提示词(prompt)。

使用 Ultralytics Python 软件包进行语义图像搜索
图像路径警告

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

from ultralytics import solutions

app = solutions.SearchApp(
    # data = "path/to/img/directory" # Optional, build 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

此类执行所有后端操作:

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

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

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # 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'用于相似度搜索的图像目录路径。
参数类型默认值描述
devicestrNone指定推理设备(例如 cpucuda:00)。允许用户选择 CPU、特定的 GPU 或其他计算设备来执行模型。

使用 CLIP 和 FAISS 进行语义图像搜索的优势

使用 CLIP 和 FAISS 构建自己的语义图像搜索系统具有几个显著的优势:

  1. 零样本(Zero-Shot)能力:你不需要在特定数据集上训练模型。CLIP 的零样本学习功能让你能够使用自由形式的自然语言对任何图像数据集执行搜索查询,从而节省时间和资源。

  2. 类人理解力:与基于关键词的搜索引擎不同,CLIP 理解语义语境。它能够根据抽象、情感或关系查询来检索图像,例如“自然中快乐的孩子”或“夜间充满未来感的城市天际线”。

    OpenAI Clip 图像检索工作流

  3. 无需标签或元数据:传统的图像搜索系统需要仔细标注的数据。此方法仅需原始图像。CLIP 无需任何人工标注即可生成嵌入。

  4. 灵活且可扩展的搜索:即使面对大规模数据集,FAISS 也能实现快速的最近邻搜索。它针对速度和内存进行了优化,即使在成千上万(或数百万)个嵌入的情况下也能实现实时响应。

    Meta FAISS 嵌入向量构建工作流

  5. 跨领域应用:无论你是在构建个人照片存档、创意灵感工具、产品搜索引擎,还是艺术推荐系统,该技术栈都能以极小的调整适应各种领域。

常见问题 (FAQ)

CLIP 如何理解图像和文本?

CLIP (对比语言图像预训练) 是由 OpenAI 开发的模型,它学习连接视觉和语言信息。它是在一个包含图像及其对应自然语言说明的海量数据集上进行训练的。这种训练使其能够将图像和文本映射到共享的嵌入空间,因此你可以使用向量相似度直接对它们进行比较。

为什么 CLIP 在 AI 任务中被认为如此强大?

CLIP 的过人之处在于其泛化能力。它不是仅针对特定标签或任务进行训练,而是从自然语言本身学习。这使得它能够处理灵活的查询,如“骑摩托艇的人”或“超现实梦境”,使其在从分类到创意语义搜索的各种应用中都非常有用,且无需重新训练。

FAISS 在本项目(语义搜索)中具体起什么作用?

FAISS (Facebook AI Similarity Search) 是一个工具包,可以帮助你非常高效地搜索高维向量。一旦 CLIP 将图像转换为嵌入,FAISS 就能快速轻松地找到与文本查询最接近的匹配项,非常适合实时图像检索。

如果 CLIP 和 FAISS 分别来自 OpenAI 和 Meta,为什么要使用 Ultralytics Python 软件包

虽然 CLIP 和 FAISS 分别由 OpenAI 和 Meta 开发,但 Ultralytics Python 软件包 通过一个仅需两行的工作流,简化了它们向完整语义图像搜索流水线的集成,而且开箱即用:

相似图像搜索
from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # 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

这种高层实现处理了以下内容:

  • 基于 CLIP 的图像和文本嵌入生成。
  • FAISS 索引创建与管理。
  • 利用余弦相似度进行高效语义搜索。
  • 基于目录的图像加载与 可视化

我可以自定义此应用的后端吗?

可以。目前的配置使用 Flask 和基本的 HTML 前端,但你可以将其替换为你自己的 HTML,或者使用 React、Vue 或其他前端框架构建更动态的 UI。Flask 可以作为你自定义界面的后端 API。

可以搜索视频而不是静态图像吗?

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

评论