YOLO 對象檢測 OpenCV 源代碼

請直接查看原文章 YOLO 對象檢測 OpenCV 源代碼 https://hotdog29.com/?p=621

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

YOLO

在本教程中,您將學習如何使用yolo 對象檢測器 使用深度學習,OpenCV 和Python 檢測圖像和視頻流中的對象。

通過應用目標檢測,你不僅能夠確定什麼是圖像中,也其中一個給定對象所在!

我們首先簡要討論yolo物體探測器,包括物體探測器的工作原理。

從那裏我們將使用 OpenCV ,Python 和 深度學習 :

將yolo物體檢測器應用於圖像
將yolo應用於視頻流
我們將通過討論YOLO對象檢測器的一些限制和缺點來結束本教程,包括我的一些個人提示和建

使用 OpenCV 進行yolo對象檢測
在本教程的其餘部分中,我們將:

討論 yolo 物體探測器的模型和架​​構
利用 yolo 檢測圖像中的對象
應用 yolo 檢測視頻流中的對象
討論 yolo 物體探測器的一些限制和缺點
什麼是YOLO物體探測器?

圖1: yolo 對象檢測器流水線(源)的簡化圖示。我們將在此博客文章中使用YOLO 和 OpenCV。

當涉及基於深度學習的物體檢測時,您將遇到三種主要物體檢測器:

R-CNN 及其變體,包括原始 R-CNN, Fast R- CNN, 和 Faster R-CNN
單發探測器(SSDs)
YOLO
R-CNN是第一個基於深度學習的物體檢測器之一,並且是兩級檢測器的示例。

在第一個R-CNN出版物中,Rich特徵層次結構用於精確的對象檢測和語義分割,(2013)Girshick等。提出了一種對象檢測器,它需要諸如選擇性搜索(或等效物)之類的算法來提出可能包含對象的候選邊界框。
然後將這些區域傳遞到 CNN 進行分類,最終導致第一個基於深度學習的物體探測器之一。
標準 R-CNN 方法的問題在於它很慢並且不是完整的端到端物體檢測器。

Girshick等。2015年發表了第二篇論文,名爲 Fast R-CNN。Fast R-CNN算法對原始R-CNN進行了相當大的改進,即提高準確度並減少執行正向傳遞所花費的時間; 但是,該模型仍然依賴於外部區域提議算法。

直到Girshick等人的後續2015年論文,Faster R-CNN:用區域提議網絡實現實時物體檢測,R-CNN才成爲真正的端到端深度學習物體探測器。刪除選擇性搜索要求,而是依賴於(1)完全卷積的區域提議網絡(RPN)和(2)可以預測對象邊界框和“對象”分數(即,量化它是一個區域的可能性的分數圖像的圖像可能包含圖像)。然後將RPN的輸出傳遞到 R-CNN 組件以進行最終分類和標記。

雖然 R-CNN 傾向於非常準確,但 R-CNN 系列網絡的最大問題在於它們的速度 – 它們非常慢,在GPU上僅獲得5 FPS。

爲了提高基於深度學習的物體探測器的速度,單次探測器(SSD)和YOLO都使用單級探測器策略。

這些算法將對象檢測視爲迴歸問題,採用給定的輸入圖像並同時學習邊界框座標和相應的類標籤概率。

通常,單級檢測器往往不如兩級檢測器準確,但明顯更快。

YOLO是單級探測器的一個很好的例子。

Redmon等人於2015年首次推出了他們的論文“ You Only Look Once:Unified,Real-Time Object Detection”,詳細介紹了一種能夠進行超實時物體檢測的物體探測器,在GPU上獲得 45 FPS。

注意:他們的模型的一個較小的變種稱爲“Fast YOLO”,聲稱在GPU上達到155 FPS。

YOLO經歷了許多不同的迭代,包括YOLO9000:更好,更快,更強(即YOLOv2),能夠檢測超過9,000個物體探測器。

通過對對象檢測和分類進行聯合訓練,Redmon和Farhadi能夠實現如此大量的對象檢測。通過聯合訓練,作者同時在ImageNet分類數據集和COCO檢測數據集上訓練了YOLO9000。結果是一個名爲YOLO9000的YOLO模型,它可以預測沒有標記檢測數據的對象類的檢測。

