在上一節內容中,介紹了如何將YOLO應用於圖像目標檢測中,那麼在學會檢測單張圖像後,我們也可以利用YOLO算法實現視頻流中的目標檢測。
將YOLO應用於視頻流對象檢測
首先打開 yolo_video.py文件並插入以下代碼:
同樣,首先從導入相關數據包和命令行參數開始。與之前不同的是,此腳本沒有-- image參數,取而代之的是量個視頻路徑:
-- input :輸入視頻文件的路徑;-- output :輸出視頻文件的路徑;視頻的輸入可以是手機拍攝的短視頻或者是網上搜索到的視頻。另外,也可以通過將多張照片合成為一個短視頻也可以。本博客使用的是在PyImageSearch上找到來自imutils的VideoStream類的 示例。
下面的代碼與處理圖形時候相同:
在這裡,加載標籤並生成相應的顏色,然後加載YOLO模型並確定輸出層名稱。接下來,將處理一些特定於視頻的任務:
在上述代碼塊中:
打開一個指向視頻文件的文件指針,循環讀取幀;初始化視頻編寫器 (writer)和幀尺寸;嘗試確定視頻文件中的總幀數(total),以便估計整個視頻的處理時間;之後逐個處理幀:
上述定義了一個 while循環, 然後從第一幀開始進行處理,並且會檢查它是否是視頻的最後一幀。
接下來,如果尚未知道幀的尺寸,就會獲取一下對應的尺寸。
接下來,使用當前幀作為輸入執行YOLO的前向傳遞 :
在這裡,構建一個 blob 並將其傳遞通過網絡,從而獲得預測。然後繼續初始化之前在圖像目標檢測中使用過的三個列表: boxes 、 confidences、classIDs :
在上述代碼中,與圖像目標檢測相同的有:
循環輸出層和檢測;提取 classID並過濾掉弱預測;計算邊界框坐標;更新各自的列表;接下來,將應用非最大值抑制:
同樣的,在上述代碼中與圖像目標檢測相同的有:
使用cv2.dnn.NMSBoxes函數用於抑制弱的重疊邊界框,可以在此處閱讀有關非最大值抑制的更多信息;循環遍歷由NMS計算的idx,並繪製相應的邊界框+標籤;最終的部分代碼如下:
總結一下:
初始化視頻編寫器(writer),一般在循環的第一次迭代被初始化;列印出對處理視頻所需時間的估計;將幀(frame)寫入輸出視頻文件;清理和釋放指針;現在,打開一個終端並執行以下命令:
圖6:YOLO應用於車禍視頻對象檢測
在視頻/ GIF中,你不僅可以看到被檢測到的車輛,還可以檢測到人員以及交通信號燈!YOLO目標檢測器在該視頻中表現相當不錯。讓現在嘗試同一車追逐視頻中的不同視頻:
圖7:在該視頻中,使用OpenCV和YOLO對象檢測來找到該嫌疑人,嫌疑人現在已經逃離汽車並正位於停車場
YOLO再一次能夠檢測到行人!或者嫌疑人回到他們的車中並繼續追逐:
圖8:YOLO是一種快速深度學習對象檢測器,能夠在使用GPU的情況下用於實時視頻
最後一個例子,讓我們看看如何使用YOLO作為構建流量計數器:
圖9:立交橋交通視頻表明,YOLO和OpenCV可準確、快速地檢測汽車
下面匯總YOLO視頻對象檢測完整視頻:
Quaker Oats汽車追逐視頻;Vlad Kiraly立交橋視頻;「White Crow」音頻;
YOLO目標檢測器的局限和缺點
YOLO目標檢測器的最大限制和缺點是:
它並不總能很好地處理小物體;它尤其不適合處理密集的對象;限制的原因是由於YOLO算法其本身:
YOLO對象檢測器將輸入圖像劃分為SxS網格,其中網格中的每個單元格僅預測單個對象;如果單個單元格中存在多個小對象,則YOLO將無法檢測到它們,最終導致錯過對象檢測;因此,如果你的數據集是由許多靠近在一起的小對象組成時,那麼就不應該使用YOLO算法。就小物體而言,更快的R-CNN往往效果最好,但是其速度也最慢。在這裡也可以使用SSD算法, SSD通常在速度和準確性方面也有很好的權衡。
值得注意的是,在本教程中,YOLO比SSD運行速度慢,大約慢一個數量級。因此,如果你正在使用預先訓練的深度學習對象檢測器供OpenCV使用,可能需要考慮使用SSD算法而不是YOLO算法。因此,在針對給定問題選擇對象檢測器時,我傾向於使用以下準則:
如果知道需要檢測的是小物體並且速度方面不作求,我傾向於使用faster R-CNN算法;如果速度是最重要的,我傾向於使用YOLO算法;如果需要一個平衡的表現,我傾向於使用SSD算法;
想要訓練自己的深度學習目標檢測器?
圖10:在我的書「使用Python進行計算機視覺的深度學習」中,我介紹了多種對象檢測算法,包括fasterR-CNN、SSD、RetinaNet。書中講述了如何創建對象檢測圖像數據集、訓練對象檢測器並進行預測。
在本教程中,使用的YOLO模型是在COCO數據集上預先訓練的.。但是,如果想在自己的數據集上訓練深度學習對象檢測器,該如何操作呢?大體思路是自己標註數據集,按照darknet網站上的指示及網上博客自己更改相應的參數訓練即可。或者在我的書「 深度學習計算機視覺與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進行計算機視覺深度學習」,其中提供了有關如何成功訓練自己的檢測器的詳細指南。