RDO、SAD、SATD、λ相關概念【轉】

 

轉自:http://zmshy2128.blog.163.com/blog/static/2544637200658104210/

率失真優化概述:

  率失真優化(Rate D isto r t i on Op t i m ized)策略是在率失真理論[3 ]的基礎上提出的一種代價函數方案,  RDO 的主要思想是, 在計算代價函數時, 同時考慮碼率和失真度兩方面因素的制約, 在保證低失真度的同時保證低碼率, 這樣更加有利於視頻流的傳輸。 H. 264在運動搜索、 參考幀擇優、 模式決策三個方面運用了不同的RDO 代價函數, 也將非RDO 代價函數列爲可選模式, 以滿足不同的需要。。 可描述如下: 在保證比特率R 不超過最大比特率R max 的條件下, 使失真D 達到最小, 即m in{D } 限制條件:R ≤R max。

  可以通過選擇最優的編碼參數給出"最好"的圖像質量(最低的失真) , 並不超過目標比特率。 在實際中, 用一套編碼參數(量化步長、 塊模式選擇等)對視頻序列進行編碼, 得到相應的編碼比特率 (R ) 和解碼圖像質量(或失真D ) , 兩者結合, 即形成一個R -D 工作點。 用不同套的編碼參數重複上述編碼過程,獲得不同的R - D 工作點,曲線爲凸的曲線,橫座標爲D,縱座標爲R,曲線爲R(D)。

  公式如:J(mode)=D+λ*R。根據不同的情況,D可取下面的值(常用的就是SSD、SAD和SATD):以H.264亮度爲例,在幀內預測塊大小(16x16或4x4)和預測方向(4個或9個)決策、運動搜索(選擇最有匹配點)、參考幀選擇、幀間模式選擇等都需要進行RDO。

    SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即絕對誤差和

    SATD(Sum of Absolute Transformed Difference)即hadamard變換後再絕對值求和

    SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和

    MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均絕對差值

    MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方誤差

RDO概述:

  衆所周知,評價編碼效率的有兩大指標:碼率和PSNR。碼流越小,則壓縮率越大;PSNR越大,重建圖像越好。在模式選擇的時候,判別公式實質上也就是對二者的綜合評價。

  首先以RDO爲例,模式對應的代價:J(mode)=SSD+λ*R(ref,mode,mv,residual)

  這裏,SSD是指重建塊與源圖像的差值均方和;λ是拉格朗日乘子,就當是權值吧;R就是該模式下宏塊編碼的實際碼流,包括對參考幀、模式、運動矢量、殘差等的比特總和。當然如果是幀內模式,就只有R(mode,residual)。

  很多人迷惑的是,改宏塊還沒編碼啊,怎麼知道它的碼流和重建圖像?實際上,RDO就是對每個模式都實際編碼一次,得到J(mode),然後選擇J(mode)最小的模式爲實際編碼模式。就像編碼器引入了一個大反饋,這也正是JM選用RDO編碼起來龜速的原因,當然,編碼效率最佳。

  後來,“隨意”注意到,不論熵編碼選用cavlc還是cabac,各個模式下的residual編碼都使用cavlc,爲什麼此時不用cabac呢?難道cabac複雜麼?我的看法是因爲cabac會對模型表更新數據,解碼端是沒有模式選擇模塊的,如果編碼端此時使用cabac,會造成編解碼端模型表不匹配,不能正常解碼。 λ的取值是就是碼率控制相關的概念。

SAD和SATD:

  前已所述,RDO包含各模式的實際編碼過程,也就是變換量化、熵編碼、反變換反量化、重建等,計算量是相當大的,實時編碼領域不可能直接使用。因此,就有了下面的替代公式:

  J(mode)=SAD+λ*R(ref,mode,mv)

  J(mode)=SATD+λ*R(ref,mode,mv)

  這裏SAD就是該模式下預測塊與源圖像的絕對誤差和。比特R中少了對residual的編碼,也就是運動估計後就可以直接得到該模式的J(mode)值,極大的減少了運算複雜度。

  SATD就是對殘差進行哈德曼變換後的係數絕對和,在大多數情形下,SATD比SAD評價效果更好些,我對foreman CIF圖像的測試,psnr增加了約0.2db,碼流差不多。當然,SATD比SAD多了個變換,計算量大些。

注意:SAD和SATD對應的λ與RDO的λ取值是不一樣的。

  容易困惑的還有,運動估計的匹配準則,很多運動估計的論文中都直接是SAD或SSE。編碼器中對殘差、MV、ref都要編碼,所以匹配準則也就是SAD和碼流R的綜合評價!!!在同一個模式下,參考塊與編碼塊的不同信息有ref、MV,故匹配準則爲:

Jmotion=SAD+λ*R(ref,mv)

最後,附上我以前在羣“H264樂園”中的帖子,

Q:如果不用率失真最優化, 爲什麼選擇SATD+delta×r(mode,ref,mv)作爲模式選擇的依據?爲什麼運動估計中,整象素搜索用SAD,而亞象素用SATD?爲什麼幀內模式選擇要用SATD? 

A:    SAD即絕對誤差和,僅反映殘差時域差異,影響PSNR值,不能有效反映碼流的大小。SATD即將殘差經哈德曼變換的4×4塊的預測殘差絕對值總和,可以將其看作簡單的時頻變換,其值在一定程度上可以反映生成碼流的大小。因此,不用率失真最優化時,可將其作爲模式選擇的依據。

   一般幀內要對所有的模式進行檢測,幀內預測選用SATD的原因同上。 在做運動估計時,一般而言,離最優匹配點越遠,匹配誤差值SAD越大,這就是有名的單一平面假設,現有的運動估計快速算法大都利用該特性。但是,轉換後SATD值並不滿足該條件,如果在整象素中運用SATD搜索,容易陷入局部最優點。而在亞象素中,待搜索點不多,各點處的SAD差異相對不大,可以用SATD選擇碼流較少的匹配位置。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章