0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DL Streamer與YOLOv8模型實(shí)現(xiàn)多路視頻流實(shí)時(shí)分析

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 2023-10-20 11:17 ? 次閱讀

作者:楊亦誠英特爾AI軟件工程師

作為眾多 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ù)制鏈接到瀏覽器打開)

7e3321e2-6ea0-11ee-939d-92fbcf53809c.png

圖1:典型的視頻分析系統(tǒng)流水線

Intel DL Streamer 工具套件

DL Streamer 是一套開源的流媒體分析系統(tǒng)框架,它基于著名的 GStreamer 多媒體框架所打造,可以幫助開發(fā)者快速構(gòu)建復(fù)雜的媒體分析流水線。開發(fā)者只需要通過命令行的方式就可以輕松完成一套支持多路的分析系統(tǒng)搭建。此外,在這個(gè)過程中,DL Streamer 會幫助我們將每個(gè)模塊部署在指定的硬件加速平臺,以獲得更好的性能與更高的資源利用率。

7e3f46d4-6ea0-11ee-939d-92fbcf53809c.png

圖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像頭的幀率上限。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 英特爾
    +關(guān)注

    關(guān)注

    60

    文章

    9816

    瀏覽量

    171114
  • 視頻
    +關(guān)注

    關(guān)注

    6

    文章

    1925

    瀏覽量

    72717
  • AI
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于YOLOv8實(shí)現(xiàn)自定義姿態(tài)評估模型訓(xùn)練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態(tài)評估模型,實(shí)現(xiàn)在自定義數(shù)據(jù)集上,完成自定義姿態(tài)評估模型的訓(xùn)練與推理。
    的頭像 發(fā)表于 12-25 11:29 ?2619次閱讀
    基于<b class='flag-5'>YOLOv8</b><b class='flag-5'>實(shí)現(xiàn)</b>自定義姿態(tài)評估<b class='flag-5'>模型</b>訓(xùn)練

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】yolov8模型轉(zhuǎn)換

    嘗試將最新的yolov8模型轉(zhuǎn)換為愛芯派的模型。 環(huán)境準(zhǔn)備 準(zhǔn)備Docker環(huán)境 首先自己在任意機(jī)器上準(zhǔn)備好docker環(huán)境,詳細(xì)步驟見官網(wǎng)。 Docker 鏡像文件 準(zhǔn)備 yolo8
    發(fā)表于 11-20 12:19

    使用YOLOv8做目標(biāo)檢測和實(shí)例分割的演示

    YOLOv8是來自Ultralytics的最新的基于YOLO的對象檢測模型系列,提供最先進(jìn)的性能。
    的頭像 發(fā)表于 02-06 10:11 ?7136次閱讀

    YOLOv8自定義數(shù)據(jù)集訓(xùn)練到模型部署推理簡析

    如果你只是想使用而不是開發(fā),強(qiáng)烈推薦通過pip安裝方式獲取YOLOv8包!YOLOv8安裝命令行
    的頭像 發(fā)表于 03-24 09:27 ?4496次閱讀

    TensorRT 8.6 C++開發(fā)環(huán)境配置與YOLOv8實(shí)例分割推理演示

    YOLOv8實(shí)例分割TensorRT 推理代碼已經(jīng)完成C++類封裝,三行代碼即可實(shí)現(xiàn)YOLOv8對象檢測與實(shí)例分割模型推理,不需要改任何代碼即可支持自定義數(shù)據(jù)訓(xùn)練部署推理
    的頭像 發(fā)表于 04-25 10:49 ?5449次閱讀
    TensorRT 8.6 C++開發(fā)環(huán)境配置與<b class='flag-5'>YOLOv8</b>實(shí)例分割推理演示

    在AI愛克斯開發(fā)板上用OpenVINO?加速YOLOv8目標(biāo)檢測模型

    《在 AI 愛克斯開發(fā)板上用 OpenVINO 加速 YOLOv8 分類模型》介紹了在 AI 愛克斯開發(fā)板上使用 OpenVINO 開發(fā)套件部署并測評 YOLOv8 的分類模型,本文將
    的頭像 發(fā)表于 05-12 09:08 ?1204次閱讀
    在AI愛克斯開發(fā)板上用OpenVINO?加速<b class='flag-5'>YOLOv8</b>目標(biāo)檢測<b class='flag-5'>模型</b>

    YOLOv8版本升級支持小目標(biāo)檢測與高分辨率圖像輸入

    YOLOv8版本最近版本又更新了,除了支持姿態(tài)評估以外,通過模型結(jié)構(gòu)的修改還支持了小目標(biāo)檢測與高分辨率圖像檢測。原始的YOLOv8模型結(jié)構(gòu)如下。
    的頭像 發(fā)表于 05-16 11:14 ?1.2w次閱讀
    <b class='flag-5'>YOLOv8</b>版本升級支持小目標(biāo)檢測與高分辨率圖像輸入

    AI愛克斯開發(fā)板上使用OpenVINO加速YOLOv8目標(biāo)檢測模型

    《在AI愛克斯開發(fā)板上用OpenVINO加速YOLOv8分類模型》介紹了在AI愛克斯開發(fā)板上使用OpenVINO 開發(fā)套件部署并測評YOLOv8的分類模型,本文將介紹在AI愛克斯開發(fā)板
    的頭像 發(fā)表于 05-26 11:03 ?1140次閱讀
    AI愛克斯開發(fā)板上使用OpenVINO加速<b class='flag-5'>YOLOv8</b>目標(biāo)檢測<b class='flag-5'>模型</b>

    教你如何用兩行代碼搞定YOLOv8各種模型推理

    大家好,YOLOv8 框架本身提供的API函數(shù)是可以兩行代碼實(shí)現(xiàn) YOLOv8 模型推理,這次我把這段代碼封裝成了一個(gè)類,只有40行代碼左右,可以同時(shí)支持
    的頭像 發(fā)表于 06-18 11:50 ?2845次閱讀
    教你如何用兩行代碼搞定<b class='flag-5'>YOLOv8</b>各種<b class='flag-5'>模型</b>推理

    三種主流模型部署框架YOLOv8推理演示

    深度學(xué)習(xí)模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對YOLOv5~YOLOv8的系列模型,均可以通過C+
    的頭像 發(fā)表于 08-06 11:39 ?2485次閱讀

    如何修改YOLOv8的源碼

    很多人也想跟修改YOLOv5源碼一樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的,然后就直接從master/main下面把源碼克隆出來一通
    的頭像 發(fā)表于 09-04 10:02 ?1814次閱讀
    如何修改<b class='flag-5'>YOLOv8</b>的源碼

    YOLOv8實(shí)現(xiàn)任意目錄下命令行訓(xùn)練

    當(dāng)你使用YOLOv8命令行訓(xùn)練模型的時(shí)候,如果當(dāng)前執(zhí)行的目錄下沒有相關(guān)的預(yù)訓(xùn)練模型文件,YOLOv8就會自動下載模型權(quán)重文件。這個(gè)是一個(gè)正常
    的頭像 發(fā)表于 09-04 10:50 ?1012次閱讀
    <b class='flag-5'>YOLOv8</b><b class='flag-5'>實(shí)現(xiàn)</b>任意目錄下命令行訓(xùn)練

    基于YOLOv8的自定義醫(yī)學(xué)圖像分割

    YOLOv8是一種令人驚嘆的分割模型;它易于訓(xùn)練、測試和部署。在本教程中,我們將學(xué)習(xí)如何在自定義數(shù)據(jù)集上使用YOLOv8。但在此之前,我想告訴你為什么在存在其他優(yōu)秀的分割模型時(shí)應(yīng)該使用
    的頭像 發(fā)表于 12-20 10:51 ?672次閱讀
    基于<b class='flag-5'>YOLOv8</b>的自定義醫(yī)學(xué)圖像分割

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8模型部署與推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?1199次閱讀
    基于OpenCV DNN<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>YOLOv8</b>的<b class='flag-5'>模型</b>部署與推理演示

    使用NVIDIA JetPack 6.0和YOLOv8構(gòu)建智能交通應(yīng)用

    進(jìn)行視頻數(shù)據(jù)的接收與存儲;借助 YOLOv8 和 DeepStream AI 感知服務(wù)實(shí)現(xiàn)實(shí)時(shí)目標(biāo)檢測和車輛追蹤;車輛移動的時(shí)空分析。在構(gòu)建好這一流程后,將利用 API 生成
    的頭像 發(fā)表于 08-23 16:49 ?328次閱讀
    使用NVIDIA JetPack 6.0和<b class='flag-5'>YOLOv8</b>構(gòu)建智能交通應(yīng)用