雖然有趣和新穎,但鑑於論文的標題和摘要,YOLOv2的表現有點令人沮喪。

在COCO的156級版本中,YOLO9000實現了16%的平均精度(mAP),是的,雖然YOLO可以檢測9,000個單獨的類,但準確性並不是我們想要的。

Redmon和Farhadi最近發表了一篇新的YOLO論文,YOLOv3:增量改進(2018)。YOLOv3比之前的型號大得多,但在我看來,它是YOLO系列物體探測器中最好的一款。

我們將在此博客文章中使用YOLOv3,特別是YOLO在COCO數據集上進行了培訓。

COCO數據集由80個標籤組成,包括但不限於:


自行車
汽車和卡車
飛機
停車標誌和消防栓
動物,包括貓,狗,鳥,馬,牛和羊,僅舉幾例
廚房和餐廳用品,如酒杯,杯子,叉子,刀子,勺子等。
…以及更多!
您可以使用此鏈接找到YOLO在 COCO 數據集上訓練的內容的完整列表。

我將結束本節,說任何學術需要閱讀Redmon的YOLO論文和技術報告 – 它們不僅具有新穎性和洞察力,而且還具有令人難以置信的娛樂性。

但嚴重的是,如果你今天什麼都不做,請閱讀YOLOv3技術報告。

它只有6頁,其中一頁只是引用/引用。

此外,技術報告是誠實的,學術論文很少,如果有的話。

項目結構
我們來看看今天的項目佈局。您可以使用操作系統的GUI(適用於OSX的Finder,適用於Ubuntu的Nautilus),但您可能會發現 在終端中使用tree命令更容易,更快捷

我們今天的項目包括4個目錄和兩個Python腳本。

目錄(按重要性順序)是:

yolo – coco / :YOLOv3對象檢測器預先訓練(在COCO數據集上)模型文件。這些都是由Darknet團隊訓練的。
images / :此文件夾包含四個靜態圖像,我們將執行對象檢測以進行測試和評估。
videos / :在使用YOLO對圖像進行物體檢測後,我們將實時處理視頻。此目錄包含四個示例視頻供您測試。
output / :輸出已由YOLO處理並帶有邊界框和類名稱註釋的視頻可以放在此文件夾中。
我們正在審查兩個Python腳本 – yolo .py 和 yolo_video .py 。第一個腳本用於圖像,然後我們將學習所學內容並將其應用於第二個腳本中的視頻。

你準備好了嗎?

圖像中的YOLO對象檢測
讓我們開始將YOLO物體探測器應用於圖像!

打開 項目中的 yolo .py文件

您需要爲此腳本OpenCV 3.4.2+安裝所有Python綁定。你可以在這裏找到我的OpenCV安裝教程,請記住OpenCV 4現在處於測試階段 – 你可能會遇到安裝或運行某些腳本的問題,因爲它不是正式版本。暫時我建議去OpenCV 3.4.2+。實際上,你可以將起來,在不到5分鐘運行 PIP爲好。

首先,我們導入我們所需的包 – 只要安裝了OpenCV和NumPy,您的解釋器就會輕鬆過關。

現在讓我們解析四個命令行參數。命令行參數在運行時處理,允許我們從終端更改腳本的輸入。如果您不熟悉它們,我建議您在我之前的教程中閱讀更多內容。我們的命令行參數包括:

– image :輸入圖像的路徑。我們將使用YOLO檢測此圖像中的對象。
– yolo : yolo 目錄的基本路徑。然後,我們的腳本將加載所需的YOLO文件,以便對圖像執行對象檢測。
– confidence (置信度) :過濾弱檢測的最小概率。我給它的默認值爲50%( 0.5 ),但你可以隨意嘗試這個值。
– threshold :這是我們的非最大值抑制閾值,默認值爲 0.3 。您可以在此處閱讀有關非最大值抑制的更多信息。
解析之後, args 變量現在是一個包含命令行參數的鍵值對的字典。你會 在這個腳本的其餘部分看到 args很多次。

