利用孿生網(wǎng)絡,Keras,Tensorflow比較圖片相似度
作者:Adrian Rosebrock
翻譯:張一然
在本文中,您將學習如何使用孿生網(wǎng)絡和深度學習庫Keras / TensorFlow比較兩個圖像的相似性(以及它們是否屬于相同或不同的類)。
這篇博客文章是我們有關孿生網(wǎng)絡基礎的三部曲系列的第三部分:
第1部分:使用Python為孿生網(wǎng)絡構建圖片二元組(兩周前的帖子)(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)
第2部分:使用Keras,TensorFlow和深度學習訓練孿生網(wǎng)絡(上周的教程)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)
第3部分:使用孿生網(wǎng)絡比較圖像(本教程)
上周我們學習了如何訓練孿生網(wǎng)絡。我們的模型在測試集上表現(xiàn)良好,可以正確地檢驗兩張圖像是否屬于同一類別。訓練完成后,我們將模型序列化到磁盤。
在上周的教程發(fā)布后不久,我收到了PyImageSearch讀者Scott的電子郵件,他問:
“嗨, Adrian -感謝您提供有關孿生網(wǎng)絡的指南。我在深度學習領域聽說過他們,但老實說,我不知道他們如何起作用或他們能做什么。這個系列確實幫助我消除了疑慮,甚至在我的一個工作項目中幫到了我。
我的問題是:
我們如何利用訓練好的孿生網(wǎng)絡在訓練和測試集以外的圖像上進行預測?
那可能嗎?”
當然,Scott。這正是我們今天要討論的內容。
要了解如何使用孿生網(wǎng)絡比較圖像的相似性,請繼續(xù)閱讀。
利用孿生網(wǎng)絡,Keras, Tensorflow比較圖片相似度
在本文第一部分,我們將討論使用訓練好的孿生網(wǎng)絡去預測兩張圖片相似度的基本過程,更具體地說,預測兩張輸入圖片是否屬于同一類。
然后,您將學習如何使用Keras和TensorFlow為孿生網(wǎng)絡配置開發(fā)環(huán)境。
配置完您的開發(fā)環(huán)境后,我們將回顧項目目錄結構,然后實現(xiàn)一個使用孿生網(wǎng)絡比較圖像的相似性的Python腳本。
最后,我們將在本教程中總結討論結果。
孿生網(wǎng)絡如何預測兩張圖片的相似度
圖1:使用孿生網(wǎng)絡比較兩張圖像的相似度會得出相似度分數(shù)。分數(shù)越接近“ 1”,圖像越相似(因此更可能屬于同一類別)。相反,分數(shù)越接近“ 0”,兩個圖像就越不相似。
在上周的教程中,您學習了如何訓練孿生網(wǎng)絡以驗證兩對數(shù)字是屬于同一類別還是不同類別。并將訓練后的孿生模型序列化到磁盤。
然后問題變成:
“我們如何使用我們訓練好的孿生網(wǎng)絡來預測兩個圖像之間的相似性?”
答案是我們利用孿生網(wǎng)絡中最后一層,即Sigmoid激活函數(shù)。
Sigmoid激活函數(shù)的輸出范圍為[0,1],這意味著當我們向孿生網(wǎng)絡輸入圖像對時,模型的輸出值在0到1之間。
值0表示兩個圖像完全不同,而值1表示兩個圖像非常相似。
這種相似性的一個示例可以在本節(jié)前邊部分的圖1中看到:
-
將“ 7”與“ 0”進行比較,相似度得分僅為0.02。
-
但是,將“ 0”與另一個“ 0”進行比較會得出非常高的相似度得分0.93。
-
通常使用相似性截斷值0.5(50%)作為閾值:
-
如果兩個圖像的圖像相似度小于等于0.5,則它們屬于不同的類別。
-
相反,如果圖片二元組的預測相似度大于0.5,則它們屬于同一類。
通過這種方式,您可以使用孿生網(wǎng)絡來(1)比較圖像的相似度,以及(2)確定圖像是否屬于同一類別。
使用孿生網(wǎng)絡的實際用例包括:
-
人臉識別:給定兩張包含人臉的獨立圖像,確定兩張照片中的人是否為同一人。
-
簽名驗證:當出現(xiàn)兩個簽名時,請確定其中一個是否為偽造。
-
處方藥識別:給定兩個處方藥,確定它們是相同藥物還是不同藥物。
配置您的開發(fā)環(huán)境
本系列有關孿生網(wǎng)絡的教程利用Keras和TensorFlow。如果打算繼續(xù)學習本教程或本系列的前兩部分,建議您花些時間配置深度學習開發(fā)環(huán)境。
您可以參考如下任意一種方法在您的系統(tǒng)上安裝Tensorflow和Keras
-
如何在Ubuntu上安裝Tensorflow2.0(https://www.pyimagesearch.com/2019/12/09/how-to-install-tensorflow-2-0-on-ubuntu/)
-
如何在macOS上安裝Tensorflow2.0(https://www.pyimagesearch.com/2019/12/09/how-to-install-tensorflow-2-0-on-macos/)
這兩篇教程都可以幫助您在便捷的python虛擬環(huán)境中為系統(tǒng)配置本篇博客所必須的軟件
配置開發(fā)壞境遇到困難?
圖2: 在配置開發(fā)環(huán)境時遇到問題?想要訪問在Google Colab上預配置的Jupyter notebook?請務必加入PyImageSearch Plus,這樣的話,您將在幾分鐘之內啟動并運行本教程。
-
如果你時間有限?
-
在你作為雇員的公司,使用加域的電腦學習?想跳過命令行、包管理器、虛擬環(huán)境的麻煩?
-
準備好當下就在你windows,macos,linux系統(tǒng)上運行代碼了嗎?
那么,今天就加入PyImageSearch Plus吧!(https://www.pyimagesearch.com/pyimagesearch-plus/)
在您的web瀏覽器中即可訪問本教程的Jupyter Notebook和其他預定義的PyImageSearch指南,這些文件可直接運行在Google Colab的生態(tài)系統(tǒng)中!無需安裝。
最重要的是,這些Jupyter Notebook將在Windows,macOS和Linux上運行!
項目結構
在深入了解本教程之前,讓我們先花點時間檢查一下我們的項目目錄結構。
首先,請確保使用本教程的“下載”部分下載源代碼和示例圖像。
讓我們看一下該項目:
在examples目錄下我們有許多示例數(shù)字
圖3:示例數(shù)字,我們將使用通過Keras和TensorFlow實現(xiàn)的孿生網(wǎng)絡來比較數(shù)字的相似性。
我們將采樣這些數(shù)字對,然后使用我們的孿生網(wǎng)絡比較它們的相似性。
ouput輸出目錄包含訓練歷史記錄圖(plot.png)和我們的訓練完的/序列化的孿生網(wǎng)絡模型(siamese_model /)。這兩個文件都是在上周有關訓練自定義孿生網(wǎng)絡模型的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)中生成的-請確保您在繼續(xù)之前閱讀了該教程,因為它是今天所必需的!
pyimagesearch模塊包含三個Python文件:
1. Config.py 配置文件存儲重要的變量,例如輸出文件路徑和訓練配置(包括圖像輸入尺寸,批處理大小,訓練次數(shù)等)
2. Siamese_network.py:我們對孿生網(wǎng)絡架構的實現(xiàn)
3. Utils.py 包含輔助配置函數(shù)以生成圖像二元組,計算歐幾里得距離并繪制訓練歷史路徑
train_siamese_network.py腳本包含:
1. 導入配置, 孿生網(wǎng)絡實現(xiàn)和功能函數(shù)
2. 從磁盤加載MNIST數(shù)據(jù)集
3. 生成圖片二元組
4. 創(chuàng)建訓練/測試數(shù)據(jù)集
5. 訓練孿生網(wǎng)絡
6. 把訓練好的孿生網(wǎng)絡序列化到磁盤
今天,我將不再介紹這四個腳本,因為上周有關如何訓練孿生網(wǎng)絡的教程已經介紹了這四個腳本。為了完整起見,我已經將這些文件包含在今天教程的項目目錄結構中,但是再次重申一下,要想全面回顧這些文件,他們做的什么以及他們如何做,請參考上周的教程。
最后,我們將重點放在今天的教程test_siamese_network.py上。
該腳本將:
1. 從磁盤加載我們訓練好的孿生網(wǎng)絡模型
2. 在examples目錄中獲取樣本數(shù)字圖像的路徑
3. 從這些樣本中隨機構造成圖像二元組
4. 使用孿生網(wǎng)絡比較圖像二元組的相似性
開始工作吧!
實現(xiàn)我們的孿生網(wǎng)絡圖像相似性腳本
現(xiàn)在,我們已經準備好了使用Keras和TensorFlow實現(xiàn)孿生網(wǎng)絡來獲得圖片相似性。
首先,請確保使用本教程的“下載”部分下載源代碼,示例圖像和預先訓練的孿生網(wǎng)絡模型。
打開test_siamese_network.py,然后按照以下步驟操作:
我們首先導入所需的Python包(第2-9行)。值得注意的導入包括:
-
config:包含重要的配置,包括位于磁盤上的經過訓練/序列化的孿生網(wǎng)絡模型的路徑
-
utils:包含在孿生網(wǎng)絡Lambda層中使用的euclidean_distance函數(shù)-我們需要導入此包以禁止有關從磁盤加載Lambda層的任何用戶警告
-
load_model:Keras / TensorFlow函數(shù)用于從磁盤加載訓練好的孿生網(wǎng)絡
-
list_images:在examples目錄中獲取所有圖像的路徑
讓我們繼續(xù)分析語句的參數(shù):
我們在這里只需要一個參數(shù)--input,它是我們要比較相似性的圖像目錄在磁盤上的地址。運行此腳本時,我們將把 examples目錄的路徑作為此處的輸入。
解析了命令行參數(shù)后,我們現(xiàn)在可以在--input目錄中獲取所有testImagePaths:
第20行獲取了我們所有示例圖像的路徑,這些圖像包含要比較相似性的數(shù)字。第22行從這些testImagePaths中隨機生成總共10對圖像。
第26行使用load_model函數(shù)從磁盤加載我們的孿生網(wǎng)絡。
利用從磁盤加載的孿生網(wǎng)絡,我們現(xiàn)在可以比較圖像的相似性:
29行循環(huán)所有的圖片二元組, 對于每一對圖片我們
1. 從磁盤加載兩張圖片載(31,32行)
2. 復制兩張圖片以便后序畫圖/可視化(35, 36行)
3. 沿著batch維度添加一個通道的維度(43, 44行)
4. 將像素值由[0, 255]縮放到[0, 1], 就像我們上周訓練孿生網(wǎng)絡那樣(47, 48行)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)
一旦imageA和imageB處理完, 我們調用孿生網(wǎng)絡模型(52行)的.predict()方法比較他們的相似度, 得到兩張圖片的概率/相似度分數(shù)(53行)
最后一步是在屏幕上展示兩張圖片以及相應的相似度分數(shù)
第56行和第57行為該圖像對創(chuàng)建一個matplotlib圖形,并以相似性得分作為圖形標題。
第60-67行繪制兩張圖像,而第70行則將輸出顯示到屏幕上。
恭喜您實現(xiàn)孿生網(wǎng)絡用來比較圖像和計算相似度!在下一節(jié)中,我們將看到我們辛勤工作的結果。
使用Keras和TensorFlow的孿生網(wǎng)絡的圖像相似性結果
現(xiàn)在,我們準備使用我們的孿生網(wǎng)絡比較圖像的相似性!
在我們檢查結果之前,請確保您:
1. 閱讀了我們之前有關訓練孿生網(wǎng)絡的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/),以便您了解如何訓練和生成我們的孿生網(wǎng)絡模型
2. 使用本教程的“下載”部分下載源代碼,預訓練的孿生網(wǎng)絡和示例圖片
打開終端,然后執(zhí)行以下命令:
圖4:使用孿生網(wǎng)絡和Keras / TensorFlow深度學習庫比較圖像相似性的結果。
注意:是否收到與TypeError相關的錯誤:('Keyword argument not understood:', 'groups')?如果是這樣,請記住,本教程“下載”部分中包含的預訓練模型是使用TensorFlow 2.3訓練的。因此,在運行test_siamese_network.py時,您應該使用TensorFlow 2.3。如果您更喜歡使用其他版本的TensorFlow,只需運行train_siamese_network.py來訓練模型, 生成新的孿生網(wǎng)絡模型并序列化到磁盤。然后您將可以運行test_siamese_network.py且不會出現(xiàn)錯誤。
上面的圖4顯示了我們的圖像相似性結果。
對于第一個圖像對,一個包含“ 7”,而另一個包含“ 1”-顯然,它們不是同一幅圖像,相似度得分很低,只有42%。我們的孿生網(wǎng)絡已正確將這些圖像標記為屬于不同類別。
下一個圖像對由兩個“ 0”數(shù)字組成。我們的孿生網(wǎng)絡預測出非常高的相似度,97%,表明這兩個圖像屬于同一類別。
您可以在圖4中看到所有其他圖像對的相同模式。相似性得分高的圖像屬于同一類別,而相似性得分低的圖像對屬于不同的類別。
由于在我們的孿生網(wǎng)絡中使用了sigmoid激活層作為最終層(其輸出值在[0,1]范圍內),所以通常是使用相似性截斷值0.5(50%)作為閾值:
-
如果兩個圖像對的圖像相似度小于等于0.5,則它們屬于不同的類別。
-
相反,如果對的預測相似度小于0.5,則它們屬于同一類。
使用孿生網(wǎng)絡計算圖像相似度時,可以在自己的項目中使用此經驗。
下一步
圖片5:如果你想成為神經網(wǎng)絡的專家,使用特定的數(shù)據(jù)集構建你的深度學習模型,瀏覽用python實現(xiàn)計算機視覺的深度學習(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/),并開始行動吧!此資料的學習,你可以得到PyImageSearch團隊的支持。
孿生網(wǎng)絡是先進的深度學習技術,因此,要真正掌握,您需要深入了解神經網(wǎng)絡和深度學習基礎知識。
如果此博客文章引起了您的興趣,并且您想了解更多信息,那么最好是從我的書《 Python的計算機視覺深度學習》(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)開始。
在這本書中,您將深入探討神經網(wǎng)絡和深度學習的基礎知識,這些基礎知識對于使用孿生網(wǎng)絡以及更復雜的模型和體系結構至關重要。
本書將理論與代碼實現(xiàn)相結合,因此您將很快掌握:
-
深度學習基礎知識的理論和基礎,即使不具備高級數(shù)學學位,也能快速理解和實現(xiàn)。我為您提供了基本方程式,并用代碼做了實現(xiàn),以便您可以掌握概念并在自己的工作中使用它們。
-
實現(xiàn)您自己的自定義神經網(wǎng)絡體系結構。您將學習如何實現(xiàn)最新的架構,例如ResNet,SqueezeNet等,以及如何創(chuàng)建自己的自定義CNN。
-
如何在自己的數(shù)據(jù)集上訓練CNN。與大多數(shù)深度學習教程不同,我的課程教您如何使用自己的自定義數(shù)據(jù)集。在完成本書之前,您將在自己的數(shù)據(jù)集中訓練CNN。
-
目標檢測(Faster R-CNN,SSD 和RetinaNet)和實例分割(MaskR-CNN)。您將學習如何創(chuàng)建自己的自定義目標檢測器和分割網(wǎng)絡。
-
您還將找到答案和經過驗證的代碼配方,以:
-
創(chuàng)建并準備自己自定義的圖像數(shù)據(jù)集以進行圖像分類,目標檢測和分割
-
通過閱讀手把手教程(包含大量代碼),更好地了解用于計算機視覺的深度學習背后的算法以及如何實現(xiàn)它們
-
將我的提示,建議和最佳練習付諸實踐,以最大程度地提高模型的準確性
使用Python進行計算機視覺的深度學習(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)這本書充滿了PyImageSearch慣用的高質量內容和毫無廢話的教學風格。
如果您準備開始使用,請在此處獲取副本。(https://pyimagesearch.dpdcart.com/cart/add?product_id=144623&method_id=154481&_ga=2.2294384.1585655171.1604272926-1981724077.1597366431)
如果您仍然不確定下一步是否要進行深度學習,請查看這些學生成功案例(https://www.pyimagesearch.com/pyimagesearch-reviews-testimonials/)。就像您一樣,讀者能夠在自己的職業(yè)生涯中脫穎而出,進行突破性的研究,并鉆研令人難以置信的有益的愛好-您也可以!
如果您在嘗試之前需要更多信息,我很樂意將完整的目錄和示例章節(jié)發(fā)送給您-只需單擊此處(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)。
您還可以瀏覽我的其他書籍和課程產品庫(https://www.pyimagesearch.com/books-and-courses/)
總結
在本教程中,您學習了如何比較兩個圖像的相似性,更具體地說,是比較兩個圖像屬于相同類別還是不同類別。我們使用孿生網(wǎng)絡以及Keras和TensorFlow深度學習庫來完成此任務。
這篇文章是我們介紹孿生網(wǎng)絡的三部分系列的最后一部分。為了便于參考,以下是該系列中每個指南的鏈接:
第1部分:使用Python為孿生網(wǎng)絡構建圖片二元組(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)
第2部分:使用Keras,TensorFlow和深度學習訓練孿生網(wǎng)絡
(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)
第3部分:使用孿生網(wǎng)絡,Keras和TensorFlow比較圖像的相似性(本教程)
在不久的將來,我將介紹有關孿生網(wǎng)絡的更多高級系列,其中包括:
-
圖像三元組
-
對比損失
-
三元損失
-
孿生人臉識別
-
利用孿生網(wǎng)絡的單樣本學習
請繼續(xù)關注這些教程;你一定不想錯過他們!
原文鏈接:
https://www.pyimagesearch.com/2020/12/07/comparing-images-for-similarity-using-siamese-networks-keras-and-tensorflow/
原文標題:
Comparing images for similarity using siamese networks, Keras, and TensorFlow