摘要:本文主要介绍H264码率控制过程中,RQ模型参数更新推导过程,并结合JM19.0代码分析其功能实现

H264码率控制中比较重要的一个模型是RQ模型,不管是图像级码率控制还是基本单元码率控制都会用到。

RQ模型主要作用是根据目标比特数以及预测MAD,预测得到当前编码单元(帧/宏块)的量化步长QStep,得到量化步长后,才可以进行后续的率失真优化RDO获取最佳编码方式。

RQ模型参数初始值是固定值,肯定不能满足所有的编码场景,因此,在编码过程中需要根据已编码的数据不断更新参数,从而使 RQ 模型更加精准。

1. RQ模型

RQ模型公式如下:
Target=c1∗MADQStep+c2∗MADQStep2Target = c1* \frac {MAD} {QStep} + c2* \frac {MAD} {QStep^2}Target=c1∗QStepMAD​+c2∗QStep2MAD​
其中,TargetTargetTarget 表示预测得到的目标比特数,
MADMADMAD表示编码后数据的平均误差,由于这个时候还没有开始编码,所以这个值也是通过已编码帧的MAD预测当前帧得到的。

c1、c2c1、c2c1、c2就是我们要不断更新的参数。

2. 参数更新过程

使用线性回归算法来更新RQ模型的参数。更新过程由下面三步组成(这部分代码实现参考JM的updateRCModel函数):

  1. 选择数据集

模型的准确度依赖于做线性回归的数据集大小及其质量。一般来说,选择的数据量越多,越能反映出平均情况,但难以反映出实时情况。例如在场景切换时,需要根据最近的情况及时更新模型。

在滑动窗口内的已编码视频帧的信息(QStepi、MADi、bitsi)(QStep_{i}、MAD_{i}、bits_{i})(QStepi​、MADi​、bitsi​)构成了一组数据集。每编码一个帧或基本编码单元,会把该次编码生成的数据样本放入滑动窗,作为数据集的一部分。

  1. 计算模型参数

根据滑动窗内数据集(QStep、MAD、编码bit数),使用线性回归法更新RQ模型参数。计算过程在JM的RCModelEstimator函数
使用线性回归方法,统计数据集中所有样本,使得真实编码比特数和RQ模型预测目标比特数最接近。

  1. 移除滑动窗内误差太大的数据样本,并重新计算RQ模型参数。

使用上一步骤计算得到的RQ模型参数计算每个样本的均方差,均方差超过阈值K的样本则认为该数据是错误数据,应该从数据集剔除。然后再根据步骤2重新计算一次RQ模型参数。

3. 线性回归推导

参数更新通过线性回归方法实现.
可得到滑动窗内所有样本平方差代价函数如下:
E=∑i=1n(c1∗MADi/QStepi+c2∗MADi/QStepi2−Targeti)2E= \sum_{i=1}^{n} (c_1* MAD_{i}/QStep_{i} + c_2*MAD_{i}/QStep_{i}^2-Target_{i})^2E=i=1∑n​(c1​∗MADi​/QStepi​+c2​∗MADi​/QStepi2​−Targeti​)2

令x=QStepx=QStepx=QStep,表示实际编码使用的量化步长;
y=bitsy=bitsy=bits,表示最终编码后的真实比特数。

代价函数可表示为
E(c1,c2)=∑i=1n(c1∗MADi/xi+c2∗MADi/xi2−yi)2E(c_1,c_2)= \sum_{i=1}^{n} (c_1* MAD_{i}/x_{i} + c_2*MAD_{i}/x_{i}^2-y_{i})^2E(c1​,c2​)=i=1∑n​(c1​∗MADi​/xi​+c2​∗MADi​/xi2​−yi​)2
我们要做的实际上是求得c1,c2c_1,c_2c1​,c2​,使EEE最小。

分别对c1和c2求偏导,可得E的最小值分别对c_1和c_2求偏导,可得E的最小值分别对c1​和c2​求偏导,可得E的最小值
∂E∂c1=∂∑i=1n(c1∗MADi/xi+c2∗MADi/xi2−yi)2∂c1=0\frac{\partial E}{\partial c_1}=\frac{\partial \sum_{i=1}^{n} (c_1* MAD_{i}/x_{i} + c_2*MAD_{i}/x_{i}^2-y_{i})^2}{\partial c_1}=0∂c1​∂E​=∂c1​∂∑i=1n​(c1​∗MADi​/xi​+c2​∗MADi​/xi2​−yi​)2​=0

∑i=1n∂(c1∗MADi/xi+c2∗MADi/xi2−yi)2∂c1=0\sum_{i=1}^{n} \frac{\partial (c_1* MAD_{i}/x_{i} + c_2*MAD_{i}/x_{i}^2-y_{i})^2}{\partial c_1} = 0i=1∑n​∂c1​∂(c1​∗MADi​/xi​+c2​∗MADi​/xi2​−yi​)2​=0

