# 免費開源串流媒體分析工具Intel OpenVINO DL Streamer讓你也能成為智能影音分析大師
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAGZyxTc02yeLyHeNvfbSaAlMOp1TMrmeOBaw3e4ftSbOhFEzL0L2Q5P_J-y7J5VFTMHR06h6Be5yi05PM-XZo1UTY6WAcNoxmXC4UGnEpcQG-dZZNAbBmEmQxxdenD35-MbY_ZS9hcFfXC_Pb-uNAIYLujY5tRjOYPmjjz5pehCBD9s1-SGlWQwR7/s1653/20220926_DLStreamer_Fig_00.jpg)
時光飛逝,轉眼2022年也過了四分之三,Intel OpenVINO Toolkit (以下簡稱OpenVINO) 2022.1版也在今年作出不少重大變革,其中一項重要又實用的功能「**Deep Learning Streamer (以下簡稱DL Streamer)**」也有許多更新。假若各位看過小弟在2018年寫過的「[【Intel OpenVINO™教學】GStreamer串流影片智能分析不再慢吞吞─看Intel OpenVINO DL Stream如何加速影片推論](http://omnixri.blogspot.com/2021/02/intel-openvinogstreamerintel-openvino.html)」[1],相信應該會對這項工具有一些初步認識。如果您是剛入門的朋友,也不用太擔心,透過本文依序從「**什麼是DL Streamer**」、「**認識DL Streamer架構**」、「**如何安裝DL Streamer**」、「**DL Streamer小試身手**」及「**DL Streamer表現分析**」等小節的介紹,相信應該能更快速、深入了解OpenVINO這項好用的工具。
## 1. 什麼是DL Streamer
首先幫大家科普一下什麼是「**串流媒體(Streaming Media)**」。一般使用數位照相機或手機拍照時得到的是一張張靜態影像(Images),而使用數位錄影機或手機錄製視訊時得到的一段一段自帶聲音的動態視訊(Videos)或稱為視訊片段(Video Clips)。通常這兩類的數位媒體都會以檔案方式儲存在如硬碟、記憶卡等本地端儲存裝置,而靜態影像會以jpg, png等格式儲存,動態視訊(含聲音)則會以mp4, mov等格式儲存。以上這兩種用法多半是拍完後再使用播放器進行回播,若使用者想要從網路上查看一張數位照片時,大概還有耐心等影像傳完後再開啟觀賞,但若是一段較長的(如數百MB)數位視訊,則大概很少人有耐心等待數分鐘甚至數十分鐘讓視訊檔案傳完後再啟動播放軟體來觀看了。於是就有了一邊傳送、一邊播放的「串流媒體」技術出現了。
一般「串流媒體」分為供應端和接收端,供應端就像自來水廠或電廠,會一直源源不斷地提供水電,接收端就像家中的水管、電線,當打開水龍頭或電源開關時就有源源不斷的水電可用。通常在視訊串流供應端,會以穩定的速度連續取得特定解析度的數位影像進行傳送,如每秒30個影格(Frames) / FHD(1920 x 1080像素)解析度 / mp3聲音格式。但不幸地是我們的傳送通道(如ADSL/光纖有線網路,WIFI/4G/5G無線網路等)並沒有足夠大的頻寬來傳送這些大量的原始影像資料,就像水管不夠大,電線不夠粗的類似問題。所以在傳送前會以人眼或人耳難以辨識的破壞性壓縮編碼(Encoding)方式(如mp4/H.264/H.265等)來大幅降低資料資傳輸量,待用戶接收到這些訊號時,再以反向解壓縮解碼(Decoding)來取得接近原始影音品質的訊號。雖然上述作法解決了傳輸資料頻寬問題,但為了讓使用者能一面接收一面觀看視訊,所以接收端還要先緩衝一小段(如數秒)視訊後再開始播放,以免傳輸速度不穩定時,無法順暢的播放,就像自來水會先配送到大樓的水塔(緩衝區)再接到各個用戶家中(播放器)。
瞭解了「串流媒體」後,就不難理解為什麼在很多賣場、工廠甚至家中都裝設有大量的網路協議攝影機(Internet Protocol Camera, 以下簡稱IP Cam)提供串流媒體,來幫助大家進行即時同步的安全監控的工作了。為了方便大家架設及使用,很多廠商都有推出對應的軟體產品,而在開源世界中最知名的莫過於「GStreamer」這項工具了,它把錄製(含影像及聲音)、壓縮、傳送、解壓縮、播放等功能都包含在其中了,所以非常受到歡迎。傳統上有一些安全監控設備供應商會整合這些串流媒體工具用來開發一些中低階的智能安全監控軟體,完成如闖入、遺失、遺留、人流、人臉辨識等應用。隨著「深度學習」AI算法的普及加上邊緣運算硬體的推論能力提升,Intel也將此項概念整合進OpenVINO Toolkit中,結合GStreamer和OpenVINO的Runtime函式庫(2022.1以前版本稱為推論引擎Inference Engine, IE)推出「**DL Streamer**」,讓串流媒體不只可以同步監看,更能高效即時運行「影像分類」、「物件偵測」、「影像分割」、「姿態估測」等方面的邊緣智能影像分析。在OpenVINO 2022.1版後更加入對「聲音辨識」的功能,完整串流媒體影音的全方位智能分析能力。
## 2. 認識DL Streamer架構
如上一小節所述,DL Streamer 是一項基於 GStreamer 的開源串流媒體分析框架(Streaming Media Analytics Frame),它可適用於雲端和邊緣端串流媒體智能影音分析應用,主要包含下列三大項流水線(Pipeline)功能[2]:
* **DL Streamer Pipeline Framework**:用於設計、創建、建置和運行媒體分析流水線,它包含了C++和Python APIs。
* **DL Streamer Pipeline Server**:可將媒體分析流水線部署到一個或多個節點上擴展成微服務,包括REST APIs的管理。
* **DL Streamer Pipeline Zoo**:協助媒體分析流水線進行基準測試及優用,包括顯示可即時使用的目錄清單。
如Fig. 1所示,即為 DL Streamer 工作流水線示意圖。串流影音媒體可透過單隻或多隻 IP Cam 傳送到運行 DL Streamer 的硬體上,接著執行解碼(解壓縮)取得原始影音內容,再來將影像縮放截切到AI模型要求的大小後送去進行推論工作。由於串流媒體影像中的物件可能要經好幾個影格(frames)才有較明顯的移動,所以一直分析影像是很浪費硬體資源,同時也造成分析速度無法提升問題。因此有時會根據使用者設定,啟用「物件追蹤」功能,每隔幾個影格才進行推論一次,而中間的影格就使用計算量較低的追蹤算法來協助提升分析速度。當完成影像分析後,會依不同功能得到分類結果(分類名稱、置信度等)、物件資訊(位置、尺寸、內容等)、姿態節點(特徵點座標等)等文字或數字資訊。有時為了方便使用者觀看,會將以上資訊以繪圖方式將線、框、文字等內容重新繪回原影像上。最後可依不同需求採取即時顯示或發出警報,亦可儲存完整/部份結果影像或數據到本地或雲端儲空間,方便後續進行查詢使用。當然為了節省儲存空間,通常也是會使用通用壓縮(編碼)格式(如mp4, H.264, H.265等)來儲存。
從Fig.1的下方側說明,還可了解到在工作流水線的每個步驟可以使用到的運算資源是不同的。在前後段的編碼/解碼(COdeing / DECoding, CODEC)部份和一般多媒體影音編輯/存儲都類似,所以大部份都可使用硬體(GPU, CPU內專用CODEC)來加快編解碼處理速度。而推論部份 OpenVINO 可以支援 Intel 全系列硬體(CPU, iGPU, VPU, FPGA)來進行加速運算,若啟用物件追蹤功能則可使用 CPU / iGPU 來處理,最後一些後處理部份,如結果影像繪圖、文字輸出等工作較無加速處理需求,則使用 CPU 即可。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9jEMNQV4xjXRyQ_XPN6lhfYcl6ed_Qu0BY5SmlJ52gz7MjzGn_xjY6BKZKfKtAEFujDIw1f1_BWaqtDeWe9VcveB_JBTpjJ_wP1Hh8QhmAYkaYOgyuW-uciLFkNrxKdLT69NMEmNgqAsHTAkyoGWzd0VsFILQ_tQARiU4T_VKzTycOj9J7x9-5SBc/s1658/20220926_DLStreamer_Fig_01.jpg)
Fig.1 Intel DL Streamer工作流水線示意圖。[2](OmniXRI整理製作, 2022/9/26)
接下來範單說明一下 DL Streamer 的軟體元件堆疊架構。如Fig. 2所示,最底層是 Intel 的硬體負責執行程式碼及加速運算工作,包含有 CPU (含 Core i, Atom, Xeon系列), iGPU (含內顯 HD Graphics, Xe, 外顯 Iris Xe 系列), VPU (Movidius Myriad X, 含 NCS2 )及 FPGA (Arria)。往上一層是相依的軟體函式庫負責將特定功能(如AI, 影像處理)整合成一獨立函式庫供上層軟體呼叫應用,如 Intel One API, OpenVINO 和第三方的 OpenCV 等。再往上一層則會視不同用途而有不同的堆疊,包含雲端及邊緣微服務、流水線及應用程式及系統評估基線測試等。其中又以流水線框架為最重要部份,它負責硬體影音編解碼、推論加速、中繼資料及訊息匯流排及 C++ / Python APIs 等,同時向下整合 OpenVINO,以利直接使用多種預訓練或其它框架轉換過來的模型。在這個部份向上會和GStreamer充份整合,讓外界在呼叫使用時相容性更高。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiniBxNtTB0EwbP4T-O2f4i3n4YaCNUkIhqszgx8Hc_oQBHG74I9bAZFGKdobMywcabUyY3UJabqR6EWZQyArPMSrexsd7IfvdSltRILQUIxqbKRixfYSap8B_K48vPZoHeCXbk5gUAc7EogCDhdA7sIC1eqN45C29JNI96hmLndjE-1T10DwWy91tm/s1658/20220926_DLStreamer_Fig_02.jpg)
Fig. 2 Intel OpenVINO 及 DL Streamer 軟體元件堆疊示意圖。[2](OmniXRI整理製作, 2022/9/26)
## 3. 如何安裝DL Streamer
在 OpenVINO 2022.1版後為加快安裝及部署工作,已將 DL Streamer 及一些推論時較不會用到的工具從快速安裝包中移除了,若有需要則須由使用者參考官方說明文件[3]另行安裝。目前支援在 Ubuntu (Linux) 下以APT, Docker方式安裝,當然也可以下載源碼自行編譯,對於 Windows 安裝(仍在預覽 Preview 階段),主要支援 Docker 安裝和下載源碼自行編譯。
雖然官方有提供很完整的安裝說明,但仍有許多坑要填,尤其在Windows WSL2中所產生的圖形化使用者介面 (GUI) 問題。這裡另外幫大家整理了一份「[如何在Windows安裝Linux(WSL2+Ubuntu)及Docker來執行OpenVINO和DL Streamer](https://omnixri.blogspot.com/2022/09/windowslinuxwsl2ubuntudockeropenvinodl.html)」[4],方便大家在 Windows 上安裝 Docker 來運行 OpenVINO 2022.1 和 DL Streamer,同時解決以往在 WSL2 上無法調用 GUI 和 Intel GPU 算力資源的問題,其架構及流程如Fig. 3所示。這裡特別提醒,如果是使用 Win 10 的朋友,一定要記得將版本更新到 21H2 (OS建置 19000.x 以上),以免遇到安裝問題。如果你的電腦已經是安裝 Ubuntu 桌面作業環境,建議還是閱讀一下這篇文章,以便了解 Docker 安裝上會遇到的問題。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ1ddmNUY_HkCcenkevV7BE-yJf9M9Qf4xb_kTAQdGoVgsQILP04ymCrA30TgxM1fCOqC1ctjz0hecIqDF52g5IyRfIl2xWBTIx7HSpNgVSl0nKzHKs06ZD4b41m9ozu_gzwjAZ2QsOS3rd7yoFRWLJ6mhpfLh3PcnZJ6bzxRNC_EPxjXLxkW2FeES/s1658/20220926_DLStreamer_Fig_03.jpg)
Fig. 3 在 Windows 配合 WSL2 + Ubuntu 安裝 Docker 運行 OpenVINO 及 DL Streamer 示意圖。[4](OmniXRI整理製作, 2022/9/21)
## 4. DL Streamer小試身手
### 4.1 以Docker安裝啟動DL Streamer
如[4]介紹,以Docker安裝完 DL Streamer 後,就可以拿幾個官方提供的範例程式來練練手了。如下列所示指令進行操作,首先進到 Ubuntu 命令列模式下,啟動 Docker 環境並運行 dlstrermer 映像檔。此時提示符號應會變成「dlstreamer@xxxxxx:~$」表示成功進入Docker環境。這裡提供簡易及完整兩種執行 Docker 環命令,只需擇一運行即可。
```bash
# 若使用 WSL2 + Ubuntu 桌面環境的命令列工具進入時要記得把使用者從 root 切換到正確的使用者名稱
# su user_name
cd ~
# 允許連接到 X Server
xhost local:root
setfacl -m user:1000:r ~/.Xauthority
# 啟動 Docker
sudo systemctl start docker
# 運行 DL Streamer Image (簡易指令),可加入 --user root 權限,方便後續執行 apt install 等指令
sudo docker run -it --rm --user root dlstreamer/dlstreamer:devel /bin/bash
# 運行 DL Streamer Image (完整指令), 若使用桌機而不是WSL2+虛擬顯示器則將顯示裝置改成 --device /dev/dri
sudo docker run -it --privileged --net=host \
--device /dev/dxg \
-v ~/.Xauthority:/home/dlstreamer/.Xauthority \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
-v /dev/bus/usb \
--rm --user root dlstreamer/dlstreamer:devel /bin/bash
```
再來就可以切換到 DL Streamer 的工作目錄,進到 samples 路徑進行練習。為了方便後續範例程式的運行,這裡可以執行批次檔(download_models.sh)一口氣把所需的模型一起下載到 /home/dlstreamer/intel/dl_streamer/models 路徑下。在運行 OpenVINO 或 DL Streamer之前不要忘了設定環境變數,以免相關程式運行時找不到對應路徑。再來就可以到 /samples/gts_launch 下執行各個範例了。若想對各個範例有更進一步了解,含參數使用,可查閱各範例中的 README.md。
```bash
# 設定 OpenVINO 和 DL Streamer 環境變數
source /opt/intel/openvino_2022/setupvars.sh
source /opt/intel/dlstreamer/setupvars.sh
# 切換到DL Streamer範例程式路徑
cd /opt/intel/dlstreamer/samples
# 進行模型下載
./download_models.sh
# 檢視下載到的模型路徑
ls /home/dlstreamer/intel/dl_streamer/models
# 進入 /samples/gts_launch 執行各個範例
# 進到各自範例路徑執行和路徑同名之批次檔(./*.sh),如下範例
cd gts_launch
cd audio_detect
./audio_detect.sh
```
其中下載的模型清單如下所示,即 /samples/model.lst 檔案中所定義的內容。如Fig. 4,為幾個常見的視訊串流媒體智能分析應用執行畫面。
* face-detection-adas-0001 人臉偵測
* age-gender-recognition-retail-0013 年齡、性別辨識
* emotions-recognition-retail-0003 情緒辨識
* landmarks-regression-retail-0009 人臉特徵點辨識
* facial-landmarks-35-adas-0002 人臉特徵點辨識
* person-vehicle-bike-detection-2004 行人、汽車、腳踏車偵測
* person-attributes-recognition-crossroad-0230 行人屬性辨識
* vehicle-attributes-recognition-barrier-0039 汽車屬性辨識
* head-pose-estimation-adas-0001 人頭姿態估測
* human-pose-estimation-0001 人體姿態估測
* aclnet 生活中常見53種環境聲音辨識(ESC-50 + 3)
* action-recognition-0001-encoder 行為辨識編碼器
* action-recognition-0001-decoder 行為辨識解碼器
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfQeaE1BbKTBApIkQZwkCzialXF_71da0dk5-Q5yRtgmo5b1dATC5-yvCkQJss2gLruBXDlioAlOKtys2n5KfQ4nqsu_ElFzI6jIf_H5GO7u-u9m0dQUpjgAnwFKNnoG0jl8jDza_Yr3v1yzAKJkmLXPQBHxAQr1BytNuBitSH5kxVot-HJ2VmsjmG/s1658/20220926_DLStreamer_Fig_04.jpg)
Fig. 4 Intel OpenVINO DL Streamer 相關範例運行畫面圖。(OmniXRI整理製作, 2022/9/26)
當然DL Streamer支援的模型不只這些範例內容,更多已支援的 Intel, Public, Model Zoo 預訓練模型清單,可參見官方說明文件[5]。
### 4.2 以APT安裝啟動DL Streamer
原本以為已透過[4]的說明方式解決了 GUI 及 iGPU 運行問題,Docker 也能順利運行起來,但實測相關範例後發覺,目前官方提供的Docker Hub Images (dlstreamer/dlstreamer) 對於視訊和影像顯示相關範例仍有些許不順,連附帶的OpenCV cv2.imshow() 函式也無法運作。即便在桌機純Ubuntu + Docker下運作也有類似問題,所以建議改用 APT 安裝方式來解決這些問題,不用使用 Docker 安裝。以下就簡單說明安裝步驟。
```bash
# 首先退出 Docker 環境,重新回到使用者根目錄
exit
cd ~
# 更新系統並下載相依套件
sudo apt-get update && sudo apt-get install curl gpg-agent software-properties-common
# 登錄 OpenVINO toolkit APT repository
curl https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | sudo apt-key add -
echo "deb https://apt.repos.intel.com/openvino/2022 `. /etc/os-release && echo ${UBUNTU_CODENAME}` main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2022.list
# 安裝 OpenVINO toolkit 建議版本的 OpenCL 驅動程式
sudo apt-get update && sudo apt-get install openvino-libraries-dev-2022.1.0
sudo -E /opt/intel/openvino_2022/install_dependencies/install_NEO_OCL_driver.sh
# 安裝 Intel DL Streamer 流水線框架和建議版本的多媒體驅動程式
sudo apt-get update && sudo apt-get install intel-dlstreamer-dev
sudo -E /opt/intel/dlstreamer/install_dependencies/install_media_driver.sh
# 設置 OpenVINO 及 DL Streamer 工作環境變數
source /opt/intel/openvino_2022/setupvars.sh
source /opt/intel/dlstreamer/setupvars.sh
# 這兩項為選配功能可不安裝,主要包括 MQTT 和 KAFKA
sudo -E /opt/intel/dlstreamer/install_dependencies/install_mqtt_client.sh
sudo -E /opt/intel/dlstreamer/install_dependencies/install_kafka_client.sh
# 登錄 Intel oneAPI APT repository
sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main"
# 安裝完整 DL Streamer 開發者套件包,含 CPU / GPU Runtime, C++ / Python bindings, samples及其它開發工具
sudo apt-get update && sudo apt-get install intel-dlstreamer-dev
```
以APT方式完成安裝後,就可依[4]建立好的 python 虛擬環境和已安裝的 openvino-dev來運行 DL Streamer 範例程式。首先一樣要先去下載 DL Streamer 所需的模型,但是這裡和剛才 Docker 的動作有所不同。剛才下載好的模型,當結束 Docker 環境時,會全部清空,下次再進入時又要重新下載。而這裡下載到的模型會一直保留在 ~/intel/dl_streamer/models 路徑下,不會因離開 WSL2 或 Ubuntu 環境時就會消失。下次進入時就可直接使用模型,不用重新下載。
```bash
# 回到根目錄
cd ~
# 進入python openvino_env 虛擬環境
source openvino_env/bin/activate
# 設置 OpenVINO 及 DL Streamer 工作環境變數
source /opt/intel/openvino_2022/setupvars.sh
source /opt/intel/dlstreamer/setupvars.sh
# 切換路徑到 DL Streamer 範例路徑下執行下載所有模型批次檔(只需下載一次,之後再重新進入開發環境時就不用再執行此命令)
cd /opt/intel/dlstreamer/samples
./download_models.sh
# 檢視下載到的模型路徑
ls ~/intel/dl_streamer/models
# 進入 /samples/gts_launch 執行各個範例
# 進到各自範例路徑執行和路徑同名之批次檔(./*.sh),如下範例
cd gts_launch
cd human_pose_estimation
./human_pose_estimation.sh
```
完成上述工作後,進到各範例程式路徑下,就可以順利運行執行有影片串流媒體的範例程式了。
## 5. DL Streamer範例說明
接下來就分別以一個影片中人物的姿態(骨架)偵測和生活中常見53種環境聲音辨識的範例來說明 DL Streamer 的用法。而其工作流程大致相同,可參考Fig. 1說明。
### 範例 5-1 姿態估測
如下列指令所示,即可運行範例,這裡分別使用CPU和iGPU進行測試,運行結果如Fig. 5所示。根據[6]的完整說明可得知,這個範例主要使用了下列程序。
* **filesrc** 輸入影像,這裡可支援本地影片檔案(*.mp4等)、串流影像網址(URL)或本機網路攝影機(Web-Camera)
* **decodebin** 負責視訊解碼
* **videoconvert** 負責視訊轉換,主要進行色彩格式轉換(RGB ⇆ BGR)
* **gvaclassify** 對影像使用OpenPose進行完整推論及後處理
* **gvawatermark** 在影像上繪製點、線、文字
* **autovideosink** 將結果影像渲染(Render)到視窗,搭配 sync=false 採用非同步處理,可增加整體流水線的工作效率
在推論模型上,選用了預先訓練好的 human-pose-estimation-0001 來偵測人體姿態上主要關節點位置。而相關節點的名稱則定義在 /model_proc/human-pose-estimation-0001.json 中。
這個範例提供下列三個輸入參數,亦可完全不輸入採用預設參數運行。
- **[INPUT_VIDEO]** 指定輸入影片名稱,可為檔案名稱(如 *.mp4)、本機網路攝影機(如 /dev/video0)及遠端IP Camera或串流媒體網址(如rtsp://, http://)
- **[DEVIDE]** 指定推論裝置,如CPU, GPU(Intel 內顯HD Grapics或外顯 Iris Xe)
- **[SINK_ELEMENT]** 指定結果顯示方式,可在畫面上(display)或只以文字輸出速度(fps)
更完整的指令下達方式可參考[6]下 human_pose_estimation.sh 原始內容。
```bash
# 進入姿態估測範例程式路徑
cd /opt/intel/dlstreamer/samples/human_pose_estimation
# 採用預設參數運行範例
./human_pose_estimation.sh
# 採用完整參數運行範例
# ./human_pose_estimation.sh [INPUT_VIDEO] [DEVICE] [SINK_ELEMENT]
./human_pose_estimation.sh https://github.com/intel-iot-devkit/sample-videos/raw/master/face-demographics-walking.mp4 CPU display
```
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3sdsvflyWOjPcssIqJWMm2IyYgTDAKjoZlRwwG5vhflXUCDle7BRaDNM7ESXnlqpaz9vGTSaDvrtlQMBY-cAMctjiBuzjcPiep0xmcGkD1BnaTm_auSzORnOnrheRX-EEov5UztOPSlxnc5VKdYGTiWQQo_5x0KuOvByFYa-KgAh2GfV06bwMTQde/s1658/20220926_DLStreamer_Fig_05.jpg)
Fig. 5 串流媒體執行姿態估測範例結果圖。(OmniXRI整理製作, 2022/9/26)
### 範例 5-2 聲音辨識
在以往的 OpenVINO 版本中對於聲音的處理及辨識較為缺乏,在2022.1版後加入了許多相關應用模型及範例。其中在 DL Streamer 中也提供了生活中常見53種環境聲音辨識,這裡主要是使用了ESC-50環境音公開資料集[7](如動物叫聲、自然環境聲、人類非語音聲音、室內聲響、戶外噪音,五大類共50種),另外加上槍聲、群眾聲及人說話聲共53種。
和範例5-1的操作類似,依下指令操作即可運行本範例,運行結果如Fig. 6所示。這個範例中使用了一個人聲檔案「how_are_you_doing.wav」,其內容就是有一個男生聲音說了一句約三秒鐘長度的「How are you doing」,所以當聲音檔丟進模型進行推論時,應該會得到分類編號(label_id) 52 的「Speech」。可是從Fig. 6中可看出,前幾個測試結果明顯被分錯,這是因為講話的聲音較長,程式會先將聲音切成一小段一小段再分類。而每一小段長度為1秒、取樣頻率為16KHz,若以1奈秒 (ns, 10^-9 second)表示時,則長度為 1,000,000,000。為完成所有長度(3秒多)的分類,所以每次位移0.2秒(長度為 200,000,000)再重新取1秒資料進行分類,因此前幾次被辨識錯誤的機率就提高了,但整體來看,大部份分類都是正確的。
根據[8]的完整說明可得知,這個範例主要使用了下列程序。
* **filesrc / urisourcebin** 輸入聲音,這裡可支援本地影片檔案(*.mp4等)或串流聲音資料來源網址(URL)。
* **decodebin** 負責音訊解碼
* **audioresample, audioconvert, audiomixer** 負責輸人聲音訊號的轉換及重新取樣
* **gvaaudiodetect** 使用ACLNet進行聲音分類或稱事件偵測
* **gvametaconvert** 將ACLNet偵測到的結果轉換成JSON格式方便後續處理及顯示
* **gvametapublish** 將偵測結果輸出以文字串方式顯示到螢幕
* **fakesink** 負責結束流水線工作
在推論模型上,選用了預先訓練好的 aclnet_des_53_fp32.onnx 來偵測人生活中常見53種環境聲音。而相關分類的名稱則定義在 /model_proc/aclnet.json 中。
這個範例只需提供一個輸入參數,亦可完全不輸入採用預設參數運行。
- **[INPUT_PATH]** 指定輸入影片名稱,可為檔案名稱(如 *.wav)及串流媒體網址(如http://)
更完整的指令下達方式可參考[8]下 audio_event_detection.sh 原始內容。
```bash
# 進入聲音辨識例程式路徑
cd /opt/intel/dlstreamer/samples/audio_detection
# 採用預設參數運行範例
./audio_event_detection.sh
# 採用完整參數運行範例
# ./audio_event_detection.sh [INPUT_PATH]
./audio_event_detection.sh ./how_are_you_doing.wav
```
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC1K9J6ak7JCBGfKgEf-pDfk3AAM_eq5rP78_E9SaQDEeO97N0dK1vEdwWCUX0sMhCJnod4dqhyL3z5KHWpRKJybZBj3pJLqUQeIvMvNh5WRFk1o6FVD4f1dPVwJ3seROZanoo-E4rs5o5jL3MxQwkU-H_3p9e6-AI9cWwPTE9XQXaMPzla_-M9RzK/s1658/20220926_DLStreamer_Fig_06.jpg)
Fig. 6 生活中常見53種環境聲音辨識結果圖。(OmniXRI整理製作, 2022/9/26)
最後如果想對更多的GStreamer Elements有更進一步了解,可參考官方說明文件[9]。
## 6. DL Streamer教學影片
如果大家還想更進一步了解DL Streamer,Intel在Youtube也有開了一個OpenVINO Toolkit的教學影片專區,其中關於GStreamer有兩隻影片和DL Streamer部份有四隻影片,如下所示,大家可以參考一下。
* [Full Pipeline Simulation Using GStreamer | OpenVINO™ toolkit | Ep. 47 | Intel Software](https://youtu.be/fWhPV_IqDy0)
* [Full Pipeline Simulation Using GStreamer Samples | OpenVINO™ toolkit | Ep. 48 | Intel Software](https://youtu.be/EqHznsUR1sE)
* [OpenVINO DL Streamer messaging | OpenVINO™ toolkit | Ep. 63 | Intel Software](https://youtu.be/TiSj-TX47Ls)
* [DL Streamer Tracking Element | OpenVINO™ toolkit | Ep. 64 | Intel Software](https://youtu.be/z4Heorhg3tM)
* [Multi-sensor Pipelines Using DL-streamer | OpenVINO™ toolkit | Ep. 65 | Intel Software](https://youtu.be/ek6URdbW98s)
* [DL-Streamer Python Custom Element | OpenVINO™ toolkit | Ep. 66 | Intel Software](https://youtu.be/SDGE9Vyd-bY)
## 小結
以往要完成串流影音媒體即時智慧分析是非常耗時耗力的,更不要說要同時支援成千上百隻串流媒體網路攝影機(IP Cam)。因此當有了Intel OpenVINO + DL Streamer後,IP Cam馬上就變身為Smart Cam,除了能保有原來的即時遠端觀看功能外,還能輕鬆的加上影像辨識等邊緣智慧應用項目,有效提升辨識效率,一舉多得。尤其是OpenVINO 2022.1版的DL Streamer,更加強了聲音部份的處理及辨識功能,完整了串流媒體的影音即時辨識能力。接下來Intel OpenVINO + DL Streamer還能玩出什麼新花樣,就靠大家各憑本事、發揮創意了。
## 參考文獻
[1] 許哲豪,【Intel OpenVINO™教學】GStreamer串流影片智能分析不再慢吞吞─看Intel OpenVINO DL Stream如何加速影片推論
http://omnixri.blogspot.com/2021/02/intel-openvinogstreamerintel-openvino.html
[2] Intel, DL Streamer Documentation
https://dlstreamer.github.io/
[3] Intel, DL Streamer Documentation - Install Guide
https://dlstreamer.github.io/get_started/install/install_guide_index.html
[4] 許哲豪,如何在Windows安裝Linux(WSL2+Ubuntu)及Docker來執行OpenVINO和DL Streamer
https://omnixri.blogspot.com/2022/09/windowslinuxwsl2ubuntudockeropenvinodl.html
[5] Intel,DL Streamer Documentation - Supported Models
https://dlstreamer.github.io/supported_models.html
[6] Intel, Github - dlstreamer/dlstreamer - Human Pose Estimation Sample (gst-launch command line)
https://github.com/dlstreamer/dlstreamer/tree/master/samples/gstreamer/gst_launch/human_pose_estimation
[7] Karol J. Piczak, Github - karolpiczak/ESC-50 - ESC-50: Dataset for Environmental Sound Classification
https://github.com/karolpiczak/ESC-50
[8] Intel, Github - dlstreamer/dlstreamer - Audio Detection Sample (gst-launch command line)
https://github.com/dlstreamer/dlstreamer/tree/master/samples/gstreamer/gst_launch/audio_detect
[9] Intel, DL Streamer Documentation - Elements
https://dlstreamer.github.io/elements/elements.html
## 延伸閱讀
[A] 許哲豪,OpenVINO 2022大改版讓Edge AI玩出新花樣
http://omnixri.blogspot.com/2022/08/openvino-2022edge-ai.html
[B] 許哲豪,有了OpenVINO 2022 PrePostProcessor APIs影像推論就更有效率了
http://omnixri.blogspot.com/2022/08/openvino-2022-prepostprocessor-apis.html
[C] 許哲豪,使用PyPi (pip install) 安裝Intel OpenVINO 2022.1填坑心得
http://omnixri.blogspot.com/2022/08/pypi-pip-install-intel-openvino-20221.html