跳转至内容

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

简介

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



观看: 相似性搜索如何工作 | 使用 OpenAI CLIP、META FAISS 和 Ultralytics 包进行视觉搜索 🎉

语义图像搜索可视化预览

带有语义搜索结果概览的 Flask 网页

工作原理

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

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

使用 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 i.e "cpu" or "cuda"
)

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

VisualAISearch

此类执行所有后端操作:

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

相似图像搜索

图像路径警告

如果您使用的是自己的图像,请确保提供图像目录的绝对路径。否则,由于 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 i.e "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:

参数 类型 默认值 描述
data str 'images' 用于相似性搜索的图像目录的路径。
参数 类型 默认值 描述
device str None 指定用于推理的设备(例如, cpu, cuda:00)。允许用户在 CPU、特定 GPU 或其他计算设备之间进行选择,以执行模型。

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

使用 CLIP 和 FAISS 构建您自己的语义图像搜索系统具有以下几个引人注目的优势:

  1. 零样本能力:您无需在您的特定数据集上训练模型。CLIP 的零样本学习使您可以使用自由形式的自然语言对任何图像数据集执行搜索查询,从而节省时间和资源。

  2. 类人理解: 与基于关键词的搜索引擎不同,CLIP理解语义上下文。它可以根据抽象的、情感的或关系的查询(如“自然界中快乐的孩子”或“夜晚的未来城市天际线”)来检索图像。

    OpenAI Clip 图像检索工作流程

  3. 无需标签或元数据:传统的图像搜索系统需要仔细标记的数据。此方法只需要原始图像。CLIP 生成嵌入,而无需任何手动注释。

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

    Meta FAISS 嵌入向量构建工作流程

  5. 跨领域应用: 无论您是构建个人照片档案、创意灵感工具、产品搜索引擎,甚至是艺术推荐系统,此堆栈都可以通过最少的调整来适应不同的领域。

常见问题

CLIP 如何理解图像和文本?

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

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

CLIP 的突出之处在于其泛化能力。它并非仅针对特定标签或任务进行训练,而是从自然语言本身中学习。这使其能够处理灵活的查询,如“一个人骑着水上摩托”或“超现实的梦境”,从而使其可用于从分类到创造性语义搜索的各种任务,而无需重新训练。

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 i.e "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 索引创建和管理。
  • 利用余弦相似度进行高效的语义搜索。
  • 基于目录的图像加载和可视化

我可以自定义此应用程序的前端吗?

是的,您完全可以。当前的设置使用带有基本 HTML 前端的 Flask,但您可以随意替换您自己的 HTML,甚至可以使用 React、Vue 或其他前端框架构建更动态的东西。 Flask 可以轻松地用作您的自定义界面的后端 API。

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

不能直接搜索,但有一个简单的解决方法。您可以从视频中提取单独的帧(例如,每秒一帧),将它们视为独立的图像,然后将它们输入到系统中。这样,搜索引擎就可以对视频中的视觉时刻进行语义索引。



📅 3个月前创建 ✏️ 2个月前更新

评论