2∗∑i=1n(c1∗MADi/xi+c2∗xi/xi2−yi)∗MADixi=02*\sum_{i=1}^{n} { (c_1* MAD_{i}/x_{i} + c_2*x_{i}/x_{i}^2-y_{i})} * \frac {MAD_i} {x_i}= 02∗i=1∑n​(c1​∗MADi​/xi​+c2​∗xi​/xi2​−yi​)∗xi​MADi​​=0

∑i=1n(c1+c2xi−yi∗xi/MADi)=0\sum_{i=1}^{n} (c_1+ \frac{c_2} {x_i} - y_i*x_i/MAD_i)=0i=1∑n​(c1​+xi​c2​​−yi​∗xi​/MADi​)=0

同理对c2c_2c2​的偏导可得方程:
∑i=1n(c1/xi+c2/xi2−yi/MADi)=0\sum_{i=1}^{n} (c_1/x_i+ {c_2}/ {x_i^2} - y_i/MAD_i)=0i=1∑n​(c1​/xi​+c2​/xi2​−yi​/MADi​)=0

可得矩阵运算方程
[∑i=1n1∑i=1n1/xi∑i=1n1/xi∑i=1n2/xi2]∗[c1c2]=[∑i=1nyi∗xi/MADi∑i=1nyi/MADi]\begin{bmatrix} \sum_{i=1}^{n} 1 & \sum_{i=1}^{n} 1/x_i \\ \sum_{i=1}^{n} 1/x_i & \sum_{i=1}^{n} 2/x_i^2 \\ \end{bmatrix} * \begin{bmatrix} c_1 \\ c_2 \\ \end{bmatrix}= \begin{bmatrix} \sum_{i=1}^{n} y_i*x_i/MAD_i \\ \sum_{i=1}^{n} y_i/MAD_i \\ \end{bmatrix}[∑i=1n​1∑i=1n​1/xi​​∑i=1n​1/xi​∑i=1n​2/xi2​​]∗[c1​c2​​]=[∑i=1n​yi​∗xi​/MADi​∑i=1n​yi​/MADi​​]
求解以上方程可得c1,c2c_1,c_2c1​,c2​

JM代码中求解过程在函数RCModelEstimator中,其中用到的几个变量如下:
a00=∑i=1n1,a01=∑i=1n1/xia_{00}=\sum_{i=1}^{n} 1, a_{01}= \sum_{i=1}^{n} 1/x_ia00​=∑i=1n​1,a01​=∑i=1n​1/xi​
a10=∑i=1n1/xi,a11=∑i=1n2/xi2a_{10}= \sum_{i=1}^{n} 1/x_i, a_{11}= \sum_{i=1}^{n} 2/x_i^2a10​=∑i=1n​1/xi​,a11​=∑i=1n​2/xi2​
b0=∑i=1nyi∗xi/MADi,b1=∑i=1nyi/MADib_0=\sum_{i=1}^{n} y_i*x_i/MAD_i , b_1=\sum_{i=1}^{n} y_i/MAD_ib0​=∑i=1n​yi​∗xi​/MADi​,b1​=∑i=1n​yi​/MADi​

void RCModelEstimator (VideoParameters *p_Vid, InputParameters *p_Inp, RCQuadratic *p_quad, int n_windowSize, Boolean *m_rgRejected)
{int n_realSize = n_windowSize;int i;double oneSampleQ = 0;double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;double MatrixValue;Boolean estimateX2 = FALSE;// 获取滑动窗内有效样本个数for (i = 0; i < n_windowSize; i++){// find the number of samples which are not rejectedif (m_rgRejected[i])n_realSize--;}// default RD model estimation results,m_X1、m_X2对应公式里的c1、c2p_quad->m_X1 = p_quad->m_X2 = 0.0;for (i = 0; i < n_windowSize; i++){if (!m_rgRejected[i])oneSampleQ = p_quad->m_rgQp[i]; // m_rgQp存放的是QStep值}for (i = 0; i < n_windowSize; i++){// if all non-rejected Q are the same, take 1st order modelif ((p_quad->m_rgQp[i] != oneSampleQ) && !m_rgRejected[i])estimateX2 = TRUE;if (!m_rgRejected[i])p_quad->m_X1 += (p_quad->m_rgQp[i] * p_quad->m_rgRp[i]) / n_realSize;}// take 2nd order model to estimate X1 and X2/*求解方程,也就是上面推导的矩阵公式| a00  a01 |  |  m_x1 | = | b0 || a10  a11 |  |  m_x2 |    | b1 |*/if ((n_realSize >= 1) && estimateX2){for (i = 0; i < n_windowSize; i++){if (!m_rgRejected[i]){a00  = a00 + 1.0;a01 += 1.0 / p_quad->m_rgQp[i];a10  = a01;a11 += 1.0 / (p_quad->m_rgQp[i] * p_quad->m_rgQp[i]);b0  += p_quad->m_rgQp[i] * p_quad->m_rgRp[i];b1  += p_quad->m_rgRp[i];}}// solve the equation of AX = BMatrixValue=a00*a11-a01*a10;if(fabs(MatrixValue) > 0.000001){p_quad->m_X1 = (b0 * a11 - b1 * a01) / MatrixValue;p_quad->m_X2 = (b1 * a00 - b0 * a10) / MatrixValue;}else{p_quad->m_X1 = b0 / a00;p_quad->m_X2 = 0.0;}}if( p_Vid->type == P_SLICE || (p_Inp->RCUpdateMode == RC_MODE_1 && (p_Vid->number != 0)) ){p_quad->Pm_X1 = p_quad->m_X1;p_quad->Pm_X2 = p_quad->m_X2;}
}

