基于ViT、CLIP、EfficientNet、DINO-v2和BLIP-2构建AI图像相似性搜索

概述

为了深入探究图像相似性,这里决定采用多种先进的人工智能模型进行分析。这些模型包括视觉变换器(ViT)、对比语言-图像预训练模型(CLIP)、基于双向编码器表示的图像描述模型(BLIP)、高效网络(EfficientNet)、DINO-v2以及经典的卷积神经网络VGG16。

通过这些模型,能够从不同角度和层面捕捉到图像之间的相似之处。例如,视觉变换器(ViT)通过将图像分割成多个小块,并利用自注意力机制来分析这些图像块之间的关系,从而揭示出图像的内在相似性;对比语言-图像预训练模型(CLIP)则通过将图像与文本描述相结合,利用大规模数据集进行预训练,从而能够理解图像内容的语义相似性;而基于双向编码器表示的图像描述模型(BLIP)则专注于生成准确的图像描述,并通过比较不同图像的描述来评估它们的相似度.

此外,高效网络(EfficientNet)以其卓越的计算效率和强大的特征提取能力,在图像相似性分析中也表现出色;DINO-v2作为一种自监督学习模型,能够通过对比学习的方式,无需人工标注数据,即可学习到图像的深层特征表示,从而实现对图像相似性的有效评估;而经典的卷积神经网络VGG16则凭借其在图像处理领域的广泛应用和成熟的技术,为图像相似性分析提供了可靠的基准和参考.

直觉:图像作为空间中的向量

图像相似性搜索的核心是一个简单的想法:图像可以表示为高维空间中的向量。当两张图像相似时,它们的向量在这个空间中应该占据相似的位置。我们可以通过测量角度(或余弦相似度)来确定这些向量的相似程度。如果角度小,图像就接近(相似)。如果角度大,图像就相距较远(不同)。这就像在公寓大楼里寻找你的邻居,但方式要抽象得多。
图像的向量嵌入

认识模型

===============
这里使用了几个深度学习模型,每个模型都有其优点和特点:

  • CLIP(对比语言 - 图像预训练):由OpenAI构建,它学习将图像与文本匹配。对于我们的相似性搜索来说,这不是一个坏选择。
  • ViT(视觉Transformer):ViT通过将图像视为序列,类似于Transformer处理文本的方式,彻底改变了图像处理。
  • BLIP:一种视觉 - 语言模型,专注于对齐视觉和文本内容。
  • EfficientNet:以其效率而闻名,该模型非常适合图像识别任务。
  • DINO:一种自监督Transformer模型,擅长从图像中学习特征。
  • VGG16:一个经典的卷积神经网络(CNN),已经存在多年,在图像识别任务中仍然表现出色。

步骤1:数据准备

维基百科上抓取了国旗图像,将世界各国的国旗变成了一个数据集。

import pandas as pd
flags_df = pd.read_csv('national_flags.csv')  
print(flags_df)

从维基百科抓取后的DataFrame

步骤2:特征提取

有了国旗后,真正有趣的部分开始了:提取特征。每个模型都获取国旗图像并将其转换为特征向量。这就像是将一张图像翻译成一个数字列表,这些数字封装了它的特征。

在这个实验中,我将使用Huggingface变压器库来提取嵌入。

  • EfficientNet:通过平均最后一个隐藏层输出的空间维度来提取国旗特征,专注于细粒度模式。
image_processor = AutoImageProcessor.from_pretrained("google/efficientnet-b7")
model = EfficientNetModel.from_pretrained("google/efficientnet-b7")
# 准备输入图像
inputs = image_processor(img, return_tensors='pt')
with torch.no_grad():
    outputs = model(**inputs, output_hidden_states=True)
embedding = outputs.hidden_states[-1]
embedding = torch.mean(embedding, dim=[2,3])
  • ViT