成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖像相似度比較之 CLIP or DINOv2

人工智能 機器視覺
在本文中,我們將探索定義CLIP和DINOv2的強項和微妙之處的旅程。我們旨在發現這些模型中哪一個在圖像相似度任務的世界中真正出色。讓我們見證這兩位巨頭的較量,看看哪個模型勝出。

在人工智能領域,計算機視覺的兩大巨頭是CLIP和DINOv2。CLIP改變了圖像理解的方式,而DINOv2為自監督學習帶來了新的方法。在本文中,我們將探索定義CLIP和DINOv2的強項和微妙之處的旅程。我們旨在發現這些模型中哪一個在圖像相似度任務的世界中真正出色。讓我們見證這兩位巨頭的較量,看看哪個模型勝出。

CLIP中的圖像相似度

使用CLIP計算兩個圖像之間的相似度是一個簡單的過程,只需要兩個步驟:首先提取兩個圖像的特征,然后計算它們的余弦相似度。

首先,確保已安裝所需的軟件包。建議設置和使用虛擬環境:

#Start by setting up a virtual environment
virtualenv venv-similarity
source venv-similarity/bin/activate
#Install required packages
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可用 else "cpu")
processor = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32")
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device)

#Extract features from 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)

#Extract features from 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)

#Compute their cosine similarity and convert it into a score between 0 and 1
cos = nn.CosineSimilarity(dim=0)
sim = cos(image_features1[0],image_features2[0]).item()
sim = (sim+1)/2
print('Similarity:', sim)

2張相似的圖像

使用兩張相似圖像的示例,獲得的相似度得分為令人印象深刻的96.4%。

DINOv2中的圖像相似度

使用DINOv2計算兩張圖像之間的相似度的過程與CLIP類似。需要同一組軟件包,無需進行任何額外的安裝:

from transformers import AutoImageProcessor, AutoModel
from PIL import Image
import torch.nn as nn

device = torch.device('cuda' if torch.cuda.is_available() else "cpu")
processor = AutoImageProcessor.from_pretrained('facebook/dinov2-base')
model = AutoModel.from_pretrained('facebook/dinov2-base').to(device)


image1 = Image.open('img1.jpg')
with torch.no_grad():
    inputs1 = processor(images=image1, return_tensors="pt").to(device)
    outputs1 = model(**inputs1)
    image_features1 = outputs1.last_hidden_state
    image_features1 = image_features1.mean(dim=1)

image2 = Image.open('img2.jpg')
with torch.no_grad():
    inputs2 = processor(images=image2, return_tensors="pt").to(device)
    outputs2 = model(**inputs2)
    image_features2 = outputs2.last_hidden_state
    image_features2 = image_features2.mean(dim=1)

cos = nn.CosineSimilarity(dim=0)
sim = cos(image_features1[0],image_features2[0]).item()
sim = (sim+1)/2
print('Similarity:', sim)

與CLIP示例中的相同圖像對一起使用,使用DINOv2獲得的相似度得分為93%。

使用COCO數據集進行測試

在深入評估它們的性能之前,讓我們使用COCO數據集的驗證集中的圖像來比較CLIP和DINOv2的結果。我們采用的流程如下:

  • 遍歷數據集以提取所有圖像的特征。
  • 將嵌入存儲在FAISS索引中。
  • 提取輸入圖像的特征。
  • 檢索相似度最高的三張圖像。

對于那些對FAISS深入了解的人,請參考這篇充滿信息的文章。確保首先使用以下命令安裝它:pip install faiss-[gpu|cpu]。

第1部分:特征提取和創建2個索引:

import torch
from PIL import Image
from transformers import AutoProcessor, CLIPModel, AutoImageProcessor, AutoModel
import faiss
import os
import numpy as np

device = torch.device('cuda' if torch.cuda.is_available() else "cpu")

#Load CLIP model and processor
processor_clip = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32")
model_clip = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device)

#Load DINOv2 model and processor
processor_dino = AutoImageProcessor.from_pretrained('facebook/dinov2-base')
model_dino = AutoModel.from_pretrained('facebook/dinov2-base').to(device)

#Retrieve all filenames
images = []
for root, dirs, files in os.walk('./val2017/'):
    for file in files:
        if file.endswith('jpg'):
            images.append(root  + '/'+ file)


