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