【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理

慧聰教育網 2021-06-18 17:56 來源:慧聰教育網作者:許哲豪

歐尼克斯實境互動工作室  許哲豪



【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理

【慧聰教育網】隨著人工智能興起,利用“深度學習”技術進行計算機視覺工作已是很普遍的應用,如圖像分類、對象檢測等。通常只需將單張圖像送入訓練好的模型中進行推理即可得到輸出結果,但當遇到視頻文件或串流視頻時,逐格(by Frame)圖像分析就變得很沒效率,因為幀間時間差距過短(通常為 1/30 ~ 1/60 秒),場景中的對象位移量(變形量)可能過小,導致幀間得到幾乎相同的計算結果(對象位置、尺寸及分類),浪費計算資源,也讓系統看起來反應過慢。

為了使視頻文件及串流視頻在分析上能加快反應,Intel OpenVINO Toolkit(以下簡稱 OpenVINO)整合了 GStreamer、OpenCV 并提供 DL Streamer - GStreamer Video Analytics (GVA) Plugin,讓用戶可以更靈活地進行設置,使其在視頻(連續圖像)分析上更具效率。接下來就幫大家介紹“什么是串流視頻?”、“什么是 GStreamer?”、“如何安裝 OpenVINO DL Streamer 環境”、“串流視頻分析及優化流程”,最后再以一個實時追蹤車輛、行人的范例來介紹如何使用命令行操作,希望能幫大家對 DL Streamer 有更多認識。

*什么是串流視頻?什么是 GStreamer?

相信大家都用過數字相機或攝像頭,隨便拍一張照片都是幾百萬甚至上千萬像素,如果在不壓縮的情況下,一張超高畫質(Full HD)圖像分辨率為 1920 x 1080 像素(俗稱200 萬或 2M),每個彩色像素紅綠藍各使用 1 Byte (8 bit)來表示,則要儲存這張圖像就要 6.22 MByte。若以這個分辨率拍攝每秒 30 幀(frame)的視頻時,則 1 秒鐘就要 186.6 Mbyte,1 分鐘 11.2 GByte,一臺 1 TByte (1,000 GByte)的硬盤也不過只能存不到 90 分鐘視頻,所以就有了利用人眼對紋理頻率(平滑、雜亂紋理)、色彩濃度感知能力不同,發明了各種破壞性壓縮方式來縮小圖像及視頻的文件大小,如 jpg,mp4 等格式,讓圖像、視頻大小縮小數十到百倍,而人眼也很難分辨其差異。

雖然圖像壓縮已解決儲存大小的問題,但如果想從網絡上看一部視頻卻要等所有視頻都下載完才能觀看,這也太不方便了。于是就有人提出可以把取得圖像、壓縮、傳送、解壓縮、顯示變成一個像水管(pipeline)依序分段工作的作法,視頻(連續圖像)內容就像水一樣在水管中流動,使用者收到一小段資料就可以開始播放,不必等到視頻全部下載完才能觀看。而且視頻內容只需暫存在緩沖區,不一定要存在硬盤中,可節省儲存空間,因此透過此種方式傳送的視頻就稱為串流視頻(Stream Video)。目前像大家??吹?Youtube、各種直播或者是網絡監控攝像頭(IP Camera)都是采用這樣的作法,當然我們也可以把存在硬盤中的文件當作串流視頻讀取,這樣也可大幅增進播放效率。

目前市面上有很多串流視頻的處理軟件及開發工具,其中 GStreamer [1]就是最廣為人知的開源工具。它主要在 Liunx 上運行,有很多硬件 (CPU, GPU, DSP, CODEC, ASIC 等) 廠商都對其進行了優化,使得影音內容在壓縮(編碼 Encode) / 解壓縮(解碼 Decode)效率大幅提升。如 Fig. 1 所示,GStreamer 采取功能方塊作法,每個方塊根據不同工作項目會有不同輸入(sink)和輸出信號源(src),再按照需求將前后串聯起來。以一個影音播放器(player)為例,首先開啟影音文件,再將其分解(demuxer)成聲音(src_01)和視頻(src_02)兩組信號源,再按照聲音和視頻格式給予對應的解碼器(decoder),最后再由對應的揚聲器和顯示器將聲音和視頻播出來,完成串流影音文件播放工作。當然這里是采取一邊讀取文件一邊播放的串流型式存在。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


