blog-post

使用 Manticore Search 构建反向图像搜索应用

TL;DR: 学习如何使用 Manticore Search 构建反向图像搜索应用,包括回顾反向图像搜索的历史、背后的技术以及图像检索系统的实用方法。

介绍

反向图像搜索改变了我们发现数字内容的方式,让用户可以通过图像而不是文字进行搜索。这项技术有许多应用,从帮助购物者找到产品到让设计师检查他们的作品与现有设计的匹配。它已成为许多数字平台的关键组成部分。

您可以在 image.manticoresearch.com 尝试我们的反向图像搜索演示,并查看 GitHub 上的开源实现

我们将深入探讨反向图像搜索的工作原理,讨论其在现实世界中的应用,并展示向量搜索技术如何使此工具在从日常浏览到专业应用的各类场景中高效且可访问。

理解反向图像搜索

反向图像搜索是如何工作的?

反向图像搜索允许用户通过上传图像或提供图像 URL 进行搜索,系统会返回视觉上相似的图像及相关信息。该过程涉及几个关键步骤,利用向量搜索技术高效处理高维图像数据:

  1. 特征提取:系统分析图像以识别关键视觉元素。
  2. 嵌入生成:将视觉特征转化为数值向量表示。
  3. 相似性比较:将此向量与存储的图像向量数据库进行比较,使用向量搜索。
  4. 结果排序:根据相似性分数对结果进行排序。

机器学习模型的作用

机器学习模型,特别是深度学习,彻底改革了反向图像搜索。2000 年代早期的系统依赖于基本的颜色直方图和边缘检测,限制了准确性。2012 年卷积神经网络(CNN)的引入,例如 AlexNet,显著提高了理解复杂视觉模式的能力。

随着时间的推移,Google 图像和 Pinterest 等服务从基本的元数据匹配发展为使用先进的深度学习模型,提供精准的搜索结果。TinEye 也展示了跟踪图像修改和重用的能力。

现代机器学习模型在理解复杂视觉模式和生成详细图像嵌入方面表现出色,这些嵌入捕捉了每张照片的精髓。这些模型能够理解上下文,识别不同视角的物体,甚至掌握艺术风格——这些成就是旧的计算机视觉方法无法实现的。

使用 TinyCLIP 和 Manticore Search 构建反向图像搜索系统

反向图像搜索展示

Manticore Search 中,我们探索了几种构建高效反向图像搜索系统的方法。我们希望找到一个实用的解决方案,利用 Manticore 强大的向量搜索,同时保持可访问性,因此我们选择了 TinyCLIP — 一个高效运行于标准 CPU 的精简模型。

TinyCLIP 非常适合我们的实现,因为它在处理效率和精度之间达到了良好的平衡。与需要专用 GPU 基础设施的大型模型不同,TinyCLIP 可以在标准硬件上运行,非常适合轻量级的容器化部署。

作为 CLIP(对比语言-图像预训练)家族的一部分,TinyCLIP 可以为图像和文本创建向量嵌入,支持:

  1. 使用其他图像搜索图像(反向图像搜索)。
  2. 使用文本描述搜索图像。
  3. 找到与图像相关的文本内容。
  4. 根据相似性进行文本与文本之间的匹配。

TinyCLIP 在减少以下方面保持良好的准确性:

  • 模型大小(减少存储和内存)。
  • 计算需求(可在 CPU 上运行)。
  • 推理时间(更快的响应)。
  • 容器占用(易于部署和扩展)。

通过将 TinyCLIP 与 Manticore Search 的向量存储集成,我们为构建可部署的多模态搜索系统创建了一个实用的基础。

向量搜索 是反向图像搜索的一种有效方法,能够快速准确地比较高维向量。作为一个开源引擎,Manticore Search 支持向量搜索,使其成为实现反向图像搜索的强大选择。

使用 Manticore Search 实现反向图像搜索

