一、介绍
VimgFind是专为Windows系统设计的本地AI搜图工具,核心是“向量编码”与“索引存储”。实际上无论是以图搜图还是以文搜图,核心的第一步都是将这些非数值型数据给量化成向量。而如果希望能同时集成以图搜图还是以文搜图,就必须要求模型能将图片和文本映射到同一块向量空间中。项目地址:github.com/Just-A-Fres…
VimgFind不仅具有以图搜图能力,同时在2.1以上的版本还新增了以文搜图的功能(输入框内回车键触发);
二、快速使用
2.1 直接下载
- 最新版v2.3.2:github.com/Just-A-Fres…
- 历史版本:项目Releases页面(github.com/Just-A-Fres…
[注意] 首次启动需切换到设置界面添加并立即更新索引。默认开启了自动更新索引,只要添加了索引目录,后面就无需再手动更新。目前的界面支持:
- 点击浏览按钮/剪切板按钮/拖拽图片到窗口实现以图搜图;
- 在文本框中输入文本按回车键触发以文搜图;
2.2 源码部署
详见项目简介
三、功能实现
3.1 以图搜图的核心逻辑
以图搜图的本质是“图片向量的相似度匹配”,流程如下:
- 图片预处理:通过PIL(Pillow)库读取本地图片,完成尺寸归一化、色域转换等操作(项目中
utils.py、encoder.py隐含该逻辑); - 向量编码:将预处理后的图片输入预训练的ONNX模型(Imagenet-B2/Chinese CLIP),通过ONNXRuntime完成推理,输出固定维度的图片特征向量;
- 向量索引构建:利用hnswlib(高效近邻检索库)将所有图片的特征向量构建成索引库(
IndexManager.py负责索引管理); - 相似度检索:待搜索图片经同样编码后,在索引库中检索余弦相似度最高的向量,匹配出对应的图片文件。
3.2 以文搜图的核心逻辑
以文搜图是“文本-图片跨模态匹配”,基于CLIP(Contrastive Language-Image Pre-training)技术实现:
- 文本分词编码:通过
tokenizer.py中的FullTokenizer类,将中文文本切分为子词(参考config/models/vocab.txt的中文词表),再转换为模型可识别的ID; - 文本向量生成:分词后的文本输入Chinese CLIP的ONNX模型,生成文本特征向量;
- 跨模态匹配:将文本向量与图片索引库中的图片向量做余弦相似度计算,返回匹配度最高的图片——这也是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系统的文件操作、剪切板功能等。