讓我們加載我們的類標籤併爲每個標籤設置隨機顏色

這裏我們 在第21行和第22行加載所有類 LABELS (注意第一個命令行參數 args [ “yolo”]) 。 然後將隨機 顏色分配給第25-27行的每個標籤 。

讓我們推導出YOLO權重和配置文件的路徑,然後從磁盤加載YOLO

要在第35行從磁盤加載 yolo ,我們將利用 OpenCV 的名爲 cv2 的 DNN 函數 。dnn 。readNetFromDarknet 。此函數需要 configPath 和 weightsPath ,它們是通過第30行和第31行上的命令行參數建立的 。

我不能強調這一點:至少需要OpenCV 3.4.2才能運行此代碼,因爲它具有 加載YOLO所需的更新的 dnn模塊。

讓我們加載圖像並通過網絡發送

在這個塊中我們:

加載輸入 圖像 並提取其尺寸(第38和39行)。
確定YOLO模型中的輸出圖層名稱(第42和43行)。
從圖像構造一個 blob(第48和49行)。您是否對 blob 是什麼或 cv2 是什麼感到困惑。dnn 。blobFromImage 呢?給這篇博客文章一個閱讀。
既然我們的blob準備好了,我們就會

通過我們的 yolo 網絡進行正向傳遞(第50和52行)
顯示 yolo 的推理時間(第56行)
除非我們想象我們的結果,否則物體檢測有什麼用?我們現在採取措施來過濾和可視化我們的結果。

但首先,讓我們初步化一些我們在這樣做過程中需要的列表

這些清單包括:

boxes :我們圍繞對象的邊界框。
confidences :YOLO 分配給對象的置信度值。較低置信度值表示該對象可能不是網絡認爲的對象。請記住,從上面的命令行參數中我們將過濾掉不符合 0.5 閾值的對象。
classIDs :檢測到的對象的類標籤。
讓我們開始用我們的 YOLO layerOutputs 中的數據填充這些列表 :YOLO Object Detection with OpenCVPython

在這個代碼塊中有很多 – 讓我們分解它。

在這個塊中,我們:

遍歷每個 layerOutputs (從第65行開始 )。
循環在每個 檢測 中 output (嵌套循環開始於 第67行)。
提取 classID 和 置信度 (第70-72行)。
使用 置信度 濾除弱檢測(第76行)。
現在我們已經過濾掉了不需要的檢測,我們將:

縮放邊界框座標,以便我們可以在原始圖像上正確顯示它們(第81行)。
提取邊界框的座標和尺寸(第82行)。YOLO 返回邊界框座標形式: (centerX ,centerY ,寬度,和高度) 。
使用此信息導出邊界框的左上角(x,y) –座標(第86和87行)。
更新 框 , 置信度 和 classID 列表(第91-93行)。
有了這些數據,我們現在將應用所謂的“非最大值抑制”

YOLO不對我們應用非最大值抑制 ,因此我們需要明確應用它。

應用非最大值抑制可以抑制明顯重疊的邊界框,只保留最自信的邊界框。

NMS 還確保我們沒有任何冗餘或無關的邊界框。

利用 OpenCV 內置的 NMS DNN 模塊實現,我們對第97和98行進行非最大值抑制 。所需要的只是我們提交邊界 框 , 置信度 ,以及我們的置信度閾值和 NMS 閾值。

如果你一直在閱讀這篇博客,你可能想知道爲什麼我們沒有使用我的imutils實現NMS。主要原因是 NMSBoxes 函數現在在OpenCV中工作。以前它對某些輸入失敗並導致錯誤消息。現在NMSBoxes 函數正常工作,我們可以在自己的腳本中使用它。

讓我們在圖像上繪製框和類文本!

假設存在至少一個檢測(線101),我們繼續循環 由非最大值抑制確定的idx。

然後,我們 使用隨機類顏色(第105-113行)在圖像上繪製邊界框和文本 。

最後,我們顯示結果圖像,直到用戶按下鍵盤上的任意鍵(確保選擇並聚焦OpenCV 打開的窗口)。

從那裏,打開一個終端並執行以下命令

