邊緣檢測 使用 OpenCV 和 深度學習 進行 整體嵌套邊緣檢測

邊緣檢測 使用 OpenCV 和 深度學習 進行 整體嵌套邊緣檢測

熱狗

熱狗

 

原文鏈接 邊緣檢測 使用 OpenCV 和 深度學習 進行整體嵌套邊緣檢測

在 2019年7月21日 上張貼 由 hotdog發表回覆

邊緣檢測 使用 OpenCV 和 深度學習 進行整體嵌套 邊緣檢測
在本教程中,您將學習如何使用OpenCV和深度學習應用整體嵌套 邊緣檢測(HED)。我們將對圖像和視頻流應用整體嵌套 邊緣檢測,然後將結果與 OpenCV 的標準 Canny 邊緣檢測器進行比較。
邊緣檢測使我們能夠找到圖像中對象的邊界, 並且是圖像處理和計算機視覺的首批應用用例之一。
使用OpenCV進行邊緣檢測時,您最有可能使用Canny邊緣檢測器 ; 但是,Canny邊緣檢測器存在一些問題,即:

  1. 將下限和上限值設置爲滯後閾值是一個手動過程,需要實驗和視覺驗證。
  2. 對一個圖像有效的滯後閾值可能不適用於另一個圖像(對於在不同光照條件下捕獲的圖像,這幾乎總是如此)。
  3. Canny邊緣檢測器通常需要許多預處理步驟(即轉換爲灰度,模糊/平滑等)以獲得良好的邊緣圖。

整體嵌套 邊緣檢測(HED)試圖通過端到端深度神經網絡解決Canny邊緣檢測器的侷限性。
該網絡接受RGB圖像作爲輸入,然後生成邊緣圖作爲輸出。此外,HED生成的邊緣圖在保留圖像中的對象邊界方面做得更好。
要了解有關使用OpenCV進行整體嵌套 邊緣檢測的更多信息,請繼續閱讀!
尋找這篇文章的源代碼?
跳到下載部分。
使用OpenCV和深度學習進行整體嵌套邊緣檢測
在本教程中,我們將學習使用OpenCV和深度學習的整體嵌套邊緣檢測(HED)。
我們首先討論整體嵌套邊緣檢測算法。
從那裏我們將審查我們的項目結構,然後利用HED在圖像視頻中進行邊緣檢測。
讓我們繼續吧!
什麼是整體嵌套邊緣檢測?

我們今天在這裏使用的算法來自謝和圖的2015年論文,整體嵌套邊緣檢測,或簡稱爲“HED”。
Xie和Tu的工作描述了一種深度神經網絡,能夠自動學習能夠確定圖像中對象的邊緣/對象邊界的豐富的分層邊緣圖。
該邊緣檢測網絡能夠在Berkely BSDS500NYU Depth數據集上獲得最先進的結果 。
有關本文範圍之外的網絡架構和算法的完整評論,請參閱官方出版物瞭解更多詳情。
項目結構
繼續抓住今天的 下載並解壓縮文件。
從那裏,您可以使用以下命令檢查項目目錄

我們的HED Caffe模型包含在 hed_model / 目錄中。
我提供了一些樣本 圖像/ 包括我自己,我的狗和我在互聯網上找到的樣本貓圖像。
今天我們將查看 detect_edges_image .py 和 detect_edges_video .py 腳本。兩個腳本共享相同的邊緣檢測過程,因此我們將大部分時間花在HED圖像腳本上。
圖像中的整體嵌套邊緣檢測
我們今天回顧的Python和OpenCV整體嵌套邊緣檢測示例與OpenCV官方倉庫中HED示例非常相似。
我在這裏的主要貢獻是:

  1. 提供一些額外的文檔
  2. 最重要的是,向您展示如何在您自己的項目中使用整體嵌套邊緣檢測。

讓我們繼續並開始 – 打開 detect_edge_image .py文件

2-4行進行導入包,我們將"https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/">argparse用於解析命令行參數。通過cv2 導入訪問OpenCV函數和方法 。我們的 os 導入將允許我們構建文件路徑,而不管操作系統如何。
此腳本需要兩個命令行參數:

  • – edge – detector :OpenCV深度學習邊緣檢測器的路徑。該路徑包含兩個Caffe文件,稍後將用於初始化我們的模型。
  • – image :用於測試的輸入圖像的路徑。就像我之前說的那樣 – 我在 “下載”中提供了一些圖像 ,但您也應該在自己的圖像上嘗試腳本。

