看 Intel OpenVINO DL Stream 如何加速視頻推理
隨著人工智能興起,利用“深度學習”技術進行計算機視覺工作已是很普遍的應用,如圖像分類、對象檢測等。通常只需將單張圖像送入訓練好的模型中進行推理即可得到輸出結果,但當遇到視頻文件或串流視頻時,逐格(by Frame)圖像分析就變得很沒效率,因為幀間時間差距過短(通常為1/30~1/60秒),場景中的對象位移量(變形量)可能過小,導致幀間得到幾乎相同的計算結果(對象位置、尺寸及分類),浪費計算資源,也讓系統(tǒng)看起來反應過慢。
本文引用地址:http://butianyuan.cn/article/202106/426307.htm為了使視頻文件及串流視頻在分析上能加快反應,Intel OpenVINO Toolkit(以下簡稱OpenVINO)整合了GStreamer、OpenCV并提供DL Streamer-GStreamer Video Analytics(GVA)Plugin,讓用戶可以更靈活地進行設置,使其在視頻(連續(xù)圖像)分析上更具效率。接下來就幫大家介紹“什么是串流視頻?”、“什么是GStreamer?”、“如何安裝OpenVINO DL Streamer環(huán)境”、“串流視頻分析及優(yōu)化流程”,最后再以一個實時追蹤車輛、行人的范例來介紹如何使用命令行操作,希望能幫大家對DL Streamer有更多認識。
*什么是串流視頻?什么是GStreamer?
相信大家都用過數(shù)字相機或攝像頭,隨便拍一張照片都是幾百萬甚至上千萬像素,如果在不壓縮的情況下,一張超高畫質(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分鐘視頻,所以就有了利用人眼對紋理頻率(平滑、雜亂紋理)、色彩濃度感知能力不同,發(fā)明了各種破壞性壓縮方式來縮小圖像及視頻的文件大小,如jpg,mp4等格式,讓圖像、視頻大小縮小數(shù)十到百倍,而人眼也很難分辨其差異。
雖然圖像壓縮已解決儲存大小的問題,但如果想從網(wǎng)絡上看一部視頻卻要等所有視頻都下載完才能觀看,這也太不方便了。于是就有人提出可以把取得圖像、壓縮、傳送、解壓縮、顯示變成一個像水管(pipeline)依序分段工作的作法,視頻(連續(xù)圖像)內容就像水一樣在水管中流動,使用者收到一小段資料就可以開始播放,不必等到視頻全部下載完才能觀看。而且視頻內容只需暫存在緩沖區(qū),不一定要存在硬盤中,可節(jié)省儲存空間,因此透過此種方式傳送的視頻就稱為串流視頻(Stream Video)。目前像大家??吹腨outube、各種直播或者是網(wǎng)絡監(jiān)控攝像頭(IP Camera)都是采用這樣的作法,當然我們也可以把存在硬盤中的文件當作串流視頻讀取,這樣也可大幅增進播放效率。
目前市面上有很多串流視頻的處理軟件及開發(fā)工具,其中GStreamer[1]就是最廣為人知的開源工具。它主要在Liunx上運行,有很多硬件(CPU,GPU,DSP,CODEC,ASIC等)廠商都對其進行了優(yōu)化,使得影音內容在壓縮(編碼Encode)/解壓縮(解碼Decode)效率大幅提升。如Fig.1所示,GStreamer采取功能方塊作法,每個方塊根據(jù)不同工作項目會有不同輸入(sink)和輸出信號源(src),再按照需求將前后串聯(lián)起來。以一個影音播放器(player)為例,首先開啟影音文件,再將其分解(demuxer)成聲音(src_01)和視頻(src_02)兩組信號源,再按照聲音和視頻格式給予對應的解碼器(decoder),最后再由對應的揚聲器和顯示器將聲音和視頻播出來,完成串流影音文件播放工作。當然這里是采取一邊讀取文件一邊播放的串流型式存在。
Fig.1 GStreamer串流影音播放工作流程。[2]
*如何安裝OpenVINO DL Streamer環(huán)境
OpenVINO為了方便大家使用DL Streamer,同樣地在Docker Hub上提供了現(xiàn)成的映像文件(Image)給大家下載,不熟悉如何使用Docker安裝的人,可以參考「【Intel OpenVINO?教學】如何利用Docker快速構建OpenVINO開發(fā)環(huán)境」[3]。不過上次文中使用的ubuntu18_dev這個映像文件并不支持DL Streamer,GStreamer,Speech Libraries及Intel Media SDK,所以要重新到Docker Hub下載ubuntu18_data_dev映像文件,執(zhí)行下方指令即可獲得映像文件(約8.28 GByte)。不過這些文件有點大,下載時間從數(shù)分鐘到數(shù)十分鐘不等,具體視網(wǎng)絡速度而定。
#到Docker Hub下載映像文件
docker pull openvino/ubuntu18_data_dev
#檢查是否下載成功
docker images
Fig.2 Intel OpenVINO DL Streamer映像文件下載成功畫面。
另外補充一下,若非使用Docker安裝,則要注意軟件工作環(huán)境需滿足下列條件。
OpenVINO 2021.1(Inference Engine 2.1.0)或以上版本
Linux Kernel 4.15或以上版本
GStreamer 1.16或以上版本
更多DL Streamer完整說明可參考Intel官方Github openvinotoolkit/dlstreamer_gst。[4]
*串流視頻分析及優(yōu)化流程
OpenVINO目前整合了GStreamer的串流視頻工具(VAAPI,labav等)、原有的推理引擎(Inference Engine,IE)、OpenCV等函數(shù)庫,搭建DL Streamer串流視頻分析插件(GStreamer Video Analytics Pulgin,GVA),方便讓開發(fā)者創(chuàng)建的應用程序能輕松地發(fā)揮硬件加速計算組件的效能,如Fig.3所示。
Fig.3 OpenVINO DL Streamer Software Stack。(圖片來源:Intel IOTG)
接下來就以一個常見的應用來舉例什么是串流視頻分析(Stream Video Analytics)。假設一個商店在門口處裝了一組網(wǎng)絡監(jiān)控攝像頭(IP Camera),想要利用拍到的圖像來得知進門的顧客是否為重要客人(VIP)或者是黑名單(Blocklist)客戶,此時就要對拍到的連續(xù)圖像進行人臉識別,這就是串流視頻分析。
一個完整的串流視頻分析工作包括接收已壓縮的視頻、解碼(解壓縮)、前處理(如圖像格式轉換、亮度/色彩/對比調整等)、分析/推理(圖像分類、對象檢測等)、后處理(將結果以文字、繪圖等方式迭回原圖像上),最后視輸出方式可選擇直接輸出到屏幕顯示或著再重新編碼(壓縮)成文件儲存回硬盤中,如Fig.4中間列所示。
其中在推理部份可以是多種工作串接而成的,也可同時處理二種以上工作,在OpenVINO GVA Plugin中提供了多種函數(shù)(元素Element)可供使用、包括檢測(gvadetect)、分類(gvaclassify)、追蹤(gvatrack)、水印(gvawatermark)、發(fā)布(gvapublish)等,而更多完整的介紹及用法可參考官網(wǎng)Github說明[5][6]。如Fig.4上方列即表示使用了檢測、識別、追蹤及水印等元素來完成推理及顯示工作。
Fig.4 DL Streamer串流視頻分析工作流程圖。(OmniXRI Feb.2021整理制作)
在這一連串工作中,并不是所有工作都交給CPU來處理,而是將其分配給最適合、效率最高的硬件來執(zhí)行才是最理想的。比方說文件的存?。ㄓ脖P和內存間數(shù)據(jù)搬移)、格式轉換、繪圖等非矩陣運算工作交給CPU,解碼/編碼等大量數(shù)學運算交給GPU,而神經(jīng)網(wǎng)絡推理所需的巨量矩陣運算工作則由AI芯片(也可以是GPU,VPU,FPGA,NPU,ASIC等)完成,如此就能得到最佳的工作效率。一般串流視頻播放速度大約是1/30秒一個幀(Frame),所以當傳輸及計算速度夠快時,就能同時計算多個串流視頻,如Fig.4下方列所示。
接下來說明如何提升推理效率,如同本文一開始提到的,如果對串流視頻的每一幀都進行推理,則系統(tǒng)執(zhí)行效率會變得很差,很難達成每秒30幀的計算,如Fig.5左上圖所示(這里僅以檢測為例,另可加入分類識別及其它工作項目)。為改善執(zhí)行效率,可令對象檢測及分類次數(shù)減少,因為幀間對象的位置、尺寸、外形可能變動不大,不需一直執(zhí)行推理工作。如Fig.5左下圖所示,對象檢測和圖像分類的間隔數(shù)量可以設成不同(也可相同),而幀間隔數(shù)量則視視頻中對象移動速度而定。但是采用這種方式有個缺點,有些幀可能不進行推理,所以會造成沒有結果內容可以迭合回原圖像中,畫面會有閃爍情況發(fā)生。
如果想更精準表示對象的微小位移,則使用傳統(tǒng)的對象追蹤方式會比直接使用神經(jīng)網(wǎng)絡進行對象檢測更快。只要在兩個檢測幀中間加入追蹤動作,就可自動為中間幀找出對象的位置,改善對象檢測位置偏差及畫面閃爍問題,如Fig.5右圖所示。目前提供了兩種追蹤模式,zero-term會給每個對象一個獨立編號(unique ID)方便在任一幀中查找,而short-term則會找出幀間最接近的內容位置。
Fig.5串流視頻分析優(yōu)化方式比較圖。左上圖:每一幀全都進行對象檢測,無優(yōu)化。左下圖:每6個幀檢測一次,4個幀分類一次。右圖:間隔檢測及分類并加入追蹤補足。(OmniXRI Feb.2021整理制作)
更多OpenVINO中GStreamer及DL Streamer的原理及使用方式可參考官方提供的Youtube視頻說明[7][8][9][10]。
*DL Streamer范例說明
目前DL Streamer提供多種執(zhí)行范例,包括直接命令行指令(gst-launch)、C/C++/Python程序等,接下來就以直接命令行指令方式來進行介紹。啟動Docker后這些范列預設會安裝在
/opt/intel/openvino_2021.2.185/data_processing/dl_streamer/samples路徑下
(openvino后方數(shù)字代表對應版本)。執(zhí)行范例前要先下載相關預訓練模型及參數(shù)文件,其工作命令如下所示。
#開放權限,允許本地連接,方便后面Docker中啟用X Window GUI功能xhost+local:root
#以Docker方式運行DL Streamer范例之命令,其中另增加--user root 用戶權力,方便在Docker中安裝文本編輯器(nano,vim等)
docker run-it--device/dev/dri:/dev/dri--d evi ce-cgroup-rule='c 189:*rmw'- v~/.Xauthority:/root/.Xauthority-v/tmp/.X11-unix/:/tmp/.X11-unix/-e DISPLAY=$DISPLAY-v/dev/bus/usb:/dev/bus/usb--rm--u ser root openvino/ubuntu18_data_dev:latest
#啟動Docker完成會出現(xiàn)下列提示字符,最后數(shù)字為OpenVINO安裝版本
openvino e3a20b255ff3:/opt/intel/openvino_2021.2.185$
#接著更新Docker中系統(tǒng)套件及安裝文本編輯器nano方便后續(xù)修改范例程序
apt update
apt install nano
#下載范例程序所需模型及參數(shù),相關范例程序也在此路徑下
cd data_processing/dl_streamer/samples
./download_models.sh
#完成下載后默認會將模型及參數(shù)存放在
/home/openvino/intel/dl_streamer/model路徑下
由于啟動Docker的命令中有--rm,所以每次離開后會清空所有新增內容,再重新啟動時要重新執(zhí)行上述安裝及下載動作,以免造成范例無法運行問題。更多關于該映像文件不同啟動方式及參數(shù),可參考Intel官方Docker Hub/openvino/ubuntu18_data_dev說明[11]。
在/data_processing/dl_streamer/samples/gst_launch/下主要是提供以gst-launch命令行方式執(zhí)行串流視頻分析的范例,有人臉檢測及識別、語音事件檢測、車輛行人追蹤、中介數(shù)據(jù)發(fā)布等應用,這里會以車輛行人追蹤分析為例進行說明。
首先進到/vehicle_pedestrian_tracking路徑下,執(zhí)行vehicle_pedestrian_tracking.sh即可看到執(zhí)行結果。
#切換工作路徑至范例程序所在路徑
cd
/data_processing/dl_streamer/samples/gst_launch/vehicle_pedestrian_tracking
#執(zhí)行車輛行人追蹤分析范例,可選配輸入三項參數(shù),也可不輸入使用默認值
./vehicle_pedestrian_tracking.sh[輸入影片][偵測間隔幀數(shù)][推理精度]
為更清楚說明執(zhí)行參數(shù)目的及運作指令方式,以下就將vehicle_pedestrian_tracking.sh內容完整顯示于Fig.6并補充說明如下:
輸入視頻(FILE):可支持本地端(硬盤中)影音文件(*.mp4等)、網(wǎng)絡攝像頭(Webcam)、串流攝像頭(IP Camera)網(wǎng)址(rtps://)或者一般網(wǎng)絡串流文件(http://)。本范例默認值為https://github.com/intel-iot-devkit/sample-videos/blob/master/personbicycle-car-detection.mp4,也就是說,不輸入此項參數(shù)時會自動上網(wǎng)讀取這個串流視頻,注意計算機必須連網(wǎng)才能正確執(zhí)行。
檢測間隔幀數(shù)(DETECTION_INTERVAL):為加速串流視頻分析,可設定間隔幀數(shù)
(Frame)減少計算,其概念如Fig.5左下圖所示??闪硗獯钆湎路阶粉欗椖渴褂茫a齊中間幀的檢測工作。默認為10,以一般視頻幀速度(FPS)為每秒30幀來算,相當于1/3秒檢測一次。對于對象移動緩慢的場景已足夠使用,可視需求調整長短。
推理精度(INFERENCE_PRICISION):可根據(jù)需求選擇不同推理精度,預設為FP32,
即推理模型的權重值是以32位浮點數(shù)表示。若想加快計算可選擇FP16(16位浮點數(shù))或INT8(8位整數(shù)),當然這樣可能會犧牲一點推理的正確性。
以上三組為可自由設定的參數(shù),若只想使用默認值可不輸入,若只想修改檢測間隔幀數(shù),此時第一項參數(shù)必須設成""(空字符串)令其使用默認值,否則將無法正確運作。
除了這些自由設定參數(shù)外,范例中還有許多參數(shù)可以調整,但需自行以文字編輯器(如nano,vim等)載入再修改。以下分別說明幾個重要參數(shù)。
推理設備(INFERENCE_DEVICE):預設為CPU,可自行修改成GPU,MYRIAD,HDDL等不同設備。但使用GPU前要確定是INTEL 6到10代繪圖處理器Iris或HD系列,或者11代X e,OpenVINO不支持NVIDIA或AMD的GPU。另外模型大小不一,所以不保證所有模型一定可以在CPU以外設備上使用。另外提醒,如果在Linux上手動安裝OpenVINO,需另外安裝Intel OpenCL驅動程序,否則將無法正確使用GPU。
追蹤型式(TRACKING_TYPE):預設為short-term,另可選擇zero-term。主要用于協(xié)助補齊檢測及分類未工作之幀的計算。
重新分類幀數(shù)間隔(RECLASSIFY_INTERVAL):默認為10,這個數(shù)字可檢測間隔幀數(shù)相同亦可不同,視需求而定。同樣地也可搭配追蹤型式補齊未分類中間幀數(shù)的分類結果。
在這個范例中主要使用四個GVA Plugin并搭配指定模型來完成工作,包括:
gvadetect:負責車輛、腳踏車、行人檢測,對應person-vehicle-bike-detectioncrossroad-0078。
gvainference:負責人員及車輛屬性推理,分別對應person-attributes-recognitioncrossroad-0230及vehicle-attributes-recognition-barrier-0039。
gvatrack:負責補齊未進行對象檢測及分類推理中間幀的分析結果。
gvawatermark:負責將分析結果產(chǎn)生的圖框和文字迭合回原圖像中,方便用戶了解運行速度及是否有正確檢測及分類推理。
videoconvert:視頻格式(色彩空間)轉換。
fpsdisplaysink:渲染(Rendering)輸出結果到屏幕速度。
更完整的參數(shù)說明可參考官網(wǎng)[12]。
Fig.6以命令行方式進行串流視頻車輛行人分析范例(vehicle_pedestrian_tracking.sh)說明。
再來簡單比較一下在不同參數(shù)下的執(zhí)行結果。測試條件為:Intel Core i5-4400 3.1GHz 4核4線程,8GByte內存,OpenVINO Docker Image:ubuntu18_data_dev(OpenVINO 2021.2.185 for DL Streamer)。分別以下列三種方式進行比較。其中不啟動追蹤方式即是將Fig.6中對象追蹤(藍色虛線框)那兩行指令刪除。實驗結果如Fig.7所示。?
檢測、分類間隔皆為1且不啟動追蹤:執(zhí)行時CPU四核平均使用率53.8%,推理負擔極重,平均速度12.02 FPS。每一個幀都會顯示檢測到的對象及分類結果。
檢測、分類間隔皆為10且不啟動追蹤:執(zhí)行時CPU四核平均使用率7.5%,推理負擔極輕,平均速度11.67 FPS。每十個幀會顯示檢測到的對象及分類結果,故畫面會有點閃爍。
檢測、分類間隔皆為10且啟動追蹤:執(zhí)行時CPU四核平均使用率21.65%,推理負擔中等,平均速度11.60 FPS。由于有啟動追蹤功能,所以每一個幀都會顯示檢測到的對象及分類結果。
整體來說只測試一個串流視頻還沒讓CPU耗盡所有資源,所以應該還可以同時接受多個視頻(串流攝像頭、網(wǎng)絡攝像頭)或更多分析項目。另外加長檢測及分類幀數(shù)間隔明顯會令系統(tǒng)計算量大幅減少。如果再加上追蹤功能,除可滿足逐格分析外又不會耗損太多計算資源,這樣就可容納更多串流視頻一起工作。
Fig.7不同測試條件實驗結果,左行為輸出圖像,右行為CPU及內存使用情況。(OmniXRI Feb.2021整理制作)
*小結
在當前網(wǎng)絡發(fā)達的年代,不論是智能零售、智能安防、智慧城市等各種應用都離不開串流攝像頭或網(wǎng)絡視頻的傳送方式。有了像Intel OpenVINO DL Streamer這類智能分析工具后,就能更容易滿足大量輸入,快速推理的需求。本文篇幅有限,無法一一展現(xiàn)這項工具的所有細節(jié),剩下部份請大家多多去探索。
*參考文獻
[1]GStreamer open source multimedia framework
https://gstreamer.freedesktop.org/
[2]GStreamer pipeline https://gstreamer.freedesktop.org/documentation/applicationdevelopment/introduction/basics.html
[3]許哲豪,”【Intel OpenVINO?教學】如何利用Docker快速建置OpenVINO開發(fā)環(huán)境”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
評論