视频直播/远程会议中的AI关键技术探索应用
隨著各種AI新技術的發展和應用,它們不僅為我們帶來了對于服務形式、內容,如各種視頻特效、功能實現上的改變,更為重要的是對于服務質量以及成本上的優化。本文由NVIDIA深度學習解決方案架構師 吳金鐘 在線上分享中的演講內容整理而成,詳細分析探討了英偉達GPU上的硬編解碼方案和CUDA并行計算架構賦能下的音視頻AI技術研究與最新實踐應用。
文 /?吳金鐘
文章整理?/?LiveVideoStack
我是英偉達深度學習解決方案架構師吳金鐘,今天給大家介紹的是英偉達在直播場景中的解決方案。
?
英偉達針對直播場景提出了Broadcast engine(RBX)和Maxine兩個解決方案,針對的是消費級GPU和數據中心GPU兩個應用場景。我會先對這兩個解決方案做一個簡單的概述,然后再對其中的視頻壓縮技術codec和transcoding做一個詳解,最后是NGC,NGC是英偉達高度優化的解決方案的hub,為開發者使用GPU提供便利。
1. RBX & MAXINE?
?
目前英偉達在直播場景中,GPU的功能按運行平臺分成兩個部分,一個是RBX,另一個是MAXINE。RBX依托的就是RTX GPU強大的算力,支持了實時的AI特效,比如說背景噪音的剔除、綠幕、超分、人臉跟蹤等等。MAXINE是為數據中心準備的,它是英偉達在2020年最新發布的解決方案,不管是RBX還是MAXINE,它們其實都是一組AI能力的集合。
我們看右邊的圖,這個圖就顯示了RBX和MAXINE的軟件棧結構,它們的功能都是由一組SDK提供,我們剛剛說到的綠幕和超分就是由視頻特效SDK提供,背景噪音剔除是由音頻特效SDK提供,Face tracking是由AI特效提供的。同時里面還集成了Codec的功能,利用GPU上硬編解碼單元,提供了串流的能力。Jarvis是英偉達對話式AI的解決方案,直播中引入Jarvis提供transcription、ASR和TTS等功能。Audio2Face是語音驅動avatar的功能,我們之前在GTC上看到的Misty水滴的效果,就使用到了Audio2Face的功能。同時NVIDIA Research最新的研究成果也會不斷地增加進來。我們后面會對其中的AI視頻壓縮技術做一個詳解。
再往下看就是CUDA并行計算架構,提供了GPU強大的并行計算能力。我們剛才提到的這些AI的模型都是需要通過CUDA和TensorRT進行加速來實現實時計算的。TensorRT是英偉達提供的AI模型推理加速的SDK,同時從Volta (如V100)這一代開始GPU上增加了Tensor core矩陣乘單元來對模型推理進一步加速。Tensor core同時也可以通過混合精度訓練的方式來對訓練進行加速。再往下就是GPU的硬件層。?
1.1 RBX
?
這些是MAXINE主要的功能,它分為幾大類。視頻特效包括綠幕、超分、upscale、artifact reduction。綠幕的功能是前后景分割,分割后的背景可以被虛化,也可以替換成其他的圖片、視頻或者游戲畫面等等。超分和Upscale都有提升分辨率的能力。超分在視頻增強的同時還有一定的artifact reduction的功能,它計算量比較重。Upscale有一定的銳化作用,是一個比較輕量級的算法。Artifact reduction主要是用于消除在低碼率下所引起的artifact。
音頻特效就包括背景噪音的剔除,比如說PC風扇的聲音、直播時背景人群竊竊私語的聲音、窗外下雨的聲音等等。AR特效包括人臉檢測、跟蹤、landmark點和3D mesh生成。人臉檢測輸出的是2D bounding boxes,同時也支持多個bounding boxes的輸出。用戶也可以根據自己的場景去指定輸出bounding box的數量。
人臉關鍵點的檢測輸出的是126點的landmark,可以對眼睛、嘴唇、眼球進行跟蹤。它輸入的數據可以是image + bounding boxes,也可以直接輸入image,在內部進行人臉檢測再生成bounding boxes。3D mesh和上面二者處理的方式類似,一般情況下輸入image + landmark點。如果沒有landmark點,也可以在內部計算landmark點,然后通過landmark點擬合出來3D mesh。右下角的網址包含了更多的細節。
1.2 MAXINE
MAXINE是英偉達在視頻會議方面的解決方案。據統計,全球每天視頻會議的數量已經超過了3000萬。由于疫情的影響,視頻會議有變成一種常態化需求的趨勢。MAXINE的功能與RBX有很多的共同點,但MAXINE是在云端部署的。在云端部署的一個好處是和終端的計算能力解綁,給用戶提供一致的服務質量。MAXINE也提供綠幕、超分、upscale、artifact reduction、背景噪音的剔除、轉錄、NLU、TTS、AR等特效,也使用TRT/tensor core進行加速。在部署上,MAXINE可以通過Kubernetes微服務的方式,也可以通過DeepStream的方式。同時MAXINE也提供開發的SDK,用戶可以根據自己的需要把對應的模塊集成到自己的系統中。
DeepStream是英偉達提出的端到端視頻流的解決方案。它基于的是開源的框架GStreamer,其中主要集成了兩個部分:一個是GPU CODEC的功能,一個是AI推理的功能。DeepSteam的plugin結構方便用戶開發自己的功能。
BROADCAST APP DEMO?
這是背景噪音的剔除。這個功能已經嵌入進了常用的直播軟件中,比如OBS。視頻中其他例子是綠幕效果,背景虛化替換成視頻或者游戲的畫面等等;還有相機跟隨的效果。
NVIDIA MAXINE
這是超分效果,左邊是360p,右邊是720p。接下來是我們剛才提到的相機跟隨的效果,這是在云端部署的。其次是綠幕效果、背景噪音剔除、Audio2Face、視頻會議中的翻譯、AI視頻壓縮技術、人臉矯正。
2. AI視頻壓縮技術
?
下面我們對AI視頻壓縮技術做一個詳解,這是一個NVIDIA Research最近的研究成果。對于視頻會議來說,有兩個核心需求:一個是降帶寬。視頻占用大量的帶寬資源,因此降帶寬成為了核心需求。另一個需求是用戶體驗感不高,視頻會議中人臉的朝向一般都不是正對著屏幕,無法達到面對面交流的效果,所以提升用戶的體驗也是一個核心需求。如果可以把人臉的朝向矯正過來,也會大大提升用戶體驗。
我們再看下傳統的視頻壓縮技術,以H264為例,它采用的是I幀P幀B幀編碼的技術。即使是這樣,在網絡上傳送的數據量仍然是巨大的,視頻會議有其特殊性。一般情況下,每一路信號里只有一個用戶,背景也是靜態的。這里介紹的one shot free view的技術提出了只傳一幅圖像,然后用這幅圖像進行初始化,每幀只需要傳送非常少的數據就可以進行視頻重建的技術。初始化圖像包含了用戶的appearance identity的信息,每幀只需要傳送頭部的姿態信息和面部的表情信息delta。這樣的好處是每幀傳送的數據量大大減少了,視頻進一步得到了壓縮。同時,使用GAN的技術也保證視頻重建的質量。
右圖第一張圖是原始的視頻,第二張圖就是重建出來的視頻,但重建出來的視頻人臉朝向并沒有矯正過來,第三張圖是經過人臉對齊的、視頻重建的結果。這個主要是因為論文中提出的主要關鍵點分解的技術。將人臉的identity信息和運動信息進行分解,因此在重建的過程中可以只保留人臉面部信息不變,而去調整頭部姿態的信息,然后對人臉朝向進行矯正。與現有方法相比,這篇文章是free view的,可以在原圖像的view附近較大的一個角度進行旋轉。
同時,英偉達在GAN方面做過許多工作,與這篇文章相關的有pix2pixHD、vid2vid來解決時間域連續的問題;再到few shot vid2vid來解決只用較少量圖片重建視頻的問題;再到one shot free view來解決單shot大角度旋轉的問題。另外,和這篇文章密切相關的還有FOMM,first order motion model這篇文章。與FOMM不同的是,本文采用的是隱式的3D的key points,而不是2D的key points。同時將head pose、運動信息、identify信息進行分離來進行人臉的矯正。
再來看下具體的過程。這篇論文包含了兩個步驟:第一步是特征提取,包括源圖像和driving video的特征提取。先說下人臉關鍵點的分解,分解出來的信息包括三個部分:第一個是appearance identity,這部分和用戶的運動信息無關,只需要通過一張用戶的圖片就可以提取出來,之后就輸入到后面的網絡中進行重建;第二個是head pose R/T(旋轉或平移兩個部分),需要每幀進行傳輸;第三個是expression delta 面部表情,這部分信息也需要每幀上傳,用來重建面部的表情。
左下圖網絡的輸入包括兩個部分:一個是source image,一個是driving video。因為需要重建的是source image里面的人物,所以我們要從source image里提取appearance identity的信息,這個和用戶的姿態無關,我們只需要用戶的一張圖片就可以了。隨后需要從driving video里提取expression delta和head pose R/T兩個數據。因為我們想通過目標人物的表情來驅動source image,所以有了以上三個信息之后就可以進行重建了。如果head pose不是由driving video提供的,而是由用戶指定的,那么就可以實現姿態編輯了。
右圖是特征提取的過程,里面的每一個方塊都是DL的模型,一共有四個DL的模型。首先是appearance feature extractor F,這是提取特征的信息,只需做一次,輸出的就是appearance feature fs;第二個是head pose estimator H,輸出的是旋轉和平移兩個矢量,需要每幀傳輸;第三個是表情delta,也需要每幀傳輸;第四個是key points detector L,提取一定數量三維的關鍵點,這里三維關鍵點是隱式的,并不是真正的在三維空間內,像3D mesh那樣的。論文中使用的關鍵點是20個,是由網絡無監督學習出來的。這里的L只需要對源圖像進行計算就可以了,輸出的Xc,k和Jc,k就提供了缺省的姿態信息。
我們看圖中藍色的箭頭,當有了key points Xc,k和Jc,k之后,就可以對其進行旋轉或平移了,最后再加上expression delta,隨后就可以對目標圖像進行重建。這里的Ru和Tu其實就是用戶指定的head pose。
直觀地看下identity信息和運動信息的分離。左邊兩張圖是source image和driving image。直接用key points Xc,k去重建的是一個正面的圖像, Xc,k是三維空間中隱式的關鍵點,作為演示這里面只顯示出了五個關鍵點;對于關鍵點進行旋轉和平移,重建出來的就是旋轉和平移后的圖像。可以看到這樣的圖像的頭部的姿態已經和driving image里的頭部姿態對齊了,但是面部表情還不一致。最后還得把面部表情delta加進來進行重建。我們可以對比下重建的效果,重建的過程保持了identity信息的不變,同時頭部的姿態和表情都與driving video保持一致。
剛才說的是第一步,第二步就是視頻重建,這個可以分為兩個部分:第一個是feature volume wrapping,第二步是將變形后的Feature volume w(fs)輸到generator進行幀重建。這里的feature volume思想是從FFOM中借鑒來的,一個改進就是將原來2D顯式的key points替換成了3D隱式的key points,這樣就可以對3D隱式的key points進行旋轉和平移了。有興趣的同學可以去看下論文。
下面再看下數據壓縮部分。傳輸的數據包括兩個部分:一個是原始圖像,只需傳輸一次;另外是需要每幀傳輸的R/T、頭部姿態和expression delta。這些數據也是需要采用壓縮的方式進行傳播的。我們來看這張流程圖。
?
輸入的圖片是d,通過編碼之后得到了head pose、R/T和面部表情 delta,這些數據需要傳送給接收端進行重建。在傳送的過程中,數據編碼的格式采用的是熵編碼的方式。
這幅圖的統計給出了在兩種配置下(20個關鍵點和自適應的關鍵點)每幀需要傳送的數據量。
?
我們看平均的數據量,每幀需要傳輸的數據不到100byte。從整體來上看,基于AI視頻壓縮技術與H264相比,可以節約十倍的網絡帶寬。當然當背景有新的物體進來時,或者說有帽子、眼鏡、口罩等遮擋物時,這時候其實就需要上傳一張新的source image,后面再基于這張新的source image進行重建。這張新的source image也可以通過壓縮的方式進行上傳。
?
這兩幅圖是對比的效果,左邊是H264,它的帶寬每幀是97KB;右圖是視頻壓縮技術,它的帶寬只有0.1KB,可以看到 AI視頻壓縮技術在低碼率下重建的效果還是很好的。
?
我們來看一下效果圖,在相同的帶寬下,H264編碼很多的細節都丟失了。在低帶寬的情況下,AI視頻壓縮有一個比較好的重建。
?
以上是一些資源。
在直播中一個重要的模塊就是編解碼。GPU上編輯碼的單元和計算單元是獨立開的,它們可以同時使用。他們共享的是顯存和PCIe的帶寬。Encoder方面支持常用的H264、H265的編碼格式。Decoder支持的格式更多,比如VP8、VP9等。在最新安培的架構上增加了對解碼AV1的支持,分辨率可以達到8192×8192。H264的編解碼在GPU上可以達到4096×4096,H265可以達到8192×8192的編解碼。
我們來看一下CODEC的性能,這里顯示的是在1080p下解碼的性能。在不同的格式下,H264、HEVC、HEVC10bit和VP9上各個 GPU 的解碼能力的對比。最高的線就是T4,可以看到T4在各個格式下的解碼的性能都是比較優越的。T4主要用在線上服務的場景,它的目標就是多樣性的任務都可以在T4上面有較好的表現。對于H264來說,T4的解碼的Performance大約是1000幀每秒,H265大約是2100幀每秒。
我們再看上面兩幅圖,左邊是H264 1080p30fps的編碼,右邊是HEVC 1080p30fps的編碼。
對于T4 fast來說,分別可以支持19路和13路的并發。這是對latency不太敏感的情況下;如果是對latency比較敏感的情況下,比如云游戲、視頻直播,像B幀,還有look ahead技術就沒有辦法使用了,并發的路數是17路和12路。從整體上來說,使用GPU支持的并發路數都是高于CPU的。
?
在轉碼的場景下,Codec 的SDK已經集成進了FFmpeg,使用的流程和傳統的方式是一樣的。首先視頻流進來-->設置 GPU的解碼(h264_CUVID)-->在GPU上做一些 filtering(scale/transpose)等-->再設置GPU的編碼(h264_nvenc)-->最后是輸出視頻。
同時在GPU上也支持一到多路的轉碼。支持多GPU,可以通過-gpu list或-hwaccel_device 1使用。同時也支持GPU和CPU的混合操作,比如有些格式在GPU上不支持,就可以把解碼的工作挪到CPU上,等解碼完成后,再把解碼出來的數據,通過hwupload_cuda傳到GPU上。GPU也支持常用的filters,如resize、scale、crop等操作。
這是一個典型的FFmepg的命令行。一般都會指定-vsync 0,這個參數保證了既不產生重復幀也不會丟棄幀。這個參數在對比CPU和GPU的功能時經常會用到。-hwaccel cuvid保證了解碼出來的數據是駐留在GPU上的。再設置 h264硬解碼的功能,輸入視頻、拷貝音頻,使用h264進行編碼,設置bitrate是5M,最后輸出視頻。
?
在轉碼中一個比較容易忽略的點是CPU和GPU之間的隱式的數據交換。為了保證解碼出來的數據是駐留在GPU上的,就需要指定-hwaccel cuvid參數。當沒有指定這個參數的時候,FFmpeg就會缺省的把解碼的數據拷回CPU,當我們后面用GPU進行編碼的時候,數據又需要拷回 GPU,這個其實是一個不必要的數據交換,盡量減少這種方式的使用。
在直播中有時候也會有一定的渲染的任務。在服務器端headless服務器上,OpenGL一般是與EGL搭配使用,實現 GPU的離屏的渲染。渲染出來的結果。最簡單的方式可以通過 glReadPixels讀到 CPU,再進行后續處理,比如濾波等、最后是落盤。
另一個更高效的方式:渲染完成之后,通過CUDA/OpenGL互操作的方式,將其影射到CUDA context里,再由CUDA kernel做濾波的操作,最后再拷到CPU,最后落盤。
真實感渲染也可以使用OptiX SDK進行光線跟蹤。比如在V100上,ray tracing是使用CUDA cores來進行光線求交的。從圖靈這一代開始,T4上增加了RT cores,專門對光線求交進行加速,可以直接使用OptiX SDK進行開發,也可以使用Vulkan里面的ray tracing擴展進行開發,同時OptiX也集成進了DXR。在服務器端,OpenGL的開發環境可以從NGC上下載,Vulkan可以從container上下載,OptiX可以從產品頁下載,有完整的 sample code和文檔。Vulkan ray tracing可以參考最下面的文檔。如果需要對ray tracing性能進行評估的話,可以使用Nsight Graphics來profiling。
上圖總結了在各個模塊中數據是如何交換的。涉及到了decoder和encoder,這部分功能都是由Codec的SDK提供的。AI推理和訓練,這部分都是CUDA和各種框架來提供的。OpenGL和Vulkan是driver的一部分。這么多模塊都需要進行互操作, 因此CUDA就可以作為一個中轉。對于decoder,可以在DecodLockFrame和UnlockFrame之間使用CUDA的kernel對像素進行操作。對于encoder,在EncodeFrame之前,可以調用CUDA kernel去做顏色空間的轉換等等。對于OpenGL,首先需要將資源注冊進CUDA,當渲染完成之后,再用Map和Unmap的方式將其影射到CUDA context。對于Vulkan,可以通過 graphics和computer queues里面的 transfer的功能,拷貝數據到CUDA。對于AI來說,它本身就是在CUDA context下進行的,所以無所謂數據交換了。
3. NGC
?
下面介紹一下NGC,它提供了英偉達部分解決方案的containers,還有預訓練的模型和scripts、helm charts、已經使能了 GPU的訓練框架等等。目的是加速產品的研發和部署,針對的是AI、數據科學、HPC、可視化等領域。目前container的數量已經超過了100個,trained model超過30個,支持在x86、ARM、Power平臺上使用。支持云、數據中心和edge的場景。
NGC提供的資源都經過了安全的驗證,并且經過了全面的測試,支持的不同場景,NGC每月都會更新,提供最新的特性和最好的性能。支持Docker Container、Singularity、Bare metal,VMs、Kubernetes等使用方式。
這張表格顯示了在三個不同的場景中,V100和A100訓練上的性能對比。以BERT為例,第一個方塊顯示的是v20.05 V100的性能,第二個方塊顯示的是v20.07 V100的性能。即使都是在V100 GPU的情況下,也可以通過軟件升級等方式來提升性能。同時使用最新一代的GPU A100,訓練性能還可以有一個大幅的提升,NGC的團隊也會持續不斷地對其進行優化。
NGC支持的場景, CV方面有ResNet-50、SSD、MobileNet、VGG16等。NLP方面有WaveGlow、BERT、NeMo。NeMo是NVIDIA開源的、構建對話式AI應用的工具包。對于推薦方面,有Wide & Deep、DLRM等。NGC提供了預訓練的模型,可以在此基礎上去進行transfer training,也可以直接用來推理。NGC還提供了sample code、定制化的模型、還有復現的腳本等等。
同時,NGC還提供了遷移學習工具包,Transfer Learning Toolkit,解決在工業場景中訓練數據不足、標簽不足、數據分布不一致、場景不一致等等,需要從現有的模型上重建的問題。在AI推理上,NGC提供了TensorRT的container,使用layer fusion、kernel auto-tuning等多種技術去優化AI推理的過程,來降低延遲、提升吞吐。同時,TensorRT也集成進了主流框架,在框架里就可以使用TensorRT的能力。NGC提供了T4和V100上TRT預訓練的模型,包括fp32、fp16和int8的模型等等。
Triton是英偉達提供的輕量級的Inference server,使用的是CUDA streams的方式,支持異構多GPU、支持多個模型同時并行推理、支持從現有的框架里面導入模型,支持TRT、TF、Pytorch等框架。這個項目已經開源了,英偉達提供的工具可以從 NGC下載,下載docker container的方式比較方便快捷,也可以到產品頁去下載,自己安裝也是可以的。
LiveVideoStackCon 2021 北京站? |??9月3-4日
正在面向社會公開招募講師,歡迎通過?speaker@livevideostack.com?
提交個人及議題資料,無論你的公司大小,title高低,老鳥還是菜鳥,只要你的內容對技術人有幫助,其他都是次要的,我們將會在24小時內給予反饋。?? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的视频直播/远程会议中的AI关键技术探索应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音视频技术开发周刊 | 192
- 下一篇: 探讨TensorRT加速AI模型的简易方