在 Python 中探索圖像相似性方法
在一個充斥著圖像的世界里,衡量和量化圖像之間相似性的能力已經成為一項關鍵任務。無論是用于圖像檢索、內容推薦還是視覺搜索,圖像相似性方法在現代應用中起著至關重要的作用。
幸運的是,Python提供了大量工具和庫,使得開發人員和研究人員能夠輕松地探索和實現這些方法。在這篇博客中,我們將深入探討各種圖像相似性技術,并演示如何使用Python實現它們。
理解圖像相似性
圖像相似性可以被看作是兩幅圖像在視覺內容方面相似程度的數值表示。圖像可以在顏色、形狀、紋理和構圖等多個維度上相似。為了量化這些相似性,采用了各種數學和計算方法,使我們能夠高效地比較和分類圖像。
流行的圖像相似性方法
- 基于直方圖的方法
- 基于特征的方法
- 基于深度學習的方法
1.基于直方圖的方法
直方圖捕捉圖像中像素值的分布。通過比較兩幅圖像的直方圖,可以衡量它們的相似性。
直方圖交集和直方圖相關性是常用于此目的的度量標準。Python的OpenCV庫提供了計算和比較直方圖的工具。
在這里,我們將演示一個簡單的示例,使用基于直方圖的方法和opencv-python庫:
import cv2
# Load images
image1 = cv2.imread(image1)
image2 = cv2.imread(image2)
hist_img1 = cv2.calcHist([image1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_img1[255, 255, 255] = 0 #ignore all white pixels
cv2.normalize(hist_img1, hist_img1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
hist_img2 = cv2.calcHist([image2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_img2[255, 255, 255] = 0 #ignore all white pixels
cv2.normalize(hist_img2, hist_img2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# Find the metric value
metric_val = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
print(f"Similarity Score: ", round(metric_val, 2))
# Similarity Score: 0.94
結構相似性指數(SSIM)
SSIM是一種廣泛使用的指標,評估兩幅圖像之間的結構相似性。它考慮亮度、對比度和結構,給出一個介于-1(不相似)和1(相同)之間的分數。Python中的scikit-image庫提供了SSIM的實現。在這里,我們將演示一個簡單的示例,使用SSIM和scikit-image庫:
import cv2
from skimage import metrics
# Load images
image1 = cv2.imread(image1)
image2 = cv2.imread(image2)
image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]), interpolation = cv2.INTER_AREA)
print(image1.shape, image2.shape)
# Convert images to grayscale
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# Calculate SSIM
ssim_score = metrics.structural_similarity(image1_gray, image2_gray, full=True)
print(f"SSIM Score: ", round(ssim_score[0], 2))
# SSIM Score: 0.38
與直方圖方法相比,SSIM方法的主要缺點是圖像必須具有相同的尺寸。即使相似性分數很低,我們可以從圖像中去除背景和透明度,以提高相似性分數。
2.基于特征的方法
這些方法從圖像中提取顯著特征,如邊緣、角點或關鍵點。諸如尺度不變特征變換(SIFT)和加速穩健特征(SURF)之類的技術可識別圖像中的獨特點,然后可以在圖像之間進行比較。可以使用opencv-python庫進行SIFT和SURF。
3.基于深度學習的方法
深度學習已經徹底改變了圖像相似性任務。使用預訓練的卷積神經網絡(CNNs)如ResNet、VGG和Inception,可以從圖像中提取深層特征。
openAI的CLIP(對比語言-圖像預訓練)是一個令人印象深刻的多模態零樣本圖像分類器,它在多個領域取得了令人印象深刻的結果,而無需微調。它將在大規模transformer(如GPT-3)領域的最新進展應用到視覺領域。
我們可以使用torch、open_clip和sentence_transformers庫對這些模型進行微調,用我們自己的圖像和文本數據進行訓練。ScrapeHero可以幫助準備自己的圖像數據集以訓練這些模型。其網絡爬蟲服務可以爬取復雜的網站并提供高質量的數據。
在這里,我們將演示一個簡單的示例,使用基于CLIP的預訓練模型和torch、open_clip和sentence_transformers庫:
!pip install git+https://github.com/openai/CLIP.git
!pip install open_clip_torch
!pip install sentence_transformers
import torch
import open_clip
import cv2
from sentence_transformers import util
from PIL import Image
# image processing model
device = "cuda" if torch.cuda.is_available() else "cpu"
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-16-plus-240', pretrained="laion400m_e32")
model.to(device)
def imageEncoder(img):
img1 = Image.fromarray(img).convert('RGB')
img1 = preprocess(img1).unsqueeze(0).to(device)
img1 = model.encode_image(img1)
return img1
def generateScore(image1, image2):
test_img = cv2.imread(image1, cv2.IMREAD_UNCHANGED)
data_img = cv2.imread(image2, cv2.IMREAD_UNCHANGED)
img1 = imageEncoder(test_img)
img2 = imageEncoder(data_img)
cos_scores = util.pytorch_cos_sim(img1, img2)
score = round(float(cos_scores[0][0])*100, 2)
return score
print(f"similarity Score: ", round(generateScore(image1, image2), 2))
#similarity Score: 76.77
然后,可以基于這些特征向量的余弦相似度或歐氏距離計算圖像之間的相似性。為了提高準確性,我們可以預處理圖像。
應用領域
圖像相似性技術的主要應用包括電子商務產品匹配、圖像檢索、物體識別和人臉識別。例如,在圖像檢索中,可以使用圖像相似性找到與查詢圖像相似的圖像。圖像相似性可以在物體識別中使用,將給定對象與已知數據庫進行匹配。圖像相似性算法可用于通過將人臉與數據庫進行比較來識別個人。
結論
在今天以視覺為驅動的世界中,衡量圖像相似性的能力是許多應用的重要組成部分。本博客向您介紹了從簡單的基于直方圖的方法到復雜的深度學習技術的各種圖像相似性方法。您還可以探索Siamese網絡,這是一類專為一次學習和圖像相似性任務而設計的神經網絡。
Python憑借其豐富的庫生態系統,如scikit-image、opencv-python、TensorFlow和PyTorch,使開發人員和研究人員能夠有效地實現這些方法。通過嘗試這些技術,將打開創造運用圖像相似性的強大力量的創新應用的大門。