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