超分演算法在 WebRTC 高清視訊傳輸弱網優化中的應用

融雲RongCloud發表於2022-03-30

隨著 5G 的發展應用,人們對音視訊通訊的品質要求在不斷提高。習慣了高清視覺享受的使用者,顯然無法接受退回“馬賽克時代”。關注【融雲全球網際網路通訊雲】瞭解更多

然而,在全球網際網路通訊雲服務中,面對網路和終端的豐富多樣和複雜多變,又難免遇到使用者頻寬不足的情況。使用技術手段來提高影像和視訊解析度,讓使用者在較低頻寬的情況下依然獲得較高清晰度的影像和視訊就非常重要了。

本文分享使用影像超解析度技術在有限頻寬下實現 WebRTC 高清視訊傳輸的優化方案。

視訊編碼中影響視訊清晰度的主要因素

理論上,對於同一種編碼器而言,在解析度不變的前提下,位元速率越大,視訊質量越高。但是從視覺來看,在特定編碼器和解析度的情況下,位元速率存在一個最優值。

通常,視訊通話/會議採用的視訊壓縮方案為 H264 或者 VP8。在 H264 編碼中,720P 和 1080P 的視訊推薦位元速率為分別為 3500Kbps 和 8500Kbps。

在移動裝置中,H264 編碼器推薦的位元速率如下表。

1280 x 7201920 x 1080
極低位元速率500 Kbps1 Mbps
低位元速率1 Mbps2 Mbps
中等位元速率2 Mbps4 Mbps
高位元速率4 Mbps8 Mbps
極高位元速率8 Mbps16 Mbps

(移動端不同解析度的推薦位元速率)

由上表可知,在 WebRTC 技術方案框架下進行視訊通話時,採用 H264 編碼器對 1080P 高清視訊進行壓縮,視訊若設定為中等位元速率則需要 4Mbps。

對於頻寬不足的部分終端使用者,若仍然播放 1080P 的視訊會存在卡頓的情況。則可以在 WebRTC 的技術框架下,採用聯播(simulcast)或者 SVC 的方式,對不同的終端使用者根據各自的特點傳輸不同解析度或者不同幀率的碼流。

簡單來說,若使用者的網路環境不適合傳輸 1080P 的視訊,則給使用者傳送 720P 的視訊,所需位元速率為 1080P 的一半,可以最大限度保障有限頻寬下的視訊傳輸流暢性。

高清已成趨勢,在不改變編碼器即 H264 或 VP8 的情況下,如何依然在終端上獲得高清視訊成為學術界和產業界需要共同研究和解決的課題。

影像超解析度技術在 WebRTC 中的應用

影像超解析度技術(Super Resolution,SR)是計算機視覺中提高影像和視訊解析度的重要技術,可以將一幅低解析度影像重建出高解析度影像。

通俗地說,就是當我們放大一張尺寸較小的影像時,會出現模糊的現象,超解析度重建就是將原圖中一個畫素對應的內容在放大之後的圖中用更多的畫素來表示,讓影像儘可能地清晰。

隨著深度學習的發展,目前影像超解析度技術已經從傳統的計算機視覺分析方法全面轉向基於 CNN 和 Transformer 的方案。

將影像超解析度技術應用於 WebRTC 的通常實現方式為:傳送低解析度的視訊,在每一個終端顯示的時候,採用超解析度技術對影像進行放大。由於傳送的視訊為低解析度的影像,可以在較低的傳輸視訊資料量下獲得較高的清晰度。

在 WebRTC 中,影像超解析度演算法需要同時滿足實時超分和清晰效果的雙重要求。通過對業界主流基於深度學習的超分演算法進行廣泛調研和實驗,我們發現基於 ESPCN 進行優化可以滿足要求。

ESPCN 由 2016 年發表在 CVPR 上的論文“Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network”提出,實驗結果如圖所示,達到了速度和精度的平衡。

篇幅所限,不在此展開介紹該模型的具體結構。

(各種演算法的精度和速度對比)

ESPCN 模型實驗

在此次實驗中,我們用 Pytorch 進行 ESPCN 模型的搭建、訓練和推理。訓練的資料一般可以採用常見的影像資料庫,比如 PASCAL VOC、COCO 等,當然也可以根據行業特點採集相應資料集,讓模型推理更有針對性。

為了增大資料庫,我們在訓練時會採用一些資料庫擴容操作,最有效的方法之一是影像隨機裁剪。該方法不僅能夠對資料庫進行擴容,而且可以弱化資料噪聲與提升模型穩定性。

在 WebRTC 視訊傳輸中,在編碼端對影像進行 1/2 下采樣。比如,傳輸 1080P 視訊,在編碼端視訊的下采樣為 960×540。

根據本文前述分析及部分實驗效果表明,傳輸 960×540 解析度的視訊相較傳輸 1080P 的視訊,資料量可以減少一半以上。

在實際應用中,當終端使用者由於頻寬限制無法直接傳輸 1080P 的視訊時,可以傳輸 960×540 的視訊,再採用 ESPCN 模型對 960×540 的視訊進行超分重建獲得原始 1920×1080 的視訊,從而滿足使用者對高清視訊的要求。

終端部署 ESPCN 模型優化

一般而言,深度學習模型訓練完成後,需要模型對不同終端進行鍼對性地部署。

首先,我們通過模型量化縮小模型大小,減少對終端儲存的佔用,提升計算速度,加速深度學習推理的優化。

在這方面,Pytorch 框架提供了相應的介面,可以對模型進行各種量化,我們採用的是 int8 量化。

通過 int8 量化,模型中的部分資料從 float 變成 int 型,採用 libtorch 整合到 WebRTC 中,訓練好的模型會轉換成 libtorch 可以讀取的 pt 格式。

結果顯示,未量化之前 ESPCN 模型大小為 95KB,量化之後為 27KB。

其次,針對不同型號手機的推理優化,從 256256 上取樣到 512152,該模型在華為 P10 等中高階手機上可以達到 30ms 的推理速度,在 Asus Fonepad 8、Samsung Galaxy M31 等終端上目前實時表現尚不理想。我們還將採用剪枝和各種量化手段持續優化模型,滿足各類手機的要求。

ESPCN 模型實驗結果

模型讀取部分關鍵程式碼如下所示,其中 espcn.pt 為未量化之前的模型。

// Deserialize the ScriptModule from a file using torch::jit::load().
auto  device = torch::kCUDA;
std::string str = "espcn.pt";
  
try
{
    module = torch::jit::load(str, device);
}
catch (const c10::Error& e)
{
    std::cerr << "error loading the model\n" << e.what();
}

pmodule = &module;

模型的推理如下程式碼所示,output 即為模型推理的輸出。因為輸出的資料為 0 到 1,需要對輸出資料進行限定和轉換。

需要注意的是,ESPCN 模型預設是針對 Y 通道的超分,對 UV 資料而言,直接進行雙三次插值(bicubic),即完成了 YUV 三個通道的超分。

std::vector<torch::jit::IValue> inputs;
inputs.push_back((img_tensor1.cuda()));
at::Tensor output = pmodule->forward(inputs).toTensor();
output = output.mul(255).clamp(0, 255).to(torch::kU8);

量化後的 ESPCN 模型效果


(原始影像)

將原始影像採用雙三次插值(bicubic)放大成目標尺寸

通過 ESPCN 模型超分重建

從視覺效果來看,ESPCN 模型的效果要遠好於 bicubic 插值的方法。

本文主要介紹了基於影像超解析度技術進行 WebRTC 傳輸優化的方案,涉及模型選擇、訓練、量化等方面。

視訊傳輸優化方案眾多,影像超解析度技術僅是其中之一。在實時音視訊互動成為通訊基本訴求的當下,融雲會積極結合相關理論和成熟演算法,研發新技術,對視訊壓縮和傳輸進行優化,滿足遍佈全球、需求各異的各類使用者需求。

相關文章