视频编码器的智能化——AI辅助编解码的ASIC解决方案
點擊上方“LiveVideoStack”關注我們
在此次LiveVideoStackCon 2021 音視頻技術大會 北京站,來自镕銘半導體的劉迅思詳細列舉了目前常用的AI輔助編解碼的方法,論述如何在硬件和軟件層面將AI結合編解碼的實踐,探索新的標準和新一代編碼器結合AI應該如何設計。
文 | 劉迅思
整理 | LiveVideoStack
大家好,我是來自NETINT镕銘半導體的劉迅思,本次要跟大家分享的主題是視頻編碼器的智能化。
為什么要分享這個話題?直白的說主要的是為了帶貨,因為目前公司最新推出了基于帶有AI功能的硬件ASIC編碼器、編碼卡,當然更重要的是我們覺得它也是未來視頻編解碼一個很重要的方向。
我知道來LiveVideoStackCon 音視頻技術大會的老師,可能很多都是做AI算法、編碼算法,或是應用開發(fā)的。作為一家芯片公司,打個比方,我們就有點像是“種菜”的,諸位老師就像是“大廚”,我一個“種菜”的和大家說種出來的菜能做成什么樣的美食,很容易得到一些不信任的目光。說到這個也很有意思,前兩天看到LVS的一位講師的朋友圈,提到之前寫PPT的時候非常謹慎,咨詢很多專家,總是擔心PPT內有什么錯誤,但現(xiàn)在卻不像之前那樣,為什么呢?他說,現(xiàn)在更歡迎聽眾來提出一些不同的意見。對我來說其實也是一樣的,非常期待大家聽完能有一些反饋給到我們。這其實也是公司三年以來在國內跟數(shù)據(jù)中心的客戶合作的一種模式,因為客戶很多都是業(yè)務方、應用方,我們會反饋給客戶更多底層的信息,客戶也同樣反饋給我們很多應用端的信息,互相協(xié)作可以把事情做得很好。
本次分享的內容主要有以下幾點:首先是我們理解的AI輔助編碼在學術界研究的主要方向;其次是正在落地的商業(yè)化實踐;還會基于以上內容,分享ASIC編碼器在軟硬件實現(xiàn)上有什么樣的區(qū)別;接著會介紹ASIC編碼器的優(yōu)勢場景;最后會跟大家探討一下未來基于ASIC以及基于硬件的視頻編解碼器應該是什么樣子。
1. 研究方向
首先,介紹學術界的一些研究方向。
總的來說,可分為兩大類:一類是基于傳統(tǒng)的,也就是264、265,基于殘差,基于DCT變換來開發(fā)一些編碼的工具,并且我們還會在每一個編碼工具上基于神經(jīng)網(wǎng)絡來做一些優(yōu)化;而另外一類,則是完全拋開這些工具,直接使用神經(jīng)網(wǎng)絡來做編解碼的壓縮。
1.1像素概率建模
第一種是像素概率建模。其原理是,它認為每一個像素點其實是可以根據(jù)上下文的一些像素的概率估算出來的,比如,當前像素值可以根據(jù)它之前一直到的這些值的概率,做一個聯(lián)合概率,計算得出的值。比較著名的一些神經(jīng)網(wǎng)絡,如最早發(fā)布的PixelCNN和PixelRNN,這是兩個不同的算子,用CNN和RNN來做像素概率建模,后續(xù)又有了Gated PixelCNN,或者叫conditional PixelCNN。
其實在做像素概率建模的時候需要一個掩模,它的原理是從之前的像素來推斷出當前像素,這就意味著在計算時,需要將后續(xù)的像素點做掩模遮蔽掉,但在遮蔽的時候有可能會擋住之前一些像素點,造成一些盲點,Gated PixelCNN就是為了解決盲點的問題。說起來感覺可能比較復雜,這個算法其實是有比較常見的應用的,像大家可能用過一些APP是拍攝一張自己現(xiàn)在的照片,然后可以推算出當你七十歲時會長成什么樣子,這就是用上述算法來實現(xiàn)的。它其實最早是用來做圖像生成的,用于編解碼時,之前看到有的paper會這么做,用像素概率建模來預測當前圖片的預測值,然后根據(jù)圖片的真實值,用真實值減去預測值得到殘差。我們對殘差做編碼,然后在解碼端用像素概率建模來恢復整個圖像,再將殘差添加回去。
1.2AutoEncoder、Variational Auto-Encoder(VAE)
另外很大的一類就是AutoEncoder,它的原理是通過無監(jiān)督學習來做編解碼。這個模型也比較簡單,一個輸入后先做encoder,通過不同的卷積提取出這一幀圖片的高維數(shù)據(jù)特征,然后用decoder將其還原,還原后進行輸出。在做無監(jiān)督學習時,我們的最終目標是輸出和輸入之間的差值最小,所以需要不停地訓練encoder和decoder之間卷積網(wǎng)絡的參數(shù),將差值做到最小。當然,其中也有很多不同的做法,有的是用不同的算子,CNN、RNN,用雙向RNN、LSTM等來做。另外,還有代價函數(shù)的不同,有的是用MSE(均方差)來做,有的是用MS-SSIM來做差值。
這個模型最大的問題是很容易會欠擬合,因為它的參數(shù)很多,輸出和輸入之間可能會沒辦法訓練出很好的模型。基于這個,有人提出在encoder之后可以做一步量化,在decoder之后做一步反量化。此時我們看到如圖公式是一個典型的RDO公式,D是輸入和輸出的差值,λ是拉格朗日常數(shù),R是根據(jù)不同量化取得的值,這個公式的意義就是在量化一定的情況下保證差值最小。
Variational Auto-Encoder(VAE)是一種變形的AutoEncoder,剛剛講到AutoEncoder是使用卷積來做,做完以后會得到一個高維的矩陣,保存了它所有的特征。而VAE的做法則是在每個樣本輸入后,會得到一個均值和方差,它認為每個樣本其實是正態(tài)分布的,有了均值和方差就能畫出一個正態(tài)分布的函數(shù)。那么在這個正態(tài)分布的函數(shù)里就可以采樣它的變量,相當于每個會對應出一個,在解碼器生成的時候再把還原成一個真實的樣本。
1.3光流估計
前面提到的是AutoEncoder,還有一個最近比較熱門的就是光流估計。
光流估計之前很多都是用OpenCV的方法來做,比較稀疏的光流可以用傳統(tǒng)的圖像算法來做光流估計,與傳統(tǒng)的編解碼算法有點像,編解碼算法我們也會做運動補償和運動估計,但編解碼是基于宏塊或者根據(jù)CU來做運動估計的。光流估計是會對每一個像素點都會預測它的光流,因為是用一整個卷積來計算整個的光流,它認為每一個像素點都能計算出它的光流。之前比較有名的光流估計的模型是FlowNet2,大家有興趣的可以了解一下。光流估計中有一個比較大的問題是如何產生有光流真值的訓練圖片,也就是在訓練的時候如何確定訓練出來的圖片的光流值是對的,所以很多人會用顯卡生成一些假的圖像來做訓練。
1.4感知編碼
如圖是感知編碼一個比較典型的應用,在視頻會議開始時只要傳送每一位與會者的面部照片,后續(xù)只要告訴解碼器某一與會者的頭是向左轉或向右轉,解碼端基于對抗網(wǎng)絡就可以生成這名與會者所對應動作的視頻。在傳輸時只需要將關鍵幀用傳統(tǒng)編碼器進行編碼,在解碼端使用對抗網(wǎng)絡生成圖片,并用關鍵幀來做訓練,實際輸出效果與H.264相比可以降低非常多的碼率。
1.5語義編碼
目前存在的編碼,無論是視頻或是圖片,它其實不僅僅是給人眼看的,有很多是直接用來輸出給AI的。我們在傳輸傳統(tǒng)圖片信息之外,還需要傳輸一些高維的特征值。舉個例子,這里有一輛車和一只狗,在編碼完成之后,在decoder時不僅僅可以decoder出畫面,同時也可以decoder出之前物體識別的信息結果,即圖片中有一輛車和一只狗。
未來視頻質量評價的標準可能不僅僅是PSNR、SSIM,圖像也會加入語義損失的判斷,即圖像或視頻經(jīng)過壓縮之后是否會產生語義的損失。
1.6傳統(tǒng)編碼工具的優(yōu)化
接下來介紹基于傳統(tǒng)編碼工具的優(yōu)化。如上圖所示,傳統(tǒng)編碼算法無論是264還是265,一個Image輸入進來,首先需要進行幀間或幀內的預測,然后要做Mode Decision確定到底選哪一種方式,然后做量化、做Transform,最后還做環(huán)內的濾波,做Entropy去編出bitrate。
在每一個編碼工具的模塊上面其實都會有一些AI的方法來進行優(yōu)化。如幀內預測時,有人提出用CNN優(yōu)化預測模式。標準規(guī)定的預測范圍其實很小,使用CNN可以擴大預測范圍;幀間預測時,雙向參考塊我們現(xiàn)在一般的做法都是采用線性的組合,乘上一個固定的比例算出當前預測塊的值。那是不是除了線性組合,我們還可以用CNN來做一些非線性的組合。另外,插值的時候,不是簡單的做一些半像素的插值,是不是可以利用CNN進行半像素插值;另外還有一個比較有意思的方向就是跨通道的預測,就是說一個YUV的視頻,可能只知道Y值,怎么才能推斷出它的U值和V值?在這點上,AV1有一個標準是Cfl,HEVC有一個CCP的擴展標準,來做跨通道預測。既然是做預測,那么大家可能也會想到用CNN來做一些非線性、跨通道的預測。
此外剛剛說到變換,也有使用CNN做預處理,訓練出類似ICT變換的圖像變換。我相信除了這些以外,有很大一塊AI輔助編解碼的工作其實是用來做濾波的。濾波分環(huán)外濾波和環(huán)內濾波,區(qū)別在于解碼端輸出濾波完的圖片,是不是會用來做參考幀,如果不做參考幀,就是環(huán)外濾波,做參考幀就是環(huán)內濾波。那這里就有很多學術界的方法來實現(xiàn),其實它基本上是基于不同的輸入,輸入的時候不光輸入YUV,還要輸入QP、 block info、?解碼幀、相鄰幀輸入、殘差、幀內預測信號,根據(jù)這些做濾波輸出不一樣的效果。環(huán)內濾波主要講HEVC,因為環(huán)內濾波分DF和SAO,在不同的階段會插入不同的網(wǎng)絡,有的是在DF和SAO之間,有點是在DF之前,有的是在SAO之后。這個理念一個是說根據(jù)不同的QP我要訓練出不同的濾波的網(wǎng)絡來,不像現(xiàn)在SAO只有一個模型來做濾波,可能基于不同的QP來做,另一個是基于不同的Loss來做。
2. 商業(yè)化實踐
前面提到的是一些學術界的研究,Paper有很多,下面會介紹一些商業(yè)化落地的實踐。
分了這幾個類型,有做預處理的,有做ROI、超分辨率、逆色調映射、碼率自適應算法優(yōu)化的。
2.1預處理優(yōu)化
做預處理AI的其實有很多,分大類的話有視頻降噪、背景替換、內容審核、場景檢測。這個圖是很典型的做背景替換的,把背景摳出來之后直接做背景替換。這個功能其實在我們自己新一代的產品, Quadra芯片當中我們也實現(xiàn)了這個功能。
2.2ROI感興趣區(qū)域編碼
這個也是我們真實的,在新一代Quadra上跑的一個實時的視頻,做了ROI感興趣區(qū)域,上圖是兩個視頻里面截取的兩幀,都是500kbp/s的視頻,我們用YOLOv4 (p2 5:55)對圖片中每一個人臉都做了劃區(qū)域,可以看到右邊這一張圖特別是這個女生的臉,跟左邊這一張圖比就會差很多,這就是我們劃完以后對人臉設定了一些比較低的QP,然后來做一些精細化的處理。
2.3超分辨率
另外還有很大的一類是做超分。左邊是一個EGVSR,不是很新的超分模型,但是效果很好,對計算量的要求其實比較低。超分是分圖像的超分還有視頻的超分兩類。圖像的超分最早的就是SRCNN,這是最早提出用CNN網(wǎng)絡來做超分的一個Paper,這個模型最早是說把一個低分辨率的視頻收進來以后,先把它擴大成一個高分辨率的視頻,然后再來做計算。在這個基礎上后來又推出了FSRCNN,就是說進來的視頻不需要放大,基于低分辨率的視頻先做卷積,最后會做一個反卷積來吧低分辨率的視頻變成高分辨率的視頻。ESPCN也是類似的做法,也是直接在一個低分辨率的視頻下面去做一些特征的一些計算。后續(xù)也有用對抗網(wǎng)絡來做超分,DRCN是用RNN來做超分,就是不同的算子來做超分。
除了這些大家也知道其實對視頻來說最大的壓縮不是在圖像的本身上面,最大的壓縮是在幀間信息上面,基于這個也有專門針對視頻的一些超分算法,有的是做運動補償,就是我基于目前的這一幀和它相鄰的這一幀,因為用AI,所以就用光流估計做出每一個像素點運動的估計和補償,相當于當前的這一幀我先基于它的圖像做一次超分,然后再用幀間的運動補償來做一次殘差的計算,然后我把當前圖像的超分加上殘差來做視頻間的超分。另外一種方法其實更徹底,前面那種運動補償還有點像264、265,后面這種更徹底,不需要去對齊相鄰幀和當前幀的運動補償,我在網(wǎng)絡中輸入的時候不是輸一幀,而是輸好幾幀進去,直接通過網(wǎng)絡取空間和時間信息來做超分。
2.4逆色調映射
逆色調映射說起來可能沒人聽得懂,但是其實說白了就是怎么把一個SDR的視頻轉成HDR的視頻。
我歸納下來,其實它最主要解決的問題就是這三點:SDR到HDR它的亮度范圍擴展、另外是它的色域從BT.709變成BT.2020色域轉換、8bit 位寬轉 10 bit。這里面有很多神經(jīng)網(wǎng)絡來做逆色調映射。
2.5碼率自適應算法優(yōu)化
這個可能跟編碼算法的關系可能就不大了,它是用來做碼率自適應算法的。之前快手發(fā)表了一個很好的論文,專門講碼率自適應算法。碼率自適應其實分兩種,一種是Buffer-based,就是基于客戶端的播放緩沖區(qū)buffer情況決策。其實都是基于客戶端,Rate-based則是基于預測的帶寬決策。基本上基于AI的都是用Buffer-based來做這個事情的,這個是說客戶端會去看自己的當前buffer的緩存區(qū),當緩存區(qū)比較小的時候,說明帶寬其實不夠,所以會把bitrate調小,buffer比較大的時候說明帶寬很高,那又會把bitrate調高?;谶@樣一個決策。
但是這個決策往往很多時候會失敗,因為它這時候沒辦法預測下一次網(wǎng)絡的帶寬是什么樣的情況,可能就會想這種情況下就基于強化學習的算法來做一個碼率自適應的ABR的算法優(yōu)化。
左邊就是一種類型的強化學習的算法,它是做Actor和Critic的一個算法,Actor它會根據(jù)不同的策略take action,會進入不同的state,critic會根據(jù)不同的state和action去打分,然后告訴Actor你下一次要怎么做,基本上是這樣一個做法。
3. 軟硬件實現(xiàn)
后面講的是我們的本行,我們的軟硬件的實現(xiàn)是怎么做的。
NETINT其實實在這個月,我們開始開放給客戶正式的測試,就是我們新一代的Quadra的芯片。
3.1硬件架構
這個硬件架構比較簡單。我們這個Quadra的芯片是為了編解碼專門設計的一個芯片,我們一開始的目的是做硬件編解碼,當然之前三年在跟客戶交流的業(yè)務溝通過程中,我們發(fā)現(xiàn)了除了編解碼之外我們還需要加一些其他的硬件模塊,所以我們在里面會加入一個NPU,也會有Audio DSP來做視、音頻的編解碼,除了這個,還有2D的引擎來做旋轉、縮放、加水印這些硬件加速的工作。Host端這邊沿用上一代產品的NVM標準的存儲協(xié)議來交互。
3.2軟件架構
這是它的軟件架構,這樣做的好處是底層為Quadra FW,用戶端是不需要裝驅動的,可以使用標準的Open Source NVMe驅動,無論是Linux、Windows還是Android系統(tǒng)。并且基本適配于所有的CPU和OS,包括國產的一些OS,因為它們都有NVMe的存儲驅動;在此之上我們會提供一個libnetint的API庫,主要做一些不同實例的管理、參數(shù)的設置;最上層會支持FFmpeg的框架來調用。編解碼是這樣的一個架構,AI也是一樣的,因為我們的AI是為了服務編解碼的,所以我們會在FFmpeg中加入一些Filter,來做AI的計算。
這個是我們之前設計的一個方法,其實不僅僅是NPU,CPU也是一樣的,我們應該如何最小化CPU的負載,所有我們有一個Fire and Forget 機制,即后置PC在準備完一些cmdbuf,打給NPU以后是不會再作等待的,是一個異步的調用。直到NPU有一些中斷過來時,后置PC才會做這些回調的處理。
如圖是整個數(shù)據(jù)流,Stream進來后,通過PCIe NVMe Interface,其中所有的東西都是在我們的芯片當中完成的,從Decoder開始到縮放,到AI-engine,計算完成后再Encoder,最后出去的是一個Stream Out,在這中間是完全不需要CPU參與,也不需要和主機進行交互的。
4. 優(yōu)勢場景
接下來會介紹到我們認為的基于ASIC的硬件編碼,在哪些場景下比較具有優(yōu)勢。
對于我們來說,首先要解決的問題是確定我們到底要做強編碼的產品還是強AI的產品?本次分享的主要是AI輔助編碼,對于我們來說,還是以編碼為主,AI來做輔助,這也就牽扯到芯片中到底要有多大的AI算力來配多大的編碼密度。因為芯片是一個面積和功耗強相關的東西,當我們將功耗控制到一定程度時可以做高密度的使用。目前我們Quadra單卡的功耗是在25W以下,這意味著可以做成u.2的形式,之前我們有配置服務器多的時候可以插24張卡,形成一個高密度編碼的整機的服務器,所以對于我們來說,最終答案是選擇提供合適的AI算力,主要強調編碼功能。
第二點是高密度和虛擬化,高密度意味著我們在計算TCO的時候并不是算每一張卡的編碼成本,而是計算服務器加上卡的編碼成本。除此之外,做硬件虛擬化就是我們通過一些虛擬化的支持,不管是SR-IOV,將一張卡虛擬成多個設備給不同的虛擬機用,還是做成一個編碼池,將整個編碼池提供給不同的虛擬機用。這些都是通過硬件來做虛擬化的,代價會比較低。
還有一個最大的場景,也就是低延遲的場景,這是硬件編碼器與軟件編碼器相比最具有優(yōu)勢的場景。低延遲不僅僅是指它的延遲比較低,另外延遲也是恒定的,不管這一幀有多復雜,它的延遲都是恒定的,這對一些特殊的業(yè)務來說好處是非常大的,如云桌面、云游戲。
另外,還有4K/8K 高分辨率。當分辨率達到4K/8K時,編碼的標準可能已經(jīng)不能用了264了,需要用到265,甚至更高的一些編碼標準來做編碼,此時對CPU的算力要求會非常大,此時ASIC編碼器硬件成本的優(yōu)勢就會體現(xiàn)出來。
最后一點我們深有體會,其實就算是做直播的客戶,做轉碼系統(tǒng)的客戶,大部分的精力也并不是花在編解碼上,而是會花在媒資管理、分布式存儲、推流拉流、以及任務調度中。因為這是其核心業(yè)務,將編碼的東西交由硬件來做,客戶可以更聚焦業(yè)務。這也是我們覺得硬件編碼器比較有優(yōu)勢的一個地方。
5. 未來
最后探討一下未來,這其實是一個開放的話題,即未來的硬件編碼器會是什么樣子?
就像新一代的芯片一樣,不僅僅包含編解碼,而且已經(jīng)在加入AI相關的功能,后續(xù)是不是還會有一些新的硬件功能融入進來,這是一個值得思考的問題。另外一個問題是說,未來的編碼器是不是還會像現(xiàn)在一樣只提供一些數(shù)據(jù)流的推送,只提供一些不同編碼格式的選擇,還是說可以將整個基本的編碼工具暴露給客戶。因為我們覺得編解碼是計算模式相對固定,但算力消耗越來越大的東西,倒推20年,大家覺得有什么事情是這樣的?就是圖像渲染,所以有了GPU出現(xiàn)。OpenGL是一套非常好的工具,它將GPU圖像渲染中需要做的一些場景抽象出來,形成各種各樣的API,通過調用API就可以實現(xiàn)圖像渲染中所有的邏輯。那么,對于編解碼來說,是不是也有這樣的一套框架,這就是我們所想的未來硬件編碼器的樣子。
講師招募
LiveVideoStackCon 2022 音視頻技術大會 上海站,正在面向社會公開招募講師,無論你所處的公司大小,title高低,老鳥還是菜鳥,只要你的內容對技術人有幫助,其他都是次要的。歡迎通過?speaker@livevideostack.com?提交個人資料及議題描述,我們將會在24小時內給予反饋。
喜歡我們的內容就點個“在看”吧!
總結
以上是生活随笔為你收集整理的视频编码器的智能化——AI辅助编解码的ASIC解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火山引擎端云一体化服务:打造面向体验的视
- 下一篇: 对话Justin Uberti:RTC的