我们利用 Manticore Search 的能力将反向图像搜索变为现实。以下是逐步指南:

  1. 设置 Manticore Search:按照 这些说明 安装和配置 Manticore Search。
  2. 为图像向量创建表:定义用于存储图像向量的表架构:
    CREATE TABLE IF NOT EXISTS <table name> (
        id bigint,
        image_path text,
        caption text,
        embeddings float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='COSINE'
    )
    
  3. 生成图像嵌入:利用 TinyCLIP 将图像转化为向量嵌入。
    生成图像嵌入:使用 TinyCLIP 将图像转化为向量嵌入。我们创建了一个 轻量级 Python 服务器 来生成和检索这些嵌入。
    如果您对使用 Python 操作模型感到好奇,它非常简单,代码大致如下:
    from transformers import CLIPProcessor, CLIPModel, AutoProcessor, AutoModelForCausalLM
    
    clip_model = CLIPModel.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M")
    clip_processor = CLIPProcessor.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M")
    
    try:
        image_bytes = base64.b64decode(request.image)
        image = Image.open(io.BytesIO(image_bytes))
    
        inputs = clip_processor(images=image, return_tensors="pt")
        with torch.no_grad():
            image_features = clip_model.get_image_features(**inputs)
    
        print(image_features.squeeze().tolist())
    except Exception as e:
        raise HTTPException(status_code=400, detail=f"Error processing image: {str(e)}")
    
  4. 索引图像向量:将您的向量数据导入 Manticore Search 表。
    首先,处理每个图像以获取其文本嵌入表示,然后将这些向量存储在您的 Manticore Search 表中。这个关键步骤将您的视觉数据转换为可搜索的数值,使它们能够在搜索过程中高效检索。
    查看 这个脚本 ,我们开发了它用于通过前面提到的 Python 服务器 API 导入数据到我们的演示中。您所需要做的就是通过模型处理您的图像集合,这将生成可以存储在 Manticore Search 中的向量。
  5. 实现图像搜索:集成 Manticore Search 的向量能力以找到视觉上相似的图像。
    这是一个实际应用和基本工作流程,演示了您可以使用 Manticore 实现的内容。为了简化,某些细节已被省略,但您可以在 我们的仓库 找到完整的代码。
    // 首先上传图像并获取嵌入
    $image = Image::upload($file['tmp_name'])->unwrap();
    $embeddings = $Embed->getImageEmbeddings($image->getPath())->unwrap();
    
    // 使用 Manticore Search 搜索
    $client = new Manticoresearch\Client(config('manticore'));
    $query = new Manticoresearch\Query\KnnQuery('embeddings', $embeddings, 10);
    $docs = $client->index('image')->search($query)->get();
    
    // 最后处理找到的图像
    foreach ($docs as $doc) {
        $row = ['id' => (int)$doc->getId(), ...$doc->getData()];
        $items[] = $row;
    }
    
    同样,在 这个脚本 中,您可以看到我们如何处理图像嵌入及使用 Manticore Search 执行向量相似性搜索以检索相关结果。

Manticore Search 图像演示

我们开发了一个演示,展示向量搜索的能力,您可以在 image.manticoresearch.com 上进行探索。该演示利用了 TinyCLIP 的 AI 模型将图像转化为向量并执行快速相似性搜索。

关键特性

  1. 反向图像搜索(图像到图像搜索):上传或链接一张图像以寻找视觉上相似的内容。
  2. 文本到图像搜索:使用文本描述查找相关图像。这个功能得益于 TinyCLIP 创建与图像嵌入匹配的文本嵌入的能力,从而提供有效的跨模态检索。尽管本文关注于反向图像搜索,我们将来会创建一篇单独的文章专注于文本到图像搜索。
  3. 高效的 CPU 处理:TinyCLIP 提供快速结果,无需专用硬件。

反向图像搜索的应用

反向图像搜索开启了许多可能性:

  • 电子商务:反向图像搜索可以通过上传照片帮助客户找到视觉上相似的产品。例如,如果客户看到一件他们喜欢的裙子但无法在线找到,他们可以上传一张照片,系统将向他们展示可购买的视觉上相似的裙子。这个功能有助于提高产品发现和增强购物体验。
  • 内容管理:识别重复图像对于拥有庞大内容库的组织来说是一个重大挑战。反向图像搜索使内容管理者能够快速识别和删除冗余图像,优化存储空间,并确保高效的内容管理。它还帮助跟踪不同平台上未经授权的图像使用,维护版权合规。
  • 推荐:提供视觉上相关的建议有助于提高用户参与度,使用户轻松发现相关内容。例如,一位用户上传一张特定家具的照片,可以展示与风格或颜色匹配的类似物品,帮助他们更容易地完成一套或探索类似选项。这种能力可以应用于时尚、家居装饰以及许多其他领域,以提供更直观和以视觉驱动的推荐体验。

结论和未来方向

反向图像搜索已经取得了长足的进步,从简单的颜色匹配发展到先进的基于向量的相似性分析。凭借 TinyCLIP 和 Manticore Search 等模型,构建反向图像搜索系统现在对于各个规模的开发者来说都是可行的。

我们在 image.manticoresearch.com 提供的图像搜索演示,让您可以亲身体验这些技术。无论您是希望向您的应用程序添加视觉搜索,还是仅仅出于好奇,该演示都是探索现代反向图像搜索力量的绝佳起点。

安装Manticore Search

安装Manticore Search