讓我們定義 CropLayer 類

爲了利用OpenCV的Holistically-Nested Edge Detection模型,我們需要定義一個自定義圖層裁剪類 – 我們適當地命名這個類 CropLayer 。
在這個類的構造函數中,我們分別存儲裁剪開始和結束的起始和結束(x,y)座標(第15-21行)。
將HED與OpenCV一起應用時,下一步是定義 getMemoryShapes函數,該函數負責計算輸入的卷大小

第27行導出輸入體積的形狀以及目標形狀。
第28行也從輸入中提取批量大小和通道數 。
最後,第29行分別提取目標形狀的高度和寬度。
給定這些變量,我們可以計算第32-35行的起始和結束作物(x,y) –座標。
然後,我們將卷的形狀返回到第39行的調用函數。
我們需要定義的最終方法是 前向函數。此功能負責在網絡的正向傳遞(即推斷/邊緣預測)期間執行裁剪

第43和44行利用了Python和NumPy方便的列表/數組切片語法。
鑑於我們的 CropLayer類,我們現在可以從磁盤加載我們的HED模型並使用 net註冊CropLayer

我們的prototxt路徑和模型路徑是使用args [ “edge_detector” ] 提供的 – edge -detector命令行參數 建立的 (第48-51行)。
從那裏開始, protoPath 和 modelPath 都用於在第52行加載和初始化我們的Caffe模型 。
讓我們繼續加載我們的輸入 圖像

加載我們的原始 圖像,並在第58和59行提取空間尺寸(寬度和高度) 。
我們還計算了Canny邊緣圖(第64-66行),因此我們可以將邊緣檢測結果與HED進行比較。
最後,我們準備申請HED了

要使用OpenCV和深度學習應用整體嵌套邊緣檢測(HED),我們:

  • 從我們的圖像構造一個 blob(第70-72行)。
  • 將blob傳遞通過HED網,獲得 hed 輸出(第77和78行)。
  • 將輸出大小調整爲原始圖像尺寸(第79行)。
  • 將我們的圖像像素縮放回[0,255]範圍 並確保類型爲 “uint8” (第80行)。

最後,我們將展示:

  1. 原始輸入圖像
  2. Canny邊緣檢測圖像
  3. 我們的整體嵌套邊緣檢測結果

圖像和HED結果
要使用OpenCV將整體嵌套邊緣檢測應用於您自己的圖像,請確保使用本教程的下載部分來獲取源代碼,經過培訓的HED模型和示例圖像文件。從那裏,打開一個終端並執行以下命令
$ python detect_edges_image.py --edge-detector hed_model --image images/cat.jpg

左邊 我們有輸入圖像。
中心, 我們有Canny邊緣探測器。
而在右邊,是我們全面地應用套式邊緣檢測後的最終輸出。
注意Canny邊緣探測器如何不能保留貓,山脈或貓所坐的岩石的物體邊界。
另一方面,HED能夠保留所有這些對象邊界。
我們試試另一張圖片
$ python detect_edges_image.py --edge-detector hed_model --image images/guitar.jpg

在上面的圖3中,我們可以看到自己彈吉他的示例圖像。使用Canny邊緣檢測器時,地毯的紋理和圖案會產生很多“噪點” – HED,相反,沒有這樣的噪音。
此外,HED在抓住我的襯衫,牛仔褲(包括牛仔褲上的洞)和吉他的物體邊界方面做得更好。
讓我們做一個最後的例子


$ python detect_edges_image.py --edge-detector hed_model --image images/janie.jpg

這張照片中有兩個物體:(1)狗,和(2)她身後的椅子。
Canny邊緣探測器(中心)做了一個合理的工作,突出了椅子的輪廓,但無法正確捕捉狗的物體邊界,主要是由於她的外套中的明/暗和暗/光過渡。
HED()能夠更輕鬆地捕捉Janie的整個輪廓。
視頻中的整體嵌套邊緣檢測
我們已將Openrally-Nested Edge Detection應用於使用OpenCV的圖像 – 是否可以對視頻執行相同的操作?
我們來看看。
打開 detect_edges_video .py文件1