#Define a function that normalizes embeddings and add them to the index
def add_vector_to_index(embedding, index):
    #convert embedding to numpy
    vector = embedding.detach().cpu().numpy()
    #Convert to float32 numpy
    vector = np.float32(vector)
    #Normalize vector: important to avoid wrong results when searching
    faiss.normalize_L2(vector)
    #Add to index
    index.add(vector)

def extract_features_clip(image):
    with torch.no_grad():
        inputs = processor_clip(images=image, return_tensors="pt").to(device)
        image_features = model_clip.get_image_features(**inputs)
        return image_features

def extract_features_dino(image):
    with torch.no_grad():
        inputs = processor_dino(images=image, return_tensors="pt").to(device)
        outputs = model_dino(**inputs)
        image_features = outputs.last_hidden_state
        return image_features.mean(dim=1)

#Create 2 indexes.
index_clip = faiss.IndexFlatL2(512)
index_dino = faiss.IndexFlatL2(768)

#Iterate over the dataset to extract features X2 and store features in indexes
for image_path in images:
    img = Image.open(image_path).convert('RGB')
    clip_features = extract_features_clip(img)
    add_vector_to_index(clip_features,index_clip)
    dino_features = extract_features_dino(img)
    add_vector_to_index(dino_features,index_dino)

#store the indexes locally
faiss.write_index(index_clip,"clip.index")
faiss.write_index(index_dino,"dino.index")

第2部分:圖像相似度搜索:


import faiss
import numpy as np
import torch
from transformers import AutoImageProcessor, AutoModel, AutoProcessor, CLIPModel
from PIL import Image
import os

#Input image
source='laptop.jpg'
image = Image.open(source)

device = torch.device('cuda' if torch.cuda.is_available() else "cpu")

#Load model and processor DINOv2 and CLIP
processor_clip = AutoProcessor.from_pretrained("openai/clip-vit-base-patch32")
model_clip = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device)

processor_dino = AutoImageProcessor.from_pretrained('facebook/dinov2-base')
model_dino = AutoModel.from_pretrained('facebook/dinov2-base').to(device)

#Extract features for CLIP
with torch.no_grad():
    inputs_clip = processor_clip(images=image, return_tensors="pt").to(device)
    image_features_clip = model_clip.get_image_features(**inputs_clip)

#Extract features for DINOv2
with torch.no_grad():
    inputs_dino = processor_dino(images=image, return_tensors="pt").to(device)
    outputs_dino = model_dino(**inputs_dino)
    image_features_dino = outputs_dino.last_hidden_state
    image_features_dino = image_features_dino.mean(dim=1)

def normalizeL2(embeddings):
    vector = embeddings.detach().cpu().numpy()
    vector = np.float32(vector)
    faiss.normalize_L2(vector)
    return vector

image_features_dino = normalizeL2(image_features_dino)
image_features_clip = normalizeL2(image_features_clip)

#Search the top 5 images
index_clip = faiss.read_index("clip.index")
index_dino = faiss.read_index("dino.index")

#Get distance and indexes of images associated
d_dino,i_dino = index_dino.search(image_features_dino,5)
d_clip,i_clip = index_clip.search(image_features_clip,5)

結果

使用四個不同的圖像作為輸入,搜索產生了以下結果:

CLIP與DINOv2

在這個小子集中,似乎DINOv2展現出了略微卓越的性能。

針對DISC21數據集的基準測試

為了比較它們的性能,我們將遵循與此故事中描述的相同方法:https://medium.com/aimonks/image-similarity-with-dinov2-and-faiss-741744bc5804。我們還將重復上面的腳本,以提取特征,然后計算圖像相似度。

數據集

為了對比CLIP和DINOv2,我們選擇了DISC21數據集,這個數據集是專門為圖像相似性搜索創建的。由于其巨大的大小為350GB,我們將使用150,000張圖像的子集。

所使用的度量標準

在度量方面,我們將計算以下內容:

  • 準確率:正確預測的圖像數量與總圖像數量的比率。
  • 前三準確率:正確圖像在前三個相似圖像中找到的次數與總圖像數量的比率。
  • 計算時間:處理整個數據集所需的時間。

