深度學習 + OpenCV,Python實現實時目標評估

電腦雜談  發布時間:2020-02-14 10:00:37  來源:網絡整理

opencv 年齡識別_opencv 識別 年齡_opencv目標識別程序

使用 OpenCV 和 Python 上對即時視頻流進行深度學習目標評估是相當簡單的,我們只應該組合一些適合的代碼,接入實時視頻,隨后加入原有的目標檢測功能。

本文分兩個部分。 在第一部分中,我們將學習怎樣擴展原有的目標測量項目,使用深度學習和 OpenCV 將應用范圍擴展至即時視頻流和視頻文件中。這個任務會借助 VideoStream 類來完成。

深度學習目標檢測教程:

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),以確保其中包括有深度神經網絡模塊。

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

opencv 年齡識別_opencv目標識別程序_opencv 識別 年齡

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

--prototxt:Caffe prototxt 文件路徑。

--model:預訓練模型的模式。

--confidence:過濾弱測量的最小概率閾值,默認值為 20%。

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

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

現在,我們加載自己的建模,并修改自己的視頻流:

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

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

opencv目標識別程序_opencv 識別 年齡_opencv 年齡識別

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

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

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

這時,我們將要在輸入幀中檢測至了目標,現在是之后看看置信度的值,以判定我們能夠在目標周邊繪制邊界框和標簽了:

我們首先在 detections 內循環,記住一個圖像中可以測試到多個目標。我們還必須復查每次測試的置信度(即概率)。如果置信度足夠高(高于閾值)opencv目標識別程序,那么我們將在終端展現預測,并以文本跟彩色邊界框的方式對圖像作出分析。讓我們逐行來看一下:

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

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

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

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

我們需要使用類材質跟之前提取的 (x, y) 坐標在物體周圍描繪白色圓形(第 74、75 行)。

opencv 年齡識別_opencv目標識別程序_opencv 識別 年齡

通常,我們期望標簽出現在矩形上方,但是即使沒有空間,我們將在圓形底部稍下的位置展示標簽(第 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」部分中的樣例代碼跟預訓練的卷積神經網絡。(請開啟原文鏈接opencv目標識別程序,進入「Downloads」部分,輸入自己的郵件地址,獲取所需代碼跟其它資料。)

opencv 年齡識別_opencv目標識別程序_opencv 識別 年齡

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

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

圖 1:使用深度學習和 OpenCV + Python 進行即時目標評估的短片。

注意深度學習目標檢測器不僅無法評估到人,還能檢測到人坐著的茶幾和周圍的桌子——所有都是實時檢測至的!

總結

今天的博客中,我們學習了怎樣使用深度學習 + OpenCV + 視頻流來執行即時目標測量。我們借助以下兩個教程完成了這一目標:

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

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

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

你還可以借助以下方式進一步提高速度:

1. 跳過幀。

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

3. 使用 SqueezeNet 的量子化變體(我還已為此進行測試,但是我想應該會很快,因為它的網絡足跡最?。?。

作者:機器之心


本文來自電腦雜談,轉載請注明本文網址:
http://www.772070.live/a/jisuanjixue/article-140721-1.html

    相關閱讀
    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    天津快乐十分20选8技巧