免费的本地 以图搜图&以文搜图工具分享

121 阅读4分钟

一、介绍

VimgFind是专为Windows系统设计的本地AI搜图工具,核心是“向量编码”与“索引存储”。实际上无论是以图搜图还是以文搜图,核心的第一步都是将这些非数值型数据给量化成向量。而如果希望能同时集成以图搜图还是以文搜图,就必须要求模型能将图片和文本映射到同一块向量空间中。项目地址:github.com/Just-A-Fres…

VimgFind不仅具有以图搜图能力,同时在2.1以上的版本还新增了以文搜图的功能(输入框内回车键触发);

二、快速使用

2.1 直接下载

[注意] 首次启动需切换到设置界面添加并立即更新索引。默认开启了自动更新索引,只要添加了索引目录,后面就无需再手动更新。目前的界面支持:

  • 点击浏览按钮/剪切板按钮/拖拽图片到窗口实现以图搜图
  • 在文本框中输入文本按回车键触发以文搜图

2.2 源码部署

详见项目简介

三、功能实现

3.1 以图搜图的核心逻辑

以图搜图的本质是“图片向量的相似度匹配”,流程如下:

  1. 图片预处理:通过PIL(Pillow)库读取本地图片,完成尺寸归一化、色域转换等操作(项目中utils.pyencoder.py隐含该逻辑);
  2. 向量编码:将预处理后的图片输入预训练的ONNX模型(Imagenet-B2/Chinese CLIP),通过ONNXRuntime完成推理,输出固定维度的图片特征向量;
  3. 向量索引构建:利用hnswlib(高效近邻检索库)将所有图片的特征向量构建成索引库(IndexManager.py负责索引管理);
  4. 相似度检索:待搜索图片经同样编码后,在索引库中检索余弦相似度最高的向量,匹配出对应的图片文件。

3.2 以文搜图的核心逻辑

以文搜图是“文本-图片跨模态匹配”,基于CLIP(Contrastive Language-Image Pre-training)技术实现:

  1. 文本分词编码:通过tokenizer.py中的FullTokenizer类,将中文文本切分为子词(参考config/models/vocab.txt的中文词表),再转换为模型可识别的ID;
  2. 文本向量生成:分词后的文本输入Chinese CLIP的ONNX模型,生成文本特征向量;
  3. 跨模态匹配:将文本向量与图片索引库中的图片向量做余弦相似度计算,返回匹配度最高的图片——这也是VimgFind v2.1及以上版本支持“以文搜图”的核心。

3.3 索引存储逻辑

如果直接将所有向量和文件路径一同塞到向量数据库中,是极为不合适的。不仅是因为文件路径并非向量数据库的核心存储内容,却极大地消耗了向量数据库的存储体积。此外,如果我们想存储更多的文件信息,也只能一股脑往向量数据库塞。更好的方式是只往向量数据库中存储"id + 向量",再创一个文件name_index.json存储"id"到文件路径的映射。我们还可以在name_index.json中存储文件的元数据。这样当文件发生变化时,我们可以通过比较元数据发现这一变化,并更新其对应的向量。

3.4 加速索引构建的核心方法

索引构建的核心瓶颈在于IO而非CPU计算。在Python中,由于想要加快IO密集型的任务,核心便是利用多线程。在线程中使用PIL模型对图像进行预处理,回到主线程对图片进行向量化。这便是search_tools.py中类SearchTool中update_ir_index方法的核心逻辑。

3.5 项目核心依赖解析

VimgFind的依赖清单(requirements.txt)精准匹配了功能需求:

  • hnswlib==0.8.0:轻量级近邻检索库,支撑亿级向量的快速检索;
  • onnxruntime==1.20.1:ONNX模型推理引擎,兼容Windows且推理速度快;
  • Pillow==9.5.0:图片处理基础库,负责图片读取、预处理;
  • numpy==1.21.6:向量计算基础库;
  • 其他依赖(如pywin32):适配Windows系统的文件操作、剪切板功能等。