Fig. 1 GStreamer 串流影音播放工作流程。[2]

*如何安裝 OpenVINO DL Streamer 環境

OpenVINO 為了方便大家使用 DL Streamer,同樣地在 Docker Hub 上提供了現成的映像文件(Image)給大家下載,不熟悉如何使用 Docker 安裝的人,可以參考「【Intel OpenVINO?教學】如何利用 Docker 快速構建 OpenVINO 開發環境」[3]。不過上次文中使用的 ubuntu18_dev 這個映像文件并不支持 DL Streamer, GStreamer, Speech Libraries 及 Intel Media SDK,所以要重新到 Docker Hub 下載 ubuntu18_data_dev 映像文件,執行下方指令即可獲得映像文件(約 8.28 GByte)。不過這些文件有點大,下載時間從數分鐘到數十分鐘不等,具體視網絡速度而定。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理



Fig. 2 Intel OpenVINO DL Streamer 映像文件下載成功畫面。

另外補充一下,若非使用 Docker 安裝,則要注意軟件工作環境需滿足下列條件。

? OpenVINO 2021.1(Inference Engine 2.1.0)或以上版本

? Linux Kernel 4.15 或以上版本

? GStreamer 1.16 或以上版本

更多 DL Streamer 完整說明可參考 Intel 官方 Github openvinotoolkit/dlstreamer_gst。 [4]

*串流視頻分析及優化流程

OpenVINO 目前整合了 GStreamer 的串流視頻工具(VAAPI, labav 等)、原有的推理引擎(Inference Engine, IE)、OpenCV 等函數庫,搭建 DL Streamer 串流視頻分析插件(GStreamer Video Analytics Pulgin, GVA),方便讓開發者創建的應用程序能輕松地發揮硬件加速計算組件的效能,如 Fig. 3 所示。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


Fig. 3 OpenVINO DL Streamer Software Stack。(圖片來源:Intel IOTG)

接下來就以一個常見的應用來舉例什么是串流視頻分析(Stream Video Analytics)。假設一個商店在門口處裝了一組網絡監控攝像頭 (IP Camera),想要利用拍到的圖像來得知進門的顧客是否為重要客人(VIP)或者是黑名單(Blocklist)客戶,此時就要對拍到的連續圖像進行人臉識別,這就是串流視頻分析。

一個完整的串流視頻分析工作包括接收已壓縮的視頻、解碼(解壓縮)、前處理(如圖像格式轉換、亮度/色彩/對比調整等)、分析/推理(圖像分類、對象檢測等)、后處理(將結果以文字、繪圖等方式迭回原圖像上),最后視輸出方式可選擇直接輸出到屏幕顯示或著再重新編碼(壓縮)成文件儲存回硬盤中,如 Fig. 4 中間列所示。

其中在推理部份可以是多種工作串接而成的,也可同時處理二種以上工作,在 OpenVINO GVA Plugin 中提供了多種函數(元素 Element)可供使用、包括檢測 (gvadetect)、分類(gvaclassify)、追蹤(gvatrack)、水印(gvawatermark)、發布(gvapublish) 等,而更多完整的介紹及用法可參考官網 Github 說明[5][6]。如 Fig.4 上方列即表示使用了檢測、識別、追蹤及水印等元素來完成推理及顯示工作。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


Fig. 4 DL Streamer 串流視頻分析工作流程圖。(OmniXRI Feb. 2021 整理制作)

