亚洲国产精品乱码一区二区,美景房屋2免费观看,哎呀哎呀在线观看视频高清国语,从镜子里看我是怎么C哭你

Article / 文章中心

利用孿生網(wǎng)絡,Keras,Tensorflow比較圖片相似度

發(fā)布時間:2022-12-08 點擊數(shù):3743

作者: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