訂閱
糾錯(cuò)
加入自媒體

建立重復(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)

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)