18-回顧:h264中的CABAC

【開始學習HEVC的算數編碼之前,先修補一下知識漏洞,回去學一下H.264的CABAC爲好。參考文獻爲: D. Marpe, H. Schwarz, and T. Wiegand, “Context-based adaptive binary arithmetic coding in the H.264/AVC video compression standard,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, no. 7, pp. 620–636, Jul. 2003.
Context-based adaptive binary arithmetic coding in the H.264/AVC video compression standard

1、引言
CABAC將二進制算數編碼同上下文模型結合,極大提高了算法的適應性和消除冗餘的能力。除此之外,CABAC還包括一種低複雜度算法,可以較好地適應低功耗的軟硬件實現方案。在針對測試序列的實驗結果中顯示,相對於傳統的熵編碼方法,CABAC可以節省9-14%的碼流。CABAC是H.264/AVC中規定的兩種熵編碼方法的一種,首先在【7】中提出初步版本並在【8-17】中逐步優化。本文主要描述了【1】中CABAC的最終版本。相比之下,MPEG-2,H.263和MPEG-4等標準主要採用基於定長表的VLC編碼,存在諸多問題。
第一個可以實用的基於塊結構的混合視頻編碼方法的自適應算數編碼在H.263的附錄中提出【4】.然而該方法也存在問題。首先,這種方法所針對的目標同H.263的VLC相同,包括對變換系數的編碼的組合符號。這樣算數編碼對非整數碼長的帶編碼元素的處理能力沒有被充分發掘。其次,這種方法所有的概率模型是固定的,因爲不能在實際的符號概率分佈統計中自適應變化,因此效率不高;最後,由於其過高的運算複雜度和有限的壓縮效率增益,在多數場合的應用價值不大。
  在一些非塊結構的編碼算法中,經常涉及到算數編碼。這些算法常常基於離散小波變換DWT,並結合了一些如重疊塊運動補償、基於網格的變形和基於運動補償的時域濾波等於時域預測無關的技術。而其中採用的熵編碼通常源自於基於DWT的靜態圖像壓縮標準如SPIHT和JPEG2000的前身等。
  關於“分割、聚合和條件編碼”(PACC),該方法的特點在於分割策略:給定一個特定大小的表作爲源數據(如量化過的係數),通過二元分割的方法削減表的尺寸,例如對於量化係數,依據該係數是否被量化爲0。實際上,這樣的方法便是一種二值化的過程。通過這種“表縮減”操作,後續的建模階段在最大程度縮減的表上的操作的效率可以更有效率。如此,高階條件模型的設計和應用可以極大簡化並且降低了模型過度擬合的風險。鑑於此,最終的算數編碼方法選擇了一種快速的表驅動算數編碼。
  爲了改進H.263附錄E的方法,CABAC將自適應二進制算數編碼同精心設計的上下文模型結合。由表縮減所提示,對於非二元符號引入了額外的二值化過程。由於相對VLC,CABAC的運算複雜度被視爲主要不足,因此大量精力被投入在軟硬件優化的算法設計方面。在硬件資源有限,難以滿足CABAC條件的場合中,H.264/AVC的基準檔次上編碼器提供了另一種方法,除了對殘差數據之外,其他語法元素採用一種基於零階指數哥倫布編碼無限擴展集合的方法;對殘差數據,採用了一種上下文自適應的邊長編碼方法CAVLC,通過對不同的語法元素選擇不同的碼錶壓縮符號間冗餘。同樣,CAVLC也面臨着與之前的算法類似的問題,對概率大於0.5的符號沒有足夠的效果。

2、CABAC的框架結構
【HEVC學習與研究】20、回顧:H.264的CABAC原理
上圖顯示的是CABAC的流程架構。整個CABAC編碼架構主要分爲三個部分:1、二值化;2、上下文建模;

3、二進制算數編碼;
  在第一步二值化中,一個非0/1的語法結構被映射成一個唯一的二進制01序列;而對二進制元素,該過程被跳過。對於生成的二進制碼流,隨後根據常規編碼或者旁路編碼的選擇,可能經過一步或者兩步處理步驟。
在常規編碼模式中,完成二進制話的bin進行上下文建模,通過選擇一個概率模型,在做相應的選擇的時候參考之前處理的bin或者語法元素。之後,bin和上下文模型在算數編碼器中進行編碼,並且更新上下文模型。另一種方式旁路編碼模式,因爲沒有顯式地選擇上下文模型,簡化了編碼引擎,因此編解碼速度更快,複雜度更低。
A. 二值化過程
  可用於視頻編碼的上下文建模和自適應二進制編碼所必須滿足的要求主要有:(1)在一個較短的時間內獲取儘可能精確的條件概率模型;(2)爲確保串行架構處理過程的數據吞吐量,概率估計和算數編碼的基本操作的運算複雜度需儘可能低。爲滿足這樣的條件,採用了二值化作爲預處理過程,將每一個值非0/1的語法元素轉化爲0/1,成爲一串二進制的碼字流。這樣,算數編碼的碼錶長度被削減爲2個,在建模和編碼方面都更加容易。同時由於出現長碼字流的概率並不大,因此快速的二進制編碼引擎可以彌補這一步驟造成的運算量負擔。最後,二值化使上下文建模可以在亞符號層進行,對於大概率的常見符號可採用條件概率,對於其他小概率符號可採用(零階)聯合概率模型。相比之下,這樣的設計在不造成上下文稀釋效果的前提下,可以選擇更高階的條件概率模型。
  CABAC二值化的方法。在實際的應用中,H.264的CABAC採用了一元碼、截斷一元碼、k階指數哥倫布編碼和定長碼的方法,可以在不保存和傳輸任何碼錶的情況下恢復原值。另外還可能採用多種方法的結合方法。
B.   上下文建模
  在上下文建模中,給定的符號將被分配一個概率分佈模型,編碼引擎根據該模型生成比特序列以表示該符號。由於上下文模型決定了編碼及其效率,因此設計合理的,可以充分挖掘統計依賴性,並且可以動態更新的上下文模型具有重大意義。
  由之前處理的符號組成的集合T={z}稱作上下文模板集,另一個相關集合C={0,...,C-1}爲上下文集。通過選取T中不同的元素z切換不同概率模型,估計出條件概率p(x|F(z)),使用此條件概率編碼元素x後,根據x的值更新概率模型。H.264的CABAC對上下文模型施加了兩個限制減少估計條件概率時的計算複雜度。其一,上下文模板集T僅包含與當前編碼符號相鄰的元素,因此實際上C集合實際使用的元素較少;其二,上下文建模僅針對二值化過後的二進制碼字流。
  在CABAC中指定了4種類型的上下文模型。第一種類型的上下文模板與兩個最近處理過的相鄰語法元素相關。相鄰的定義根據語法元素的不同而不同,通常指語法元素左側和上方相鄰元素。第二種類型專門用於mb_type和sub_mb_type兩個元素,依據之前編碼的bin來做模型選擇。第三種和第四種模型都只用於殘差數據,且根據不同的塊類型分屬不同的模型類別。第三種模型不依賴於先前處理的數據,而是依據掃描路徑上的位置。第四種模型設計了一種建模函數,涉及到累計編碼層級數的估計。
  除了這些基於條件概率的上下文模型之外,部分bin使用固定分配的上下文模型,這些bin必須是由常規編碼模式,並且不適用前述各個類別的上下文模型。下表中包含了H.264/AVC中的語法元素以及其對應的上下文模型索引。
【HEVC學習與研究】20、回顧:H.264的CABAC原理
  每一個索引值對應的上下文模型都分爲兩個部分,包括一個6爲的概率狀態索引和一個二進制的最大概率符號MPS。這樣一個上下文模型可用一個7位的無符號整數表示。序號0-72的上下文模型用於表示宏塊類型、子塊類型、空間域/時域預測模式以及基於條帶和宏塊的控制信息。每一個相應的上下文模型索引都可以用context index offset和context index increment求和表示。序號73-398的上下文模型用於處理殘差數據。對significant_coeff_flag和last_significant_coeff_flag各設置兩個集合的上下文模型,因爲這兩個語法元素同像素掃描模式相關,因此分別爲幀編碼和長編碼定義不同的上下文模型集合。在完全的幀或場編碼的情況下,該集合中實際上只有277個元素。對於coded_block_pattern,上下文索引值的計算方法同0-72的一致,對於其他的模型則引入了context category的值。另需註明的是上下文建模中,只使用了當前條帶中的先前處理的語法元素,即跨slice邊界的數據不作爲建模的依據。
