深度學習 + OpenCV,Python實現實時視頻目標檢測


使用 OpenCV 和 Python 對實時視頻流進行深度學習目標檢測是非常簡單的,我們只需要組合一些合適的代碼,接入實時視頻,隨后加入原有的目標檢測功能。

 

在本文中我們將學習如何擴展原有的目標檢測項目,使用深度學習和 OpenCV 將應用范圍擴展到實時視頻流和視頻文件中。這個任務會通過 VideoStream 類來完成。

現在,我們將開始把深度學習+目標檢測的代碼應用於視頻流中,同時測量 FPS 處理速度。

 

使用深度學習和 OpenCV 進行視頻目標檢測

為了構建基於 OpenCV 深度學習的實時目標檢測器,我們需要有效地接入攝像頭/視頻流,並將目標檢測應用到每一幀里。

首先,我們打開一個新文件,將其命名為 real_time_object_detection.py,隨后加入以下代碼:

我們從第 2-8 行開始導入封包。在此之前,你需要 imutils 和 OpenCV 3.3。在系統設置上,你只需要以默認設置安裝 OpenCV 即可(同時確保你遵循了所有 Python 虛擬環境命令)。

Note:請確保自己下載和安裝的是 OpenCV 3.3(或更新版本)和 OpenCV-contrib 版本(適用於 OpenCV 3.3),以保證其中包含有深度神經網絡模塊。

下面,我們將解析這些命令行參數:

與此前的目標檢測項目相比,我們不需要圖像參數,因為在這里我們處理的是視頻流和視頻——除了以下參數保持不變:

  • --prototxt:Caffe prototxt 文件路徑。
  • --model:預訓練模型的路徑。
  • --confidence:過濾弱檢測的最小概率閾值,默認值為 20%。

隨后,我們初始化類列表和顏色集:

在第 22-26 行,我們初始化 CLASS 標簽,和相應的隨機 COLORS。有關這些類的詳細信息(以及網絡的訓練方式),請參考:

現在,我們加載自己的模型,並設置自己的視頻流:

我們加載自己的序列化模型,提供對自己的 prototxt 和模型文件的引用(第 30 行),可以看到在 OpenCV 3.3 中,這非常簡單。

下一步,我們初始化視頻流(來源可以是視頻文件或攝像頭)。首先,我們啟動 VideoStream(第 35 行),隨后等待相機啟動(第 36 行),最后開始每秒幀數計算(第 37 行)。VideoStream 和 FPS 類是 imutils 包的一部分。

現在,讓我們遍歷每一幀(如果你對速度要求很高,也可以跳過一些幀):

首先,我們從視頻流中讀取一幀(第 43 行),隨后調整它的大小(第 44 行)。由於我們隨后會需要寬度和高度,所以我們在第 47 行上進行抓取。隨后將 frame 轉換為一個有 dnn 模塊的 blob(第 48 行)。

現在,我們設置 blob 為神經網絡的輸入(第 52 行),通過 net 傳遞輸入(第 53 行),這給我們提供了 detections。

這時,我們已經在輸入幀中檢測到了目標,現在是時候看看置信度的值,以判斷我們能否在目標周圍繪制邊界框和標簽了:

我們首先在 detections 內循環,記住一個圖像中可以檢測到多個目標。我們還需要檢查每次檢測的置信度(即概率)。如果置信度足夠高(高於閾值),那么我們將在終端展示預測,並以文本和彩色邊界框的形式對圖像作出預測。讓我們逐行來看一下:

在 detections 內循環,首先我們提取 confidence 值(第 59 行)。

如果 confidence 高於最低閾值(第 63 行),那么我們提取類標簽索引(第 67 行),並計算檢測到的目標的坐標(第 68 行)。

然后,我們提取邊界框的 (x, y) 坐標(第 69 行),之后將用於繪制矩形和文本。

我們構建一個文本 label,包含 CLASS 名稱和 confidence(第 72、73 行)。

我們還要使用類顏色和之前提取的 (x, y) 坐標在物體周圍繪制彩色矩形(第 74、75 行)。

通常,我們希望標簽出現在矩形上方,但是如果沒有空間,我們將在矩形頂部稍下的位置展示標簽(第 76 行)。

最后,我們使用剛才計算出的 y 值將彩色文本置於幀上(第 77、78 行)。

幀捕捉循環剩余的步驟還包括:(1)展示幀;(2)檢查 quit 鍵;(3)更新 fps 計數器:

上述代碼塊簡單明了,首先我們展示幀(第 81 行),然后找到特定按鍵(第 82 行),同時檢查「q」鍵(代表「quit」)是否按下。如果已經按下,則我們退出幀捕捉循環(第 85、86 行)。最后更新 fps 計數器(第 89 行)。

如果我們退出了循環(「q」鍵或視頻流結束),我們還要處理這些:

當我們跳出(exit)循環,fps 計數器 停止(第 92 行),每秒幀數的信息向終端輸出(第 93、94 行)。

我們關閉窗口(第 97 行),然后停止視頻流(第 98 行)。

如果你到了這一步,那就可以做好准備用自己的網絡攝像頭試試看它是如何工作的了。我們來看下一部分。

 

實時深度學習目標檢測的結果

為了實時深度學習目標檢測器正常運行,確保你使用本指南「Downloads」部分中的示例代碼和預訓練的卷積神經網絡。(請打開原文鏈接,進入「Downloads」部分,輸入自己的郵箱地址,獲取所需代碼和其他資料。)

打開終端,執行下列命令:

如果 OpenCV 能夠訪問你的攝像頭,你可以看到帶有檢測到的目標的輸出視頻幀。我對樣本視頻使用了深度學習目標檢測,結果如下:

 

圖 1:使用深度學習和 OpenCV + Python 進行實時目標檢測的短片。

注意深度學習目標檢測器不僅能夠檢測到人,還能檢測到人坐着的沙發和旁邊的椅子——所有都是實時檢測到的!

 

總結

今天的博客中,我們學習了如何使用深度學習 + OpenCV + 視頻流來執行實時目標檢測。我們通過下列兩個教程完成了這一目標:

1. 使用深度學習和 OpenCV 進行目標檢測(

2. 在 OpenCV 上進行高效、線程化的視頻流(

最終結果是基於深度學習的目標檢測器可以處理 6-8 個 FPS 的視頻(當然,這也取決於你的系統速度)。

你還可以通過以下途徑進一步提升速度:

1. 跳過幀。

2. 使用 MobileNet 的不同變體(速度更快,但是准確率下降)。

3. 使用 SqueezeNet 的量子化變體(我還未對此進行測試,但是我想應該會更快,因為它的網絡足跡更小)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM