建立重復(fù)圖像查找系統(tǒng)
是否要識(shí)別重復(fù)或接近重復(fù)的圖像?或者計(jì)算數(shù)據(jù)集中每個(gè)圖像的副本數(shù)?
如果是,那么這篇文章是給你的。
本文的目標(biāo)有五個(gè)方面:
1. 理解重復(fù)圖像查找器和基于內(nèi)容的圖像檢索系統(tǒng)之間的區(qū)別
2. 演練比較相似圖像的5種不同方法的概念
3. 學(xué)習(xí)python中的每個(gè)方法實(shí)現(xiàn)
4. 確定圖像變換對(duì)所述算法整體性能的靈敏度
5. 為在速度和準(zhǔn)確性方面選擇適合你應(yīng)用的最佳方法的選擇過(guò)程鋪路(包括實(shí)驗(yàn))
基本架構(gòu)
首先,需要定義一個(gè)重要的術(shù)語(yǔ)。查詢圖像是用戶輸入以獲取信息的圖像。系統(tǒng)在數(shù)據(jù)集中搜索相似圖像,計(jì)算圖像之間的距離。圖1說(shuō)明了這些步驟。
圖1-重復(fù)圖像查找系統(tǒng)的基本結(jié)構(gòu)
在第3節(jié)中,我們將研究這個(gè)相似性塊,并探索實(shí)現(xiàn)此功能的最常見(jiàn)方法。
重復(fù)圖像查找器與基于內(nèi)容的圖像檢索系統(tǒng)
兩種系統(tǒng)之間的主要區(qū)別在于,重復(fù)圖像查找器僅檢測(cè)相同和近似相同的圖像(圖2)。另一方面,基于內(nèi)容的圖像檢索(CBIR)系統(tǒng)搜索相似的感興趣區(qū)域,并顯示與這些區(qū)域最相似的圖像(圖像3)。
圖2:重復(fù)圖像查找系統(tǒng)的輸入和輸出示例:
圖3-基于內(nèi)容的圖像檢索系統(tǒng)的詳細(xì)信息示例
請(qǐng)注意,基于內(nèi)容的圖像檢索系統(tǒng)如何識(shí)別蘋果并輸出不同場(chǎng)景的圖像。
比較相似圖像的五種常用方法
本文將考察五種主要方法:
· 歐幾里得距離
· 結(jié)構(gòu)相似性度量(SSIM)
· 圖像哈希
· 相似度
· 特征的相似性(使用CNN)
1、歐幾里得距離
轉(zhuǎn)到第一種方法,如圖4所示,歐幾里得距離是平面中2個(gè)數(shù)據(jù)點(diǎn)之間的直線距離[8]。它也稱為L(zhǎng)2范數(shù)距離度量。
圖4-歐幾里得距離
我們可以將圖像表示為向量。向量是具有起點(diǎn)和終點(diǎn)的量[4]。這兩個(gè)點(diǎn)構(gòu)成向量的兩個(gè)特征:大小和方向。
在向量空間中,假設(shè)我們有兩張圖片來(lái)比較x=[x1,x2,x3]和y=[y1,y2,y3]。雖然圖5顯示了一般公式[8],但圖6顯示了使用示例。
圖5-歐幾里得距離的一般公式
圖6-應(yīng)用歐幾里得距離公式的示例
該方法公式簡(jiǎn)單明了。
在python中,實(shí)現(xiàn)非常簡(jiǎn)單:
· 實(shí)現(xiàn)1:使用Scipy庫(kù)
import numpy as np
from scipy.spatial import distance
from PIL import Image
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images have to be of equal size
# we need to flatten the image to a 1D vector
value = distance.euclidean(np.a(chǎn)rray(image1).flatten(), np.a(chǎn)rray(image2).flatten())
實(shí)現(xiàn)2:使用NumPy的linalg
import numpy as np
from PIL import Image
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images have to be of equal size
# linalg.norm
value = np.linalg.norm(np.a(chǎn)rray(image1) - np.a(chǎn)rray(image2))
2、結(jié)構(gòu)相似性度量(SSIM)
論文《Image Quality Assessment: From Error Visibility to Structural Similarity》[1]于2004年介紹了SSIM。它計(jì)算兩個(gè)給定圖像之間的相似性,得出一個(gè)介于0和1之間的值。
除了尋找重復(fù),它的許多應(yīng)用之一是測(cè)量壓縮圖像如何影響其質(zhì)量[2]。此外,它還估計(jì)了數(shù)據(jù)傳輸損耗如何嚴(yán)重降低質(zhì)量[2]。
作者認(rèn)為,影響該指數(shù)的主要三個(gè)因素是亮度、對(duì)比度和結(jié)構(gòu)[3]。因此,如果其中一個(gè)因素發(fā)生變化,度量也會(huì)發(fā)生變化。
實(shí)現(xiàn)如下:
from SSIM_PIL import compare_ssim
from PIL import Image
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images have to be of equal size
value = compare_ssim(image1, image2, GPU=False) # a value of 1 indicates strong similarity
3、圖像哈希
計(jì)算兩幅圖像之間相似性的另一種方法是圖像哈希(也稱為數(shù)字指紋)。它是為每個(gè)圖像分配唯一哈希值的過(guò)程。然而,該方法對(duì)相同的值產(chǎn)生相同的結(jié)果。平均哈希是眾多哈希類型之一。其工作方式如下[6]。此外,請(qǐng)參閱圖7以了解說(shuō)明。
1. 減小圖像大。ɡ纾8x8)
2. 將其轉(zhuǎn)換為灰度
3. 取均值
4. 將每個(gè)像素與平均值進(jìn)行比較。如果像素高于平均值,則為其指定值1,否則為0
5. 構(gòu)造哈希
圖7-平均哈希步驟
生成的64位整數(shù)可能如下所示:
1011111101100001110001110000111101101111100001110000001100001001
我們可以用不同的方式表示圖像。從左上角開(kāi)始列出0位和1(如上例所示)、左右角等等[6]。
最重要的是,如果我們改變縱橫比,增加或減少亮度或?qū)Ρ榷,甚至改變圖像的顏色,其哈希值將是相同的[7],這使其成為比較同一圖像的最佳方法之一。
比較兩幅圖像的步驟如下[7]:
1. 構(gòu)造每個(gè)圖像的哈希(通過(guò)遵循上述5個(gè)步驟)
2. 計(jì)算漢明距離。零距離表示相同的圖像。(下面的代碼塊更好地解釋了這一點(diǎn))
import imagehash
from PIL import Image
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images DO NOT have to be of equal size
# Construct the hash
hash1 = imagehash.a(chǎn)verage_h(yuǎn)ash(image1)
hash2 = imagehash.a(chǎn)verage_h(yuǎn)ash(image2)
# Calculate the hamming distance
value = hash1-h(huán)ash2
4、余弦相似性
余弦相似性是一種計(jì)算兩個(gè)向量(可以是圖像)相似性的方法,方法是取點(diǎn)積并將其除以每個(gè)向量的幅值[9],如下圖8所示。
圖8-余弦相似方程
隨著兩個(gè)向量之間的角度變小,相似性變大[9]。如圖9所示,向量C和B與A和B具有高度相似性,因?yàn)樗鼈兊慕嵌让黠@較小。
圖9-余弦相似性說(shuō)明
以下是使用torch計(jì)算兩個(gè)PIL圖像的度量的代碼。
from torch import nn
from PIL import Image
from torchvision import transforms
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image)
# Note: images have to be of equal size
# Transform the images to tensors then flatten them to 1D tensors
image1_tensor = transforms.ToTensor()(image1).reshape(1, -1).squeeze()
image2_tensor = transforms.ToTensor()(image2).reshape(1, -1).squeeze()
cos = nn.CosineSimilarity(dim=0) # dim=0 -> dimension where cosine similarity is computed
value = float(cos(image1_tensor, image2_tensor)) # a value of 1 indicates strong similarity
5.特征的相似性(使用CNN)
最后一種比較圖像的方法是計(jì)算特征的相似性。眾所周知,卷積神經(jīng)網(wǎng)絡(luò)CNN可以選擇圖像的模式并對(duì)其進(jìn)行感知。卷積層是具有檢測(cè)模式的濾波器。圖像中的不同圖案可以是邊緣、形狀或紋理。這些模式稱為特征。
我們可以從CNN的卷積層中提取這些特征。
圖10清楚地說(shuō)明了一個(gè)示例架構(gòu)。通常,我們指定網(wǎng)絡(luò)的最后一個(gè)卷積層用于特征提取。
圖10-一個(gè)簡(jiǎn)單的CNN架構(gòu)
最先進(jìn)的CNN架構(gòu)之一是高效網(wǎng)(EfficientNet)。這是一種縮放方法,使用復(fù)合系數(shù)均勻縮放所有維度:深度/寬度/分辨率。我不會(huì)深入探討它,因?yàn)樗隽吮疚牡姆秶。然而,我將在以下幾?jié)中使用它。
通常,數(shù)據(jù)科學(xué)界在基于內(nèi)容的圖像檢索系統(tǒng)中廣泛使用特征的相似性。實(shí)驗(yàn)部分將解釋原因。
5.1. EfficientNet-b0和歐幾里得距離
在從EfficientNet中提取特征后,我應(yīng)用歐幾里得距離測(cè)量查詢和數(shù)據(jù)集圖像的特征之間的相似性,以找到最相似的特征。
from efficientnet_pytorch import EfficientNet
import numpy as np
from PIL import Image
from torchvision import transforms
# Load the model
model = EfficientNet.from_pretrained('efficientnet-b0')
model.eval()
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images have to be of equal size
# Convert the images to tensors
image1_tensor = transforms.ToTensor()(image1)
image2_tensor = transforms.ToTensor()(image2)
# Add a fourth dimension for the batch and extract the features
features1 = model.extract_features(image1_tensor.unsqueeze(0))
features2 = model.extract_features(image2_tensor.unsqueeze(0))
# Calculate the Euclidean distance of the features
value = round(np.linalg.norm(np.a(chǎn)rray(features1.detach()) -
np.a(chǎn)rray(features2.detach())), 4)
5.2. EfficientNet-b0和余弦相似性
計(jì)算特征的余弦相似性與前一個(gè)非常相似。然而,應(yīng)用余弦相似性代替歐幾里得距離。
from efficientnet_pytorch import EfficientNet
from PIL import Image
from torchvision import transforms
from torch import nn
# Load the model
model = EfficientNet.from_pretrained('efficientnet-b0')
model.eval()
image1 = Image.open("path/to/image")
image2 = Image.open("path/to/image")
# Note: images have to be of equal size
# Transform the images to tensors
image1_tensor = transforms.ToTensor()(image1)
image2_tensor = transforms.ToTensor()(image2)
# Add a fourth dimension representing the batch number and compute the features
features1 = model.extract_features(image1_tensor.unsqueeze(0))
features2 = model.extract_features(image2_tensor.unsqueeze(0))
# flatten the features and apply cosine similarity
cos = nn.CosineSimilarity(dim=0)
value = round(float(cos(features1.reshape(1, -1).squeeze(),
features2.reshape(1, -1).squeeze())),4)
在本節(jié)結(jié)束之前,如果得到的相似性為250、0.04或10809,該怎么辦?使一對(duì)圖像相似的數(shù)字是多少?答案如下:你必須根據(jù)對(duì)所選數(shù)據(jù)集的研究或特殊測(cè)試來(lái)定義此閾值。
數(shù)據(jù)集集合
在整個(gè)實(shí)驗(yàn)過(guò)程中,使用了兩個(gè)不同的數(shù)據(jù)集進(jìn)行評(píng)估:
· Fruits360數(shù)據(jù)集的一部分(96幅多尺寸圖像)
· 收集并稱之為SFBench的數(shù)據(jù)集由40張圖片組成(3024x4032像素)
指定了第一個(gè)數(shù)據(jù)集來(lái)評(píng)估重復(fù)/近似重復(fù)圖像查找器,因?yàn)樗擅總(gè)類別360度拍攝的不同水果的圖像組成。這些框架略有不同;圖12顯示了棕色劃痕是如何順時(shí)針移動(dòng)的。
圖11:Fruits360數(shù)據(jù)集的樣本
圖12:Fruits360數(shù)據(jù)集三幀之間的差異
由于所有圖像都是相鄰幀,因此在此數(shù)據(jù)集上的測(cè)試將為我們提供關(guān)于重復(fù)圖像查找器性能的良好反饋。這意味著,對(duì)于每個(gè)獨(dú)特的類別,這些圖片主要是相似的。
其次,SFBench是一個(gè)收集了40幅圖像的數(shù)據(jù)集,用于評(píng)估基于內(nèi)容的圖像檢索(CBIR)系統(tǒng)。
請(qǐng)注意,本文的目標(biāo)不是構(gòu)建或評(píng)估CBIR系統(tǒng)。我們使用該數(shù)據(jù)集僅測(cè)試圖像變換(如3D投影和旋轉(zhuǎn))如何影響方法的性能。
數(shù)據(jù)集的一些示例圖像如下圖13所示。與第一個(gè)數(shù)據(jù)集一樣,它由每個(gè)場(chǎng)景4個(gè)圖像組成。
圖13:SFBench數(shù)據(jù)集示例
實(shí)驗(yàn)
以以下方式使用兩個(gè)數(shù)據(jù)集測(cè)試了每種方法:
實(shí)驗(yàn)1:速度和準(zhǔn)確性
實(shí)驗(yàn)2:圖像轉(zhuǎn)換的彈性
實(shí)驗(yàn)3: Scipy distance.euclidean vs. Numpy linalg.norm 速度
注意:在所有測(cè)試中都使用了2019年的MacBook Pro CPU。此外,你可以在Github存儲(chǔ)庫(kù)中找到所有測(cè)試。
實(shí)驗(yàn)1:速度和準(zhǔn)確性
該測(cè)試為重復(fù)圖像查找系統(tǒng)提出了速度和精度方面的最佳方法。以下步驟如下:
· 讀取Fruits360數(shù)據(jù)集的圖像。
· 將其轉(zhuǎn)換為RGB
· 將圖像大小調(diào)整為固定大小
· 使用5種方法
· 獲取參考圖像的3個(gè)最相似圖像。
· 計(jì)算該方法用于比較一對(duì)圖像的平均時(shí)間(秒)
· 計(jì)算準(zhǔn)確率(對(duì)于每個(gè)參考圖像,如果檢測(cè)到3個(gè)重復(fù)/近重復(fù),準(zhǔn)確率為100%)
結(jié)果(如表1所示)清楚地表明,余弦相似性占主導(dǎo)地位,CNN的運(yùn)行時(shí)間比余弦相似性慢約250倍,但是準(zhǔn)確率卻比較接近。此外,如果速度是一個(gè)很大的因素,那么圖像哈希是一個(gè)很好的選擇。
表1-實(shí)驗(yàn)1結(jié)果
實(shí)驗(yàn)2:圖像轉(zhuǎn)換的彈性
該測(cè)試遵循與實(shí)驗(yàn)1相同的步驟。唯一的區(qū)別是使用的數(shù)據(jù)集和大小調(diào)整因子;我使用了SFBench,注意到圖像重復(fù)查找器的目的不是檢測(cè)和識(shí)別相似的變換圖像。我只是評(píng)估這些方法在CBIR系統(tǒng)中的潛在使用的彈性。
從邏輯上講,當(dāng)CNN在其層內(nèi)保存空間信息時(shí),特征相似性方法表現(xiàn)最好。表2總結(jié)了以下結(jié)果:
表2-實(shí)驗(yàn)2結(jié)果
實(shí)驗(yàn)3:Scipy distance.euclidean vs. Numpy linalg.norm 速度
最后一個(gè)實(shí)驗(yàn)通過(guò)重復(fù)相同的操作約2300次來(lái)考察Scipy和Numpy實(shí)現(xiàn)的比較。此測(cè)試是本文的額外步驟,不會(huì)影響重復(fù)圖像/近復(fù)制查找系統(tǒng)的功能。
結(jié)果表明,它們的性能相似(表3)。
表3-實(shí)驗(yàn)3結(jié)果
結(jié)論
總之,我們學(xué)習(xí)了歐幾里得距離、SSIM、圖像哈希、余弦相似性和特征相似性的概念和Python代碼。此外,我們還確定了圖像變換對(duì)這些算法性能的敏感性。最后,通過(guò)實(shí)驗(yàn),我們根據(jù)速度和準(zhǔn)確性的要求,得出了最佳的方法。
你可以在Github存儲(chǔ)庫(kù)中找到所有數(shù)據(jù)集、實(shí)驗(yàn)和結(jié)果。此外,只要對(duì)每個(gè)數(shù)據(jù)集遵循相同的命名約定,就可以測(cè)試你選擇的數(shù)據(jù)集。
參考引用
[1] Wang, et al, Image Quality Assessment: From Error Visibility to Structural Similarity, 2004
[2] Imatest LLC, SSIM: Structural Similarity Index, v.22.1
[3] Datta, All about Structural Similarity Index (SSIM): Theory + Code in PyTorch, 2020
[4] Mathematics LibreTexts, A Further Applications of Trigonometry: Vectors. 2021
[5] Nagella, Cosine Similarity Vs Euclidean Distance, 2019
[6] The Content Blockchain Project, Testing Different Image Hash Functions, 2019
[7] Krawetz, The Hacker Factor Blog, Looks Like It, 2011
[8] Gohrani, Different Types of Distance Metrics used in Machine Learning, 2019
[9] Clay, How to calculate Cosine Similarity (With code), 2020
原文標(biāo)題 : 建立重復(fù)圖像查找系統(tǒng)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開(kāi)啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市