概述
在人工智能领域,CLIP和DINOv2是计算机视觉领域的两大巨头。CLIP彻底改变了图像理解,而DINOv2为自监督学习带来了新的方法。
在本文中,我们将踏上一段旅程,揭示定义CLIP和DINOv2的优势和微妙之处。我们的目标是发现这些模型中哪一个在图像相似性任务的世界中真正表现出色。让我们见证巨头的碰撞,看看哪个模型会脱颖而出。
1 使用CLIP计算图像相似性
使用CLIP计算两张图像之间的相似性是一个简单的过程,只需两步:首先,提取两张图像的特征,然后计算它们的余弦相似度。
首先,确保安装了必要的软件包。建议设置并使用虚拟环境:
# 首先设置虚拟环境
virtualenv venv-similarity
source venv-similarity/bin/activate
# 安装所需软件包
pip install transformers Pillow torch
接下来,计算图像相似性:
import torch
from PIL import Image
from transformers import AutoProcessor, CLIPModel
import torch.nn as nn
device = torch.device('cuda' if torch.cuda.is_available() else "cpu")
processor = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32")
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device)
# 从image1中提取特征
image1 = Image.open('img1.jpg')
with torch.no_grad():
inputs1 = processor(images=image1, return_tensors="pt").to(device)
image_features1 = model.get_image_features(**inputs1)
# 从image2中提取特征
image2 = Image.open('img2.jpg')
with torch.no_grad():
inputs2 = processor(images=image2, return_tensors="pt").to(device)
image_features2 = model.get_image_features(**inputs2)
# 计算它们的余弦相似度并将其转换为0到1之间的分数
cos = nn.CosineSimilarity(dim=0)
sim = cos(image_features1[0],image_features2[0]).item()
sim = (sim + 1) / 2
print('Similarity:', sim)
使用提供的两张相似图像的示例,获得的相似度分数令人印象深刻,达到了96.4%。
2 使用DINOv2计算图像相似性
使用DINOv2计算两张图像之间的相似性过程与CLIP类似。用DINOv2需要与前面提到的相同的软件包集,无需额外安装:
from transformers import AutoImageProcessor, AutoModel
from PIL import Image
import torch.nn as nn
device