C.   二進制算數編碼
  算數編碼是一種基於遞歸區間劃分的方法。假設某最小概率符號(LPS)對應的概率區間爲pLPS∈(0,0.5],其區間下限和範圍分別由L和R表示。在編碼過程中,該區間被分割爲兩個部分:其一與LPS關聯,寬度爲RLPS=R*pLPS。而RMPS=R-RLPS爲最大概率符號對應區間,其概率估計爲1-pLPS。根據二進制碼元判定選擇爲LPS或者MPS這兩個區間中的一個,並用“指向”該區間的二進制值表示目前處理過的二元序列,而這個區間的長度代表各個二進制碼出現概率的乘積。如此可以更加逼近信息熵的下限值。

3、CABAC的細節詳述
A.   宏塊類型、預測模式和控制信息的編碼
      1). 宏塊和子宏塊類型編碼:mb_skip_flag表示在P/SP幀中當前宏塊是否被跳過,若非跳過宏塊,則mb_type表示該宏塊的的類型。對於P8×8和B8×8宏塊,對於每一個子宏塊都有一個語法元素sub_mb_type表示其類型。
    編碼mb_skip_flag:對於任意一個宏塊C,對應的上下文模型包含了該宏塊左側(宏塊A)和上方(宏塊B)的mb_skip_flag的值。根據這兩個參數的取值,當前宏塊的取值可能爲0、1或2。
  編碼mb_type:下圖表示了宏塊和子宏塊類型的二值化方法。
【HEVC學習與研究】20、回顧:H.264的CABAC原理
  在P條帶中,mb_type不使用4這個模式,而5-30的值表示P條帶中幀內宏塊的類型,此類情況下,二值化的第一位爲1。對上圖中的各個二值化結果,對mb_type取值分別爲C0-C3,對sub_mb_type分別爲C0, C1, C2。
2).   預測模式的編碼
  對於幀內宏塊,需編碼的語法元素有亮度和色度分量的預測模式;對於幀間宏塊,則包含參考幀的索引和相關的運動矢量殘差信息。
      (1).幀內4×4模式的亮度分量:用到兩個語法元素prev_intra4x4_pred_mode_flag和rem_intra4x4_pred_mode(只有在前者=0的時候有效,二值化用3位定長碼);採用兩個不同概率模型;
      (2).幀內模式的色度分量:ChPredInDcMode表明了相應的宏塊是否採用DC預測模式,而當前宏塊則依據左、上方的相鄰宏塊的ChPredInDcMode是否爲1決定上下文模型索引值爲0、1或2。這些上下文模型用於編碼intra_chroma_pred_mode(二值化用截斷1元碼)的第一個二進制碼字。剩餘的碼字採用其他固定的概率模型。
  (3).參考幀索引:同上類似,語法元素ref_idx的上下文模型索引號有當前宏塊左側和上方的宏塊信息(RefIdxZeroFlag,表示該區域的ref_idx是否爲0)決定,有0-3共4種可能取值。採用該模型編碼第一個碼字,其他碼字用另外兩個模型完成。
  (4).MVD分量:其選擇的上下文模型,根據左和上方宏塊或子宏塊的MVD模的和值的範圍分爲0.1.2三個值。MVD的二值化採用3階指數哥倫布編碼,只有前綴部分的第一個碼字採用上述模型,第2-9個碼字使用另外的4個模型編碼。後綴部分都採用旁路編碼模式。
  3).   控制信息的編碼:
  主要包三個元素的處理:mb_qp_delta, end_of_slice_flag和mb_field_decoding_flag。
  (1)mb_qp_delta:用於可變宏塊量化參數,包含在coded_block_pattern=0的非跳過模式的宏塊中。第一步Δ(C)映射爲一個對應的非負值並採用二院碼二值化。根據之前編碼宏塊的Δ(P)是否爲0決定爲第一個碼字選取哪一個概率模型,其餘碼字採用另外的模型。
  (2)end_of_slice_flag:標識當前宏塊是條帶內的最後一個宏塊。採用某個特別設計的非自適應概率模型。
  (3)mb_field_decoding_flag:標識在幀場自適應模式中,該宏塊使用幀編碼還是場編碼。其上下文模型索引通過對比左、上方相鄰塊的mb_field_decoding_flag值取0、1或2;

