作為眾多 AI 應(yīng)用場景的基座,基于流媒體的視覺分析一直是傳統(tǒng) AI 公司的核心能力之一。但想要搭建一套完整的視頻分析系統(tǒng)其實(shí)并不容易,其中會涉及多個(gè)圖像處理環(huán)節(jié)的開發(fā)工作,例如視頻流拉取、圖像編解碼、AI 模型前后處理、AI 模型推理,以及視頻流推送等常見任務(wù)模塊。其中每一個(gè)模塊都需要領(lǐng)域?qū)<以谥付ǖ?a href="http://srfitnesspt.com/v/tag/1751/" target="_blank">硬件平臺進(jìn)行開發(fā)和優(yōu)化,并且如何高效地將他們組合起來也是一個(gè)問題。在這篇文章中,我們將探討如何利用 Intel 的 DL Streamer 工具套件打造一套支持多路視頻流接入的視頻分析系統(tǒng),利用 OpenVINO 部署并加速 YOLOv8 推理任務(wù)。
(復(fù)制鏈接到瀏覽器打開)
圖1:典型的視頻分析系統(tǒng)流水線
Intel DL Streamer 工具套件
DL Streamer 是一套開源的流媒體分析系統(tǒng)框架,它基于著名的 GStreamer 多媒體框架所打造,可以幫助開發(fā)者快速構(gòu)建復(fù)雜的媒體分析流水線。開發(fā)者只需要通過命令行的方式就可以輕松完成一套支持多路的分析系統(tǒng)搭建。此外,在這個(gè)過程中,DL Streamer 會幫助我們將每個(gè)模塊部署在指定的硬件加速平臺,以獲得更好的性能與更高的資源利用率。
圖2:DL Streamer 架構(gòu)圖
01Intel DL Streamer Pipeline Framework 用于構(gòu)建最基礎(chǔ)的視頻分析流水線,其中利用 VA-API 庫提升 GPU 的硬件編解碼能力,基于 OpenVINO 實(shí)現(xiàn)對于 AI 推理任務(wù)的加速。此外還支持 C++和 Python API 接口調(diào)用方式,便于開發(fā)者與自有系統(tǒng)進(jìn)行集成。
02Intel DL Streamer Pipeline Server 可以將構(gòu)建好的視頻分析流水線以微服務(wù)的方式部署在多個(gè)計(jì)算節(jié)點(diǎn)上,并提供對外的 REST APIs 接口調(diào)用。
03Intel DL Streamer Pipeline Zoo 則被作為性能評估與調(diào)式的工具,其中集成了一些即開即用的示例,方便開發(fā)者測試。
本文中分享的 demo 是一個(gè)基于 DL Streamer 的最小化示例,僅使用Intel DL Streamer Pipeline Framework 進(jìn)行任務(wù)開發(fā)。
開發(fā)流程
1、YOLOv8 模型優(yōu)化與轉(zhuǎn)換
首先我們需要對模型進(jìn)行性能優(yōu)化,這里我們才利用量化技術(shù)來壓縮模型體積。由于目前 Ultralytics 庫已經(jīng)直接支持 OpenVINO IR 格式的模型導(dǎo)出,所以我們可以直接調(diào)用以下接口將 YOLOv8 預(yù)訓(xùn)練權(quán)轉(zhuǎn)化為OpenVINO IR,并通過 NNCF 工具進(jìn)行后訓(xùn)練量化。
det_model = YOLO(f"../model/{DET_MODEL_NAME}.pt") out_dir = det_model.export(format="openvino", dynamic=True, half=True)
左滑查看更多
此外由于我們需要使用 vaapi-surface-sharing backend,來實(shí)現(xiàn)從解碼-前處理-推理在 GPU 設(shè)備上的 zero-copy,標(biāo)準(zhǔn) YOLOv8 模型的部分前處理任務(wù)沒有辦法支持 vaapi-surface-sharing
因此我們需要將部分前處理任務(wù)以模型算子的形式提前集成到模型結(jié)構(gòu)中,這里可以利用 OpenVINO 的 Preprocessing API 來進(jìn)行前處理任務(wù)中轉(zhuǎn)置和歸一化操作的集成。具體方法如下:
input_layer = model.input(0) model.reshape({input_layer.any_name: PartialShape([1, 3, 640, 640])}) ppp = PrePostProcessor(model) ppp.input().tensor().set_color_format(ColorFormat.BGR).set_layout(Layout("NCHW")) ppp.input().preprocess().convert_color(ColorFormat.RGB).scale([255, 255, 255]) model = ppp.build()
左滑查看更多
2、 集成 YOLOv8 后處理任務(wù)
由于 DLStreamer 目前沒有直接支持 YOLOv8 的后處理任務(wù),所以我們需要在其源碼中新增 YOLOv8 后處理任務(wù)的 C++ 實(shí)現(xiàn)。
并重新編譯 DLStreamer 源碼。相較之前 YOLO 系列的模型,YOLOv8 模型的原始輸出會一些特殊,他的輸出數(shù)據(jù)結(jié)構(gòu)為(1, 84, 8400),其中8400代表識別對象的數(shù)量,84 代表 4 個(gè)坐標(biāo)信息 +80 種類別,而通常情況下坐標(biāo)信息和類別信息都是在最后一個(gè)維度里,所以為了在 C++ 應(yīng)用中更方便的地模型輸出進(jìn)行遍歷,我們首先需要做一個(gè)維度轉(zhuǎn)置的操作,將其輸出格式變?yōu)?strong>(1, 8400, 84),接下來就可以通過常規(guī) YOLO 模型的后處理方式,來解析并過濾 YOLOv8 模型輸出。
cv::Mat outputs(object_size, max_proposal_count, CV_32F, (float *)data); cv::transpose(outputs, outputs);
左滑查看更多
3、構(gòu)建 DL Streamer Pipeline
其實(shí) DL Streamer Pipeline 的構(gòu)建非常簡單,我們只需要記住每一個(gè) element 模塊的功能,并按從“輸入 -> 解碼 -> 推理 -> 編碼/輸出”的次序?qū)⑺麄兘M合起來就可以了,以下就是一個(gè)單通道的示例。
gst-launch-1.0 filesrc location=./TownCentreXVID.mp4 ! decodebin ! video/x-raw(memory:VASurface) ! gvadetect model=./models/yolov8n_int8_ppp.xml model_proc=./dlstreamer_gst/samples/gstreamer/model_proc/public/yolo-v8.json pre-process-backend=vaapi-surface-sharing device=GPU ! queue ! meta_overlay device=GPU preprocess-queue-size=25 process-queue-size=25 postprocess-queue-size=25 ! videoconvert ! fpsdisplaysink video-sink=ximagesink sync=false
左滑查看更多
除推理部分的任務(wù)外,DL Streamer 中大部分的模塊都是復(fù)用 GStreamer 的element,這里需要特別注意的是,為了實(shí)現(xiàn)在 GPU 硬解碼和推理任務(wù)之間的 zero-copy,解碼的輸出需要為video/x-raw(memory:VASurface)格式,并且推理的任務(wù)的前處理任務(wù)需要調(diào)用 vaapi-surface-sharing backend ,以此來將前處理的任務(wù)負(fù)載通過 GPU 來進(jìn)行加速。
此外這邊也會用到 DL Streamer 2.0 API 中新增的meta_overlay 模塊將結(jié)果信息,以 bounding box 的形態(tài)添加在原始視頻流中,并利用 fpsdisplaysink 模塊統(tǒng)計(jì)實(shí)時(shí) FPS 性能后,一并作為結(jié)果可視化進(jìn)行輸出展示。如果本機(jī)不支持可視化播放,我們也可以通過拼接以下指令:
vaapih264enc ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.168.3.9 port=5004
將結(jié)果畫面編碼后,通過 udp 協(xié)議推流,并用例如 VLC 這樣的工具,在另一臺設(shè)備播放。
如果不需要可視化呈現(xiàn),我們也可以通過 gvametapublish 模塊將原始結(jié)果輸出到一個(gè) json 文件中,或通過 MQTT 協(xié)議推送這些原始的結(jié)果數(shù)據(jù)。gvametapublish模塊的使用方法可以查詢:
https://dlstreamer.github.io/elements/gvametapublish.html(復(fù)制鏈接到瀏覽器打開)
4、多通道 Pipeline 優(yōu)化
為了方便多通道任務(wù)同屏展示,我們通過 compositor模塊將多個(gè)通道的檢測結(jié)果進(jìn)行拼接。在多路推理性能優(yōu)化方面,可以利用以下指令,將多個(gè)同一時(shí)刻內(nèi)的多個(gè) stream 輸入,打包為一個(gè) batch,送入 GPU 進(jìn)行推理,以激活 GPU 在吞吐量上的優(yōu)勢,而 infer request 的數(shù)量則會根據(jù)接入視頻的通道數(shù)動態(tài)調(diào)整。
nireq=$((${STREAM}*2)) gpu-throughput-streams=${STREAM} batch-size=${NUM_PANES} model-instance-id=1
左滑查看更多
此外,為了避免重復(fù)創(chuàng)建模型對象,可以將每個(gè)通道里的model-instance-id都設(shè)為統(tǒng)一值,這樣 OpenVINO 只會為我們初始化一個(gè)模型對象。
如何運(yùn)行示例
為了方便在不同硬件平臺進(jìn)行移植,同時(shí)降低部署門檻,這里我們已經(jīng)將所有的示例代碼打包進(jìn)了 docker 鏡像內(nèi),大家可以通過以下幾條簡單的指令,快速復(fù)現(xiàn)整個(gè)方法。
1、初始化環(huán)境
這一步主要為了可以在容器內(nèi)訪問 host 的 GPU 資源,以及開啟視頻流展示的權(quán)限,如果當(dāng)前硬件中存在多個(gè) GPU 設(shè)備,我們可以通過修改 GPU driver 的編號來調(diào)整映射到容器內(nèi)的 GPU 資源,例如這可以把renderD128修改為 renderD129
$ xhost local:root $ setfacl -m user:1000:r ~/.Xauthority $ DEVICE=${DEVICE:-/dev/dri/renderD128} $ DEVICE_GRP=$(ls -g $DEVICE | awk '{print $3}' | xargs getent group | awk -F: '{print $3}')
左滑查看更多
2、拉取 docker 鏡像
$ docker pull snake7gun/dlstreamer-yolov8-2023.0:latest
左滑查看更多
3、運(yùn)行容器
將之前設(shè)置 host 環(huán)境映射到容器內(nèi),并初始化容器內(nèi)環(huán)境。
$ docker run -it --rm --net=host -e no_proxy=$no_proxy -e https_proxy=$https_proxy -e socks_proxy=$socks_proxy -e http_proxy=$http_proxy -v ~/.Xauthority:/home/dlstreamer/.Xauthority -v /tmp/.X11-unix -e DISPLAY=$DISPLAY --device $DEVICE --group-add $DEVICE_GRP snake7gun/dlstreamer-yolov8-2023.0 /bin/bash $ source /home/dlstreamer/dlstreamer_gst/scripts/setup_env.sh
左滑查看更多
4、執(zhí)行多路示例
運(yùn)行示例,這里可以將 shell 腳本后的視頻文件替換為 IP 攝像頭 RTSP 地址,或是 webcam 的編號。由于gvawatermark模塊在 iGPU 上的性能表現(xiàn)要優(yōu)于meta_overlay ,而在 dGPU 上則相反,因此這里準(zhǔn)備了兩套 pipeline,分別為pipeline-igpu.sh 以及pipeline-dgpu.sh ,大家可以根據(jù)自己的硬件環(huán)境進(jìn)行切換。
$ cd dlstreamer_gst/demo/ $ ./pipeline-igpu.sh ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4 ~/TownCentreXVID.mp4
左滑查看更多
效果展示
本方案已經(jīng)在2023 年度的 Intel Innovation 大會上進(jìn)行了展示,該 demo 基于英特爾第 12 代酷睿 處理器的 iGPU 平臺,在 9 路 1080p h.265 攝像頭輸入的情況下,保證每路的實(shí)時(shí)分析性能可以達(dá)到 15fps,也就是大部分?jǐn)z像頭的幀率上限。
審核編輯:湯梓紅
-
英特爾
+關(guān)注
關(guān)注
60文章
9816瀏覽量
171114 -
視頻
+關(guān)注
關(guān)注
6文章
1925瀏覽量
72717 -
AI
+關(guān)注
關(guān)注
87文章
29359瀏覽量
267643 -
模型
+關(guān)注
關(guān)注
1文章
3058瀏覽量
48571 -
OpenVINO
+關(guān)注
關(guān)注
0文章
81瀏覽量
156
原文標(biāo)題:基于 DL Streamer 與 YOLOv8 模型實(shí)現(xiàn)多路視頻流實(shí)時(shí)分析 | 開發(fā)者實(shí)戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論