利用 OpenAI CLIP 和 Meta FAISS 进行语义图像搜索
导言
本指南将指导您使用OpenAI CLIP、Meta FAISS 和Flask 构建语义图像搜索引擎。通过将 CLIP 强大的可视化语言嵌入与 FAISS 高效的近邻搜索相结合,您可以创建一个功能齐全的网络界面,使用自然语言查询检索相关图像。
语义图像搜索可视化预览
如何使用
- CLIP对图像使用视觉编码器(如 ResNet 或 ViT),对语言使用文本编码器(基于转换器),将两者投射到同一个多模态嵌入空间。这样就可以使用余弦相似度对文本和图像进行直接比较。
- FAISS(Facebook 人工智能相似性搜索)建立了一个图像嵌入索引,可以快速、可扩展地检索与给定查询最接近的向量。
- Flask提供了一个简单的网络界面,用于提交自然语言查询,并显示索引中语义匹配的图像。
这种架构支持零镜头搜索,也就是说,你不需要标签或类别,只需要图像数据和一个好的提示。
使用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 提取图像和文本嵌入。
- 使用余弦相似性执行相似性搜索。
相似图片搜索
图像路径警告
如果您使用自己的图片,请确保提供图片目录的绝对路径。否则,由于 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:0 或 0 ).允许用户选择CPU 、特定GPU 或其他计算设备执行模型。 |
利用 CLIP 和 FAISS 进行语义图像搜索的优势
利用 CLIP 和 FAISS 构建自己的语义图像搜索系统具有多项引人注目的优势:
-
零点能力:您无需在特定数据集上训练模型。CLIP 的零点学习功能可让您使用自由形式的自然语言在任何图像数据集上执行搜索查询,从而节省时间和资源。
-
人性化理解:与基于关键字的搜索引擎不同,CLIP 能理解语义上下文。它可以根据 "大自然中快乐的孩子 "或 "未来城市夜晚的天际线 "等抽象、情感或关系查询检索图像。
-
无需标签或元数据:传统的图像搜索系统需要仔细标注数据。而这种方法只需要原始图像。CLIP 无需任何手动标注即可生成嵌入。
-
灵活、可扩展的搜索:FAISS 即使在大规模数据集上也能实现快速近邻搜索。它针对速度和内存进行了优化,即使有数千(或数百万)个嵌入数据,也能实现实时响应。
-
跨领域应用:无论您是要建立个人照片档案库、创意灵感工具、产品搜索引擎,还是艺术推荐系统,只需进行少量调整,该堆栈就能适应不同的领域。
常见问题
CLIP 如何理解图像和文本?
CLIP(对比语言图像预训练)是由OpenAI开发的一个模型,可以学习如何将视觉信息与语言信息联系起来。该模型在海量图像数据集上进行训练,并配以自然语言说明。通过这种训练,它可以将图像和文本映射到一个共享的嵌入空间中,因此您可以直接使用向量相似性对它们进行比较。
为什么 CLIP 被认为对人工智能任务如此强大?
CLIP 的突出之处在于它的通用能力。它不是只针对特定的标签或任务进行训练,而是从自然语言本身进行学习。这使它能够处理灵活的查询,如 "一个男人骑着水上摩托 "或 "一个超现实的梦境",从分类到创造性的语义搜索,无需重新训练即可使用。
FAISS 在这个项目(语义搜索)中具体做些什么?
FAISS(Facebook 人工智能相似性搜索)是一个工具包,可帮助您高效地搜索高维向量。CLIP 将图像转化为嵌入后,FAISS 就能快速、轻松地找到与文本查询最匹配的图像,非常适合实时图像检索。
为什么使用 UltralyticsPython 软件包?
CLIP 和 FAISS 分别由 OpenAI 和 Meta 开发,Ultralytics Python 软件包简化了它们与完整语义图像搜索管道的集成,只需 2 行工作流即可运行:
相似图片搜索
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 索引。
- 利用余弦相似性进行高效语义搜索
- 基于目录的图像加载和可视化。
我可以自定义此应用程序的前台吗?
当然可以。目前的设置使用的是 Flask 和基本的 HTML 前端,但您可以自由更换自己的 HTML,甚至使用 React、Vue 或其他前端框架构建更动态的界面。Flask 可以轻松充当您自定义界面的后台 API。
是否可以通过视频而不是静态图像进行搜索?
但有一个简单的解决方法。您可以从视频中提取单帧(例如每秒一帧),将其视为独立图像,然后将其输入系统。这样,搜索引擎就能对视频中的视觉瞬间进行语义索引。