基準測試結果

(1) 特征提取

  • CLIP:每秒處理70.7張圖像
  • DINOv2:每秒處理69.7張圖像

(2) 準確度和前三準確度

準確度和前三準確度

(3) 分析結果

兩個模型都正確預測了圖像:

所有模型都未能找到正確的圖像:

只有CLIP正確預測了圖像,DINOv2在前三個中預測了它:

只有DINOv2正確預測了圖像:

分析

DINOv2表現出明顯的領先地位,實現了在一個明顯具有挑戰性的數據集上達到64%的令人印象深刻的準確率。相比之下,CLIP展現了更為適度的準確度,達到了28.45%。

就計算效率而言,兩個模型表現出非常相似的特征提取時間。這種平衡在這方面沒有讓任何一個模型處于明顯的優勢地位。

限制

雖然這個基準測試提供了有價值的見解,但必須認識到它的限制。評估是在1448張圖像的子集上進行的,與150,000張圖像的池進行了比較。鑒于整個數據集的規模為2.1百萬張圖像,狹窄的焦點對于保存資源是必要的。

值得注意的是,MetaAI將DISC21數據集用作其模型的基準,這可能給DINOv2帶來了有利的優勢。然而,我們在COCO數據集上的測試揭示了有趣的細節:DINOv2顯示出了在圖像中識別主要元素的增強能力,而CLIP則表現出了在輸入圖像中關注特定細節的能力(如公交車圖像所示)。

最后,必須考慮CLIP和DINOv2之間嵌入維度的差異。CLIP使用512的嵌入維度,而DINOv2使用768。雖然另一種選擇是使用嵌入維度匹配的更大的CLIP模型,但值得注意的是,這將以速度為代價。在一個小子集上進行的快速測試顯示了輕微的性能提升,但沒有達到DINOv2所展示的性能水平。

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2025-02-18 16:00:00

代碼Python架構

2025-02-21 10:09:44

DINOv2圖像分類開發

2023-04-25 17:06:38

視覺任務

2024-01-18 13:39:00

AI訓練

2010-06-13 13:17:49

MySQL 列值

2010-06-11 17:45:09

路由協議IGRPEIGRP

2025-03-10 08:53:00

2023-09-06 09:54:12

AI模型

2015-10-15 10:27:12

文本相似度判定

2023-03-19 17:21:31

CLIP架構人工智能

2024-06-24 13:06:04

2024-04-02 10:05:28

Siamese神經網絡人工智能

2023-10-10 15:33:55

機器學習相似性度量

2025-01-14 13:51:44

2024-12-31 08:20:00

暹羅網絡機器學習神經網絡

2023-03-27 08:00:00

機器學習人工智能

2019-12-11 10:50:06

JS圖片前端

2025-04-11 00:16:00

模態編碼器MAECLIP

2024-09-26 16:51:23

2023-12-01 14:48:52

Python圖像
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久极品 | 久久视频精品 | 日韩国产欧美一区 | 中文字幕免费在线 | 国产美女一区二区 | 成人午夜影院 | 成人免费视频一区二区 | 国产精品高清在线 | 福利视频一区二区 | 亚洲国产成人av好男人在线观看 | 婷婷久久网| 99精品久久久久久久 | 看片天堂| 日韩不卡一区二区 | 亚洲 精品 综合 精品 自拍 | 亚洲精品www. | 综合五月 | 日本黄色一级视频 | 亚洲福利一区 | 浮生影院免费观看中文版 | 欧美成人精品激情在线观看 | 国产精品xxxx| 黄视频网址 | 亚洲一区二区高清 | 亚洲一区二区三区在线视频 | 成人精品一区二区三区中文字幕 | 中文字幕在线观看一区 | 欧美精品一区二区在线观看 | 久久大陆 | 鲁视频 | 日本不卡视频在线播放 | 91精品久久久久久久久久入口 | 精品视频一区二区三区在线观看 | 中国美女av | 久久国产精品一区二区 | 精品欧美一区二区三区久久久 | 国产欧美精品一区二区色综合朱莉 | 一区二区三区精品在线 | 欧美一级淫片免费视频黄 | 成人免费在线播放 | 国产一区不卡 |