blog-post

通过文本搜索图像与 Manticore Search

简要: 了解 Manticore Search 如何通过文本描述搜索图像,将自然语言处理与向量表示的搜索相结合。我们将讨论不同的路径——从传统方法到基于向量搜索的现代解决方案。如果您想实时查看所有内容,请访问 我们的演示


引言

想象一下,可以只用文字描述所需的图像,例如:“海滩上的日落”。现在这不是幻想,而是现实。基于文本的图像搜索将语言与视觉内容结合在一起。

传统的方法(基于关键字搜索或手动标记)往往不够准确且难以扩展。现代方法,如 Manticore Search 的解决方案,利用语义理解和向量表示,以提供更准确且上下文相关的结果。这对于在线商店、媒体库或创意任务服务尤为方便,帮助简化内容处理。

想看看它是如何工作的?试试 我们的演示!

基于文本的图像搜索方法

1. 基于关键字的搜索

最简单的方法。首先创建一个表:

CREATE TABLE images (
    title text,
    description text,
    tags text,
    path string stored
);

然后手动为每个图像添加标签。之后可以执行查询:

SELECT * FROM images WHERE MATCH('@tags 红色裙子');

或者按标题和描述进行搜索:

SELECT * FROM images WHERE MATCH('@(title,description) 红色裙子');

这里的搜索是基于文本元数据和查询的比较。这个方法简单,但需要手动标记并且限制较大。它无法理解单词之间的广泛关系或其上下文,并且依赖于精确匹配,而不是语义。

2. 使用分类的搜索

为了改善商品或其他对象的搜索,可以添加类别。这样用户就可以根据所选类别过滤图像,同时使用全文搜索。这简化了那些寻找特定内容的用户的体验。

一个表的示例可能看起来如下:

CREATE TABLE images (
    category_id int,
    subcategory_id int,
    attributes json,
    path string stored
);

采用这种方法,所有图像都被分配到预定的类别中。这提供了一种比单纯的关键字更明确的结构,但限制了灵活性,因为一切都严格绑定于预先定义的组。此外,还需要手动决定每张图片的分类。

3. 使用图像说明的搜索

存在各种 AI 模型,可以自动生成图像的简短描述(说明)。虽然这些自动生成的说明并不总是适合公开展示,但它们非常好地补充了基于关键字的搜索。

无论您如何结构化数据——通过类别或手动标记——都需要利用全文搜索工具,以便从所需字段提取信息。

假设您希望手动添加说明。那么过程可以这样进行:

  1. 添加带有正确格式的说明的数据:
    INSERT INTO images (id, auto_caption, indexed_caption, path) VALUES
     (1, '一个人走在海滩上看日落', '海滩 日落 人', '/images/sunset_beach.jpg'),
     (2, '街上的红车', '车 红色 城市', '/images/red_car.jpg');
    
  2. 对 indexed_caption 字段进行简单的文本搜索:
    SELECT * FROM images WHERE MATCH('@indexed_caption 海滩 日落');
    
  3. 使用扩展运算符进行更精确的搜索:
    -- 短语搜索
    SELECT * FROM images WHERE MATCH('"红车"');
    
    -- 复杂查询
    SELECT * FROM images WHERE MATCH('@indexed_caption (海滩 | 日落) -夜晚');
    

如何改善结果?

  • 从说明中删除停用词。
  • 调整词干提取,以涵盖不同形式的单词。
  • 为流行术语添加同义词。
  • 调整相关性系数,以提供更精确的结果。

可以将全文搜索与过滤器结合:

SELECT path, WEIGHT() as relevance
FROM images
WHERE MATCH('@indexed_caption 日落')
AND category_id = 1
ORDER BY relevance DESC
LIMIT 10;

4. 向量搜索(推荐方法)

在此之前,我们讨论了传统方法:基于关键字的搜索、分类搜索和使用说明的搜索。所有这些方法都解决了相似问题,但在处理更复杂或模糊的查询时可能无能为力。