我們的視頻腳本需要三個額外的導入:

  • VideoStream :從輸入源(如網絡攝像頭,視頻文件或其他來源)讀取幀。
  • imutils :我在GitHubPyPi上提供的便利功能包。我們正在使用 調整大小 功能。
  • time :此模塊允許我們發出一個睡眠命令,以允許我們的視頻流建立並“預熱”。

第10-15行的兩個命令行參數 非常相似:

  • – edge – detector :OpenCV的HED邊緣檢測器的路徑。
  • – input :輸入視頻文件的可選路徑。如果未提供路徑,則將使用網絡攝像頭。

我們的 CropLayer 類與我們之前定義的類相同

在定義了我們相同的 CropLayer 類之後,我們將繼續初始化我們的視頻流和HED模型

無論我們選擇使用我們的 網絡攝像頭 還是視頻文件,腳本都將動態地工作(第51-62行)。
我們的HED模型已加載, CropLayer 已在第65-73行註冊 。
讓我們在循環中獲取幀並應用邊緣檢測!

我們開始循環第76-80行的幀 。如果我們到達視頻文件的末尾(當幀爲無時發生 ),我們將從循環中斷開(第84和85行)。
第88和89行調整框架的大小,使其寬度爲500像素。然後我們在調整大小後抓住框架的尺寸。
現在讓我們來處理框架 正好在我們前面的腳本

在輸入幀上計算Canny邊緣檢測(第93-95行)和HED邊緣檢測(第100-106行)。
從那裏,我們將顯示邊緣檢測結果

我們的三個輸出幀顯示在110-112行:(1)原始的,調整大小的幀,(2)Canny邊緣檢測結果,以及(3)HED結果。
通過113號線捕獲了鍵盤輸入。如果 按下“q”,我們將從循環和清理中斷開(第116-128行)。
視頻和HED結果
那麼,整體嵌套邊緣檢測如何與OpenCV實時執行?
我們來看看。
請務必使用此博客文章的下載部分下載源代碼和HED模型。
從那裏,打開一個終端並執行以下命令
$ python detect_edges_video.py --edge-detector hed_model


在上面的簡短GIF演示中,您可以看到HED模型的演示。
請特別注意使用Canny邊緣檢測器時背景燈的邊界是如何完全丟失的; 但是,當使用HED時,邊界將被保留。
在性能方面,我在收集上面的演示時使用了我的3Ghz Intel Xeon W. 我們使用HED模型在CPU上獲得接近實時的性能。
要獲得真正的實時性能,您需要使用GPU; 但是,請記住,對OpenCV的“dnn”模塊的GPU支持特別有限(特別是目前不支持NVIDIA GPU)。
與此同時,如果您需要實時性能,可能需要考慮使用Caffe + Python綁定。
摘要
在本教程中,您學習瞭如何使用OpenCV和深度學習執行整體嵌套邊緣檢測(HED)。
與Canny邊緣檢測器不同,Canny邊緣檢測器需要預處理步驟,手動調整參數,並且通常在使用不同光照條件捕獲的圖像上表現不佳,Holistic-Nested Edge Detection旨在創建端到端深度學習邊緣檢測器。
正如我們的結果所示,HED生成的輸出邊緣圖比簡單的Canny邊緣檢測器更好地保留了對象邊界。整體嵌套邊緣檢測可以在環境和光照條件可能未知或根本無法控制的應用中取代Canny邊緣檢測。
缺點是,HED是顯著比 Canny 更計算昂貴。Canny邊緣檢測器可以在CPU上以超實時方式運行; 但是,HED的實時性能需要GPU。
我希望你喜歡今天的帖子



代碼下載
源代碼下載


原文鏈接 邊緣檢測 使用 OpenCV 和 深度學習 進行整體嵌套邊緣檢測



文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Holistically-Nested Edge Detection with OpenCV and Deep Learning/,2009年7月21日訪問
相關文章

 

張貼在技術博客opencv標籤:opencv深度學習邊緣檢測整體潛逃編輯

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