選自PyimageSearch網絡
機器之心編譯ide
參與:路雪、李澤南學習
使用 OpenCV 和 Python 對實時視頻流進行深度學習目標檢測是很是簡單的,咱們只須要組合一些合適的代碼,接入實時視頻,隨後加入原有的目標檢測功能。
在本文中咱們將學習如何擴展原有的目標檢測項目,使用深度學習和 OpenCV 將應用範圍擴展到實時視頻流和視頻文件中。這個任務會經過 VideoStream 類來完成。測試
深度學習目標檢測教程:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
ui
VideoStream 類教程:http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/命令行
如今,咱們將開始把深度學習+目標檢測的代碼應用於視頻流中,同時測量 FPS 處理速度。線程
爲了構建基於 OpenCV 深度學習的實時目標檢測器,咱們須要有效地接入攝像頭/視頻流,並將目標檢測應用到每一幀裏。cdn
首先,咱們打開一個新文件,將其命名爲 real_time_object_detection.py,隨後加入如下代碼:視頻
咱們從第 2-8 行開始導入封包。在此以前,你須要 imutils 和 OpenCV 3.3。在系統設置上,你只須要以默認設置安裝 OpenCV 便可(同時確保你遵循了全部 Python 虛擬環境命令)。blog
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(第 7二、73 行)。
咱們還要使用類顏色和以前提取的 (x, y) 座標在物體周圍繪製彩色矩形(第 7四、75 行)。
一般,咱們但願標籤出如今矩形上方,可是若是沒有空間,咱們將在矩形頂部稍下的位置展現標籤(第 76 行)。
最後,咱們使用剛纔計算出的 y 值將彩色文本置於幀上(第 7七、78 行)。
幀捕捉循環剩餘的步驟還包括:(1)展現幀;(2)檢查 quit 鍵;(3)更新 fps 計數器:
上述代碼塊簡單明瞭,首先咱們展現幀(第 81 行),而後找到特定按鍵(第 82 行),同時檢查「q」鍵(表明「quit」)是否按下。若是已經按下,則咱們退出幀捕捉循環(第 8五、86 行)。最後更新 fps 計數器(第 89 行)。
若是咱們退出了循環(「q」鍵或視頻流結束),咱們還要處理這些:
當咱們跳出(exit)循環,fps 計數器 中止(第 92 行),每秒幀數的信息向終端輸出(第 9三、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/
本文爲機器之心編譯,轉載請聯繫本公衆號得到受權。