【HEVC簡介】ALF-Adative Loop Filter


由於HEVC在HM4.0之后,就把ALF去掉,所以ALF的介紹是基於AVS2.
《HEVC標准介紹、HEVC幀間預測論文筆記》系列博客,目錄見:http://www.cnblogs.com/DwyaneTalk/p/5711333.html
 
一、基本流程:
  1、算法描述: 

        自適應環路濾波器f 是根據原始信號和失真信號計算得到均方意義下的最優濾波器,即維納濾波器,如公式(2-1)所示,                         

        其中,Y是失真信號,X是原始信號,是濾波后估計得信號,f是自適應濾波器系數向量,使得濾波信號和原始信號X之間均方誤差(MSE)最小,如圖1所示。

                       

1:ALF濾波器

        本提案提出的ALF在視頻編碼框架中的位置如下圖所示,即對SAO濾波后的重建圖像進行恢復,使得重建圖像與原始圖像的MSE最小                        

2:ALF在AVS2中的位置

2、濾波器形狀和系數決策

       本提案對彩色圖像的亮度和色度通道均采用如圖3所示的7x7十字加3x3方形的中心對稱濾波器,每個濾波器只包含9個不同的系數,其中C0~C7是7bit有符號數,取值范圍是[-1,1),C8是7bit無符號數,取值范圍是[0,2)(注:C0~C8的范圍后面提案中被修改)。                              

3:ALF濾波器形狀

        對於亮度分量,ALF將圖像按照固定規則分為16個區域,按照LCU對齊的原則均勻划分16個區域(圖像右邊界和下邊界除外),對每個區域分別計算其對應的ALF系數。對訓練得到的ALF系數(這個過程就是維納濾波器的原理),依次計算相鄰區域(按照類Hilbert掃描序號上相鄰的區域,如圖4所示)合並后得到的率失真代價,選擇率失真代價最小的區域進行合並,該過程迭代直到合並為一套濾波器為止,從中選擇率失真代價最小的合並結果,合並的區域共用相同的濾波系數。對於色度分量(Cb和Cr)分別設計一套濾波系數。對每個分量提供濾波器控制開關,根據率失真代價決定當前圖像分量是否進行濾波。為了更細粒度的控制濾波過程,我們對每個LCU的三個顏色分量分別建立控制開關,用1個比特標識,如果當前LCU濾波后的率失真性能優於濾波前,則標識為1,表示對該LCU進行濾波。                           

    

4:類Hilbert掃描方式

        為了降低編碼ALF參數帶來的碼率增加,我們提出在編解碼端建立ALF參數緩存,緩存最大可以支持8組ALF參數(后面提案改成1組)。在編碼端,分別計算當前訓練的ALF參數和緩存中ALF參數率失真代價,選擇率失真代價最小的作為當前圖像的自適應濾波器參數,如果緩存中ALF參數率失真代價小,那么只需傳遞緩存中濾波器的索引值即可。

 

