使用遷移學(xué)習(xí)加強(qiáng)你的圖像搜索
圖像相似度
正如你可能知道的,反向圖像搜索的問題是尋找相似的圖像。
但是如何定義圖像相似性呢?給出兩個(gè)樣本圖像,從視覺上我們可以很容易地確定它們是否相似。我們?nèi)绾瓮ㄟ^編程來做到這一點(diǎn)?
一種非常簡單的方法將基于與圖像關(guān)聯(lián)的元數(shù)據(jù)。換句話說,我們可以將圖像大小、RGB值、類別標(biāo)簽等元數(shù)據(jù)信息與每張圖像關(guān)聯(lián)起來。
許多web應(yīng)用程序仍然利用這種方法進(jìn)行反向圖像搜索。此類應(yīng)用程序通常將此類元數(shù)據(jù)存儲(chǔ)在ElasticSearch?或Solr?等優(yōu)化文本搜索平臺(tái)中。這種方法很簡單,但存在許多缺陷。最明顯的一個(gè)是需要大量的手工工作來標(biāo)記每個(gè)圖像。
一種更復(fù)雜的、基于計(jì)算機(jī)視覺的技術(shù)是從圖像本身提取不同的特征。傳統(tǒng)的計(jì)算機(jī)視覺算法,如SIFT和SURF,在提取特征時(shí)具有很強(qiáng)的魯棒性,可以通過比較特征來識(shí)別相似的圖像。
SIFT、SURF和其他一些傳統(tǒng)方法都擅長從輸入圖像中提取關(guān)鍵特征。圖1描述了如何利用基于SIFT的特征來查找類似的圖像。
圖1:基于SIFT特征的圖像相似性。它非常適用于堅(jiān)硬或不變的物體。這個(gè)例子展示了兩張從不同角度拍攝的自由女神像的照片。使用彩色線條顯示了兩個(gè)圖像之間的前50個(gè)匹配特征。
這個(gè)是一個(gè)快速和強(qiáng)大的方法,在我們有堅(jiān)硬對象的場景中非常有用。
例如,用矩形盒子如包裝盒或圓形圓盤如表盤等識(shí)別圖像,用這種方法是非常有效的。另一方面,不那么堅(jiān)硬的物體很難匹配。例如,兩個(gè)不同的人體模型以不同的姿勢展示同一件襯衫/裙子,這可能會(huì)讓傳統(tǒng)技術(shù)難以處理。
你可能知道,可以嘗試使用基于元數(shù)據(jù)的方法或甚至使用傳統(tǒng)的基于計(jì)算機(jī)視覺的技術(shù)來識(shí)別類似的圖像。兩者都有各自的優(yōu)點(diǎn)和缺點(diǎn)。現(xiàn)在讓我們從深度學(xué)習(xí)的角度來探索圖像的相似性。
圖像特征與遷移學(xué)習(xí)
遷移學(xué)習(xí)可以用于特征提取、微調(diào)和預(yù)訓(xùn)練設(shè)置。
回顧cnn的特征提取,我們知道預(yù)訓(xùn)練的模型中的初始層可以理解圖像。
在遷移學(xué)習(xí)的幫助下,我們可以訓(xùn)練由預(yù)訓(xùn)練好的網(wǎng)絡(luò)作為特征提取器,然后再訓(xùn)練幾個(gè)淺層。
反向圖像搜索用例巧妙地利用了預(yù)訓(xùn)練模型的特征提取特征(遷移學(xué)習(xí))。
讓我們利用預(yù)訓(xùn)練好的ResNet-50將圖像轉(zhuǎn)化為特征。這些特征通常是密集的一維向量。將輸入轉(zhuǎn)換為向量的過程也稱為向量化。
我們首先需要準(zhǔn)備一個(gè)預(yù)訓(xùn)練ResNet-50模型的實(shí)例。接下來,我們需要一個(gè)實(shí)用函數(shù)來預(yù)處理輸入圖像并得到向量輸出。代碼清單1給出了實(shí)現(xiàn)。
代碼清單1:使用預(yù)訓(xùn)練的ResNet-50將圖像轉(zhuǎn)換為特征向量
# 獲取預(yù)訓(xùn)練模型的工具函數(shù)
def get_pretrained_model(name):
if (name == 'resnet'):
# keras API輕松使用預(yù)訓(xùn)練模型
model = ResNet50(weights='imagenet',
include_top=False,
input_shape=(224, 224, 3),
pooling='max')
else:
print("Specified model not available")
return model
# 將圖像轉(zhuǎn)換為矢量的實(shí)用函數(shù)
def extract_features(img_path, model):
input_shape = (224, 224, 3)
img = image.load_img(img_path,
target_size=(input_shape[0], input_shape[1]))
img_array = image.img_to_array(img)
expanded_img_array = np.expand_dims(img_array, axis=0)
preprocessed_img = preprocess_input(expanded_img_array)
features = model.predict(preprocessed_img)
flattened_features = features.flatten()
normalized_features = flattened_features / norm(flattened_features)
return normalized_features
# 獲取一個(gè)隨機(jī)圖像的特征向量
features = extract_features('101_ObjectCategories/Faces/image_0003.jpg',
model)
如果我們仔細(xì)看一下清單1中的代碼,keras API使得準(zhǔn)備預(yù)訓(xùn)練模型的實(shí)例和使用它來進(jìn)行我們預(yù)期的特征提取非常容易。
如圖所示,該函數(shù)將圖像輸入轉(zhuǎn)換為2048維密集向量輸出。2048維向量是從ResNet模型的平均池化層中獲得的,該模型在沒有分類層的情況下實(shí)例化。
注意:我們利用ResNet-50來獲得圖像向量,但我們可以自由使用任何其他預(yù)訓(xùn)練模型。我們只需要記住一些方面,例如預(yù)訓(xùn)練網(wǎng)絡(luò)的領(lǐng)域和我們的反向圖像搜索數(shù)據(jù)集以及輸出向量的維數(shù)。
例如,如果我們用vgg -16來代替ResNet-50,特征向量就會(huì)減少到512維。我們將進(jìn)一步討論這些選擇的影響。
在我們開始實(shí)際的反向圖像搜索任務(wù)之前,我們需要一個(gè)數(shù)據(jù)集開始。為了說明目的,我們將使用加州理工學(xué)院101?數(shù)據(jù)集。這個(gè)數(shù)據(jù)集是由李飛飛和他的團(tuán)隊(duì)在2003年收集的,包含了大約40到800張圖像,分別屬于101個(gè)不同的對象類別。
該數(shù)據(jù)集具有相當(dāng)高質(zhì)量的圖像,非常適合我們的理解目的。
我們已經(jīng)準(zhǔn)備了一個(gè)將圖像轉(zhuǎn)換為向量的工具,讓我們利用相同的函數(shù)來獲得參考數(shù)據(jù)集中圖像的向量表示。這也有助于可視化這些向量,以更好地理解他們。
這個(gè)想法是,相似的物體/圖像應(yīng)該有附近的向量。但我們?nèi)绾慰梢暬粋(gè)2048維空間呢?為此,我們將采用一種降維技術(shù),稱為t-SNE。不用講太多細(xì)節(jié),把t-SNE看作是將高維向量轉(zhuǎn)換為低維空間的方法,同時(shí)保持重要的特征。
有一個(gè)非常簡化的例子,目前有一個(gè)非常長的雜貨清單。將清單上的單個(gè)項(xiàng)目分類為蔬菜、水果、乳制品等少數(shù)類別,可以看作是向低維空間的轉(zhuǎn)變,同時(shí)仍然保留重要特征。
在我們目前的情況下,我們將使用t-SNE將2048維向量轉(zhuǎn)換為2維或3維。通過降低維度,我們可以很容易地可視化。
代碼清單2展示了將我們的參考數(shù)據(jù)集轉(zhuǎn)換為向量,然后為了可視化目的降低它們的維數(shù)。代碼清單2:向量化Caltech-101數(shù)據(jù)集和基于t-SNE的降維
batch_size = 64
root_dir = '101_ObjectCategories/'
datagen = tensorflow.keras.preprocessing.
image.ImageDataGenerator(preprocessing_function=preprocess_input)
# ImageDataGenerator對象可以根據(jù)需要從磁盤讀取
# 而不用占用大量內(nèi)存
generator = datagen.flow_from_directory(root_dir,
target_size=(224, 224),
batch_size=batch_size,
class_mode=None,
shuffle=False)
num_images = len(generator.filenames)
num_epochs = int(math.ceil(num_images / batch_size))
start_time = time.time()
feature_list = []
# 模型預(yù)測是特征向量,因?yàn)樽罱K的分類層被移除
feature_list = model.predict(generator, num_epochs)
end_time = time.time()
# 功能被規(guī)范化以避免縮放問題。
# 限制一個(gè)特征可能采用的值的范圍,以確保一個(gè)或幾個(gè)維度不會(huì)主導(dǎo)整個(gè)特征空間。
for i, features in tqdm(enumerate(feature_list)):
feature_list[i] = features / norm(features)
print("Num images = ", len(generator.classes))
print("Shape of feature_list = ", feature_list.shape)
print("Time taken in sec = ", end_time - start_time)
# output
Num images = 9144
Shape of feature_list = (9144, 2048)
Time taken in sec = 30.623387098312378
我們已經(jīng)完成了一半,準(zhǔn)備了一個(gè)反向圖像搜索的解決方案。下一步使用這些特征來識(shí)別類似的圖像。
ANNOY:超快的鄰居搜索ANNOY是一個(gè)高度優(yōu)化的超快的最近鄰居搜索方法。ANNOY由Spotify開發(fā),旨在為用戶提供音樂推薦。由于每天有數(shù)百萬用戶在他們的手機(jī)和網(wǎng)絡(luò)上使用它,實(shí)現(xiàn)的重點(diǎn)是速度和準(zhǔn)確性。
ANNOY是用C++開發(fā)的,并且提供Python包裝器,ANNOY是一個(gè)基于樹的向量相似度搜索方法,它有效地利用了內(nèi)存和并行處理。它提供了許多距離度量選項(xiàng),如歐幾里得、余弦、漢明等。
讓我們在代碼清單3中查看使用ANNOY來進(jìn)行反向圖像搜索的快速實(shí)現(xiàn)。
代碼清單3 (a):基于ANNOY的反向圖像搜索
from annoy import AnnoyIndex
annoy_index = AnnoyIndex(2048,'angular')
# 添加特征到annoy_index
for i in range(num_images):
feature = feature_list[i]
# 為每個(gè)annoy_index添加特征向量
annoy_index.a(chǎn)dd_item(i, feature)
# 構(gòu)建40個(gè)搜索樹
annoy_index.build(40)
annoy_index.save('annoy_caltech101index.a(chǎn)nn')
# 測試搜索性能
%timeit annoy_index.get_nns_by_vector(feature_list[random_image_index],
5,
include_distances=True)
# 輸出
1000 loops, best of 3: 770 ?s per loop
代碼清單3 (b):測試基于ANNOY的反向圖像搜索性能
# 測試一個(gè)更大的樣本
def calculate_annoy_time():
for i in range(0, 100):
random_image_index = random.randint(0, num_images)
# 這個(gè)函數(shù)返回類似于查詢的vector
indexes = annoy_index.get_nns_by_vector(feature_list[random_image_index],
5,
include_distances=True)
%time calculate_annoy_time()
# output
CPU times: user 139 ms, sys: 0 ns, total: 139 ms
Wall time: 142 ms
如清單3所示,使用ANNOY非常簡單。它是高效的,搜索時(shí)間驚人的快。搜索結(jié)果也非常令人印象深刻,如圖2所示。
圖2:基于ANNOY的反向圖像搜索。每一行表示一個(gè)搜索查詢。最左邊的列代表查詢圖像,最右邊代表搜索結(jié)果。每個(gè)匹配結(jié)果都標(biāo)有其與查詢圖像的歐氏距離。
在很大程度上,ANNOY克服了與搜索速度和內(nèi)存需求相關(guān)的限制。
它還提供了一些額外的選項(xiàng)來進(jìn)行調(diào)整,以進(jìn)一步提高性能。其中一個(gè)與特征向量的大小有關(guān)。這也是很明顯的。如果我們減少向量的大小,它將直接減少尋找鄰居所需的內(nèi)存大小。我們利用ResNet-50輸出2048維向量。如果我們使用像VGG-16, VGG-19甚至是MobileNet這樣的模型,VGG模型的特征向量將減少到512個(gè),而MobileNet的特征向量將減少到1024個(gè)(幾乎減少了50%的大。。
除此之外,我們甚至可以利用典型的降維技術(shù),如主成分分析(PCA)或甚至t-SNE,這是一些最廣泛使用的技術(shù)。這樣的技術(shù)可以幫助我們大幅減少特征向量的大小,從而減少總體的計(jì)算和內(nèi)存需求(盡管這將與搜索性能進(jìn)行權(quán)衡)。
優(yōu)化近鄰搜索方法的需求是如此之大,許多可擴(kuò)展的解決方案已經(jīng)開發(fā)了多年。
在不深入細(xì)節(jié)的情況下,諸如雅虎的LOPQ5,NGT6已經(jīng)在商業(yè)應(yīng)用程序應(yīng)用。在同一直線上,F(xiàn)acebook AI相似性搜索或FAISS為GPU優(yōu)化實(shí)現(xiàn)。
本節(jié)討論的反向圖像搜索的不同方法和實(shí)現(xiàn)是基于首先將圖像轉(zhuǎn)換為特征向量,然后是相似度搜索算法的核心思想。優(yōu)化后的實(shí)現(xiàn)進(jìn)一步關(guān)注內(nèi)存的利用,同時(shí)返回結(jié)果的速度仍然非?臁
從這一節(jié)可以明顯看出,反向圖像搜索是一個(gè)活躍的研究領(lǐng)域,通過這些技術(shù),研究人員正在不斷地突破邊界。這些方法的成功開辟了越來越多的用例,其中反向圖像搜索是一個(gè)重要的方面。
現(xiàn)在我們對反向圖片搜索有了一個(gè)很好的理解,我們可以使用這些知識(shí)從電子商務(wù)網(wǎng)站輕松地找到類似的產(chǎn)品,甚至從一組照片中刪除重復(fù)。
同樣,反向圖片搜索也被Flickr等服務(wù)廣泛使用,用于推薦類似圖片、谷歌購物、Pinterest的“相似”功能、亞馬遜的產(chǎn)品掃描儀,識(shí)別剽竊作品。
不同的場景需要不同的技術(shù),表1簡要介紹了本節(jié)中討論的每種方法,以供快速參考。
表1:各種鄰域搜索方法的總結(jié)
參考文獻(xiàn)
原文標(biāo)題 : 使用遷移學(xué)習(xí)加強(qiáng)你的圖像搜索
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
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中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭開啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市