12 $ python yolo.py --image images/baggage_claim.jpg --yolo yolo-coco

圖2:帶有 OpenCV 的YOLO用於檢測機場中的人員和行李。

在這裏你可以看到YOLO不僅檢測到輸入圖像中的每個人,還檢測了手提箱!

此外,如果您看一下圖像的右上角,您會看到YOLO還檢測到女士肩上的手提包。

我們試試另一個例子

12 $ python yolo.py --image images/living_room.jpg --yolo yolo-coco

圖3: 使用 OpenCV 進行YOLO對象檢測用於檢測人,狗,電視和椅子。遙控器是假陽性檢測器,但是在查看ROI時,您可以想象該區域確實與遙控器有相似之處。

上面的圖像包含一個人(我自己)和一隻狗(Jemma,家庭比格犬)。

YOLO還可以檢測電視顯示器和椅子。尤其令我印象深刻的是YOLO能夠檢測到椅子,因爲它是手工製作的老式“嬰兒高腳椅”。

有趣的是,YOLO認爲我手中有一個“ 遙控器 ”。它實際上不是遙控器 – 它是VHS錄像帶上玻璃的反射; 但是,如果你盯着這個地區,它實際上看起來可能是遙遠的。

以下示例圖像演示了YOLO對象檢測器的侷限性和弱點

12 $ python yolo.py --image images/dining_table.jpg --yolo yolo-coco

圖4:YOLO和 OpenCV 用於餐桌的物體檢測。

雖然YOLO正確地檢測到葡萄酒瓶,餐桌和花瓶,但只有兩個酒杯中的一個被正確檢測到。

我們討論爲什麼YOLO在下面的“YOLO物體探測器的限制和缺點”部分中與物體緊密相。

讓我們嘗試一個最終圖像

1 $ python yolo.py --image images/soccer.jpg --yolo yolo-coco

圖5:使用YOLO物體探測器使用 OpenCV 檢測足球運動員和足球。

YOLO能夠正確地檢測球場上的每個球員,包括足球本身。請注意儘管區域高度模糊且部分遮擋,但仍會檢測到背景中的人。

視頻流中的YOLO對象檢測
既然我們已經學會了如何將YOLO對象檢測器應用於單個圖像,那麼我們也可以利用YOLO在輸入視頻文件中執行對象檢測。

打開 yolo_video .py 文件

我們從導入和命令行參數開始。

請注意,此腳本沒有 像以前那樣的 – image參數。取而代之的是,我們現在有兩個與視頻相關的論點:

– input :輸入視頻文件的路徑。
– output :輸出視頻文件的路徑。
鑑於這些論點,您現在可以使用您使用智能手機拍攝場景的視頻或在線查找的視頻。然後,您可以處理視頻文件,生成帶註釋的輸出視頻。當然,如果您想使用網絡攝像頭處理實時視頻流,也可以。只需在PyImageSearch上找到 來自imutils的 VideoStream 類的 示例。視頻 被利用並進行一些小的改動。

繼續,下一個塊 與 YOLO圖像處理腳本中的塊相同

在這裏,我們加載標籤並生成顏色,然後加載我們的YOLO模型並確定輸出層名稱。

接下來,我們將處理一些特定於視頻的任務

在這個塊中,我們:

打開一個指向視頻文件的文件指針,以便在即將到來的循環中讀取幀(第45行)。
初始化我們的視頻 編寫器 和幀尺寸(第46和47行)。
嘗試確定 視頻文件中的 總幀數,以便我們估計整個視頻的處理時間(第50-61行)。
現在我們準備開始逐個處理幀

我們定義一個 while 循環(第64行),然後我們抓住第一幀(第66行)。

我們會檢查它是否是視頻的最後一幀。如果是這樣,我們需要 從 while 循環中斷開(第70和71行)。

接下來,如果尚未抓住框架尺寸,我們會抓住框架尺寸(第74和75行)。

接下來,讓我們使用當前幀 作爲輸入執行 YOLO 的正向傳遞

在這裏,我們構建一個 blob 並將其傳遞通過網絡,從而獲得預測。我已經用時間戳包圍了前向傳遞操作,因此我們可以計算在一幀上進行預測所用的時間 – 這將有助於我們估計處理整個視頻所需的時間。