3、低延遲模式(LL)和高效模式(HE)

        考慮到利用當前編碼幀訓練ALF參數會造成編碼延遲,因此,本提案提出利用相鄰已經編碼重構的圖像進行ALF參數訓練,從而降低編碼延遲,我們稱這種模式為低延遲模式(LL,而將利用當前編碼重構圖像訓練ALF參數的方式成為高效模式(HE)如圖5所示。                           

5:(a)低延遲ALF參數訓練和(b)高效ALF參數訓練

4、實驗結果

        本部分對提出的LL和HE兩種配置的ALF濾波器分別進行驗證。Anchor是RD6.0,配置是通測條件[1],兩種配置的測試結果分別如表1和2所示。

1:所提方案在LL配置下與RD6.0 anchor的性能比較  

2:所提方案在HE配置下與RD6.0 anchor的性能比較                        

5、結論

        本提案為AVS2設計了自適應環路濾波器,在HE和LL配置下均獲得了較高的編碼性能增益,編碼復雜度的提升在可接受范圍內。所以被AVS工作組采納,並集成到參考軟件RD7.0中,其中LL和HE都集成實現,並通過代碼中的開關進行選擇。

 

二、ALF語法格式說明:

1、序列頭定義

序列頭定義

描述符

sequence_header() {

 

    video_sequence_start_code

f(32)

    profile_id

u(8)

    level_id

u(8)

    ……    other syntax

 

 

    sample_adaptive_offset_enable

u(1)

    adaptive_loop_filter_enable

u(1)

    pmvr_enable

u(1)

    reserved_bits

r(3)

    next_start_code()

 

}

 

2、I幀圖像頭定義

I圖像頭定義

描述符

i_picture_header() {

 
     ……other syntax
 

    loop_filter_disable

u(1)

    if ( ! loop_filter_disable) {

 

        loop_filter_parameter_flag

u(1)

       if ( loop_filter_parameter_flag) {

 

           alpha_c_offset

se(v)

           beta_offset

se(v)

         }

 

    }

 

   if (AlfEnableFlag) {

 

         for ( i=0; i<3; i++ ) {

 

             pic_alf_enable[i]

u(1)

         }

 

         if(PicAlfEnableFlag[0]|| PicAlfEnableFlag[1]|| PicAlfEnableFlag[2])

 

         {

 

                alf_parameter_set_new_flag

u(1)

                alf_parameter_set_id (這兩個參數在后面提案中有修改)

u(3)

           }
 

          if(alf_parameter_set_new_flag)

 

           {

 

                  alf_parameter_set()

 

              }

 

       }

 

      next_start_code()

 

}

 

3、 P、B、F幀圖像頭定義

PBF圖像頭定義

描述符

pbf_picture_header() {
 
      ……other syntax
 

     loop_filter_disable

u(1)

      if ( ! loop_filter_disable) {

 

          loop_filter_parameter_flag

u(1)

         if ( loop_filter_parameter_flag) {

 

               alpha_c_offset

se(v)

               beta_offset

se(v)

          }

 

      }

 

      if (AlfEnableFlag) {

 

             for ( i=0; i<3; i++ ) {

 

                   pic_alf_enable[i]

u(1)

            }

 

           if(PicAlfEnableFlag [0]|| PicAlfEnableFlag [1]|| PicAlfEnableFlag [2])

 

           {

 

                    alf_parameter_set_new_flag

u(1)

                    alf_parameter_set_id

u(3)

             }

 

if(alf_parameter_set_new_flag)

 

{

 

   alf_parameter_set()

 

}

 

next_start_code()

 

}

 

4、條帶定義

條帶定義

描述符

slice() {

 
……other syntax
 

while ( ! byte_aligned() )

 

      aec_byte_alignment_bit

f(1)

do {

 

     for ( i=0; i<3; i++ ) {

 

         if(PicAlfEnableFlag [i])

 

           lcu_alf_enable[i][LcuIndex]

u(1)

     }

 

     coding_unit_tree(LcuSizeInBit, LcuIndex)

 

     aec_lcu_stuffing_bit

ae(v)

} while ( ! is_end_of_slice() )

 

next_start_code()

 

}

 

 5、自適應環路濾波參數 

自適應環路濾波參數定義

描述符

alf_parameter_set () {

 

   if(PicAlfEnableFlag [0]){

 

     alf_no_filters_minus1

u(4)

for(i=0;i<alf_no_filters_minus1+1;i++){

 

      if(i>0)

 

        alf_region_distance[i]

u(4)

      for(j=0;j<9;j++)

 

        alf_coeff_luma[i][j]

ae(v)

}

 

}

 

if(PicAlfEnableFlag [1]){

 

    for(j=0;j<9;j++)

 

        alf_coeff_chroma[0][j]

ae(v)

}

 

if(PicAlfEnableFlag [2]){

 

       for(j=0;j<9;j++)

 

          alf_coeff_chroma[1][j]

ae(v)

}

 

}

 

6、語義說明

         自適應濾波允許標志  adaptive_loop_filter_enable。值為‘1’表示可使用自適應濾波;值為‘0’表示不應使用自適應濾波。AlfEnableFlag的值等於adaptive_loop_filter_enable的值。

        圖像自適應濾波允許標志  pic_alf_enable[i]。PicAlfEnableFlag的值等於pic_alf_enable的值。PicAlfEnableFlag [i]的值為1表示在該圖像內第i個分量可使用自適應濾波;值為0則表示在該圖像內第i個分量不應使用自適應濾波。其中i等於0表示亮度分量,i等於1表示Cb分量,i等於2表示Cr分量。

        自適應濾波參數集標號  alf_paramter_set_id。3位無符號整數,表示當前圖像自適應濾波參數集的標號。

        自適應環路濾波參數集解碼標志  alf_parameter_set_new_flag。值為‘1’表示當前圖像存在aps解碼過程;值為‘0’表示當前圖像不存在aps解碼過程。

        LCU自適應濾波允許標志  lcu_alf_enable[i][LcuIndex]。lcu_alf_enable[i] [LcuIndex]值為1表示第LcuIndex個LCU的第i個顏色分量可使用自適應濾波;值為0則表示第LcuIndex個LCU的第i個顏色分量不使用自適應濾波。其中i等於0表示亮度分量,i等於1表示Cb分量,i等於2表示Cr分量。 

        圖像亮度分量自適應濾波個數  alf_no_filters_minus1。alf_no_filters_minus1加1表示當前圖像亮度分量自適應濾波器個數。 

        圖像亮度分量相鄰自適應濾波器間區域個數  alf_region_distance。alf_region_distance[i]表示亮度分量第i個自適應濾波器與第i-1個自適應濾波器之間區域標號的差值。

        圖像亮度分量自適應濾波系數alf_coeff_luma。alf_coeff_luma[i][j] 表示亮度分量第i個自適應濾波器的第j個系數。

        圖像分量自適應濾波系數  alf_coeff_chroma。alf_coeff_chroma[0][j] 表示Cb分量第j個自適應濾波器系數,alf_coeff_chroma[1][j] 表示Cr分量第j個自適應濾波器系數。

三、解碼過程:

     sequence_header中ALF語法元素adaptive_loop_filter

        如果adaptive_loop_filter_enable為0,則SAO的輸出樣本直接作為ALF的輸出樣本。

        如果adaptive_loop_filter_enable為1,則根據6.2中定義的過程對SAO輸出樣本進行自適應環路濾波處理

    Picture header中ALF語法元素解碼

        解碼pic_alf_enable[3]語法元素,其中pic_alf_enable[0]表示亮度分量是否進行ALF濾波處理,如果pic_alf_enble[0]為1表示亮度分量進行ALF處理,否則亮度分量不進行ALF處理。pic_alf_enable[1]和pic_alf_enable[2]分別表示色度分量Cb和Cr是否進行ALF處理。將pic_alf_enable[i]的值分別賦給PicAlfEnableFlag。

    濾波器參數標識解碼

        如果PicAlfEnableFlag[0]~[3]不同時為0,即存在需要進行濾波處理的圖像分量。那么依次解碼alf_parameter_set_new_flag和alf_parameter_set_id。

        如果alf_parameter_set_new_flag為1,則將6.2.3中解碼得到的濾波器系數保存到alf_parameter_set_id所指示的緩存區中。

        如果alf_parameter_set_new_flag為0,則跳過6.2.3解碼過程,從alf_parameter_set_id所指示的緩存區中讀取ALF濾波器系數。

    濾波器系數解碼

        如果PicAlfEnableFlag[0]為1,則解碼alf_no_filters_minus1語法元素,alf_no_filters_minus1+1 表示亮度分量濾波器個數。

        解碼每組濾波器系數控制的相鄰基本區域的數量或者相鄰濾波器系數控制區域的距離alf_region_distance[i](i>0)(如果將16個划分區域記做基本區域單元,那么這里的濾波器系數控制區域的距離可以表示為兩個區域中的基本單元個數)。例如alf_region_distance[1]=2 表示第0組濾波器系數和第1組濾波器系數之間的距離2個基本單元,也就是第0組濾波器控制2個基本區域單元。如果存在4組濾波器,其中alf_region_distance[1]=4,alf_region_distance[2]=5,alf_region_distance[3]=2,其中第0組控制0-3的基本區域,第1組控制4-8的基本區域,第2組控制9-10的基本區域,第3組控制11-15的基本區域。

        解碼亮度分量濾波器系數alf_coeffluma[i][j]表示亮度分量中第i組濾波器的第j個系數。

        如果PicAlfEnableFlag[1]為1,則解碼色度Cb分量對應的濾波器系數,其中alf_coeff_chroma[0][j]表示Cb分量濾波器系數的第j個系數。否則跳過色度Cb分量濾波器系數解碼。

        如果PicAlfEnableFlag[2]為1,則解碼色度Cr分量對應的濾波器系數,其中alf_coeff_chroma[0][j]表示Cb分量濾波器系數的第j個系數。否則跳過色度Cb分量濾波器系數解碼。

    系數重構

        亮度分量和色度分量的最后一個系數,即如圖6所示的C8,alf_coeffluma[i][AlfCodedLengthLuma-1]和alf_coeff_chroma[g][AlfCodedLengthChroma-1]的重構值通過如下過程得到(以亮度為例),

              #define ALF_NUM_BIT_SHIFT 6(對於這個6的處理,后面提案對C0-C7和C8有了重新的修改)

              sum = 0;

              for(j=0; j< AlfCodedLengthLuma -1; j++)

              {

                     sum += (2 * alf_coeffluma[i][j]);

              }

              coeffPred = (1<<ALF_NUM_BIT_SHIFT) - sum;

              alf_coeffluma[i][AlfCodedLengthLuma-1]=coeffPred+ alf_coeffluma[i][AlfCodedLengthLuma-1][ AlfCodedLengthLuma-1];                                   

圖6 濾波器形狀和系數標號

    LCU控制語法元素

            如果PicAlfEnableFlag[i]為1,那么在讀取每個LCU參數前首先讀取其濾波器控制開關參數lcu_alf_enable[i],該變量為1表示對當前LCU進行6.2.6所指定的自適應環路濾波處理,否則跳過自適應環路濾波。

    LCU濾波過程

            如果LcuIndex所指示的LCU的濾波器控制開關lcu_alf_enable[i][LcuIndex]為1,那么對該LCU中第i個顏色分量進行濾波。對LCU中的每個樣本進行濾波時,當且僅當濾波器所使用的樣本都可用時才對該樣本進行濾波,其中樣本可用是指該樣本存在且與當前濾波樣本處於相同的slice內。

            對亮度分量中樣本p(m,n)利用第i組濾波器進行濾波的計算過程如下:

p_tmp = alf_coeffluma[i][0]*(p(m-3,n) + p(m+3,n))

p_tmp = p_tmp +  alf_coeffluma[i][1]*(p(m-2,n) + p(m+2,n))

p_tmp = p_tmp +  alf_coeffluma[i][2]*(p(m-1,n-1) + p(m+1,n+1))

p_tmp = p_tmp +  alf_coeffluma[i][3]*(p(m-1,n) + p(m+1,n))

p_tmp = p_tmp +  alf_coeffluma[i][4]*(p(m-1,n+1) + p(m+1,n-1))

p_tmp = p_tmp +  alf_coeffluma[i][5]*(p(m,n-3) + p(m,n+3))

p_tmp = p_tmp +  alf_coeffluma[i][6]*(p(m,n-2) + p(m,n+2))

p_tmp = p_tmp +  alf_coeffluma[i][7]*(p(m,n-1) + p(m,n+1))

p_tmp = p_tmp +  alf_coeffluma[i][8]*(p(m,n))

p_tmp = (p_tmp +  alf_coeffluma[i][8])>>ALF_NUM_BIT_SHIFT

p(m,n) = max(0,min(p_tmp,255))

                        

圖7 濾波樣本

    濾波器參數緩存(關於緩存濾波器系數的個數,后面提案進行了修改

            濾波器緩存中包含的參數包括濾波器幀級控制開關pic_alf_enable[3],濾波器系數alf_coeffluma[alf_no_filters_minus1+1][AlfCodedLengthLuma]和alf_coeffChroma[2][AlfCodedLengthChroma]和濾波器控制區域參數alf_region_distance。

 

四、后續提案修改:

    1、ALF時域系數緩存核心實驗提案:M3384 

            M3384.doc本提案對M3292提出的環路濾波器技術在RD7.0上進行了時域濾波器系數緩存的實驗。原提案中支持8套時域濾波器系數緩存,本提案測試了關閉時域緩存和只保留一個時域緩存的濾波器性能。實驗表明,關掉時域緩存時,相對於原有ALF技術AI、RA和LDP通測條件下分別有0.09%、0.17%和0.17%的性能損失;只保留一個時域緩存時,AI、RA和LDP通測條件下分別有0.00%、0.12%和0.09%的性能損失。為了保持濾波器靈活性,建議現有ALF中保留一個時域濾波器系數緩存。

        語法修改如下: alf_parameter_set_id由u(3)變成u(1),只需要1位就可以了。其它部分沒有變化。        

    2、基於虛擬邊界的自適應環路濾波:M3433(存在提案針對該提案進行的改進)

     ALF處於 deblocking filter和SAO之后,在基於LCU的解碼過程中,對於當前LCU進行ALF濾波時,該LCU下邊界的N行像素(亮度4行像素,色度3行像素)需要等到下方的LCU解碼重構后才能進行deblocking filter、SAO和ALF,因此需要緩存該對應行的像素,增加ALF后,需要再額外增加6行緩存像素,如圖8所示。                                  

 8: AVS2中基於LCU解碼過程中需要的line buffer示意圖

        為了減少ALF技術產生的line buffer的增加,本提案提出采用虛擬邊界技術,如果ALF濾波沒有使用跨虛擬邊界的像素時,那么濾波過程不變;如果ALF用到了跨虛擬邊界的像素,那么需要將濾波器用到的跨虛擬邊界像素對應的系數及其水平對稱位置的系數作相對應的修改,使得濾波器不再使用對應的跨虛擬邊界的像素及其水平對稱位置的像素,從而避免了增加line buffer,如圖2所示,虛線是LCU的虛擬邊界。AVS2亮度分量中,deblocking filter需要3行line buffer,SAO需要1行line buffer,因此虛擬邊界距離LCU亮度下邊界4行像素;AVS2色度分量中,deblocking filter需要2行line buffer, SAO需要1行line buffer,因此虛擬邊界距離LCU色度下邊界3行像素。       

圖9:濾波器形狀跨越虛擬邊界時具有虛擬邊界的ALF濾波過程(亮度) 

            本提案提出采用虛擬邊界對LCU內部進行ALF處理的像素進行限定,從而避免了M3292中ALF產生的line buffer。

    3、樣本濾波補償參數:M3466(這個修改在其他提案中,該提案是修改標准文檔中相關說明)

        圖像亮度分量樣本濾波補償濾波器系數  alf_coeff_luma[i][j]

                alf_coeff_luma[i][j]表示亮度分量第i個樣本濾波補償濾波器的第j個系數。當j大於或等於0且小於或等於7時,AlfCoeffLuma[i][j]的值等於alf_coeff_luma[i][j]的值。其中,j大於或等於0且小於或等於7時,alf_coeff_luma[i][j]為7位有符號數,取值范圍是-64~63alf_coeff_luma[i][8]為12位有符號數取值范圍是-1088~107。(權值取整數,避免浮點運算)

        圖像色度分量樣本濾波補償濾波器系數  alf_coeff_chroma[0][j]和alf_coeff_chroma[1][j]

                alf_coeff_chroma[0][j]表示Cb分量第j個樣本濾波補償濾波器的系數,alf_coeff_chroma[1][j] 表示Cr分量第j個樣本濾波補償濾波器的系數。當j大於或等於0且小於或等於7時,AlfCoeffChma[0][j]的值等於alf_coeff_chroma[0][j]的值,AlfCoeffChma[1][j]的值等於alf_coeff_chroma[1][j]的值。其中,j大於或等於0且小於或等於7時,alf_coeff_chroma[i][j]為7位有符號數,取值范圍是-64~63;alf_coeff_chroma[i][8]為12位有無符號數,取值范圍是-1088~107。解碼過程對應更改。

    4、基於虛擬邊界的自適應環路濾波:M3493(是對M3433的改進)                       M3493.doc

圖10:濾波器形狀跨越虛擬邊界時具有虛擬邊界的ALF濾波過程(亮度)

     如上圖10,該提案的修改主要就是對於虛擬邊界情況時,對於C0'、C1'等值不再是簡單地置0,而是賦值為其他沒有越過虛擬邊界的像素點的值。 

High Efficiency Video Coding (HEVC) Adaptive Loop Filter.pdf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM