獨家 | 利用孿生網絡,Keras,Tensorflow比較圖片相似度


作者:Adrian Rosebrock

翻譯:張一然

校對:wwl

本文約3700字,建議閱讀8分鐘

在本文中,您將學習如何使用孿生網絡和深度學習庫Keras / TensorFlow比較兩個圖像的相似性(以及它們是否屬於相同或不同的類)。

這篇博客文章是我們有關孿生網絡基礎的三部曲系列的第三部分:

第1部分:使用Python爲孿生網絡構建圖片二元組(兩週前的帖子)(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)

第2部分:使用Keras,TensorFlow和深度學習訓練孿生網絡(上週的教程)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

第3部分:使用孿生網絡比較圖像(本教程)

上週我們學習瞭如何訓練孿生網絡。我們的模型在測試集上表現良好,可以正確地檢驗兩張圖像是否屬於同一類別。訓練完成後,我們將模型序列化到磁盤。

在上週的教程發佈後不久,我收到了PyImageSearch讀者Scott的電子郵件,他問:

 

“嗨, Adrian -感謝您提供有關孿生網絡的指南。我在深度學習領域聽說過他們,但老實說,我不知道他們如何起作用或他們能做什麼。這個系列確實幫助我消除了疑慮,甚至在我的一個工作項目中幫到了我。

我的問題是:

我們如何利用訓練好的孿生網絡在訓練和測試集以外的圖像上進行預測?

那可能嗎?”

當然,Scott。這正是我們今天要討論的內容。

要了解如何使用孿生網絡比較圖像的相似性,請繼續閱讀。

利用孿生網絡,Keras, Tensorflow比較圖片相似度

在本文第一部分,我們將討論使用訓練好的孿生網絡去預測兩張圖片相似度的基本過程,更具體地說,預測兩張輸入圖片是否屬於同一類。

然後,您將學習如何使用Keras和TensorFlow爲孿生網絡配置開發環境。

配置完您的開發環境後,我們將回顧項目目錄結構,然後實現一個使用孿生網絡比較圖像的相似性的Python腳本。

最後,我們將在本教程中總結討論結果。

孿生網絡如何預測兩張圖片的相似度

圖1:使用孿生網絡比較兩張圖像的相似度會得出相似度分數。分數越接近“ 1”,圖像越相似(因此更可能屬於同一類別)。相反,分數越接近“ 0”,兩個圖像就越不相似。

在上週的教程中,您學習瞭如何訓練孿生網絡以驗證兩對數字是屬於同一類別還是不同類別。並將訓練後的孿生模型序列化到磁盤。

然後問題變成:

“我們如何使用我們訓練好的孿生網絡來預測兩個圖像之間的相似性?”

答案是我們利用孿生網絡中最後一層,即Sigmoid激活函數。

 

Sigmoid激活函數的輸出範圍爲[0,1],這意味着當我們向孿生網絡輸入圖像對時,模型的輸出值在0到1之間。

 

值0表示兩個圖像完全不同,而值1表示兩個圖像非常相似。

 

這種相似性的一個示例可以在本節前邊部分的圖1中看到:

  • 將“ 7”與“ 0”進行比較,相似度得分僅爲0.02。

  • 但是,將“ 0”與另一個“ 0”進行比較會得出非常高的相似度得分0.93。

  • 通常使用相似性截斷值0.5(50%)作爲閾值:

  • 如果兩個圖像的圖像相似度小於等於0.5,則它們屬於不同的類別。

  • 相反,如果圖片二元組的預測相似度大於0.5,則它們屬於同一類。

通過這種方式,您可以使用孿生網絡來(1)比較圖像的相似度,以及(2)確定圖像是否屬於同一類別。

使用孿生網絡的實際用例包括:

  • 人臉識別:給定兩張包含人臉的獨立圖像,確定兩張照片中的人是否爲同一人。

  • 簽名驗證:當出現兩個簽名時,請確定其中一個是否爲僞造。

  • 處方藥識別:給定兩個處方藥,確定它們是相同藥物還是不同藥物。

配置您的開發環境