然後我們將繼續初始化我們在前一個腳本中使用的三個列表: box , confidences 和classIDs 。

下一個塊再次 與我們之前的腳本相同

在這個代碼塊中,我們:

循環輸出層和檢測(第94-96行)。
提取 classID 並過濾掉弱預測(第99-105行)。
計算邊界框座標(第111-117行)。
更新我們各自的列表(第121-123行)。
接下來,我們將應用非最大值抑制並開始繼續註釋框架

您也應該識別這些行。在這裏,我們:

使用cv2應用NMS 。dnn 。NMSBoxes 函數(第127和128行)用於抑制弱的重疊邊界框。您可以在此處閱讀有關非最大值抑制的更多信息。
循環遍歷 由NMS計算的 idx並繪製相應的邊界框+標籤(第131-144行)。
讓我們完成腳本

總結一下,我們簡單地說:

初始化我們的視頻 writer 如果有必要(行147-151)。該 writer 將在循環的第一次迭代被初始化。
打印出我們對處理視頻所需時間的估計(第154-158行)。
將幀寫入 輸出視頻文件(第161行)。
清理和釋放指針(第165和166行)。
從那裏,打開一個終端並執行以下命令

12 $ python yolo_video.py --input videos/car_chase_01.mp4 \ --output output/car_chase_01.avi --yolo yolo-coco

圖6:應用於車禍視頻的YOLO深度學習對象檢測。

上面你可以看到我在YouTube上找到的汽車追逐視頻中的GIF摘錄。

在視頻/ GIF中,您不僅可以看到被檢測到的車輛,還可以檢測到人員以及交通信號燈!

YOLO物體探測器在這裏表現相當不錯。讓我們嘗試從同一車追逐視頻中的不同視頻剪輯

12 $ python yolo_video.py --input videos/car_chase_02.mp4 \ --output output/car_chase_02.avi --yolo yolo-coco

圖7:在這個運行中的嫌疑人的視頻中,我們使用 OpenCV 和YOLO對象檢測來找到該人。

嫌疑人現在已經逃離汽車並正在停車場。

YOLO再一次能夠發現人。

有一次,嫌疑人實際上能夠回到他們的汽車並繼續追逐 – 讓我們看看YOLO在那裏的表現如何

12 $ python yolo_video.py --input videos/car_chase_03.mp4 \ --output output/car_chase_03.avi --yolo yolo-coco

圖8: YOLO是一種快速深度學習對象檢測器,能夠在使用GPU的情況下用於實時視頻。

注意:此視頻對我來說太大了,無法包含在“下載”中。您可以在此處從YouTube下載視頻。

作爲最後一個例子,讓我們看看我們如何使用YOLO作爲構建流量計數器的起點

12 $ python yolo_video.py --input videos/overpass.mp4 \ --output output/overpass.avi --yolo yolo-coco

圖9:在立交橋下的交通視頻表明,YOLO和OpenCV可用於準確,快速地檢測汽車

視頻和音頻的積分:

Quaker Oats在YouTube上發佈了汽車追逐視頻。
由Vlad Kiraly在YouTube上懸掛視頻。
XTaKeRuX在FreeMusicArchive上的“白色烏鴉” 。
YOLO物體探測器的侷限和缺點
可以說YOLO物體探測器的最大限制和缺點是:

它並不總能很好地處理小物體
它尤其不處理靠近組合的對象
這種限制的原因是由於YOLO算法本身:

YOLO對象檢測器將輸入圖像劃分爲SxS網格,其中網格中的每個單元格僅預測單個對象。
如果單個單元格中存在多個小對象,則YOLO將無法檢測到它們,最終導致錯過對象檢測。
因此,如果您知道您的數據集由許多靠近在一起的小對象組成,那麼您不應該使用YOLO對象檢測器。

就小物體而言,更快的 R-CNN 往往效果最好; 然而,它也是最慢的。

SSD 也可以在這裏使用; 但是,SSD 也可能會遇到較小的對象(但不如YOLO那麼多)。

固態硬盤通常在速度和準確性方面也有很好的權衡。

同樣值得注意的是,在本教程中,YOLO比SSD運行速度慢。在我之前關於OpenCV對象檢測的教程中,我們使用了SSD – SSD的單個正向傳遞耗時約0.03秒。

但是,從本教程中,我們知道YOLO物體探測器的前向傳遞需要約0.3秒,大約慢一個數量級!

如果您正在使用預先訓練過的深度學習物體探測器OpenCV供應,您可能需要考慮使用SSD而不是YOLO。根據我的個人經驗,我很少遇到需要在SSD上使用YOLO的情況:

我發現SSD更容易訓練,它們在準確性方面的表現幾乎總是優於YOLO(至少對於我曾經使用過的數據集)。
YOLO在COCO數據集上可能會有很好的結果; 但是,我沒有找到與我自己的任務相同的準確度。
因此,在針對給定問題選擇對象檢測器時,我傾向於使用以下準則:

如果我知道我需要檢測小物體並且速度不是問題,我傾向於使用更快的R-CNN。
如果速度絕對是最重要的,我使用YOLO。
如果我需要一箇中間立場,我傾向於使用SSD。
在我的大多數情況下,我最終使用SSD或RetinaNet – 兩者都是YOLO / Faster R-CNN之間的良好平衡。

想要訓練自己的深度學習物體探測器?

圖10:在我的書“ 深度學習計算機視覺與Python”中,我介紹了多種對象檢測算法,包括更快的R-CNN,SSD和RetinaNet。在裏面我將教你如何創建對象檢測圖像數據集,訓練對象檢測器,並進行預測。更不用說我還涵蓋深度學習基礎,最佳實踐和我個人的經驗法則。現在抓住你的副本,這樣你就可以開始學習新技能了。

我們在本教程中使用的YOLO模型是在COCO數據集上預先訓練的……

…但是,如果您想在自己的數據集上訓練深度學習對象檢測器,該怎麼辦?

在我的書“ 深度學習計算機視覺與Python”中,我將教你如何訓練Faster R-CNN,單發探測器(SSD)和RetinaNet:

檢測圖像中的徽標
檢測交通標誌(例如停車標誌,產量標誌等)
檢測車輛的前視圖和後視圖(用於構建自動駕駛汽車應用)
檢測圖像和視頻流中的武器
書中的所有對象檢測章節都包含對算法和代碼的詳細說明,確保您能夠成功訓練自己的對象檢測器。

要了解有關我的書的更多信息(並獲取免費的示例章節和目錄),請單擊此處。

摘要
在本教程中,我們學習瞭如何使用 Deep Learning,OpenCV 和 Python 執行YOLO 對象檢測。

然後,我們簡要討論了YOLO架構,然後實現了 Python 代碼:

將YOLO對象檢測應用於單個圖像
將YOLO對象檢測器應用於視頻流
在配備3GHz Intel Xeon W處理器的機器上,YOLO的單個前向傳輸耗時約0.3秒; 但是,使用前一個教程中的單次檢測器(SSD),只能檢測到0.03秒,速度提高了一個數量級!

對於使用OpenCV和Python在CPU上進行基於深度學習的實時對象檢測,您可能需要考慮使用SSD。

如果您有興趣在自己的自定義數據集上訓練自己的深度學習對象探測器,請務必參閱我的書“使用Python進行計算機視覺深度學習”,其中提供了有關如何成功訓練自己的探測器的詳細指南。

更多有關 opencv 深度學習 yolo 的文章 請看 https://hotdog29.com/?cat=7

代碼下載
https://hotdog29.com/?p=620

我希望你喜歡今天的YOLO對象檢測教程!

文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月8日訪問

相關文章
文本檢測 OpenCV EAST文本檢測器 源代碼
代碼下載
dlib 使用OpenCV,Python和深度學習進行人臉識別 源代碼
OpenCV 人臉識別 源代碼
OpenCV教程 ,資源和指南
張貼在技術博客、opencv標籤:opencv、深度學習、YOLO、對象檢測編輯

請直接查看原文章 YOLO 對象檢測 OpenCV 源代碼 https://hotdog29.com/?p=621

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