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選擇碼流較少的匹配位置。