本系列有關孿生網絡的教程利用Keras和TensorFlow。如果打算繼續學習本教程或本系列的前兩部分,建議您花些時間配置深度學習開發環境。

您可以參考如下任意一種方法在您的系統上安裝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虛擬環境中爲系統配置本篇博客所必須的軟件

 

配置開發壞境遇到困難?

圖2: 在配置開發環境時遇到問題?想要訪問在Google Colab上預配置的Jupyter notebook?請務必加入PyImageSearch Plus,這樣的話,您將在幾分鐘之內啓動並運行本教程。

 

  • 如果你時間有限?

  • 在你作爲僱員的公司,使用加域的電腦學習?想跳過命令行、包管理器、虛擬環境的麻煩?

  • 準備好當下就在你windows,macos,linux系統上運行代碼了嗎?

那麼,今天就加入PyImageSearch Plus吧!(https://www.pyimagesearch.com/pyimagesearch-plus/)

在您的web瀏覽器中即可訪問本教程的Jupyter Notebook和其他預定義的PyImageSearch指南,這些文件可直接運行在Google Colab的生態系統中!無需安裝。

最重要的是,這些Jupyter Notebook將在Windows,macOS和Linux上運行!

項目結構

在深入瞭解本教程之前,讓我們先花點時間檢查一下我們的項目目錄結構。

 

首先,請確保使用本教程的“下載”部分下載源代碼和示例圖像。

 

讓我們看一下該項目:

在examples目錄下我們有許多示例數字

圖3:示例數字,我們將使用通過Keras和TensorFlow實現的孿生網絡來比較數字的相似性。

我們將採樣這些數字對,然後使用我們的孿生網絡比較它們的相似性。

ouput輸出目錄包含訓練歷史記錄圖(plot.png)和我們的訓練完的/序列化的孿生網絡模型(siamese_model /)。這兩個文件都是在上週有關訓練自定義孿生網絡模型的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)中生成的-請確保您在繼續之前閱讀了該教程,因爲它是今天所必需的!

pyimagesearch模塊包含三個Python文件:

1. Config.py 配置文件存儲重要的變量,例如輸出文件路徑和訓練配置(包括圖像輸入尺寸,批處理大小,訓練次數等)

2. Siamese_network.py:我們對孿生網絡架構的實現

3. Utils.py 包含輔助配置函數以生成圖像二元組,計算歐幾里得距離並繪製訓練歷史路徑

train_siamese_network.py腳本包含:

1. 導入配置, 孿生網絡實現和功能函數

2. 從磁盤加載MNIST數據集

3. 生成圖片二元組

4. 創建訓練/測試數據集

5. 訓練孿生網絡

6. 把訓練好的孿生網絡序列化到磁盤

今天,我將不再介紹這四個腳本,因爲上週有關如何訓練孿生網絡的教程已經介紹了這四個腳本。爲了完整起見,我已經將這些文件包含在今天教程的項目目錄結構中,但是再次重申一下,要想全面回顧這些文件,他們做的什麼以及他們如何做,請參考上週的教程。

最後,我們將重點放在今天的教程test_siamese_network.py上。

該腳本將:

1. 從磁盤加載我們訓練好的孿生網絡模型

2. 在examples目錄中獲取樣本數字圖像的路徑

3. 從這些樣本中隨機構造成圖像二元組

4. 使用孿生網絡比較圖像二元組的相似性

開始工作吧!

實現我們的孿生網絡圖像相似性腳本

現在,我們已經準備好了使用Keras和TensorFlow實現孿生網絡來獲得圖片相似性。

首先,請確保使用本教程的“下載”部分下載源代碼,示例圖像和預先訓練的孿生網絡模型。

打開test_siamese_network.py,然後按照以下步驟操作:

我們首先導入所需的Python包(第2-9行)。值得注意的導入包括:

  • config:包含重要的配置,包括位於磁盤上的經過訓練/序列化的孿生網絡模型的路徑

  • utils:包含在孿生網絡Lambda層中使用的euclidean_distance函數-我們需要導入此包以禁止有關從磁盤加載Lambda層的任何用戶警告

  • load_model:Keras / TensorFlow函數用於從磁盤加載訓練好的孿生網絡

  • list_images:在examples目錄中獲取所有圖像的路徑

