在 Python 中探索圖像相似性方法
在一個(gè)充斥著圖像的世界里,衡量和量化圖像之間相似性的能力已經(jīng)成為一項(xiàng)關(guān)鍵任務(wù)。無論是用于圖像檢索、內(nèi)容推薦還是視覺搜索,圖像相似性方法在現(xiàn)代應(yīng)用中起著至關(guān)重要的作用。
幸運(yùn)的是,Python提供了大量工具和庫(kù),使得開發(fā)人員和研究人員能夠輕松地探索和實(shí)現(xiàn)這些方法。在這篇博客中,我們將深入探討各種圖像相似性技術(shù),并演示如何使用Python實(shí)現(xiàn)它們。
理解圖像相似性
圖像相似性可以被看作是兩幅圖像在視覺內(nèi)容方面相似程度的數(shù)值表示。圖像可以在顏色、形狀、紋理和構(gòu)圖等多個(gè)維度上相似。為了量化這些相似性,采用了各種數(shù)學(xué)和計(jì)算方法,使我們能夠高效地比較和分類圖像。
流行的圖像相似性方法
- 基于直方圖的方法
- 基于特征的方法
- 基于深度學(xué)習(xí)的方法
1.基于直方圖的方法
直方圖捕捉圖像中像素值的分布。通過比較兩幅圖像的直方圖,可以衡量它們的相似性。
直方圖交集和直方圖相關(guān)性是常用于此目的的度量標(biāo)準(zhǔn)。Python的OpenCV庫(kù)提供了計(jì)算和比較直方圖的工具。
在這里,我們將演示一個(gè)簡(jiǎn)單的示例,使用基于直方圖的方法和opencv-python庫(kù):
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
結(jié)構(gòu)相似性指數(shù)(SSIM)
SSIM是一種廣泛使用的指標(biāo),評(píng)估兩幅圖像之間的結(jié)構(gòu)相似性。它考慮亮度、對(duì)比度和結(jié)構(gòu),給出一個(gè)介于-1(不相似)和1(相同)之間的分?jǐn)?shù)。Python中的scikit-image庫(kù)提供了SSIM的實(shí)現(xiàn)。在這里,我們將演示一個(gè)簡(jiǎn)單的示例,使用SSIM和scikit-image庫(kù):
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方法的主要缺點(diǎn)是圖像必須具有相同的尺寸。即使相似性分?jǐn)?shù)很低,我們可以從圖像中去除背景和透明度,以提高相似性分?jǐn)?shù)。
2.基于特征的方法
這些方法從圖像中提取顯著特征,如邊緣、角點(diǎn)或關(guān)鍵點(diǎn)。諸如尺度不變特征變換(SIFT)和加速穩(wěn)健特征(SURF)之類的技術(shù)可識(shí)別圖像中的獨(dú)特點(diǎn),然后可以在圖像之間進(jìn)行比較??梢允褂胦pencv-python庫(kù)進(jìn)行SIFT和SURF。
3.基于深度學(xué)習(xí)的方法
深度學(xué)習(xí)已經(jīng)徹底改變了圖像相似性任務(wù)。使用預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)(CNNs)如ResNet、VGG和Inception,可以從圖像中提取深層特征。
openAI的CLIP(對(duì)比語言-圖像預(yù)訓(xùn)練)是一個(gè)令人印象深刻的多模態(tài)零樣本圖像分類器,它在多個(gè)領(lǐng)域取得了令人印象深刻的結(jié)果,而無需微調(diào)。它將在大規(guī)模transformer(如GPT-3)領(lǐng)域的最新進(jìn)展應(yīng)用到視覺領(lǐng)域。
我們可以使用torch、open_clip和sentence_transformers庫(kù)對(duì)這些模型進(jìn)行微調(diào),用我們自己的圖像和文本數(shù)據(jù)進(jìn)行訓(xùn)練。ScrapeHero可以幫助準(zhǔn)備自己的圖像數(shù)據(jù)集以訓(xùn)練這些模型。其網(wǎng)絡(luò)爬蟲服務(wù)可以爬取復(fù)雜的網(wǎng)站并提供高質(zhì)量的數(shù)據(jù)。
在這里,我們將演示一個(gè)簡(jiǎn)單的示例,使用基于CLIP的預(yù)訓(xùn)練模型和torch、open_clip和sentence_transformers庫(kù):
!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
然后,可以基于這些特征向量的余弦相似度或歐氏距離計(jì)算圖像之間的相似性。為了提高準(zhǔn)確性,我們可以預(yù)處理圖像。
應(yīng)用領(lǐng)域
圖像相似性技術(shù)的主要應(yīng)用包括電子商務(wù)產(chǎn)品匹配、圖像檢索、物體識(shí)別和人臉識(shí)別。例如,在圖像檢索中,可以使用圖像相似性找到與查詢圖像相似的圖像。圖像相似性可以在物體識(shí)別中使用,將給定對(duì)象與已知數(shù)據(jù)庫(kù)進(jìn)行匹配。圖像相似性算法可用于通過將人臉與數(shù)據(jù)庫(kù)進(jìn)行比較來識(shí)別個(gè)人。
結(jié)論
在今天以視覺為驅(qū)動(dòng)的世界中,衡量圖像相似性的能力是許多應(yīng)用的重要組成部分。本博客向您介紹了從簡(jiǎn)單的基于直方圖的方法到復(fù)雜的深度學(xué)習(xí)技術(shù)的各種圖像相似性方法。您還可以探索Siamese網(wǎng)絡(luò),這是一類專為一次學(xué)習(xí)和圖像相似性任務(wù)而設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)。
Python憑借其豐富的庫(kù)生態(tài)系統(tǒng),如scikit-image、opencv-python、TensorFlow和PyTorch,使開發(fā)人員和研究人員能夠有效地實(shí)現(xiàn)這些方法。通過嘗試這些技術(shù),將打開創(chuàng)造運(yùn)用圖像相似性的強(qiáng)大力量的創(chuàng)新應(yīng)用的大門。