深度學(xué)習(xí) + OpenCV,Python實(shí)現(xiàn)實(shí)時(shí)視頻目標(biāo)檢測(cè)
使用 OpenCV 和 Python 對(duì)實(shí)時(shí)視頻流進(jìn)行深度學(xué)習(xí)目標(biāo)檢測(cè)是非常簡(jiǎn)單的,我們只需要組合一些合適的代碼,接入實(shí)時(shí)視頻,隨后加入原有的目標(biāo)檢測(cè)功能。
在本文中我們將學(xué)習(xí)如何擴(kuò)展原有的目標(biāo)檢測(cè)項(xiàng)目,使用深度學(xué)習(xí)和 OpenCV 將應(yīng)用范圍擴(kuò)展到實(shí)時(shí)視頻流和視頻文件中。這個(gè)任務(wù)會(huì)通過(guò) VideoStream 類來(lái)完成。
- 深度學(xué)習(xí)目標(biāo)檢測(cè)教程: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/
現(xiàn)在,我們將開(kāi)始把深度學(xué)習(xí)+目標(biāo)檢測(cè)的代碼應(yīng)用于視頻流中,同時(shí)測(cè)量 FPS 處理速度。
使用深度學(xué)習(xí)和 OpenCV 進(jìn)行視頻目標(biāo)檢測(cè)
為了構(gòu)建基于 OpenCV 深度學(xué)習(xí)的實(shí)時(shí)目標(biāo)檢測(cè)器,我們需要有效地接入攝像頭/視頻流,并將目標(biāo)檢測(cè)應(yīng)用到每一幀里。
首先,我們打開(kāi)一個(gè)新文件,將其命名為 real_time_object_detection.py,隨后加入以下代碼:
我們從第 2-8 行開(kāi)始導(dǎo)入封包。在此之前,你需要 imutils 和 OpenCV 3.3。在系統(tǒng)設(shè)置上,你只需要以默認(rèn)設(shè)置安裝 OpenCV 即可(同時(shí)確保你遵循了所有 Python 虛擬環(huán)境命令)。
Note:請(qǐng)確保自己下載和安裝的是 OpenCV 3.3(或更新版本)和 OpenCV-contrib 版本(適用于 OpenCV 3.3),以保證其中包含有深度神經(jīng)網(wǎng)絡(luò)模塊。
下面,我們將解析這些命令行參數(shù):
與此前的目標(biāo)檢測(cè)項(xiàng)目相比,我們不需要圖像參數(shù),因?yàn)樵谶@里我們處理的是視頻流和視頻——除了以下參數(shù)保持不變:
- --prototxt:Caffe prototxt 文件路徑。
- --model:預(yù)訓(xùn)練模型的路徑。
- --confidence:過(guò)濾弱檢測(cè)的最小概率閾值,默認(rèn)值為 20%。
隨后,我們初始化類列表和顏色集:
在第 22-26 行,我們初始化 CLASS 標(biāo)簽,和相應(yīng)的隨機(jī) COLORS。有關(guān)這些類的詳細(xì)信息(以及網(wǎng)絡(luò)的訓(xùn)練方式),請(qǐng)參考:http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/
現(xiàn)在,我們加載自己的模型,并設(shè)置自己的視頻流:
我們加載自己的序列化模型,提供對(duì)自己的 prototxt 和模型文件的引用(第 30 行),可以看到在 OpenCV 3.3 中,這非常簡(jiǎn)單。
下一步,我們初始化視頻流(來(lái)源可以是視頻文件或攝像頭)。首先,我們啟動(dòng) VideoStream(第 35 行),隨后等待相機(jī)啟動(dòng)(第 36 行),***開(kāi)始每秒幀數(shù)計(jì)算(第 37 行)。VideoStream 和 FPS 類是 imutils 包的一部分。
現(xiàn)在,讓我們遍歷每一幀(如果你對(duì)速度要求很高,也可以跳過(guò)一些幀):
首先,我們從視頻流中讀取一幀(第 43 行),隨后調(diào)整它的大小(第 44 行)。由于我們隨后會(huì)需要寬度和高度,所以我們?cè)诘?47 行上進(jìn)行抓取。隨后將 frame 轉(zhuǎn)換為一個(gè)有 dnn 模塊的 blob(第 48 行)。
現(xiàn)在,我們?cè)O(shè)置 blob 為神經(jīng)網(wǎng)絡(luò)的輸入(第 52 行),通過(guò) net 傳遞輸入(第 53 行),這給我們提供了 detections。
這時(shí),我們已經(jīng)在輸入幀中檢測(cè)到了目標(biāo),現(xiàn)在是時(shí)候看看置信度的值,以判斷我們能否在目標(biāo)周圍繪制邊界框和標(biāo)簽了:
我們首先在 detections 內(nèi)循環(huán),記住一個(gè)圖像中可以檢測(cè)到多個(gè)目標(biāo)。我們還需要檢查每次檢測(cè)的置信度(即概率)。如果置信度足夠高(高于閾值),那么我們將在終端展示預(yù)測(cè),并以文本和彩色邊界框的形式對(duì)圖像作出預(yù)測(cè)。讓我們逐行來(lái)看一下:
- 在 detections 內(nèi)循環(huán),首先我們提取 confidence 值(第 59 行)。
- 如果 confidence 高于***閾值(第 63 行),那么我們提取類標(biāo)簽索引(第 67 行),并計(jì)算檢測(cè)到的目標(biāo)的坐標(biāo)(第 68 行)。
- 然后,我們提取邊界框的 (x, y) 坐標(biāo)(第 69 行),之后將用于繪制矩形和文本。
- 我們構(gòu)建一個(gè)文本 label,包含 CLASS 名稱和 confidence(第 72、73 行)。
- 我們還要使用類顏色和之前提取的 (x, y) 坐標(biāo)在物體周圍繪制彩色矩形(第 74、75 行)。
- 通常,我們希望標(biāo)簽出現(xiàn)在矩形上方,但是如果沒(méi)有空間,我們將在矩形頂部稍下的位置展示標(biāo)簽(第 76 行)。
- ***,我們使用剛才計(jì)算出的 y 值將彩色文本置于幀上(第 77、78 行)。
幀捕捉循環(huán)剩余的步驟還包括:(1)展示幀;(2)檢查 quit 鍵;(3)更新 fps 計(jì)數(shù)器:
上述代碼塊簡(jiǎn)單明了,首先我們展示幀(第 81 行),然后找到特定按鍵(第 82 行),同時(shí)檢查「q」鍵(代表「quit」)是否按下。如果已經(jīng)按下,則我們退出幀捕捉循環(huán)(第 85、86 行)。***更新 fps 計(jì)數(shù)器(第 89 行)。
如果我們退出了循環(huán)(「q」鍵或視頻流結(jié)束),我們還要處理這些:
當(dāng)我們跳出(exit)循環(huán),fps 計(jì)數(shù)器 停止(第 92 行),每秒幀數(shù)的信息向終端輸出(第 93、94 行)。
我們關(guān)閉窗口(第 97 行),然后停止視頻流(第 98 行)。
如果你到了這一步,那就可以做好準(zhǔn)備用自己的網(wǎng)絡(luò)攝像頭試試看它是如何工作的了。我們來(lái)看下一部分。
實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè)的結(jié)果
為了實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè)器正常運(yùn)行,確保你使用本指南「Downloads」部分中的示例代碼和預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)。(請(qǐng)打開(kāi)原文鏈接,進(jìn)入「Downloads」部分,輸入自己的郵箱地址,獲取所需代碼和其他資料。)
打開(kāi)終端,執(zhí)行下列命令:
如果 OpenCV 能夠訪問(wèn)你的攝像頭,你可以看到帶有檢測(cè)到的目標(biāo)的輸出視頻幀。
注意深度學(xué)習(xí)目標(biāo)檢測(cè)器不僅能夠檢測(cè)到人,還能檢測(cè)到人坐著的沙發(fā)和旁邊的椅子——所有都是實(shí)時(shí)檢測(cè)到的!
總結(jié)
今天的博客中,我們學(xué)習(xí)了如何使用深度學(xué)習(xí) + OpenCV + 視頻流來(lái)執(zhí)行實(shí)時(shí)目標(biāo)檢測(cè)。我們通過(guò)下列兩個(gè)教程完成了這一目標(biāo):
- 使用深度學(xué)習(xí)和 OpenCV 進(jìn)行目標(biāo)檢測(cè)(http://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/)
- 在 OpenCV 上進(jìn)行高效、線程化的視頻流(http://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/)
最終結(jié)果是基于深度學(xué)習(xí)的目標(biāo)檢測(cè)器可以處理 6-8 個(gè) FPS 的視頻(當(dāng)然,這也取決于你的系統(tǒng)速度)。
你還可以通過(guò)以下途徑進(jìn)一步提升速度:
- 跳過(guò)幀。
- 使用 MobileNet 的不同變體(速度更快,但是準(zhǔn)確率下降)。
- 使用 SqueezeNet 的量子化變體(我還未對(duì)此進(jìn)行測(cè)試,但是我想應(yīng)該會(huì)更快,因?yàn)樗木W(wǎng)絡(luò)足跡更小)。
原文:
http://www.pyimagesearch.com/2017/09/18/real-time-object-detection-with-deep-learning-and-opencv/
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】