讓我們繼續分析語句的參數:

我們在這裏只需要一個參數--input,它是我們要比較相似性的圖像目錄在磁盤上的地址。運行此腳本時,我們將把 examples目錄的路徑作爲此處的輸入。

解析了命令行參數後,我們現在可以在--input目錄中獲取所有testImagePaths:

第20行獲取了我們所有示例圖像的路徑,這些圖像包含要比較相似性的數字。第22行從這些testImagePaths中隨機生成總共10對圖像。

第26行使用load_model函數從磁盤加載我們的孿生網絡。

利用從磁盤加載的孿生網絡,我們現在可以比較圖像的相似性:

29行循環所有的圖片二元組, 對於每一對圖片我們

1. 從磁盤加載兩張圖片載(31,32行)

2. 複製兩張圖片以便後序畫圖/可視化(35, 36行)

3. 沿着batch維度添加一個通道的維度(43, 44行)

4. 將像素值由[0, 255]縮放到[0, 1], 就像我們上週訓練孿生網絡那樣(47, 48行)(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

一旦imageA和imageB處理完, 我們調用孿生網絡模型(52行)的.predict()方法比較他們的相似度, 得到兩張圖片的概率/相似度分數(53行)

最後一步是在屏幕上展示兩張圖片以及相應的相似度分數

第56行和第57行爲該圖像對創建一個matplotlib圖形,並以相似性得分作爲圖形標題。

第60-67行繪製兩張圖像,而第70行則將輸出顯示到屏幕上。

恭喜您實現孿生網絡用來比較圖像和計算相似度!在下一節中,我們將看到我們辛勤工作的結果。

使用Keras和TensorFlow的孿生網絡的圖像相似性結果

現在,我們準備使用我們的孿生網絡比較圖像的相似性!

在我們檢查結果之前,請確保您:

1. 閱讀了我們之前有關訓練孿生網絡的教程(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/),以便您瞭解如何訓練和生成我們的孿生網絡模型

2. 使用本教程的“下載”部分下載源代碼,預訓練的孿生網絡和示例圖片

打開終端,然後執行以下命令:

圖4:使用孿生網絡和Keras / TensorFlow深度學習庫比較圖像相似性的結果。

注意:是否收到與TypeError相關的錯誤:('Keyword argument not understood:', 'groups')?如果是這樣,請記住,本教程“下載”部分中包含的預訓練模型是使用TensorFlow 2.3訓練的。因此,在運行test_siamese_network.py時,您應該使用TensorFlow 2.3。如果您更喜歡使用其他版本的TensorFlow,只需運行train_siamese_network.py來訓練模型, 生成新的孿生網絡模型並序列化到磁盤。然後您將可以運行test_siamese_network.py且不會出現錯誤。

上面的圖4顯示了我們的圖像相似性結果。

對於第一個圖像對,一個包含“ 7”,而另一個包含“ 1”-顯然,它們不是同一幅圖像,相似度得分很低,只有42%。我們的孿生網絡已正確將這些圖像標記爲屬於不同類別。

下一個圖像對由兩個“ 0”數字組成。我們的孿生網絡預測出非常高的相似度,97%,表明這兩個圖像屬於同一類別。

您可以在圖4中看到所有其他圖像對的相同模式。相似性得分高的圖像屬於同一類別,而相似性得分低的圖像對屬於不同的類別。

由於在我們的孿生網絡中使用了sigmoid激活層作爲最終層(其輸出值在[0,1]範圍內),所以通常是使用相似性截斷值0.5(50%)作爲閾值:

  • 如果兩個圖像對的圖像相似度小於等於0.5,則它們屬於不同的類別。

  • 相反,如果對的預測相似度小於0.5,則它們屬於同一類。

使用孿生網絡計算圖像相似度時,可以在自己的項目中使用此經驗。

下一步

圖片5:如果你想成爲神經網絡的專家,使用特定的數據集構建你的深度學習模型,瀏覽用python實現計算機視覺的深度學習(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/),並開始行動吧!此資料的學習,你可以得到PyImageSearch團隊的支持。

孿生網絡是先進的深度學習技術,因此,要真正掌握,您需要深入瞭解神經網絡和深度學習基礎知識。

如果此博客文章引起了您的興趣,並且您想了解更多信息,那麼最好是從我的書《 Python的計算機視覺深度學習》(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)開始。

在這本書中,您將深入探討神經網絡和深度學習的基礎知識,這些基礎知識對於使用孿生網絡以及更復雜的模型和體系結構至關重要。

本書將理論與代碼實現相結合,因此您將很快掌握:

  • 深度學習基礎知識的理論和基礎,即使不具備高級數學學位,也能快速理解和實現。我爲您提供了基本方程式,並用代碼做了實現,以便您可以掌握概念並在自己的工作中使用它們。

  • 實現您自己的自定義神經網絡體系結構。您將學習如何實現最新的架構,例如ResNet,SqueezeNet等,以及如何創建自己的自定義CNN。

  • 如何在自己的數據集上訓練CNN。與大多數深度學習教程不同,我的課程教您如何使用自己的自定義數據集。在完成本書之前,您將在自己的數據集中訓練CNN。

  • 目標檢測(Faster R-CNN,SSD 和RetinaNet)和實例分割(MaskR-CNN)。您將學習如何創建自己的自定義目標檢測器和分割網絡。

  • 您還將找到答案和經過驗證的代碼配方,以:

  • 創建並準備自己自定義的圖像數據集以進行圖像分類,目標檢測和分割

  • 通過閱讀手把手教程(包含大量代碼),更好地瞭解用於計算機視覺的深度學習背後的算法以及如何實現它們

  • 將我的提示,建議和最佳練習付諸實踐,以最大程度地提高模型的準確性

使用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/)。就像您一樣,讀者能夠在自己的職業生涯中脫穎而出,進行突破性的研究,並鑽研令人難以置信的有益的愛好-您也可以!

 

