# Building a Reverse Image Search app with Manticore Search

**TL;DR:** 学习如何使用 Manticore Search 构建反向图像搜索应用，包括反向图像搜索的历史、技术原理以及图像检索系统的实际应用方法。

## 引言

反向图像搜索通过允许用户使用图像而非文本进行搜索，改变了我们发现数字内容的方式。这项技术有多种应用，从帮助购物者找到产品到使设计师能够将其作品与现有设计进行比对。它已成为许多数字平台的关键组成部分。

您可以在 [image.manticoresearch.com](https://image.manticoresearch.com/) 尝试我们的反向图像搜索演示，并查看 [GitHub 上的开源实现](https://github.com/manticoresoftware/manticore-image-search)。

我们将深入探讨反向图像搜索的工作原理，讨论其实际应用，并展示向量搜索技术如何使这一工具在各种场景中高效且易于使用，从日常浏览到专业应用。

## 理解反向图像搜索

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

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

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

### 机器学习模型的作用

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

随着时间的推移，Google Images 和 Pinterest 等服务从基本的元数据匹配演变为使用先进的深度学习模型，提供精确的搜索结果。TinEye 也展示了在网页上跟踪图像修改和再利用的能力。

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

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

![反向图像搜索展示](./reverse-image-search-demo/reverse-image-search-showcase.png)

在 [Manticore Search](https://manticoresearch.com/)，我们探索了多种构建高效反向图像搜索系统的方法。我们希望找到一种实用的解决方案，利用 Manticore 强大的向量搜索功能，同时保持易用性，这使我们选择了 [TinyCLIP](https://github.com/wkcn/TinyCLIP) —— 一种在标准 CPU 上高效运行的精简模型。

TinyCLIP 是我们实现的理想选择，因为它在处理效率和精度之间取得了平衡。与需要专用 GPU 基础设施的大型模型不同，TinyCLIP 可以在标准硬件上运行，使其非常适合轻量级、容器化部署。

作为 CLIP（对比语言-图像预训练）家族的一部分，TinyCLIP 可以为图像和文本创建向量嵌入，实现以下功能：

1. 使用其他图像搜索图像（反向图像搜索）。
2. 使用文本描述搜索图像。
3. 使用图像查找相关文本内容。
4. 基于相似性进行文本到文本的匹配。

TinyCLIP 在减少以下方面表现出色：

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

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

## 向量搜索与 Manticore Search

[向量搜索](/use-case/vector-search/) 是反向图像搜索的有效方法，能够快速准确地比较高维向量。Manticore Search 是一个开源引擎，支持向量搜索，使其成为实现反向图像搜索的强大选择。

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

我们通过 Manticore Search 的功能实现了反向图像搜索。以下是逐步指南：

1. **设置 Manticore Search**：按照[这些说明](https://manual.manticoresearch.com/Installation/Installation)安装并配置 Manticore Search。
2. **为图像向量创建表**：定义用于存储图像向量的表结构：
    ```sql
    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 服务器](https://github.com/manticoresoftware/manticore-image-search/blob/1acafe0afd9ef30bfc9d9f0439f298df44f90d94/docker/containers/embed/entrypoint)来生成和检索这些嵌入。
    如果你对使用模型与 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 表中。这一步至关重要，它将你的视觉数据转换为可搜索的数值，使它们在搜索期间能够高效检索。
    查看我们开发的[此脚本](https://github.com/manticoresoftware/manticore-image-search/blob/1acafe0afd9ef30bfc9d9f0439f298df44f90d94/app/scripts/load-dataset)，用于通过前面提到的 Python 服务器 API 将数据导入我们的演示。你只需要通过模型处理你的图像集合，这将生成可以存储在 Manticore Search 中的向量。
5. **实现图像搜索**：集成 Manticore Search 的向量功能以查找视觉上相似的图像。
    这里是一个实际的实现和基本工作流程，展示了你可以使用 Manticore 实现什么。为了简化，省略了一些细节，但你可以在[我们的仓库](https://github.com/manticoresoftware/manticore-image-search)中找到完整代码。
    ```php
    // Upload image and get embeddings first
    $image = Image::upload($file['tmp_name'])->unwrap();
    $embeddings = $Embed->getImageEmbeddings($image->getPath())->unwrap();

    // Search with Manticore Search
    $client = new Manticoresearch\Client(config('manticore'));
    $query = new Manticoresearch\Query\KnnQuery('embeddings', $embeddings, 10);
    $docs = $client->index('image')->search($query)->get();

    // Finally do something with images found
    foreach ($docs as $doc) {
        $row = ['id' => (int)$doc->getId(), ...$doc->getData()];
        $items[] = $row;
    }
    ```
    此外，在[此脚本](https://github.com/manticoresoftware/manticore-image-search/blob/1acafe0afd9ef30bfc9d9f0439f298df44f90d94/app/actions/api/search-by-image.php)中，你可以看到我们如何处理图像嵌入并通过 Manticore Search 进行向量相似性搜索以检索相关结果。

## Manticore Search 图像演示

我们开发了一个演示，展示了向量搜索的功能，你可以在 [image.manticoresearch.com](https://image.manticoresearch.com/) 上探索。该演示利用 TinyCLIP 的 AI 模型将图像转换为向量并执行快速相似性搜索。

### 关键功能
1. **反向图像搜索（图像到图像搜索）**：上传或链接图像以查找视觉上相似的内容。
2. **文本到图像搜索**：使用文本描述查找相关图像。此功能得益于 TinyCLIP 能够创建与图像嵌入匹配的文本嵌入，从而提供有效的跨模态检索。虽然本文重点介绍反向图像搜索，但我们将在未来创建一篇专门介绍文本到图像搜索的独立文章。
3. **高效的 CPU 处理**：TinyCLIP 在无需专用硬件的情况下即可快速提供结果。

## 反向图像搜索的应用

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

## 结论与未来方向

反向图像搜索已经取得了长足进步，从简单的颜色匹配发展到基于向量的高级相似性分析。借助 TinyCLIP 和 Manticore Search 等模型，现在所有规模的开发人员都可以构建反向图像搜索系统。

我们提供的图像搜索演示位于 [image.manticoresearch.com](https://image.manticoresearch.com/)，让你可以亲身体验这些技术。无论你是想为你的应用程序添加视觉搜索功能，还是仅仅出于好奇，这个演示都是探索现代反向图像搜索强大功能的绝佳起点。
