李 申,柴志雷,2,嚴 偉,夏 珺,趙建斌
1(江南大學 物聯(lián)網(wǎng)工程學院,江蘇 無錫 214122 2(數(shù)學工程與先進計算國家重點實驗室,江蘇 無錫 214125 3(北京大學 軟件與微電子學院,北京 102600)
與H.264/AVC算法相比,H.265/HEVC算法可以在保證視頻質(zhì)量相同的前提下,將視頻碼率降低一半,即壓縮比提高一倍,這大大減少了對通信帶寬和存儲空間的占用.然而由于H.265算法采用了更為復(fù)雜的宏塊劃分機制和預(yù)測模式,使得其編碼速度較H.264算法降低數(shù)倍[1].因此H.265算法的加速問題自H.265標準發(fā)布以來就一直是視頻編解碼領(lǐng)域研究的熱點和難點[2].
目前國內(nèi)外相關(guān)研究多集中于幀間預(yù)測算法及幀內(nèi)預(yù)測算法的軟件加速方面,幀內(nèi)模式判決的硬件結(jié)構(gòu)及加速方面的研究相對較少.文獻[3]-文獻[8]在不同程度上對幀內(nèi)模式判決算法在軟件層次進行了加速,但加速比不理想,不能完全滿足實際應(yīng)用的需求.文獻[9]提出了一種基于FPGA的H.265編碼器,主要通過對原始圖像進行下采樣來達到快速模式判決的目的,造成編碼質(zhì)量有了一定的損失.幀內(nèi)編碼幀作為幀間算法的參照對象,其質(zhì)量的好壞直接決定了同一個GOP(Group of Pictures,畫面組)中的幀間視頻編碼質(zhì)量.因此,如何進行快速高效的幀內(nèi)模式判決是H.265算法加速的關(guān)鍵問題之一.
H.265幀內(nèi)預(yù)測和編碼算法引入了多達35種幀內(nèi)預(yù)測模式和4種CU(Coding Unit)劃分尺度,使得其算法復(fù)雜度很高[1].一方面,本文通過CU的重新劃分和組合來解決不同尺度下的編碼塊劃分問題,將多層次大尺度CU的模式判決問題轉(zhuǎn)化為單一層次多個小尺度CU模式判決的疊加問題;另一方面,通過塊內(nèi)細粒度并行和塊間窗口流水的方式實現(xiàn)并行編碼架構(gòu);最終基于FPGA實現(xiàn)了快速模式判決.在嵌入式平臺Xilinx ZCU102上的實驗結(jié)果表明,本文算法最高可達到93.6x的加速比,且編碼后的視頻平均PSNR僅降低0.71dB.
H.265幀內(nèi)預(yù)測算法的基本思想與H.264相近,是將原始視頻幀分塊劃分,利用像素的空間相關(guān)性,通過左側(cè)和上側(cè)的像素值對某一預(yù)測塊進行預(yù)測,并對預(yù)測塊與原始塊的殘差進行變換和編碼.
對于亮度分量,CU的尺寸包括64×64(Largest CU,LCU)、32×32、16×16、8×8(Smallest CU,SCU)共4種尺度,色度分量在YUV420采樣模式下CU邊長減半.
幀內(nèi)預(yù)測包含3類共35種預(yù)測模式.分別是Planar模式(模式0)、DC模式(模式1)和Angular模式(模式2~模式34)[7].
H.265幀內(nèi)預(yù)測模式判決(Mode Decision, MD)主要解決兩個問題:1)當前CU是否需要繼續(xù)向下劃分;2)每個CU采取何種預(yù)測模式.
JCT-VC給出的標準參考模型HM中采用了四叉樹遞歸的方式進行,最優(yōu)模式判定以率失真代價(RDcost)為依據(jù).具體做法是:從LCU逐層向下劃分,直至SCU遞歸返回,分別計算每種尺度下35種幀內(nèi)預(yù)測模式的最優(yōu)解.若某一尺度下,4個最優(yōu)解的RDcost之和小于上層最優(yōu)RDcost,則進行CU劃分,否則不進行CU劃分.如圖1所示.四叉樹遞歸調(diào)用結(jié)構(gòu)導致該算法的時間復(fù)雜度和空間復(fù)雜度均很高[1,5].
圖1 一次四叉樹遞歸劃分示意圖
與原始的自頂向下四叉樹遞歸劃分模式不同,本文提出了一種自底向上的逐層累加的幀內(nèi)判決預(yù)測模式,其改進之處包括以下2個方面:
首先,對于一種給定的幀內(nèi)預(yù)測模式m(0≤m≤34),不再重復(fù)計算不同深度下的RDcost,深度d(0≤d≤2)的RDcost由深度為d+1的RDcost累加得到,如式(1)所示:
(1)
其次,對于幀內(nèi)模式劃分的判定,引入了分割代價C.根據(jù)視頻編碼理論,如果在某一深度不進行四叉樹分割,能夠節(jié)省編碼時間、減小碼率(但是會造成視頻質(zhì)量在一定程度的下降),C即四叉樹分割的懲罰項.對于分割S的判定可由式(2)確定:
(2)
下面以DC模式為例,證明上述判決過程與原始判決方法可以相互替代,DC模式的計算公式如式(3)所示.其中Px,y代表坐標為(x,y)的參考像素值,N代表當前CU的尺寸,?表示算術(shù)右移操作.
(3)
證明:假設(shè)當前CU深度為d,尺寸為2N,則深度為d+1的CU尺寸為N.下面分2種情況進行討論.
情況1.當前CU符合DC分布,則深度為d+1的區(qū)域也符合DC分布.即當前CU的MD應(yīng)為m=1,S=false.
深度為d時:
(4)
深度為d+1時:
(5)
(6)
根據(jù)式(2)可得S=false,即不進行劃分.
情況2.深度為d+1的部分CU符合DC分布,深度為d的CU也不符合DC分布.
(7)
則針對DC模式需要深度為d的CU進行劃分.
同理,對于Planar模式和Angular模式,可以通過分類討論的方式對本方法的有效性加以證明,不再贅述.
本文基于高層次綜合(High Level Synthesis,HLS)方法設(shè)計了兼容AXI(Advanced eXtensible Interface)接口的并行幀內(nèi)模式判決IP.HLS是一種將C/C++語言描述向HDL描述轉(zhuǎn)化的方法,通過接口約束、資源約束、時序約束等能夠快速實現(xiàn)硬件原型設(shè)計[10,11].
如圖2所示,針對SCU,在進行模式判決時,可能用到的參考像素區(qū)域按順時針方向包括A、B、C、D、E共5個部分.
圖2 SCU與參考像素
通過這些區(qū)域得到預(yù)測值之后,再與SCU的原始像素值相減得到殘差,進而進行模式判決.H.265幀內(nèi)預(yù)測共有35種可能的預(yù)測模式,將這些數(shù)據(jù)拷貝35份,這35種幀內(nèi)預(yù)測模式就可以同時進行.依據(jù)35種預(yù)測模式的特點可以將它們分為6組,如表1所示.在FPGA的具體實現(xiàn)過程中,為了減少代碼描述上的冗余,可以將35種算法分組進行實現(xiàn),然后通過HLS提供的UNROLL指令進行展開,從而達到并行化的目的.
表1 幀內(nèi)預(yù)測模式及其分組
若重構(gòu)值不可用(如當前SCU處于視頻幀的左上角時,這些區(qū)域不存在),則采用H.265標準給出的默認值defaultVal.
defaultVal=2?(bit_depth-1)
(8)
bit_depth代表視頻分量的像素點的位寬,本文為8.
由于傳統(tǒng)的RDcost計算模式速度較慢,本文采用SAD作為RDCost的替代評價準則,計算公式如式(9)所示.
(9)
由于SCU的預(yù)測需要用到周圍像素的重構(gòu)值,這導致下一個SCU的處理必須等待上一個SCU的重構(gòu)結(jié)果,且SCU重構(gòu)的周期較長,從而導致算法無法實現(xiàn)SCU間的并行.為了減少反饋回路的耗時,本文在進行模式判決時采用原始值代替重構(gòu)值進行[4].
多個SCU的并行會受到硬件資源的限制,本文采用流水的方式將單個SCU的幀內(nèi)模式判決硬件進行復(fù)用.
二維圖像在內(nèi)存中采用一維的方式進行存儲,但SCU是二維的,若直接將DDR中的數(shù)據(jù)按SCU分塊加載至FPGA片上RAM,則會出現(xiàn)“地址跳躍”的問題.
對于通用CPU來說,其主頻在GHz數(shù)量級,同時具備多級緩存和預(yù)測-命中機制,“地址跳躍”并不會造成大的時間開銷;本文中FPGA的工作頻率為200 MHz,為了避免造成不必要的時間浪費,本文設(shè)計了DDR-BRAM-LUT 3級物理存儲結(jié)構(gòu),分別對應(yīng)視頻幀-行緩存-窗口和參考像素緩存這3級邏輯存儲結(jié)構(gòu),如圖3所示進行這種結(jié)構(gòu)劃分的依據(jù)是:DDR位于FPGA片外,容量最大但存取速度最慢;BRAM位于FPGA片內(nèi),容量較小但存儲速度較快;LUT也是FPGA的片內(nèi)資源,可以直接進行快速訪問而不像BRAM那樣需要事先指定存取地址.
圖3 三級物理與邏輯存儲結(jié)構(gòu)
具體做法如下:先將視頻信號載入DDR中,依據(jù)當前幀與當前處理的窗口對應(yīng)的行位置,進行17行緩存(初始化時首行為默認值defaultVal).同時開辟參考像素緩存和行緩存,及時對參考像素與SCU窗口進行緩存,并將SCU窗口和參考像素送入并行MD模塊,SCU窗口可以在行緩存中進行流水化處理.如圖4所示.
圖4 SCU間流水處理示意圖
基于FPGA的幀內(nèi)模式判決的總體結(jié)構(gòu)如圖5所示.視頻數(shù)據(jù)從DDR通過AXI總線載入行緩存,原始像素依據(jù)窗口劃分分別進入35個并行處理窗口w0~w34及35組并行參考像素緩存R0~R35(每組包括上側(cè)和左側(cè)兩部分),通過35個預(yù)測器P0~P34得到35種模式下的預(yù)測結(jié)果,利用SAD評價函數(shù)得到RDCost.單一尺度下可給出當前尺度的最優(yōu)結(jié)果,多尺度下依據(jù)單一尺度的結(jié)果進行疊加和修正,并采用本文2.3節(jié)提出的判決方法進行CU決策,最終將決策結(jié)果通過AXI總線寫回DDR.在DDR的讀寫過程中,利用HLS工具通過高層次約束的方法實現(xiàn)高效AXI4 Master訪存接口,不再需要手工使用硬件描述語言實現(xiàn)DDR控制和訪問.
圖5 基于FPGA的幀內(nèi)模式判決總體結(jié)構(gòu)
為了驗證本文架構(gòu)的有效性,基于FPGA對本文提出的架構(gòu)進行了高層次綜合(HLS)實現(xiàn).
實驗主要指標及主要參數(shù)配置如下:
1)實驗平臺:采用Xilinx ZCU102板卡,該板卡搭載了xczu9eg芯片,包括可編程邏輯(Programmable Logic,PL)和處理器系統(tǒng)(Processing System,PS)兩部分.其中PL端FPGA平臺采用的時鐘頻率為200MHz;PS端ARM平臺為Cortex A53 四核處理器,主頻為1GHz,4G DDR.
2)測試軟件:標準參考模型HM的編碼質(zhì)量較好,但運行速度與其他現(xiàn)有的開源模型相比較慢,在實際場景中應(yīng)用較為困難[7,8].基于此,本文選取Kvazaar[7,8]作為基本測試軟件,同時開啟GCC編譯器的-O3優(yōu)化,確保發(fā)揮CPU的最佳性能.
3)量化參數(shù)(Quantization Parameter,QP):分別取QP=22、27、32、37進行實驗,然后取四種情況下的平均值進行對比.
4)測試序列:本文采用JCT-VC提供的標準視頻測試序列,取每個視頻序列的前100幀進行測試.
5)對比與評價方法:本文將算法分別在PS端(ARM)運行原始的H.265幀內(nèi)預(yù)測MD算法,PL端(FPGA)運行改進之后的H.265幀內(nèi)預(yù)測MD算法.依據(jù)處理速度、碼率、PSNR等多方面進行對比,同時將本文結(jié)果與其他文獻結(jié)果進行對比分析.
本算法的硬件實現(xiàn)所占用的FPGA邏輯資源如表2所示,考慮到視頻幀的分辨率不同,本文的設(shè)計具備一定的伸縮性,最高可處理分辨率為1080p(即1920×1080)的視頻.
不同平臺下的處理速度對比如圖6所示,可以看出本文算法在的運行時間較原始算法有了大幅下降.
圖6 不同平臺下的處理速度對比柱狀圖
記原始MD算法在ARM平臺上的運行時間為TA,本文改進后的硬件MD算法在FPGA平臺上的運行時間為TF.
則加速比:
(10)
支持的幀率:
(11)
具體數(shù)據(jù)如表3所示.從表3可以看出,本文硬件MD算法最大可以支持1080p@29fps的幀率,達到了93.6的加速比.綜合圖6、表3可知,與軟件算法相比,硬件算法運行時間受圖像分辨率的影響變化較小,針對不同分辨率的視頻,硬件處理速度穩(wěn)定在30ms/幀上下,軟件算法處理時間隨圖片分辨率的變大而不斷增大.
表3 硬件MD算法的加速比和支持的幀率
表4是本文與軟件加速方法的對比.僅從算法角度進行優(yōu)化得到的速度提升不高[3,4],多核并行的方法能夠獲得更高的加速比[5-7],但是由于嵌入式平臺的運算性能較差,這種加速方式在嵌入式平臺獲得的加速效果有限[8].本文利用FPGA進行算法加速,在對原始算法進行改造之后,能夠進行細粒度的并行,可以得到更好的加速效果.
表4 本文與軟件加速方法對比
表5 本文與其他FPGA實現(xiàn)對比(Intra MD部分)
表5是本文與其他FPGA算法實現(xiàn)對比,與其他FPGA實現(xiàn)相比,本文采用了HLS的開發(fā)方法,在算法運行的性能上能得到與HDL開發(fā)方法相近的指標,且HLS方法采用兼容C的模式進行開發(fā),開發(fā)效率較HDL方法高,同時也便于在開源框架上進行算法移植和硬件并行化工作[10,11].不足之處是HLS方法的資源耗費較HDL多,HLS工具有待于進一步優(yōu)化.值得指出的是,為了減少邏輯資源的耗費并提高處理速度,文獻[9]在MD過程中對原始圖像進行了下采樣處理,利用差值算法減少了需要緩存和運算的像素點數(shù)目.若本文采取類似的處理方法,從理論上也能夠使邏輯資源消耗得到顯著下降,同時實現(xiàn)處理速度的提升.
表6 編碼質(zhì)量對比實驗結(jié)果
為了進一步說明本文算法對視頻編碼質(zhì)量的影響,本文統(tǒng)計了不同序列的相對于原始算法PSNR和Bit-Rate變化情況.表6是編碼質(zhì)量對比的實驗結(jié)果.由實驗結(jié)果可知,針對不同的測試序列,本文提出的并行模式判決架構(gòu)PSNR與碼率均略有下降,但總體來看,視頻編碼質(zhì)量與原始算法差異不大.
本文將H.265編碼過程中的MD算法改造為SCU MD的疊加問題,在編碼塊內(nèi)部通過細粒度并行實現(xiàn)快速模式判決,在編碼塊之間通過窗口流水方式實現(xiàn)資源復(fù)用和快速處理,并且在FPGA上利用HLS工具進行了硬件設(shè)計和實驗驗證.實驗結(jié)果表明,在保持視頻質(zhì)量一定,碼率無較大提升的前提下,本設(shè)計在嵌入式平臺Xilinx ZCU102上最高可以達到93.6x的加速比,只帶來平均約0.71dB的質(zhì)量損失,具備一定的實際應(yīng)用價值.后期將進行H.265其他模塊的FPGA移植和加速工作,從而形成一個完整的嵌入式視頻編碼系統(tǒng).