在這一連串工作中,并不是所有工作都交給 CPU 來處理,而是將其分配給最適合、效率最高的硬件來執行才是最理想的。比方說文件的存?。ㄓ脖P和內存間數據搬移)、格式轉換、繪圖等非矩陣運算工作交給 CPU,解碼/編碼等大量數學運算交給 GPU,而神經網絡推理所需的巨量矩陣運算工作則由 AI 芯片(也可以是 GPU, VPU, FPGA, NPU, ASIC 等)完成,如此就能得到最佳的工作效率。一般串流視頻播放速度大約是 1/30 秒一個幀(Frame),所以當傳輸及計算速度夠快時,就能同時計算多個串流視頻,如 Fig. 4 下方列所示。

接下來說明如何提升推理效率,如同本文一開始提到的,如果對串流視頻的每一幀都進行推理,則系統執行效率會變得很差,很難達成每秒 30 幀的計算,如 Fig. 5 左上圖所示(這里僅以檢測為例,另可加入分類識別及其它工作項目)。為改善執行效率,可令對象檢測及分類次數減少,因為幀間對象的位置、尺寸、外形可能變動不大,不需一直執行推理工作。如 Fig. 5 左下圖所示,對象檢測和圖像分類的間隔數量可以設成不同(也可相同),而幀間隔數量則視視頻中對象移動速度而定。但是采用這種方式有個缺點,有些幀可能不進行推理,所以會造成沒有結果內容可以迭合回原圖像中,畫面會有閃爍情況發生。

如果想更精準表示對象的微小位移,則使用傳統的對象追蹤方式會比直接使用神經網絡進行對象檢測更快。只要在兩個檢測幀中間加入追蹤動作,就可自動為中間幀找出對象的位置,改善對象檢測位置偏差及畫面閃爍問題,如 Fig. 5 右圖所示。目前提供了兩種追蹤模式,zero-term 會給每個對象一個獨立編號 (unique ID)方便在任一幀中查找,而 short-term 則會找出幀間最接近的內容位置。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


Fig. 5 串流視頻分析優化方式比較圖。左上圖:每一幀全都進行對象檢測,無優化。左下圖:每 6 個幀檢測一次,4 個幀分類一次。右圖:間隔檢測及分類并加入追蹤補足。(OmniXRI Feb. 2021 整理制作)

更多 OpenVINO 中 GStreamer 及 DL Streamer 的原理及使用方式可參考官方提供的 Youtube 視頻說明[7][8][9][10]。

*DL Streamer 范例說明

目前 DL Streamer 提供多種執行范例,包括直接命令行指令(gst-launch)、C / C++ / Python 程序等,接下來就以直接命令行指令方式來進行介紹。啟動 Docker 后這些范列預設會安裝在 /opt/intel/openvino_2021.2.185/data_processing/dl_streamer/samples 路徑下(openvino 后方數字代表對應版本)。執行范例前要先下載相關預訓練模型及參數文件,其工作命令如下所示。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理



由于啟動 Docker 的命令中有 --rm,所以每次離開后會清空所有新增內容,再重新啟動時要重新執行上述安裝及下載動作,以免造成范例無法運行問題。更多關于該映像文件不同啟動方式及參數,可參考 Intel 官方 Docker Hub / openvino / ubuntu18_data_dev 說明[11]。

在 /data_processing/dl_streamer/samples/gst_launch/ 下主要是提供以 gst-launch 命令行方式執行串流視頻分析的范例,有人臉檢測及識別、語音事件檢測、車輛行人追蹤、中介數據發布等應用,這里會以車輛行人追蹤分析為例進行說明。

首先進到/vehicle_pedestrian_tracking路徑下,執行 vehicle_pedestrian_tracking.sh 即可看到執行結果。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


為更清楚說明執行參數目的及運作指令方式,以下就將 vehicle_pedestrian_tracking.sh 內容完整顯示于 Fig. 6 并補充說明如下:

輸入視頻(FILE):可支持本地端(硬盤中)影音文件(*.mp4 等)、網絡攝像頭(Webcam)、串流攝像頭(IP Camera)網址(rtps://)或者一般網絡串流文件 (http://)。本范例默認值為https://github.com/intel-iot-devkit/sample-videos/blob/master/person-bicycle-car-detection.mp4,也就是說,不輸入此項參數時會自動上網讀取這個串流視頻,注意計算機必須連網才能正確執行。

◇ 檢測間隔幀數(DETECTION_INTERVAL):為加速串流視頻分析,可設定間隔幀數(Frame)減少計算,其概念如 Fig. 5 左下圖所示??闪硗獯钆湎路阶粉欗椖渴褂?,補齊中間幀的檢測工作。默認為 10,以一般視頻幀速度(FPS)為每秒 30 幀來算,相當于 1/3 秒檢測一次。對于對象移動緩慢的場景已足夠使用,可視需求調整長短。

◇ 推理精度(INFERENCE_PRICISION):可根據需求選擇不同推理精度,預設為 FP32,即推理模型的權重值是以 32 位浮點數表示。若想加快計算可選擇 FP16(16 位浮點數)或 INT8(8 位整數),當然這樣可能會犧牲一點推理的正確性。

以上三組為可自由設定的參數,若只想使用默認值可不輸入,若只想修改檢測間隔幀數,此時第一項參數必須設成 "" (空字符串)令其使用默認值,否則將無法正確運作。

除了這些自由設定參數外,范例中還有許多參數可以調整,但需自行以文字編輯器(如 nano, vim 等)載入再修改。以下分別說明幾個重要參數。

◇ 推理設備(INFERENCE_DEVICE):預設為 CPU,可自行修改成 GPU, MYRIAD, HDDL 等不同設備。但使用 GPU 前要確定是 INTEL 6 到 10 代繪圖處理器 Iris 或 HD 系列,或者 11 代 Xe,OpenVINO 不支持 NVIDIA 或 AMD 的 GPU。另外模型大小不一,所以不保證所有模型一定可以在 CPU 以外設備上使用。另外提醒,如果在 Linux 上手動安裝 OpenVINO,需另外安裝 Intel OpenCL 驅動程序,否則將無法正確使用 GPU。

◇ 追蹤型式(TRACKING_TYPE):預設為 short-term,另可選擇 zero-term。主要用于協助補齊檢測及分類未工作之幀的計算。

◇ 重新分類幀數間隔(RECLASSIFY_INTERVAL):默認為 10,這個數字可檢測間隔幀數相同亦可不同,視需求而定。同樣地也可搭配追蹤型式補齊未分類中間幀數的分類結果。

在這個范例中主要使用四個 GVA Plugin 并搭配指定模型來完成工作,包括:

◇ gvadetect:負責車輛、腳踏車、行人檢測,對應 person-vehicle-bike-detection- crossroad-0078。

◇ gvainference:負責人員及車輛屬性推理,分別對應 person-attributes-recognition-crossroad-0230 及 vehicle-attributes-recognition-barrier-0039。

◇ gvatrack:負責補齊未進行對象檢測及分類推理中間幀的分析結果。

◇ gvawatermark:負責將分析結果產生的圖框和文字迭合回原圖像中,方便用戶了解運行速度及是否有正確檢測及分類推理。

◇ videoconvert:視頻格式(色彩空間)轉換。

◇ fpsdisplaysink:渲染(Rendering)輸出結果到屏幕速度。

更完整的參數說明可參考官網[12]。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理



【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理

Fig. 6 以命令行方式進行串流視頻車輛行人分析范例

(vehicle_pedestrian_tracking.sh)說明。(OmniXRI Feb. 2021 整理制作)

再來簡單比較一下在不同參數下的執行結果。測試條件為:Intel Core i5-4400 @3.1GHz 4 核 4 線程,8 GByte 內存,OpenVINO Docker Image: ubuntu18_data_dev (OpenVINO 2021.2.185 for DL Streamer)。分別以下列三種方式進行比較。其中不啟動追蹤方式即是將 Fig. 6 中對象追蹤(藍色虛線框)那兩行指令刪除。實驗結果如 Fig. 7 所示。

◇ 檢測、分類間隔皆為 1 且不啟動追蹤:執行時 CPU 四核平均使用率 53.8%,推理負擔極重,平均速度 12.02 FPS。每一個幀都會顯示檢測到的對象及分類結果。

◇ 檢測、分類間隔皆為 10 且不啟動追蹤:執行時 CPU 四核平均使用率 7.5%,推理負擔極輕,平均速度 11.67 FPS。每十個幀會顯示檢測到的對象及分類結果,故畫面會有點閃爍。

◇ 檢測、分類間隔皆為 10 且啟動追蹤:執行時 CPU 四核平均使用率 21.65%,推理負擔中等,平均速度 11.60 FPS。由于有啟動追蹤功能,所以每一個幀都會顯示檢測到的對象及分類結果。

整體來說只測試一個串流視頻還沒讓 CPU 耗盡所有資源,所以應該還可以同時接受多個視頻(串流攝像頭、網絡攝像頭)或更多分析項目。另外加長檢測及分類幀數間隔明顯會令系統計算量大幅減少。如果再加上追蹤功能,除可滿足逐格分析外又不會耗損太多計算資源,這樣就可容納更多串流視頻一起工作。

【Intel OpenVINO 教學】GStreamer 串流視頻智能分析不再慢吞吞─看 Intel OpenVINO DL Stream 如何加速視頻推理推理


Fig. 7 不同測試條件實驗結果,左行為輸出圖像,右行為 CPU 及內存使用情況。(OmniXRI Feb. 2021 整理制作)

*小結

在當前網絡發達的年代,不論是智能零售、智能安防、智慧城市等各種應用都離不開串流攝像頭或網絡視頻的傳送方式。有了像 Intel OpenVINO DL Streamer 這類智能分析工具后,就能更容易滿足大量輸入,快速推理的需求。本文篇幅有限,無法一一展現這項工具的所有細節,剩下部份請大家多多去探索。

*參考文獻

[1] GStreamer open source multimedia framework https://gstreamer.freedesktop.org/

[2] GStreamer pipeline https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html

[3] 許哲豪,” 【Intel OpenVINO?教學】如何利用 Docker 快速建置 OpenVINO 開發環境” http://omnixri.blogspot.com/2021/01/intel-openvinodockeropenvino.html

[4] Github – openvinotoolkit / dlstreamer_gst https://github.com/openvinotoolkit/dlstreamer_gst

[5] Github - openvinotoolkit / dlstreamer_gst / Elements https://github.com/openvinotoolkit/dlstreamer_gst/wiki/Elements

[6] GStreamer Video Analytics (GVA) Plugin https://openvinotoolkit.github.io/dlstreamer_gst/index.html

[7] Intel Software, "Full Pipeline Simulation Using GStreamer | OpenVINO? toolkit | Ep. 47 | Intel Software" https://youtu.be/fWhPV_IqDy0

[8] Intel Software, "Full Pipeline Simulation Using GStreamer Samples | OpenVINO? toolkit | Ep. 48 | Intel Software" https://youtu.be/EqHznsUR1sE

[9] Intel Software, "DL Streamer Tracking Element | OpenVINO? toolkit | Ep. 64 | Intel Software" https://youtu.be/z4Heorhg3tM

[10] Intel Software, "DL-Streamer Python Custom Element | OpenVINO? toolkit | Ep. 66 | Intel Software" https://youtu.be/SDGE9Vyd-bY

[11] Docker Hub openvino/ubuntu18_data_dev, “Intel? Distribution of OpenVINO? toolkit Docker image for Ubuntu* 18.04 LTS” https://hub.docker.com/r/openvino/ubuntu18_data_dev

[12] Intel OpenVINO Toolktit, “Vehicle and Pedestrian Tracking Sample (gst-launch command line)” https://docs.openvinotoolkit.org/latest/gst_samples_gst_launch_vehicle_pedestrian_tracking_README.html

  • 聚合信息
免責聲明:凡注明來源本網的所有作品,均為本網合法擁有版權或有權使用的作品,歡迎轉載,注明出處。非本網作品均來自互聯網,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責。
百度 好搜 搜狗

警告:本站禁止未滿18周歲訪客瀏覽,如果當地法律禁止請自覺離開本站!收藏本站:請使用Ctrl+D進行收藏