選自PyimageSearch
參與:路雪、李澤南
使用 OpenCV 和 Python 對實時視頻流進行深度學習目標檢測是非常簡單的,我們只需要組合一些合適的代碼,接入實時視頻,隨後加入原有的目標檢測功能。
在本文中我們將學習如何擴展原有的目標檢測項目,使用深度學習和 OpenCV 將應用範圍擴展到實時視頻流和視頻文件中。這個任務會通過 VideoStream 類來完成。
深度學習目標檢測教程: http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
VideoStream 類教程: http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/
現在,我們將開始把深度學習+目標檢測的代碼應用於視頻流中,同時測量 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。有關這些類的詳細信息(以及網絡的訓練方式),請參考:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
現在,我們加載自己的模型,並設置自己的視頻流:
我們加載自己的序列化模型,提供對自己的 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 進行目標檢測(http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/)
2. 在OpenCV 上進行高效、線程化的視頻流(http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with- opencv/)
最終結果是基於深度學習的目標檢測器可以處理 6-8 個 FPS 的視頻(當然,這也取決於你的系統速度)。
你還可以通過以下途徑進一步提升速度:
1. 跳過幀。
2. 使用 MobileNet 的不同變體(速度更快,但是準確率下降)。
3. 使用 SqueezeNet 的量子化變體(我還未對此進行測試,但是我想應該會更快,因為它的網絡足跡更小)。
原文鏈接: http://www.pyimagesearch.com/2017/09/18/real-time-object-detection-with-deep-learning-and-opencv/