H264编码- 码率控制 RQ 模型参数推导过程以及JM代码分析相关推荐

  1. h264的码率控制 JVT-G012

    开始看h264的码率控制,很多地方都提到 G012,拿来做为参考比较,看来很有必要研究清楚. 偶这人,E文文档不翻译的话,看过就忘了,于是草草翻译了下,因为不打算做B帧,也不准备在同一帧中使用不同的M ...

  2. 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。

    题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...

  3. ffmpeg4.4项目学习--H264编码之码率控制模式及参数配置

    目录 一.引言 二.H264编码的四种模式 ------> 2.1.CBR ------> 2.2.VBR ------> 2.3.CVBR ------> 2.4.ABR - ...

  4. 视频编码码率控制:CBR、VBR和ABR

    下面介绍不同的码率控制模型和适用场景: CQP:固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最 ...

  5. 二阶低通滤波器IIR的五个参数推导过程

    最近在研究飞控代码看到了二阶低通滤波器IIR的软件代码,由于之前没有了解过二阶滤波器的原理,对代码十分懵逼,经过学习,特将学习成果发布,有兴趣的小伙伴看看,如果哪里不对,请提出来,一起学习进步哟,下面 ...

  6. 【备忘】加入L2范数正则化后的正规方程求解参数推导过程

    正则化的引入是为了解决线性回归中过拟合的问题,过拟合直观解释即训练出来的模型复杂度过高,对于当前用于训练的数据集而言预测非常精准,而对于未知数据样本的预测准确率逐渐走低,因此在目标函数中除了Loss ...

  7. 大气散射模型的推导过程

    大气中粒子的散射作用是产生雾霾的主要原因.无论是用人的肉眼观察,还是从拍摄获取的图像中观察,雾天的景象总是存在对比度和视野降低的问题.1925年,Keim & Nemnich[1]等人提出雾天 ...

  8. x264参数介绍(帧类型和码率控制,分析和视频可用性信息)

    鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置.这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设 ...

  9. X264码率控制流程分析

    码率控制的理论知识: 码率控制的目的和意义: 图像通信中码率控制的目的:通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求.视频压缩的效率和视频内容有很大的关系, ...

最新文章

  1. 一口气说出四种幂等性解决方案,面试官露出了姨母笑~
  2. zabbix3.2监控redis
  3. 新冠肺炎数据里学到的四个数据分析和机器学习知识
  4. 最新行政区划编码数据
  5. PHP内核探索之变量(2)-理解引用
  6. hdu3313 最大流找关键点,或者最短路找关键点.
  7. linux Centos7下安装python3及pip3
  8. Windows10下搭建Java环境(最新教程)
  9. C++ Primer 5th笔记(9)chapter9 顺序容器 get insert delete
  10. 跨浏览器Ajax调用封装
  11. PIC单片机精通_串口通讯与串口调试实例
  12. Raw Socket编程
  13. 仪表盘加载数据nan_6种数据格式对比,用Jupyter+pandas高效数据分析
  14. https的ssl证书申请及服务器的nginx的配置教程
  15. mpvue微信小程序引入腾讯地图sdk
  16. 黑莓手机用desktop manager安装了一些软件后重启出现erro523无法进入桌面
  17. sql语句where的执行顺序
  18. 【安全资讯】熊猫烧香之后15年,网络变安全了吗?
  19. Win10 环境变量配置
  20. lol服务器维护局,lol维护局 英雄联盟钻石维护局掉多少分

热门文章

  1. WebStorm 最新激活码 license server
  2. Linux微型服务器(NAS)的搭建
  3. SSM上传图片并保存图片地址到数据库
  4. php 循环重定向,php - 登录重定向时出现无限循环 - 堆栈内存溢出
  5. 我对软件分层设计的思考
  6. 深入浅出医学注册配准
  7. 数学符号在论文中的格式规范
  8. 北京大学计算机及应用自考,2017年下半年北京大学计算机及应用专业自考毕业论文初审结果...
  9. 获取抖音商品详情接口调用展示
  10. 新技术应用及其影响:数字经济深度解析