为了绕过这些限制,Manticore Search 提供了向量搜索。它依赖于数据的向量表示,并允许根据意义匹配文本和图像。下面我们将探讨它是如何工作的,以及设置它所需的内容。

向量搜索是如何工作的?

向量搜索使用嵌入——数值向量,反映数据的语义特征。多模态模型为文本和图像生成嵌入,然后根据值的相似性,而非相同的关键字进行匹配。

总体步骤如下:

  1. 使用机器学习模型为文本和图像创建向量表示(嵌入)。
  2. 这些向量存储在可以快速进行相似性搜索的数据库中。
  3. 查询与数据库中的向量进行比较,最终获得语义上最接近的结果。

以下是一个简化的示意图,展示了如何将文本和图像转换为嵌入并通过 Manticore Search 进行搜索:

基于向量的方法图示

使用 Manticore 设置向量搜索

让我们来看看需要进行哪些步骤:

  1. 选择多模态模型
    例如,TinyCLIP(CLIP的简化版本),它可以为文本和图像构建嵌入。连接模型和处理器:

    from transformers import CLIPProcessor, CLIPModel
    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")
    
  2. 创建数据库中的表
    准备存储向量的结构:

    CREATE TABLE images (
      id bigint,
      image_path text,
      embeddings float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='COSINE'
    );
    
  3. 生成并加载嵌入
    使用模型处理图像,获取它们的嵌入并插入数据库。作为示例,可以查看 GitHub上的load-dataset脚本

  4. 向数据库发起查询

    $embeddings = $Embed->getImageEmbeddings($image->getPath());
    $query = new Manticoresearch\Query\KnnQuery('embeddings', $embeddings, 10);
    $docs = $client->index('image')->search($query)->get();
    

向量搜索的优势

如果您使用Manticore实现图像搜索,利用向量嵌入,将获得一系列显著的优点:

  • 语义理解:根据整体意义而非精确的单词匹配,将查询与图像对应。
  • 对视觉概念的灵活性:能够很好地捕捉到微妙的视觉细节,并将其与描述相关联。
  • 自然语言的便利性:允许使用普通短语和问题。
  • 高准确性:适用于抽象或复杂查询。
  • 可扩展性:不需要持续的手动标注,并能够轻松处理大规模集合。

方法比较

以下是不同方法在实际条件下表现的简要总结:

方法描述准确性配置难度维护查询速度
关键词搜索将查询与手动标记的标签进行匹配。最简单,但无法理解语义。较低较低较高快速
分类搜索根据预先设定的组明确组织图像,提供结构化搜索。中等中等较高快速
使用标签的搜索自动或手动描述,补充关键词。中等较高中等快速
向量搜索构建嵌入并根据语义进行比较,而非形式上的匹配。较高较高较低中等

每种选择都有其优缺点。选择最适合您的任务和资源的选项。

尝试Demo

想亲自看看一切吗?我们有一个开源的Demo项目。您可以查看GitHub上的仓库,并根据自己的需求进行设置: Manticore图像搜索Demo

在仓库中,有详细的说明和脚本示例,方便您快速启动或修改应用程序。这是测试和实际生产的一个良好起点。

结论

基于文本的Manticore搜索的图像向量搜索相较于经典方法具有显著优势。它提供:

  • 非常精确的查询与相关图像的匹配。
  • 最小的手动工作(不需要到处标记标签)。
  • 考虑词语与图像之间的语义关系
  • 良好的可扩展性,随着图像数量的增加而增长。

尽管关键词搜索或分类在某些情况下也会有用,但目前向量方法被认为是图像文本搜索中最现代、最有效的方式。

不信?请访问我们的Demo image.manticoresearch.com 或查看GitHub上的源代码: Manticore图像搜索Demo.

Image Search Demo

安装Manticore Search

安装Manticore Search