01、背景介紹

隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,實時視頻分析技術(shù)已應(yīng)用于智能物聯(lián)網(wǎng)的各個領(lǐng)域,例如:智能零售、智能工廠、智能監(jiān)控等,如果把視頻比作物聯(lián)網(wǎng)的眼睛,那么實時視頻分析技術(shù)就是物聯(lián)網(wǎng)的大腦。
目前基于深度學習以及計算機視覺的視頻分析是最通用的方式。

以物聯(lián)網(wǎng)技術(shù)中非常通用的場景-物體識別技術(shù)為例,如圖是典型的物體識別的流程圖,在前端采集一段視頻流,再將物體識別出來,對所識別的物體進行標注,再進行回傳顯示,需要經(jīng)過很多復雜的步驟,其中需要調(diào)用很多接口。同樣還會涉及到顏色空間轉(zhuǎn)換、縮放、推理、以及編解碼的過程,這些過程都需要占用很大的計算資源。
同時在實際環(huán)境中如果有CPU,GPU,VPU等多種計算資源,如何讓編解碼以及推理等過程充分利用不同的計算資源從而提升系統(tǒng)性能?此外,當系統(tǒng)需要應(yīng)對更多的流分析任務(wù)時,如何進行方便快速地擴展。這些都是實時分析系統(tǒng)會碰到的問題。接下來我們從這些問題出發(fā)來介紹OWT(Open WebRTC Toolkit)如何解決實時分析系統(tǒng)的復雜性,性能以及擴展問題。OWT的實時分析系統(tǒng)是基于英特爾的OpenVINO以及開源的GStreamer框架進行開發(fā),我們先對OpenVINO,GStreamer以及OWT做個簡單的介紹。

02、英特爾 vision computing platform
Open VINO是英特爾推出的pipeline的工具集,具有完成算法、模型部署所需要的各種能力。
從圖中可以看出,其主要由兩部分組成:模型優(yōu)化器(Model Optimizer),可以把在其它框架下已經(jīng)訓練好的模型轉(zhuǎn)換為Open VINO所適用的模型再進行優(yōu)化,轉(zhuǎn)換速度較快;推理引擎(Inference Engine),即在設(shè)備上運行的AI負載在做推理時,可以將我們所需要的處理效果例如前處理、后處理、特征疊加等,通過Open VINO接口的形式方便的實現(xiàn)。
而且Open VINO 中還可以支持多種模型,目前已經(jīng)提供有150多種訓練好的模型供用戶直接使用?梢栽贠pen Model Zoo(https://docs.openvinotoolkit.org/2019_R1/_docs_Pre_Trained_Models.html)的網(wǎng)站查看具體支持的模型。另外OpenVINO在Intel平臺進行優(yōu)化,提升計算機視覺相關(guān)深度學習性能達19倍以上,可以充分利用相應(yīng)的計算資源。

另外OWT使用GStreamer框架。GStreamer 是一個高度模塊化的管線驅(qū)動式媒體框架,大概從2002年開始發(fā)布第一個版本,一直到現(xiàn)在還在不斷更新。特別是AI時代,由于其靈活性及可擴展性,GStreamer在AI領(lǐng)域應(yīng)用也比較廣泛,目前已有很多豐富的AI插件,可以提供各種功能。
目前已經(jīng)推出支持Open VINO的GStreamer插件gst-video-analytics, 提供了推理,監(jiān)測及分類等多種功能的插件,詳見https://github.com/opencv/gst-video-analytics/wiki/Elements。
OWT視頻分析系統(tǒng)給用戶提供了方便的接口,用戶可自行組合不同的GStreamer plugin來實現(xiàn)不同的分析任務(wù)。
面向WebRTC的英特爾協(xié)同開發(fā)套件,從2014年發(fā)布第一個版本到現(xiàn)在已經(jīng)是4.3.1版本,隨著時間版本不斷在演進,2019年進行了開源,開源后成為OWT(Open WebRTC Toolkit),在Github地址https://github.com/open-webrtc-toolkit/owt-server。

如圖是OWT的整體框架,OWT不僅向服務(wù)器端提供了非常豐富的功能, 也實現(xiàn)了大范圍的客戶端支持,保證各種流的接入。在服務(wù)器端有Streaming、Conferencing、Transcoding、Analytics四大功能,都是在視頻端常用的功能。
客戶端支持JavaScript、Android、IOS、Windows、Linux系統(tǒng),保證用戶的流可以通過不同的傳輸協(xié)議,例如WebRTC協(xié)議、RTSP協(xié)議、RTMP、HLS、SIP協(xié)議,傳統(tǒng)領(lǐng)域應(yīng)用的傳輸協(xié)議都可以將流接入OWT系統(tǒng),進行分析,再傳輸。
同時OWT系統(tǒng)演進很長時間,在可擴展性、分布式部署、還有高可用方面也做了很多工作,產(chǎn)品正在向更完善的方向發(fā)展。OWT兼容英特爾的多個平臺,讓實時分析任務(wù)能充分運用硬件資源,從而大大系統(tǒng)提升性能。

關(guān)于視頻分析架構(gòu),如圖OWT分為四個大模塊,通過接入節(jié)點將客戶的流接入系統(tǒng),傳輸?shù)椒治瞿K,再通過GStreamer pipeline進行視頻解碼,前處理、推理以及后處理,再編碼、推流,返回給擴散節(jié)點,通過擴散節(jié)點返回客戶端,在客戶端實時顯示。
OWT系統(tǒng)支持英特爾的VCAC-A卡,Movidus VPU以及英特爾各個產(chǎn)品系列。

對使用者來講,想要通過接口接入流進行分析是一件比較簡單的事情。例如IP攝像流通過RTSP 協(xié)議接入系統(tǒng),若用戶想要分析該流,如人臉檢測、或算法分析等,需要在客戶端發(fā)送簡單的Restful請求指定分析哪一路流。
Management api收到消息之后傳遞給Conference agent進行Session 管理,通知分析模塊,在分析模塊進行初始化動作。初始化完成后返回Session控制,通知IP攝像的流接入節(jié)點與Analytics建立連接。此時,Streaming agent將流發(fā)送給Analytics agent,進行各種算法的分析。若用戶希望在瀏覽器中看到流的分析結(jié)果,此時可以將分析后的流擴散給WebRTC節(jié)點,再傳輸給瀏覽器等待的用戶。
若用戶想要對流進行錄像,可以將分析后的流擴散給Recordign agent,在用戶端將分析后的流進行錄制。另外,若用戶想要將分析好的數(shù)據(jù)上傳到云端,也可以進行導入插件再進行相應(yīng)操作。
同時,在圖中我們可以看到,分析過程是與OWT整套方案協(xié)同工作,OWT提供很多控制的API,例如分析、錄像、sip calls、從不同的協(xié)議接入,如果想要將分析好的流推給RTMP服務(wù)器,方案也配有Streaming OUT接口進行推送,也有針對混合流、暫停/繼續(xù)播放流等操作。

當一路流從其它節(jié)點傳送到Analytics分析節(jié)點后,再送入Gstreamer pipeline中,在pipeline中進行一些操作。例如經(jīng)過H.264 parse解析,解析后解碼,通過videorate針對相應(yīng)場景的丟幀處理,再傳入推理模塊,進行推理過程。例如:檢測、分類等處理,進行編碼,通過appsink傳給輸出節(jié)點。
圖中解碼過程沒有明確表明具體使用哪個API,這些是用戶可以自己進行選擇的, GStreamer pipeline中有很多豐富的解碼接口,例如CPU或GPU解碼,大大的提升了解碼效率。推理部分在GitHub上有g(shù)st-video-analytics提供的檢測,分類等插件,使用CPU或VPU進行推理,可以更充分的利用系統(tǒng)的資源。
其中的pipeline構(gòu)建用戶可以自行定制,選擇去掉某些步驟重新組合處理流程。

如果有一個分析任務(wù),在OWT中如何實現(xiàn)的呢?
開發(fā)者可以使用OWT提供的接口,通過將不同功能的GStreamer plugin組合來實現(xiàn)一個特定分析任務(wù)的pipeline。一個分析任務(wù)最后被編譯成一個動態(tài)庫,在配置文件里配置算法號以及動態(tài)庫名來對應(yīng)分析任務(wù),配置好之后用戶通過restful請求開始分析任務(wù)時指定相應(yīng)的算法號以及要分析的流,OWT就會對指定的流進行指定的分析。
若用戶想要多個算法分析,只需要構(gòu)建多個不同的pipeline,再編譯成不同的動態(tài)庫文件,并在配置文件里指定不同的算法號即可在OWT中實現(xiàn)多個算法分析。
對于這一部分的使用說明,在Webrtc hack網(wǎng)站(網(wǎng)址https://webrtchacks.com/accelerated-computer-vision-inside-a-webrtc-media-server-with-intel-owt/)上有一篇比較詳盡的文章,可以進行查閱學習。

整個OWT系統(tǒng)演進了很多年,在資源調(diào)度方面進行了很多處理,OWT支持依據(jù)CPU,GPU,VPU資源使用情況進行任務(wù)調(diào)度。當部署在多臺機器以及多種計算資源的環(huán)境下,OWT會收集各個節(jié)點上的CPU,GPU以及VPU使用情況,將新來的分析任務(wù)根據(jù)調(diào)度策略分配到相應(yīng)的節(jié)點進行工作。我們提供了幾種常用的調(diào)度策略,用戶可根據(jù)實際部署情況對各個模塊單獨配置不同的策略。

對于HA,當Analytics處于正常狀態(tài),IP攝像機的流導入,通過圖中最上端一路流程進行錄像。分析任務(wù)正在進行時,突然出現(xiàn)故障,這時可以被Session Control檢測到,。Session Control發(fā)現(xiàn)可用節(jié)點,將可用節(jié)點激活,再將正在分析的流導入該分析節(jié)點,繼續(xù)被中斷的分析任務(wù),再傳輸?shù)絉ecording節(jié)點進行錄像。這樣就可以在實際場景中實現(xiàn)高可用的過程。
03、總結(jié)
整體方案中分析部分是基于深度學習的方式與OWT相結(jié)合,OWT使用GStreamer pipeline簡化實時視頻分析過程,開發(fā)者可以方便地通過組合GStreamer plugin來實現(xiàn)不同的實時分析任務(wù)。同時,OWT利用OpenVINO以及OWT本身的調(diào)度機制來充分利用計算資源,從而提升整體性能。OWT支持分布式部署,各個功能模塊可以快速方便地進行擴展。再加上OWT提供的HA機制,可以保證實時視頻分析系統(tǒng)的穩(wěn)健運行。
英特爾一直在致力于Visual cloud、Computing等基于IA平臺的發(fā)展,同時也提供了很多開源資源,例如Open VINO、OWT 在GitHub上有相應(yīng)的開源項目。同時英特爾在客戶端也有一些AI的方案,例如WebNN等,未來也將在瀏覽器上落地,敬請期待。