bat 引号 嵌套_边缘检测 使用 OpenCV 和 深度学习 进行整体嵌套边缘检测
原文鏈接 邊緣檢測 使用 OpenCV 和 深度學(xué)習(xí) 進行整體嵌套邊緣檢測
在 2019年7月21日 上張貼 由 hotdog發(fā)表回復(fù)
邊緣檢測 使用 OpenCV 和 深度學(xué)習(xí) 進行整體嵌套 邊緣檢測
在本教程中,您將學(xué)習(xí)如何使用OpenCV和深度學(xué)習(xí)應(yīng)用整體嵌套 邊緣檢測(HED)。我們將對圖像和視頻流應(yīng)用整體嵌套 邊緣檢測,然后將結(jié)果與 OpenCV 的標(biāo)準 Canny 邊緣檢測器進行比較。邊緣檢測使我們能夠找到圖像中對象的邊界, 并且是圖像處理和計算機視覺的首批應(yīng)用用例之一。
使用OpenCV進行邊緣檢測時,您最有可能使用Canny邊緣檢測器 ; 但是,Canny邊緣檢測器存在一些問題,即:
整體嵌套 邊緣檢測(HED)試圖通過端到端深度神經(jīng)網(wǎng)絡(luò)解決Canny邊緣檢測器的局限性。
該網(wǎng)絡(luò)接受RGB圖像作為輸入,然后生成邊緣圖作為輸出。此外,HED生成的邊緣圖在保留圖像中的對象邊界方面做得更好。要了解有關(guān)使用OpenCV進行整體嵌套 邊緣檢測的更多信息,請繼續(xù)閱讀!
尋找這篇文章的源代碼?
跳到下載部分。
使用OpenCV和深度學(xué)習(xí)進行整體嵌套邊緣檢測
在本教程中,我們將學(xué)習(xí)使用OpenCV和深度學(xué)習(xí)的整體嵌套邊緣檢測(HED)。
我們首先討論整體嵌套邊緣檢測算法。
從那里我們將審查我們的項目結(jié)構(gòu),然后利用HED在圖像和視頻中進行邊緣檢測。
讓我們繼續(xù)吧!
什么是整體嵌套邊緣檢測?
我們今天在這里使用的算法來自謝和圖的2015年論文,整體嵌套邊緣檢測,或簡稱為“HED”。
Xie和Tu的工作描述了一種深度神經(jīng)網(wǎng)絡(luò),能夠自動學(xué)習(xí)能夠確定圖像中對象的邊緣/對象邊界的豐富的分層邊緣圖。
該邊緣檢測網(wǎng)絡(luò)能夠在Berkely BSDS500和NYU Depth數(shù)據(jù)集上獲得最先進的結(jié)果 。
有關(guān)本文范圍之外的網(wǎng)絡(luò)架構(gòu)和算法的完整評論,請參閱官方出版物了解更多詳情。
項目結(jié)構(gòu)
繼續(xù)抓住今天的 “下載”并解壓縮文件。
從那里,您可以使用以下命令檢查項目目錄
我們的HED Caffe模型包含在 hed_model / 目錄中。
我提供了一些樣本 圖像/ 包括我自己,我的狗和我在互聯(lián)網(wǎng)上找到的樣本貓圖像。
今天我們將查看 detect_edges_image .py 和 detect_edges_video .py 腳本。兩個腳本共享相同的邊緣檢測過程,因此我們將大部分時間花在HED圖像腳本上。
圖像中的整體嵌套邊緣檢測
我們今天回顧的Python和OpenCV整體嵌套邊緣檢測示例與OpenCV官方倉庫中的HED示例非常相似。我在這里的主要貢獻是:
讓我們繼續(xù)并開始 – 打開 detect_edge_image .py文件
在2-4行進行導(dǎo)入包,我們將"https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/">argparse用于解析命令行參數(shù)。通過cv2 導(dǎo)入訪問OpenCV函數(shù)和方法 。我們的 os 導(dǎo)入將允許我們構(gòu)建文件路徑,而不管操作系統(tǒng)如何。
此腳本需要兩個命令行參數(shù):
- – edge – detector :OpenCV深度學(xué)習(xí)邊緣檢測器的路徑。該路徑包含兩個Caffe文件,稍后將用于初始化我們的模型。
- – image :用于測試的輸入圖像的路徑。就像我之前說的那樣 – 我在 “下載”中提供了一些圖像 ,但您也應(yīng)該在自己的圖像上嘗試腳本。
讓我們定義 CropLayer 類
為了利用OpenCV的Holistically-Nested Edge Detection模型,我們需要定義一個自定義圖層裁剪類 – 我們適當(dāng)?shù)孛@個類 CropLayer 。
在這個類的構(gòu)造函數(shù)中,我們分別存儲裁剪開始和結(jié)束的起始和結(jié)束(x,y)坐標(biāo)(第15-21行)。
將HED與OpenCV一起應(yīng)用時,下一步是定義 getMemoryShapes函數(shù),該函數(shù)負責(zé)計算輸入的卷大小
第27行導(dǎo)出輸入體積的形狀以及目標(biāo)形狀。第28行也從輸入中提取批量大小和通道數(shù) 。
最后,第29行分別提取目標(biāo)形狀的高度和寬度。
給定這些變量,我們可以計算第32-35行的起始和結(jié)束作物(x,y) –坐標(biāo)。
然后,我們將卷的形狀返回到第39行的調(diào)用函數(shù)。
我們需要定義的最終方法是 前向函數(shù)。此功能負責(zé)在網(wǎng)絡(luò)的正向傳遞(即推斷/邊緣預(yù)測)期間執(zhí)行裁剪
第43和44行利用了Python和NumPy方便的列表/數(shù)組切片語法。
鑒于我們的 CropLayer類,我們現(xiàn)在可以從磁盤加載我們的HED模型并使用 net注冊CropLayer
我們的prototxt路徑和模型路徑是使用args [ “edge_detector” ] 提供的 – edge -detector命令行參數(shù) 建立的 (第48-51行)。
從那里開始, protoPath 和 modelPath 都用于在第52行加載和初始化我們的Caffe模型 。
讓我們繼續(xù)加載我們的輸入 圖像
加載我們的原始 圖像,并在第58和59行提取空間尺寸(寬度和高度) 。
我們還計算了Canny邊緣圖(第64-66行),因此我們可以將邊緣檢測結(jié)果與HED進行比較。
最后,我們準備申請HED了
要使用OpenCV和深度學(xué)習(xí)應(yīng)用整體嵌套邊緣檢測(HED),我們:
- 從我們的圖像構(gòu)造一個 blob(第70-72行)。
- 將blob傳遞通過HED網(wǎng),獲得 hed 輸出(第77和78行)。
- 將輸出大小調(diào)整為原始圖像尺寸(第79行)。
- 將我們的圖像像素縮放回[0,255]范圍 并確保類型為 “uint8” (第80行)。
最后,我們將展示:
圖像和HED結(jié)果
要使用OpenCV將整體嵌套邊緣檢測應(yīng)用于您自己的圖像,請確保使用本教程的“下載”部分來獲取源代碼,經(jīng)過培訓(xùn)的HED模型和示例圖像文件。從那里,打開一個終端并執(zhí)行以下命令$ python detect_edges_image.py --edge-detector hed_model --image images/cat.jpg
在左邊 我們有輸入圖像。
在中心, 我們有Canny邊緣探測器。
而在右邊,是我們?nèi)娴貞?yīng)用套式邊緣檢測后的最終輸出。
注意Canny邊緣探測器如何不能保留貓,山脈或貓所坐的巖石的物體邊界。另一方面,HED能夠保留所有這些對象邊界。
我們試試另一張圖片$ python detect_edges_image.py --edge-detector hed_model --image images/guitar.jpg
在上面的圖3中,我們可以看到自己彈吉他的示例圖像。使用Canny邊緣檢測器時,地毯的紋理和圖案會產(chǎn)生很多“噪點” – HED,相反,沒有這樣的噪音。
此外,HED在抓住我的襯衫,牛仔褲(包括牛仔褲上的洞)和吉他的物體邊界方面做得更好。
讓我們做一個最后的例子$ python detect_edges_image.py --edge-detector hed_model --image images/janie.jpg
這張照片中有兩個物體:(1)狗,和(2)她身后的椅子。
Canny邊緣探測器(中心)做了一個合理的工作,突出了椅子的輪廓,但無法正確捕捉狗的物體邊界,主要是由于她的外套中的明/暗和暗/光過渡。
HED(右)能夠更輕松地捕捉Janie的整個輪廓。
視頻中的整體嵌套邊緣檢測
我們已將Openrally-Nested Edge Detection應(yīng)用于使用OpenCV的圖像 – 是否可以對視頻執(zhí)行相同的操作?
我們來看看。
打開 detect_edges_video .py文件1
我們的視頻腳本需要三個額外的導(dǎo)入:
- VideoStream :從輸入源(如網(wǎng)絡(luò)攝像頭,視頻文件或其他來源)讀取幀。
- imutils :我在GitHub和PyPi上提供的便利功能包。我們正在使用 調(diào)整大小 功能。
- time :此模塊允許我們發(fā)出一個睡眠命令,以允許我們的視頻流建立并“預(yù)熱”。
第10-15行的兩個命令行參數(shù) 非常相似:
- – edge – detector :OpenCV的HED邊緣檢測器的路徑。
- – input :輸入視頻文件的可選路徑。如果未提供路徑,則將使用網(wǎng)絡(luò)攝像頭。
我們的 CropLayer 類與我們之前定義的類相同
在定義了我們相同的 CropLayer 類之后,我們將繼續(xù)初始化我們的視頻流和HED模型
無論我們選擇使用我們的 網(wǎng)絡(luò)攝像頭 還是視頻文件,腳本都將動態(tài)地工作(第51-62行)。
我們的HED模型已加載, CropLayer 已在第65-73行注冊 。
讓我們在循環(huán)中獲取幀并應(yīng)用邊緣檢測!
我們開始循環(huán)第76-80行的幀 。如果我們到達視頻文件的末尾(當(dāng)幀為無時發(fā)生 ),我們將從循環(huán)中斷開(第84和85行)。第88和89行調(diào)整框架的大小,使其寬度為500像素。然后我們在調(diào)整大小后抓住框架的尺寸。
現(xiàn)在讓我們來處理框架 正好在我們前面的腳本
在輸入幀上計算Canny邊緣檢測(第93-95行)和HED邊緣檢測(第100-106行)。
從那里,我們將顯示邊緣檢測結(jié)果
我們的三個輸出幀顯示在110-112行:(1)原始的,調(diào)整大小的幀,(2)Canny邊緣檢測結(jié)果,以及(3)HED結(jié)果。
通過113號線捕獲了鍵盤輸入。如果 按下“q”,我們將從循環(huán)和清理中斷開(第116-128行)。
視頻和HED結(jié)果
那么,整體嵌套邊緣檢測如何與OpenCV實時執(zhí)行?
我們來看看。
請務(wù)必使用此博客文章的“下載”部分下載源代碼和HED模型。
從那里,打開一個終端并執(zhí)行以下命令$ python detect_edges_video.py --edge-detector hed_model
在上面的簡短GIF演示中,您可以看到HED模型的演示。
請?zhí)貏e注意使用Canny邊緣檢測器時背景燈的邊界是如何完全丟失的; 但是,當(dāng)使用HED時,邊界將被保留。
在性能方面,我在收集上面的演示時使用了我的3Ghz Intel Xeon W. 我們使用HED模型在CPU上獲得接近實時的性能。
要獲得真正的實時性能,您需要使用GPU; 但是,請記住,對OpenCV的“dnn”模塊的GPU支持特別有限(特別是目前不支持NVIDIA GPU)。
與此同時,如果您需要實時性能,可能需要考慮使用Caffe + Python綁定。
摘要
在本教程中,您學(xué)習(xí)了如何使用OpenCV和深度學(xué)習(xí)執(zhí)行整體嵌套邊緣檢測(HED)。
與Canny邊緣檢測器不同,Canny邊緣檢測器需要預(yù)處理步驟,手動調(diào)整參數(shù),并且通常在使用不同光照條件捕獲的圖像上表現(xiàn)不佳,Holistic-Nested Edge Detection旨在創(chuàng)建端到端深度學(xué)習(xí)邊緣檢測器。
正如我們的結(jié)果所示,HED生成的輸出邊緣圖比簡單的Canny邊緣檢測器更好地保留了對象邊界。整體嵌套邊緣檢測可以在環(huán)境和光照條件可能未知或根本無法控制的應(yīng)用中取代Canny邊緣檢測。
缺點是,HED是顯著比 Canny 更計算昂貴。Canny邊緣檢測器可以在CPU上以超實時方式運行; 但是,HED的實時性能需要GPU。
我希望你喜歡今天的帖子
代碼下載
源代碼下載
原文鏈接 邊緣檢測 使用 OpenCV 和 深度學(xué)習(xí) 進行整體嵌套邊緣檢測
文章轉(zhuǎn)自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Holistically-Nested Edge Detection with OpenCV and Deep Learning/,2009年7月21日訪問
相關(guān)文章
- 活體檢測 使用OpenCV進行 運動檢測
- 文本識別 使用 Tesseract 進行 OpenCV OCR 和 文本識別
- 文本檢測 OpenCV EAST文本檢測器 源代碼
- YOLO 對象檢測 OpenCV 源代碼
- 源代碼 下載
張貼在技術(shù)博客、opencv標(biāo)簽:opencv、深度學(xué)習(xí)、邊緣檢測、整體潛逃編輯
總結(jié)
以上是生活随笔為你收集整理的bat 引号 嵌套_边缘检测 使用 OpenCV 和 深度学习 进行整体嵌套边缘检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.余弦定理、两角和公式公式复习
- 下一篇: 基于Goolgle最新Navigatio