如果您在嘗試之前需要更多信息,我很樂意將完整的目錄和示例章節發送給您-只需單擊此處(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)。

您還可以瀏覽我的其他書籍和課程產品庫(https://www.pyimagesearch.com/books-and-courses/)

總結

在本教程中,您學習瞭如何比較兩個圖像的相似性,更具體地說,是比較兩個圖像屬於相同類別還是不同類別。我們使用孿生網絡以及Keras和TensorFlow深度學習庫來完成此任務。

這篇文章是我們介紹孿生網絡的三部分系列的最後一部分。爲了便於參考,以下是該系列中每個指南的鏈接:

第1部分:使用Python爲孿生網絡構建圖片二元組(https://www.pyimagesearch.com/2020/11/23/building-image-pairs-for-siamese-networks-with-python/)

第2部分:使用Keras,TensorFlow和深度學習訓練孿生網絡

(https://www.pyimagesearch.com/2020/11/30/siamese-networks-with-keras-tensorflow-and-deep-learning/)

第3部分:使用孿生網絡,Keras和TensorFlow比較圖像的相似性(本教程)

在不久的將來,我將介紹有關孿生網絡的更多高級系列,其中包括:

  • 圖像三元組

  • 對比損失

  • 三元損失

  • 孿生人臉識別

  • 利用孿生網絡的單樣本學習

請繼續關注這些教程;你一定不想錯過他們!

原文鏈接:

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 

編輯:王菁

校對:汪雨晴

譯者簡介

張一然,哥本哈根大學計算機系碩士畢業, 研究方向爲圖像補全。現從事自然語言處理工作。感興趣方向爲計算機視覺和自然語言處理,喜歡看書旅遊。

翻譯組招募信息

工作內容:需要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。

你能得到:定期的翻譯培訓提高志願者的翻譯水平,提高對於數據科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯繫,THU數據派產學研的背景爲志願者帶來好的發展機遇。

其他福利:來自於名企的數據科學工作者,北大清華以及海外等名校學生他們都將成爲你在翻譯小組的夥伴。

點擊文末“閱讀原文”加入數據派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公衆號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。

發佈後請將鏈接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。

點擊“閱讀原文”擁抱組織

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章