一、理论部分

率失真理论:
在给定失真的前提下如何最大限度第去除冗余。
在视频编码中的率失真理论为在给定码率RT的前提下最大限度的减少视频信息的失真,用数学描述为第一个式子所示,其中m*为取得最小码率时的编码方式,S为编码方式的集合。

对于该有条件的优化问题,可以采用拉格朗日优化法解决,通过引入拉格朗日系数λ将约束性求最值问题转为非约束性求最值问题,如第二个式子所示。

编码工具集:
如分级预测、帧内预测、帧间预测、44变换、88变换等、UVCL熵编码、CABAC熵编码等,当编码工具集固定时,对于固定的信源来说,一个编码器必然有一个确定的可操作点X的集合,由于集合点的离散型,可以在这个集合中近似出曲线包络,其中最优的一条包络被称为率失真曲线理论值。当编解码中引入了新的工具时,率失真曲线理论值可能会向左下方移动。

对于给定的R,其失真最小的点在率失真曲线理论值曲线上,上述率失真优化的公式一即让选择到的可操作点尽可能贴近理论值曲线。

编码工具决定了RD曲线的形态,即对于给定的信源,其有可能的(R,D)点集合,然而在每次编码中只能选择一个(R,D)点,通过编码策略进行选择,即怎样利用编码工具:什么时候采用帧内编码,什么时候采用帧间编码,怎样分块等让选择到的(R,D)点贴近理论曲线,这个选择的过程即率失真优化。

由于引入了拉格朗日系数,不再给定码率RT,设D+λR=J,过(R,D)做一条斜率为λ的斜线,其于纵轴截距即为J,让J最小即让截距最小,此时让(R,D)逼近理论曲线的问题可转化为过(R,D)做一条斜率为λ的斜线,让其与y轴截距最小,通过数学推导可知,当该斜线于曲线相切时理论最小,寻找给(R,D)点的过程即HEVC中的率失真优化。

通过引入λ可以更方便地去权衡视频质量与码率的重要性,当λ设置较大时,为了让J更小,就需要控制R的大小,即更注重码率,当λ设置较小时,为了让J更小,就需要控制D的大小,即更注重视频质量。

二、HEVC中帧内预测中的RDO

率失真优化贯穿于视频编解码的整个阶段,这里以帧内预测为例:
在HM中,帧内预测分为三个步骤:模式粗选(rough mode decision,RMD)、最佳可能预测模式(most possible mode,MPM)和率失真优化(RDO)
RMD依次按照35种模式对当前PU进行预测,计算预测像素于原始像素的差,对差值进行阿达玛变换后求和,将最好的几个模式加入备选模式集中
MPM依据相邻PU间的相似性,将待编码PU附近的已编码PU的模式加入备选模式集中
RDO在最终的备选模式集中进行优化,选出最优编码策略,这个过程如下:
01.分层递归遍历所有CU划分
由于HEVC的编码结构为基于CTU的四叉树划分,这个过程的率失真优化流程可以按照如下递归式表式:

每次递归比较当前深度的率失真代价于下一深度的率失真代价
在递归的过程中确定出能使率失真代价最小的编码策略
02.对每个CU确定PU划分
03.对每个PU进行帧内预测

三、HM中的RDO实现

在TLibCommon中的TComCudata中存在三个成员函数:

  Double&       getTotalCost                  ( )  { return m_dTotalCost;        }Distortion&   getTotalDistortion            ( )  { return m_uiTotalDistortion; }UInt&         getTotalBits                  ( )   { return m_uiTotalBits;       }

分别为获取总的率失真代价,计算总失真,计算总比特数,这些数据作为该类的成员,可以被其他函数修改,
如总失真m_dTotalCost在CTU的初始化时被设为最大值,在后续递归调用时会被更新为其他值,总失真被初始化为0,总码率被初始化为0:


在计算某层CU划分结果的总结果时,需要计算其划分的pccu中的数值

上述计算是对于整体结果的统计,对于每个部分的相关数据计算的代码在TLibCommon中的TComRDcost中:
计算失真的代码如下:

Distortion TComRdCost::getDistPart( Int bitDepth, const Pel* piCur, Int iCurStride,  const Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, const ComponentID compID, DFunc eDFunc )
{DistParam cDtParam;setDistParam( uiBlkWidth, uiBlkHeight, eDFunc, cDtParam );cDtParam.pOrg       = piOrg;cDtParam.pCur       = piCur;cDtParam.iStrideOrg = iOrgStride;cDtParam.iStrideCur = iCurStride;cDtParam.iStep      = 1;cDtParam.bApplyWeight = false;cDtParam.compIdx      = MAX_NUM_COMPONENT; // just for assert: to be sure it was set before usecDtParam.bitDepth     = bitDepth;if (isChroma(compID)){return ((Distortion) (m_distortionWeight[compID] * cDtParam.DistFunc( &cDtParam )));}else{return cDtParam.DistFunc( &cDtParam );}

其中DistParam cDtParam;是存在有关图像失真相关数据的对象,DistFunc为失真函数

enum ComponentID
{COMPONENT_Y       = 0,COMPONENT_Cb      = 1,COMPONENT_Cr      = 2,MAX_NUM_COMPONENT = 3
};

由于亮度与色度的失真计算方式不同,需要通过枚举型数据compID进行判断:

通过直接调用熵编码类的getNumberOfWrittenBits()来计算码率

rpcTempCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // dQP bits
rpcTempCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
rpcTempCU->getTotalCost()  = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() );

计算出的码率getTotalBits()与失真getTotalDistortion一起通过calcRdCost拿去计算总失真:

计算总失真的代码如下:

Double TComRdCost::calcRdCost( Double numBits, Double distortion, DFunc eDFunc )
{Double lambda = 1.0;switch ( eDFunc ){case DF_SSE:assert(0);break;case DF_SAD:lambda = m_dLambdaMotionSAD[0]; // 0 is valid, because for lossless blocks, the cost equation is modified to compensate.break;case DF_DEFAULT:lambda = m_dLambda;break;case DF_SSE_FRAME:lambda = m_dFrameLambda;break;default:assert (0);break;}if (eDFunc == DF_SAD){if (m_costMode != COST_STANDARD_LOSSY){return ((distortion * 65536.0) / lambda) + numBits; // all lossless costs would have uiDistortion=0, and therefore this cost function can be used.}else{return distortion + (((numBits * lambda) ) / 65536.0);}}else{if (m_costMode != COST_STANDARD_LOSSY){return (distortion / lambda) + numBits; // all lossless costs would have uiDistortion=0, and therefore this cost function can be used.}else{return distortion + (numBits * lambda);}}
}

eDFunc 代表了不同的损失函数,不同损失函数在率失真代价计算中使用的λ有所不同,随后根据不同的模式与不同的代价函数计算出失真。

HEVC学习之率失真优化相关推荐

  1. HEVC率失真优化方法

    参考资料: [1]万帅,杨付正编著. 新一代高效视频编码H.265/HEVC 原理.标准与实现[M]. 北京:电子工业出版社, 2014.12. 视频率失真曲线 对于某一视频编码标准,其编码框架已经确 ...

  2. H.265/HEVC学习笔记:量化

    量化是指将信号的连续取值(或者大量可能的离散取值)映射为有限多个离散幅值的过程,实现信号取值多对一的映射.在视频编码中,残差信号经过DCT后,变换系数往往具有较大的动态范围.因此对变换系数进行量化可以 ...

  3. HEVC学习-帧内预测-亮度分量预测主函数

    QP的详解:https://blog.csdn.net/liangjiubujiu/article/details/80569391 代码部分:https://blog.csdn.net/HEVC_C ...

  4. NVIDIA GPUs上深度学习推荐模型的优化

    NVIDIA GPUs上深度学习推荐模型的优化 Optimizing the Deep Learning Recommendation Model on NVIDIA GPUs 推荐系统帮助人在成倍增 ...

  5. 强化学习应用于组合优化问题_如何将强化学习应用于现实生活中的计划问题

    强化学习应用于组合优化问题 by Sterling Osborne, PhD Researcher 作者:斯特林·奥斯本(Sterling Osborne),博士研究员 如何将强化学习应用于现实生活中 ...

  6. 深度学习最常用的学习算法:Adam优化算法

    上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习  快速带你晋级 阅读全文 > 正文共6267个字,30张图,预计阅读时间16分钟. 听说你了解深度学习最常用的学习 ...

  7. 花书+吴恩达深度学习(七)优化方法之基本算法(Momentum, Nesterov, AdaGrad, RMSProp, Adam)

    目录 0. 前言 1. 指数加权平均(exponentially weighted averages) 2. Momentum 动量 3. Nesterov 动量 4. AdaGrad 5. RMSP ...

  8. HEVC学习笔记 第1章 编码结构

    第1章 编码结构 1.1 视频编码标准简介 视频编码标准只是规定了编码码流的语法语义和解码器,只要求视频编码后的码流符合标准的语法结构,解码器就可以根据码流的语法语义进行正常解码.因此,符合某个视频编 ...

  9. 深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)

    1. 简介 深度学习(Deep Learning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩.系统优化加速.异构计算等方法突破瓶颈,即分别在算法模型.计算图或算 ...

最新文章

  1. SQL 基础之去重和显示表结构(四)
  2. python3下载文件-使用Python 3从网上下载文件
  3. 2020年 | 云计算发展的5大趋势
  4. MSSSQL 脚本收藏
  5. 论文浅尝 | 基于图匹配神经网络的跨语言知识图对齐 (ACL 2019)
  6. anaconda3 tensorflow安装踩坑记(WIN10+tensorflow带gpu版本)
  7. DBA 14条职业选择路线,你适合哪种?
  8. [UVALive 3661] Animal Run
  9. 《Python趣味创意编程》新书上架了
  10. 数据读取入门——xlsread
  11. 完美解决Tensorflow不支持AVX2指令集问题|指令集加速
  12. 数据库实验四 视图实验
  13. java 文本提取_Java 提取PDF 文本内容
  14. 挖掘数字资产,生意增长是本质,但数据创新仍有难题待解 | 2022全球数字价值峰会...
  15. 敏捷教练如何辅导发布计划的制定之开展行动
  16. 网易裁员,让保安把身患绝症的我赶出公司。我在网易亲身经历的噩梦!
  17. 微信小程序引用外部文件找不到文件报错问题
  18. 相关性分析的结果解读及说明
  19. Unity bug error CS1703: Multiple assemblies with equivalent identity have been imported...
  20. KDD 2022时空数据挖掘领域论文汇总

热门文章

  1. 密码学-password 1
  2. 突破局域网中对用户上网的限制
  3. 写一个网页,支持10国语言便捷切换
  4. 计算机什么乘出来是错误,excel表格乘法出来数据错误-EXCEL乘法出错误,做乘法运算,按回车出现的不是得数......
  5. 百度绿萝算法打击友链交易
  6. 努比亚红魔5s9008救砖教程
  7. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
  8. 程序员和产品经理的那些“恩怨情仇”
  9. 考虑新西兰留学,什么专业好移民呢?
  10. CCPD2019车牌提取和字符提取