B.   殘差數據的編碼
  1)特點:
  針對殘差數據,H.264/AVC的CABAC定義了多種特定的語法元素進行處理,其中有:
  (1)1位標識位coded_block_flag和二元重要性圖結構,表示某個塊結構中非0變換系數的位置;
  (2)非零值level按反向掃描順序進行編碼;
  (3)依據之前傳輸的非零level值,反向掃描確定非零變換系數的上下文;
  2)編碼殘差數據的過程
  下圖表示對殘差進行CABAC的流程框圖:
【HEVC學習與研究】20、回顧:H.264的CABAC原理
  首先,除非coded_block_pattern或宏塊模式表明,該塊內不存在非零變化係數,則首先傳遞的是coded_block_flag這個值。如果這個值爲0,則該block不會再傳輸任何信息;如果不爲0,則編碼該塊的重要性圖,指示非0係數的位置。最後對每一個非零係數,編碼其符號和絕對值。所有數值按照反向掃描順序傳輸。具體細節如下:
  (1)編碼塊模式coded_block_pattern:針對非intra16x16模式的非跳過宏塊,這個值表示六個8×8子塊(亮度×4+色度×2)中的哪一個包含非零係數。採用4位定長碼和截斷值=2的截斷一元碼進行二值化;
  (2)編碼塊標誌coded_block_flag:1位符號,表示當前塊內存在非零變換系數。若不存在,則跳過該塊後期的處理;
  (3)變換系數的掃描:第一步是以某種掃描模式,將2D的變換系數矩陣映射爲一個一維序列;
  (4)重要性表significant map:在coded_block_flag表明該塊內存在非零係數的情況下,編碼該塊的重要性表;對於每一個係數,對應存在一個1位標誌significant_coeff_flag,該標誌=1,則存在另一個標誌last_significant_coeff_flag,該符號表示當前係數是否是該塊中的最後一個非零係數還是後面還有其他的。對於塊的最後一個而言,這兩個標識位不需要也不會發送。
  (5)級別信息Level Information:塊的重要性表決定了塊內非零係數的位置,非零係數的值以級別level表示,在編碼中編成兩個符號coeff_abs_level_minus1和coeff_sign_flag,分別代表係數的絕對值和符號。係數的絕對值信息用0階指數哥倫布編碼二值化。級別信息以反向掃描順序傳輸,即從最後一個重要係數開始想第一個傳遞。
  3).殘差信號的上下文建模
  在H.264/AVC中,共把變換系數矩陣分爲12中不同類型,分別代表了不同的統計特性,並針對實際情況將這12中類型分成5大類。對每一個大類,都制定一個上下文模型的集合用於編碼殘差數據相關的語法元素(coded_block_pattern除外)。下面說明對coded_block_pattern所採用的方法。
  coded_block_pattern:該語法元素中的每一位都表示相應變換系數塊的編碼判定,因此語法元素的概率模型取決於碼元的索引值。對錶示4個8×8亮度塊的前四個碼元,上下文模型索引根據左方和上方8×8塊的coded_block_pattern是否爲0的值取0-3;第四個和第五個碼元與色度分量相關,上下文的分配模型同亮度碼元類似,共額外定義了8種概率模型。
  coded_block_flag:對於5中類別任意之一,採用了4種不同的概率模型,根據左、上方塊的coded_block_flag的取值可能取0-3。只有相同類型的塊才用作判決。
  significant map:【爲什麼文獻中前面講了一個15而後面卻又提到61中呢?不明白。】
  級別信息level information:CABAC中採用了反向掃描,因爲這樣更有利於獲取穩定的統計信息。在編碼coeff_abs_level_minus1時,選用兩個上下文模型集合,其中之一用於第一個二元碼,另一個用於其他的二值化碼字。

C.   概率估計
  CABAC定義了64中概率值,有以下公式推出:
【HEVC學習與研究】20、回顧:H.264的CABAC原理
  在上式中,α≈0.95,N=64,這兩個取值確保算法在穩定、精確估計以及快速自適應之間取得一個平衡。這些概率值通過對應的索引值隱式地包含在了算數編碼引擎中。這樣,CABAC的每一個上下文模型可以用兩個參數完全表示:一個LPS的當前估計值(0-63的索引)和MPS的值(0/1),實際在CABAC中僅有126個模型狀態是有效的。
  1).   更新概率狀態:
CABAC中的概率模型基本上都是自適應模型,在沒編碼完成一個符號之後會更新狀態。對於給定狀態,更新的結果取決於當前狀態以及當前的符號是按照LPS/MPS編碼。更新完成之後將產生一個新的概率模型。在一個MPS事件發生時,給定狀態索引加1,除非狀態索引已經爲62,此時LPS概率估計已經爲最小值,或者MPS概率估計已經達到上限(此情況下,狀態索引保持爲62直到遇到LPS,此時狀態索引將減小)。
  2).   概率狀態的初始化與重置
  所有的概率狀態在條帶的邊界處都應初始化爲某種預定義的初始狀態(如全部初始化爲等概率狀態)。CABAC提供的“上下文模型初始化機制”利用了先驗知識,在兩個層次上對上下文模型進行初始化:
  (1)依賴於量化參數的初始化:
  此方法預設了一個初始化值的集合,通過初始設定的SliceQP導出。
  (2)依賴於條帶的初始化:
  通過定義兩個附加的上下文初始化集合實現,特定用於P和B條帶的上下文建模。編碼器通過在三個初始化表中選擇以適應不同的條帶類型。

D:   基於表的二進制算數編碼
  關於CABAC的算術編碼引擎,共存在兩種引擎:其一爲常規編碼引擎,此類方法利用了自適應概率模型進行算術編碼;另一種爲旁路編碼引擎用於快速編碼,利用一種近似等概率模型。
  1).常規編碼模式的區間分割:
  下圖表示了某一個二進制值binVal進行常規模式算術編碼的流程。
      【HEVC學習與研究】20、回顧:H.264的CABAC原理
在CABAC的過程中,區間的狀態可以用當前區間範圍R和區間下限L表示,在寄存器中這兩個值的精度可達9和10位。編碼binVal這個值需要上下文模型,其中包含概率狀態索引σ和MPS的值ω,具體步驟分爲以下四步:
  第一步也是最主要的一部,是根據給定的概率估計,將當前區間進行分割成兩個子區間。首先採用將2^8<=R<=2^9區間等分爲4份獲得某個量化的Q(R)值,近似表示當前區間長度R。Q(R)由其量化索引表示,ρ=(R>>6)&3。
  第二步,這個索引值ρ和概率狀態索引值σ用於在二維表TabRangeLPS中查找與LPS相關的子區間範圍RLPS。同時可以獲得的是對應MPS的子區間R-RLPS。選定給定的二進制值binVal對應的子區間,若binVal等於MPS對應的值ω,則選定低子區間,否則選定高子區間;
  第三步,採用2.C中的方法更新概率模型;
  第四步,將寄存器復位,即圖中的RenormE;
  2).旁路編碼模式
  爲了加快編解碼的速度,對於近似等概率的情況,CABAC提供了簡化版本——旁路編碼模式。該模式繞過了概率模型的估計和更新,並對區間進行平均分割。下圖表示旁路模式的流程框圖。
      【HEVC學習與研究】20、回顧:H.264的CABAC原理
3).歸一化:
  在區間範圍R離開合法範圍之後,分割過程終止,並進行歸一化操作。每次歸一化時,會輸入1個或多個碼流字符,編碼器中存在進位傳送現象。
  4).編碼終止:
  索引值爲63的概率模型是特別設計的、非自適應的模型。這樣,相關的表的入口TabRangeLPS[63,ρ]和Rlps由固定值2確定。這樣確保在編碼條帶的終止語法元素end_of_slice_flag的時候輸出7bit碼字。

4、實驗結果和總結
  採用了CABAC後,H.264的編碼效率遠遠超過了基準檔次、採用CAVLC的算法。在視頻廣播應用中,30-38db可接受的視頻質量範圍下,CABAC比CAVLC節省了9%-14%的碼率,並且在更低碼率的情況下,編碼增益也更高。
【由於平時上班沒多少時間,只能抽業餘時間學,所以進度太慢,而且難以深入,單單是這一篇論文竟然看了將近一個月,而且也沒能完全理解透徹。之前還剩下了一些問題沒有解決,比如GOP、hierarchy B和IntraPeriod等等的概念,這些會在未來幾天理解清楚。然後會找H.264的代碼在實際場景中走一遍CABAC的過程。】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章