• 【转】RDO、SAD、SATD、λ


    SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和
    SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和
    MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值
    SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
    MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方误差

    经常有人问我这方面的问题,今天总结归纳一下。

    众所周知,评价编码效率的有两大指标:码率和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,模式选择时得到的R不是实际的R,为什么此时不用cabac呢?难道cabac复杂么?我的看法是因为cabac会对模型表更新数据。解码端是没有模式选择模块的,如果编码端此时使用cabac,会造成编解码端模型表不匹配,不能正常解码。

     λ的取值是根据实验得到的。使用B帧与使用B帧的λ值是不一样的。具体值忘了,^_^,看相关文章。

    前已所述,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多了个变换,计算量大些。

    注意,此时的λ与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选择码流较少的匹配位置。

    补充:
    在JM中,模式选择的时候,还可以加入信道传输错误的代价因子。信道传输错误是用N(比如30)个独立的解码回路模拟实现的,计算量更复杂。见下面的配置文件设置:
    RDOptimization = 2 # rd-optimized mode decision (0:off, 1:on, 2: with losses)
    NumberOfDecoders = 30 # Numbers of decoders used to simulate the channel, only valid if RDOptimization = 2

  • 相关阅读:
    E-Eating Together(POJ 3670)
    F-Dining Cows(POJ 3671)
    I-MooFest(POJ 1990)
    A-Apple Catching(POJ 2385)
    H-The Cow Lineup(POJ 1989)
    LOOPS(HDU 3853)
    Card Collector(HDU 4336)
    Help Me Escape (ZOJ 3640)
    Collecting Bugs(POJ 2096)
    c#大圣之路笔记——c# 从DataGrid中导出数据 Session
  • 原文地址:https://www.cnblogs.com/irish/p/3196395.html
Copyright © 2020-2023  润新知