林鵬程
(廈門大學嘉庚學院 信息科學與技術學院,福建 漳州 363105)
視頻流是直播行業(yè)的主要載體,其傳輸質量影響著最終的呈現(xiàn)效果以及用戶體驗。然而受限于帶寬和資源,視頻在傳輸過程中常采用低碼率壓縮[1]。這意味著壓縮后的視頻會丟失重要的細節(jié),比如人物主播臉部的細節(jié)、美食外觀紋理等,諸如此類都是用戶的感興趣區(qū)域[2](Regions of Interest,ROI)。提高ROI的碼率可提高區(qū)域的視頻流質量與用戶的觀看體驗。最重要的是,在帶寬一定的情況下,提高ROI碼率的同時降低背景碼率能夠保證整體碼率處于穩(wěn)定狀態(tài),解決直播服務中帶寬的限制問題。
目前,已有諸多文獻做過相關研究。文獻[3]利用圖像小波變化得到圖像的ROI,再進行區(qū)分編碼;文獻[4]利用支持向量機檢測出圖片的ROI區(qū)域并在JPEG2000的基礎上進行分區(qū)域壓縮,結果表明,ROI壓縮方式能得到區(qū)域清晰的圖片;文獻[5]基于壓縮感知提取ROI區(qū)域并編碼,提供了一種可行的ROI圖像編碼方法。之后,研究者把目光轉向視頻壓縮領域[6]。文獻[7]根據(jù)圖像復雜度和能量設定不同的權重因子,以此重新分配碼率;文獻[8]分別對時空域λ和QP值進行調(diào)整限制;文獻[9]在率失真理論基礎上,對ROI失真估計進行縮放,以提高ROI碼率及優(yōu)先權。但上述研究還存在一些問題:研究停留在仿真層面,未在實際系統(tǒng)中實現(xiàn),尤其在對算法實時性要求高的場景。本文在直播系統(tǒng)的基礎上設計了一種基于YOLOv3與碼率分配的ROI編碼方法。在提取階段,使用YOLOv3對視頻進行ROI提取,同時采用TensorRT加速模型;在編碼階段通過復雜度評估重新分配碼率。實驗數(shù)據(jù)表明,本文方法在改善ROI視頻質量的同時,能滿足直播對壓縮速度的要求。
本文結構將作為在Nginx直播平臺的插件運行,系統(tǒng)框架如圖1所示。
圖1 系統(tǒng)框架
當用戶端把需要直播的音視頻流推送到服務端的Nginx時,Nginx將數(shù)據(jù)傳送到本文結構,經(jīng)過ROI檢測并進行碼率重分配、編碼后,重新生成壓縮的數(shù)據(jù)回傳至Nginx,由此,服務端便可為用戶提供高質量的音視頻流服務。
本文結構對ROI處理的主要流程如圖2所示。當接收到Nginx傳來的視頻幀數(shù)據(jù)時,先解壓視頻幀數(shù)據(jù),得到原始YUV視頻數(shù)據(jù),接著進行如下操作:
圖2 系統(tǒng)處理過程
(1)初步處理:將視頻YUV數(shù)據(jù)轉化為模型推流所需的RGB格式數(shù)據(jù),并進行歸一化處理;
(2)模型推理:將視頻數(shù)據(jù)輸入YOLOv3模型,檢測ROI。推理時采用基于GPU加速的TensorRT框架加速模型推理,運用多線程進行多流水線同時推理,提高推理速度;
(3)后處理:模型推理得到的數(shù)據(jù)是關于ROI位置的概率矩陣—box信息,因此需要對概率排序、篩選,最終確定是否為ROI。若為ROI,則需激活box信息。系統(tǒng)選用ReLU函數(shù)作為激活函數(shù),得到當前視頻幀ROI的位置坐標;
(4)box信息傳遞:ROI的位置坐標用于編碼,因此需要將該信息傳入libx264編碼庫。本系統(tǒng)采用FFmpeg中預留的libx264接口將信息傳入底層libx264;
(5)碼率重分配:在編碼之前,根據(jù)對幀內(nèi)各宏塊復雜度的估計,重新分配各宏塊的碼率,分配不同的QP值對幀內(nèi)宏塊進行調(diào)整編碼;
(6)封裝視頻流:重新壓縮后的視頻數(shù)據(jù)可使用FFMpeg封裝成易于網(wǎng)絡傳輸?shù)腗P4、FLV格式,供用戶觀看。
原始的分配方式可分為幀間分配和幀內(nèi)分配。前者根據(jù)設定的碼率分配緩沖區(qū),編碼前根據(jù)每個幀的復雜度、剩余緩沖區(qū)給每個幀分配對應的碼率,并通過線性關系轉化為QP值[10];后者根據(jù)幀內(nèi)每個宏塊的復雜度,將前者分配的碼率按權重分配給各宏塊,并轉化為各宏塊的QP值偏置量。最后,在編碼階段,編碼器將根據(jù)QP值與偏置量對每個宏塊進行量化。該碼率分配方式較均勻,本文在幀內(nèi)編碼階段將背景區(qū)域的碼率轉化為ROI的碼率,以此提高ROI的質量。若一幀的碼率為Rf,ROI的碼率為Rr,背景的碼率為Rb,三者關系如下:
將ROI的Rb縮減設定的比例系數(shù)為β,重分配后的碼率調(diào)整為:
重新分配背景與ROI碼率后,將新碼率分配給各宏塊,背景宏塊碼率和ROI宏塊碼率分別乘以系數(shù)α、β,以保證幀總體碼率不變。根據(jù)率失真模型,每個宏塊的碼率與復雜度存在線性關系,可據(jù)此建立復雜度Mco與碼率間的關系:
實驗條件見表1所列。
表1 實驗條件參數(shù)表
實驗分為算法速度測試與視頻質量變化測試。在算法速度方面,對不同的視頻進行處理,并采用處理過程中的FPS作為評價標準,結果見表2所列。
表2 算法速度測試結果 FPS
從結果可以看出,本文算法在TensorRT加速、單線程情況下達到約25 FPS的處理速度,增加加速線程后,處理速度約為40 FPS,基本滿足直播平臺對處理速度的要求。經(jīng)過大量測試表明,當線程數(shù)為10時,對大部分1 080P視頻的處理速度達到最佳,為50 FPS。
在視頻質量測試方面,將視頻分別轉成5種碼率進行對比。將每段視頻抽取編號1,10,50,70,100,125作為代表進行比較。如圖3所示,第一行圖片代表原始視頻,第二行圖片代表實驗組視頻,第三行圖片代表對照組視頻,從圖片可以直觀看出,對照組存在馬賽克,質量較實驗組差,實驗組較接近原始視頻質量。
圖3 實驗結果對比
為了進一步說明本文方法的有效性,采用PSNR作為評價標準。以視頻5組實驗數(shù)據(jù)為例,結果見表3所列。
表3 碼率結果(無量綱)
通過表3可以看出,本文方法能有效提高ROI碼率,實驗組相比對照組PSNR提高約10%。
本文提出的基于YOLOv3與碼率重分配的視頻直播系統(tǒng)與其他文獻相比,具有以下創(chuàng)新點:
(1)采用TensorRT加速YOLOv3推理,并在推理中使用多線程加速;
(2)在幀內(nèi)分配碼率時,通過2個因子α、β將碼率重新分配給ROI與背景。
實驗結果表明,本文方法能夠提高ROI編碼質量,同時,TensorRT與多線程加速后,處理速度達到40 FPS,完全可滿足在直播場景的應用要求。