使用 Hugging Face Datasets 和 Transformers 进行图像相似度
Hugging Face 提供了一份使用 Transformers 和 Datasets 库构建图像相似度系统的技术指南。该系统允许用户在给定查询图像的情况下,从候选图像集合中识别出最相似的图像,这是信息检索系统(如逆向图像搜索)的核心功能。
通过嵌入定义图像相似度
图像相似度通过将高维像素数据转换为称为嵌入的密集表示来实现。此过程将图像空间(例如 224 x 224 x 3 像素)压缩到低维向量空间(例如 768 维),从而显著降低检索过程中的计算时间。
为了确定两幅图像之间的相似度,系统计算它们各自嵌入之间的 余弦相似度指标。余弦相似度得分越接近,图像在向量空间中被认为越相似。
使用图像编码器计算嵌入
要生成这些嵌入,需要一个充当图像编码器的视觉模型。Hugging Face 推荐使用 AutoModel 类从 Hugging Face Hub 加载兼容的检查点。
模型选择
在示例中,系统使用 nateraw/vit-base-beans,这是一种在 beans 数据集上微调的视觉 Transformer(ViT)模型。指南强调了若干关键技术选择:
AutoModelvsAutoModelForImageClassification:使用AutoModel是因为目标是获取密集表示(嵌入),而不是离散的类别标签。- Domain-Specific Fine-tuning:使用在特定数据集(如
beans)上微调的模型,通常比使用在 ImageNet-1k 上训练的通用模型获得更好的理解和检索性能。 - Self-Supervised Learning:指南指出,通过自监督预训练获得的检查点同样可以实现出色的检索性能。
替代模型
虽然示例使用 ViT,但系统可以扩展到 Transformers 库中可用的其他视觉模型,包括:
- Swin Transformer
- ConvNeXT
- RegNet
图像相似度工作流
寻找相似图像的过程遵循四步流水线:
- 候选嵌入提取:从候选图像子集提取嵌入并存储在矩阵中。
- 查询嵌入提取:使用相同的图像编码器处理查询图像以生成其嵌入。
- 相似度打分:系统遍历候选嵌入矩阵,计算查询嵌入与每个候选之间的余弦相似度。
- 排序:根据相似度得分对结果进行排序,返回前 k 个标识符以获取最相似的图像。
为高效实现此过程,使用 datasets 库中的 map() 函数在候选数据集上并行计算嵌入。
大规模数据集的扩展
对于涉及数百万图像的大规模生产环境,存储原始 768 维嵌入会导致内存和计算瓶颈。Hugging Face 建议两种主要的优化方式:
降维
在不丢失语义含义的前提下降低嵌入的维度可以在速度和检索质量之间取得平衡。推荐使用 随机投影 和 局部敏感哈希(LSH) 等技术实现此目的。
FAISS 集成
为了实现高性能相似度搜索,datasets 库提供了与 FAISS(Facebook AI Similarity Search)的直接集成。此集成简化了索引过程:
add_faiss_index():此方法在数据集的特定嵌入列上构建密集索引。get_nearest_examples():此方法可在给定查询嵌入时高效检索最近的示例。
该集成消除了手动遍历嵌入矩阵的需求,使系统能够在保持低延迟的同时扩展到海量数据集。