摘 要:設(shè)計(jì)使用高層次綜合語言HLS(High Level Synthesize)來實(shí)現(xiàn)圖像預(yù)測幀內(nèi)編碼模塊的功能。幀內(nèi)預(yù)測編碼是指利用視頻空間域的相關(guān)性,使用當(dāng)前圖像已編碼的像素預(yù)測當(dāng)前像素,然后將預(yù)測殘差(當(dāng)前像素真實(shí)值與預(yù)測值之間的差值)作為后續(xù)編碼模塊的輸入,進(jìn)行下一步編碼處理。HLS實(shí)現(xiàn)相比與直接使用verilog和其他的語言來實(shí)現(xiàn),HLS具有開發(fā)周期短,可以極大地節(jié)省人力成本和時(shí)間成本、平臺可移植性強(qiáng)以及更便捷的代碼迭代等的優(yōu)勢。設(shè)計(jì)使用HLS實(shí)現(xiàn)的對HEIF編碼IP中圖像預(yù)測編碼模塊,主要用于FPGA中,優(yōu)化后的IP總占用10795個(gè)FIFO和30705個(gè)LUT,并且設(shè)計(jì)在后續(xù)優(yōu)化代碼之后縮短了1/3原有編碼所需時(shí)間,大大提升了編碼速率。
關(guān)鍵詞:圖像幀內(nèi)預(yù)測編碼;預(yù)測殘差;HEIF編碼;HLS
中圖分類號:TN46 文獻(xiàn)標(biāo)識碼:A
Design of HEIF Image Prediction Coding Module Based on HLS
HU Jin1,HUANG Mingshuai1,BI Xiaomeng2
(1.School of Physics amp; Electronics, Hunan University,Changsha,Hunan 410082,China;
2. Zhongda Intelligent Technology Co., Ltd., Changsha,Hunan 410082,China)
Abstract:The design uses high level synthesize(HLS) language to realize the function of image prediction in frame coding module. Intra frame predictive coding refers to using the correlation of the video spatial domain to predict the current pixel using the encoded pixel of the current image, and then using the predicted residual (the difference between the real value of the current pixel and the predicted value) as the input of the subsequent coding module for the next encoding process. Compared with the implementation of verilog and other languages directly, HLS has the advantages of short development cycle, great savings in labor cost and time cost, strong platform portability and more convenient code iteration. The image prediction coding module of HEIF encoded IP implemented by HLS is designed, which is mainly used in FPGA. The optimized IP occupies 10795 FIFO, 30705 and LUT, and the design reduces the time required for original coding by 1/3 after the subsequent optimization of the code, greatly improving the coding rate.
Key words:image intra frame prediction coding;prediction residual;HEIF encoding;HLS
HEIF圖像編碼方法包括:獲取HEIF圖像數(shù)據(jù);對圖像數(shù)據(jù)進(jìn)行計(jì)算,獲得圖像數(shù)據(jù)分量;對所述圖像數(shù)據(jù)分量進(jìn)行編程處理,獲得所述HEIF圖像數(shù)據(jù)的編碼數(shù)據(jù)[1]。視頻序列中的第一幀圖像以及其他I幀的圖像,在編碼時(shí)沒有可供參考的圖像,只能利用自身的局部像素信息來降低空間冗余,該過程即為幀內(nèi)編碼。幀內(nèi)預(yù)測技術(shù)是消除視頻空間冗余的主要技術(shù)之一[2],因此幀內(nèi)編碼是HEVC編碼中不可或缺的技術(shù)[3]。HLS具備很多其他高級語言所不具備的特點(diǎn),比如任意精度數(shù)據(jù)庫、HLS串流庫以及HLS預(yù)處理指示等?;?C/C++語言的原生數(shù)據(jù)類型都位于 8 位邊界(8 位、16 位、32 位和 64 位)上。RTL總線(對應(yīng)于硬件)支持任意數(shù)據(jù)長度。使用標(biāo)準(zhǔn) C/C++ 語言數(shù)據(jù)類型可能導(dǎo)致硬件實(shí)現(xiàn)效率低下。任意精度 (AP) 數(shù)據(jù)類型允許代碼使用位寬更小的變量,并且可供 C/C++語言仿真用于確認(rèn)功能保持不變或者可接受。較小的位寬所生成的硬件運(yùn)算符也更小且運(yùn)行更快;HLS串流庫,串流是一種數(shù)據(jù)傳輸形式,其中數(shù)據(jù)樣本從第一個(gè)樣本開始按順序發(fā)送,串流不需要地址管理。Vitis_HLS 提供了 C++ 模板類 “hls::streamlt;gt;”用于對串流數(shù)據(jù)結(jié)構(gòu)進(jìn)行建模,其相當(dāng)于無限深度的FIFO并且按照順序?qū)?shù)據(jù)進(jìn)行讀寫;HLS預(yù)處理指令則是可以將硬件電路的思維實(shí)現(xiàn)在高級語言上,比如預(yù)處理指令“#pragma HLS dataflow”中dataflow編譯指示可啟用任務(wù)級流水打拍,允許函數(shù)和循環(huán)在其操作過程中重疊,增加 RTL實(shí)現(xiàn)的并發(fā)度,并增加設(shè)計(jì)的整體吞吐量。與文獻(xiàn)[4]、文獻(xiàn)[5]以及文獻(xiàn)[6]中的傳統(tǒng)設(shè)計(jì)研究方法不同,本次設(shè)計(jì)綜合闡述了如何基于HLS實(shí)現(xiàn)HEIF編碼IP中8×8圖像預(yù)測模塊的功能。
1 編碼預(yù)測算法原理
1.1 算法實(shí)現(xiàn)簡述
圖像的幀內(nèi)預(yù)測分為兩大部分,一部分是幀內(nèi)預(yù)測模式,另一部分是幀內(nèi)預(yù)測過程。其中幀內(nèi)預(yù)測模式又分為亮度預(yù)測模式、亮度預(yù)測模式編碼以及色度預(yù)測模式編碼;幀內(nèi)預(yù)測過程主要涉及相鄰參考像素的獲取、參考像素的濾波以及預(yù)測值的計(jì)算。在本文提到的設(shè)計(jì)中對進(jìn)入IP的圖像首先進(jìn)行塊的劃分,當(dāng)塊劃分成8×8的大小的時(shí)候進(jìn)入codeLumaQT8_pred模塊,也就是設(shè)計(jì)的預(yù)測模塊。codeLumaQT8_pred主要分為外循環(huán)和內(nèi)循環(huán),其中外循環(huán)是為了滿足HEIF IP的WPP功能,內(nèi)循環(huán)則是循環(huán)了(WPP_NUM+3)×64次,其中的“WPP_NUM”是指對圖像進(jìn)行參考像素濾波、預(yù)測、計(jì)算殘差、輸出等四個(gè)步驟,“+3”是對這四個(gè)步驟進(jìn)行了流水線的設(shè)計(jì),有助于大大提升圖像處理速率,“×64”則是因?yàn)槊總€(gè)8×8的像素塊有64個(gè)像素點(diǎn)需要進(jìn)行處理,主要的功能實(shí)現(xiàn)部分均在內(nèi)循環(huán)。
1.2 codeLumaQT8_pred內(nèi)循環(huán)詳細(xì)流程
內(nèi)循環(huán)的處理步驟主要分為參考像素濾波、35種模式預(yù)測、計(jì)算殘差和輸出四個(gè)步驟,所以在代碼編寫的時(shí)候使用變量read_data、read_data1、read_data2、read_data3是否為1來判斷數(shù)據(jù)處理進(jìn)行到了哪一步。其中初始化的時(shí)候read_data=true;read_data1=read_data2=read_data3=1,因?yàn)橐婚_始就需要進(jìn)行濾波;然后在第一個(gè)像素處理循環(huán)結(jié)束之后再給變量賦值。如上所述內(nèi)循環(huán)總共循環(huán)了(WPP_NUM+3)×64次,預(yù)測模塊的關(guān)鍵步驟循環(huán)圖示如圖1。
下面對內(nèi)循環(huán)的關(guān)鍵步驟進(jìn)行詳細(xì)的拆分講解。
(1)35個(gè)預(yù)測模式
根據(jù)不同的功能,HEVC中定義了不同的名稱,其中預(yù)測單元(Predicion Unit,PU) [7]。H.265/HEVC亮度分量的幀內(nèi)預(yù)測支持5種大小的預(yù)測單元PU:4×4、8×8、16×16、32×32、64×64[8]。每種PU都對應(yīng)了35種預(yù)測模式,包括Planar模式、DC模式以及角度模式。所有預(yù)測模式使用相同的預(yù)測方式。模式0為Planar模式,模式1為DC模式,模式2~34為角度模式。其中8×8亮度塊的幀內(nèi)預(yù)測也是如此,第一種是模式0(Planar模式),Planar模式適用于在水平方向和垂直方向都呈線性變化的圖像內(nèi)容。其計(jì)算式如下:
PHx,y=(N-x)·R0,y+x·RN+1,0(1)
PVx,y=(N-x)·Rx,0+y·R0,N+1(2)
Px,y=(PHx,y+PVx,y+N)》(log2N+1)(3)
模式1是DC模式,DC模式適用于大面積平坦區(qū)域,是使用當(dāng)前塊的預(yù)測值由預(yù)測模板左側(cè)和上側(cè)(注意不包含左上角、左下方和右上方)參考像素的平均值計(jì)算得到。其第一步就是求出該預(yù)測單元左側(cè)及上方的像素平均值,如式(4)所示:
dcValue=∑Nx=1Rx,0+∑Ny=1R0,y+N》(log 2N+1) (4)
模式2~34為角度模式,是使用預(yù)測模板上側(cè)和左側(cè)的33種角度上的參考像素來計(jì)算當(dāng)前塊的預(yù)測值模式,其中角度模式中的模式27~34最為關(guān)鍵,因?yàn)樗婕昂罄m(xù)參考像素平滑濾波的處理。所有預(yù)測模式采用的是相同的預(yù)測模板,HEVC中以逐行掃描的順序訪問編碼樹單元,在編碼樹單元內(nèi)又以深度優(yōu)先、逐行掃描的順序訪問各個(gè)編碼單元。因此,除了當(dāng)前塊的左邊一列和上邊一行像素,HEVC中當(dāng)前塊的左下角和右上方的像素也可以作為參考像素[9]。如圖2所示,Px,y表示當(dāng)前塊的預(yù)測像素,Rx,y表示當(dāng)前塊的參考像素。
(2) 參考像素的平滑濾波
預(yù)測值的計(jì)算公式是按照模式27~34這種方向推導(dǎo)的,在計(jì)算其他方向的預(yù)測值的時(shí)候需要做一些調(diào)整。詳細(xì)的推導(dǎo)過程可以參考HEVC的標(biāo)準(zhǔn)文檔或者教材。參考像素的強(qiáng)平滑濾波用在32×32的亮度塊,設(shè)計(jì)中實(shí)現(xiàn)的是8×8的亮度塊,所以只有3-tap的常規(guī)平滑濾波。所有尺寸的預(yù)測塊,DC預(yù)測模式不需要進(jìn)行平滑濾波。對于8×8的塊,對2、18、34方向進(jìn)行濾波。
(3) MPM(Most Probable Model)的選擇
HEVC幀內(nèi)CU塊劃分采用四叉樹遍歷遞歸的塊劃分算法,即從大到小依次劃分遍歷所有可能的CU塊類型[10],所以在一張大圖中的每個(gè)8×8相鄰塊之間往往存在較強(qiáng)的相關(guān)性,因此相鄰PU的幀內(nèi)預(yù)測模式相同或相似的概率較大。為了去除這部分冗余信息,H.265建立了預(yù)測模式候選列表candModelList,表中有3個(gè)候選預(yù)測模式。利用candModelList可以降低編碼當(dāng)前PU最優(yōu)模式的碼率。同樣,設(shè)計(jì)中根據(jù)cuAboveLumaDir的模式(Mode1)和cuLeftLumaDir的模式(Mode2)設(shè)置MPM:如果Mode1和Mode2不同,那么前兩個(gè)MPM是Mode1和Mode2,第三個(gè)模式從Planar、DC和垂直方向中,順序選擇一個(gè)和前兩個(gè)MPM不一樣的模式;如果Mode1和Mode2相同:如果Mode1和Mode2是非角度模式,那么第一個(gè)MPM是Mode1,第二和第三個(gè)MPM按照Planar、DC和垂直預(yù)測的順序依次選擇;如果Mode1和Mode2是角度預(yù)測模式,那么第一個(gè)MPM是Mode1,第二和第三個(gè)MPM是與Mode1相鄰的兩個(gè)角度預(yù)測模式。
1.3 算法功能優(yōu)化
算法優(yōu)化思路:將16個(gè)8×8塊pipeline起來同時(shí)進(jìn)行處理,方便外部塊的處理,可以大大提升編碼的速率。主要代碼的優(yōu)化位置在于(1)預(yù)測數(shù)組空間的大小調(diào)整;(2)讀寫數(shù)據(jù)標(biāo)志信號的初始值調(diào)整;(3)預(yù)測模塊內(nèi)外循環(huán)判斷條件的調(diào)整;(4)參考像素濾波、預(yù)測、計(jì)算殘差、輸出等四個(gè)步驟的執(zhí)行判斷條件的調(diào)整。預(yù)測模塊優(yōu)化后關(guān)鍵步驟循環(huán)圖如圖3所示。
1.4 優(yōu)化時(shí)候的問題分析
(1)遇到的問題
在優(yōu)化的過程中遇到了幾個(gè)關(guān)鍵的問題:(1)沒有修改代碼輸出部分代碼時(shí),初次優(yōu)化pred只輸入了一個(gè)8×8就不輸入數(shù)據(jù)了,原因是第一組8×8的輸出沒有結(jié)束與下一組的read_data輸入時(shí)序相沖突。只能通過縮短輸出時(shí)間/延長下一組read_data輸入的時(shí)間來解決。如圖,可以看到,read_data只輸入了一輪數(shù)據(jù)(1000),outputY8只輸出了14次,本應(yīng)該輸出16次,即沒有完整地進(jìn)行輸出。修改之后pred模塊的Latency變成了之前的2倍,預(yù)測是因?yàn)閂CT_GET16引起的。
(2)解決思路
主要問題在于如何讓codeLumaQT8_pred模塊outputY8、pred輸出與read_data輸入時(shí)序不沖突,使得圖片完整數(shù)據(jù)能夠完整輸入。
(3)解決方法
在原始代碼的基礎(chǔ)之上進(jìn)行了多次嘗試之后最終找到了優(yōu)化方案。也就是前文中提到的優(yōu)化思路;(1)預(yù)測數(shù)組空間的大小調(diào)整;(2)讀寫數(shù)據(jù)標(biāo)志信號的初始值調(diào)整;(3)預(yù)測模塊內(nèi)外循環(huán)判斷條件的調(diào)整;(4)參考像素濾波、預(yù)測、計(jì)算殘差、輸出等四個(gè)步驟的執(zhí)行判斷條件的調(diào)整,具體的代碼調(diào)整參見代碼。
2 驗(yàn)證結(jié)果
最終修改完成之后,在賽靈思的開發(fā)板xc7vx485t-ffg1157-1上進(jìn)行綜合測試,選擇的時(shí)鐘頻率為100 MHz,codeLumaQT8_pred模塊計(jì)算一組16×8×8塊需要的時(shí)間(1227個(gè)時(shí)鐘周期)相比于優(yōu)化之前(1840個(gè)時(shí)鐘周期)減少了33%的時(shí)間,如表1所示。表2是優(yōu)化之前該模塊處理一組8×8數(shù)據(jù)塊需要的時(shí)間。表3是優(yōu)化后該模塊能達(dá)到的時(shí)鐘頻率。表4是整個(gè)IP的資源占用情況。
3 結(jié) 論
介紹了圖像預(yù)測模塊對8×8大小的像素塊進(jìn)行處理的幀內(nèi)算法功能實(shí)現(xiàn),與傳統(tǒng)的幀內(nèi)算法不一樣的地方在于該模塊采用的是HLS,即高層次綜合語言實(shí)現(xiàn)的,并且對其進(jìn)行了功能上的優(yōu)化處理。HLS相比于其他語言的優(yōu)勢在前文也進(jìn)行了描述,其很短的開發(fā)周期以及較強(qiáng)的代碼移植性等的優(yōu)點(diǎn)使得其可以快速地實(shí)現(xiàn)圖像編解碼IP的設(shè)計(jì)和仿真驗(yàn)證工作。
參考文獻(xiàn)
[1] 耿嘉,樊平.一種HEIF圖像編碼方法及相關(guān)設(shè)備[P].北京:CN112150567B,2023-07-18.
[2] 吳永科.HEVC快速幀內(nèi)預(yù)測編碼器的設(shè)計(jì)與實(shí)現(xiàn)[D].廣州:華南理工大學(xué),2018.
[3] 姬瑞旭. HEVC幀內(nèi)模式?jīng)Q策和CU劃分快速算法[D].西安:西安電子科技大學(xué),2014.
[4] 周敬利,金毅,余勝生等.基于H.264視頻編碼技術(shù)的研究[J].華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2003,31(8): 32-34.
[5] 裴世保,李厚強(qiáng),俞能海.H.264/AVC幀內(nèi)預(yù)測模式選擇算法研究[J].計(jì)算機(jī)應(yīng)用,2005,(8): 1808-1810.
[6] 沈曉琳.HEVC低復(fù)雜度編碼優(yōu)化算法研究[D].杭州:浙江大學(xué),2013.
[7] 黃晗. HEVC幀間/幀內(nèi)預(yù)測及優(yōu)化技術(shù)研究[D].北京:北京交通大學(xué),2014.
[8] 李恒忠,崔建明,郭勇等.基于HEVC視頻標(biāo)準(zhǔn)的熵編碼過程[J].電腦知識與技術(shù),2013,9(14):3356-3359+3365.
[9] 趙耀,黃晗,林春雨等.新一代視頻編碼標(biāo)準(zhǔn)HEVC的關(guān)鍵技術(shù)[J].數(shù)據(jù)采集與處理,2014,29(1):1-10.
[10]LAINEMA J ,BOSSEN F,HAN W J, et al. Intra coding of the HEVC standard[J].IEEE Transactions on Circuits and Systems for Video Technology,2012,22(12):1792-1801.