H264编码- 码率控制 RQ 模型参数推导过程以及JM代码分析
摘要:本文主要介绍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函数):
- 选择数据集
模型的准确度依赖于做线性回归的数据集大小及其质量。一般来说,选择的数据量越多,越能反映出平均情况,但难以反映出实时情况。例如在场景切换时,需要根据最近的情况及时更新模型。
在滑动窗口内的已编码视频帧的信息(QStepi、MADi、bitsi)(QStep_{i}、MAD_{i}、bits_{i})(QStepi、MADi、bitsi)构成了一组数据集。每编码一个帧或基本编码单元,会把该次编码生成的数据样本放入滑动窗,作为数据集的一部分。
- 计算模型参数
根据滑动窗内数据集(QStep、MAD、编码bit数),使用线性回归法更新RQ模型参数。计算过程在JM的RCModelEstimator函数
使用线性回归方法,统计数据集中所有样本,使得真实编码比特数和RQ模型预测目标比特数最接近。
- 移除滑动窗内误差太大的数据样本,并重新计算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)∗xiMADi=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+xic2−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=1n1∑i=1n1/xi∑i=1n1/xi∑i=1n2/xi2]∗[c1c2]=[∑i=1nyi∗xi/MADi∑i=1nyi/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=1n1,a01=∑i=1n1/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=1n1/xi,a11=∑i=1n2/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=1nyi∗xi/MADi,b1=∑i=1nyi/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代码分析相关推荐
- h264的码率控制 JVT-G012
开始看h264的码率控制,很多地方都提到 G012,拿来做为参考比较,看来很有必要研究清楚. 偶这人,E文文档不翻译的话,看过就忘了,于是草草翻译了下,因为不打算做B帧,也不准备在同一帧中使用不同的M ...
- 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。
题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...
- ffmpeg4.4项目学习--H264编码之码率控制模式及参数配置
目录 一.引言 二.H264编码的四种模式 ------> 2.1.CBR ------> 2.2.VBR ------> 2.3.CVBR ------> 2.4.ABR - ...
- 视频编码码率控制:CBR、VBR和ABR
下面介绍不同的码率控制模型和适用场景: CQP:固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最 ...
- 二阶低通滤波器IIR的五个参数推导过程
最近在研究飞控代码看到了二阶低通滤波器IIR的软件代码,由于之前没有了解过二阶滤波器的原理,对代码十分懵逼,经过学习,特将学习成果发布,有兴趣的小伙伴看看,如果哪里不对,请提出来,一起学习进步哟,下面 ...
- 【备忘】加入L2范数正则化后的正规方程求解参数推导过程
正则化的引入是为了解决线性回归中过拟合的问题,过拟合直观解释即训练出来的模型复杂度过高,对于当前用于训练的数据集而言预测非常精准,而对于未知数据样本的预测准确率逐渐走低,因此在目标函数中除了Loss ...
- 大气散射模型的推导过程
大气中粒子的散射作用是产生雾霾的主要原因.无论是用人的肉眼观察,还是从拍摄获取的图像中观察,雾天的景象总是存在对比度和视野降低的问题.1925年,Keim & Nemnich[1]等人提出雾天 ...
- x264参数介绍(帧类型和码率控制,分析和视频可用性信息)
鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置.这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设 ...
- X264码率控制流程分析
码率控制的理论知识: 码率控制的目的和意义: 图像通信中码率控制的目的:通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求.视频压缩的效率和视频内容有很大的关系, ...
最新文章
- 一口气说出四种幂等性解决方案,面试官露出了姨母笑~
- zabbix3.2监控redis
- 新冠肺炎数据里学到的四个数据分析和机器学习知识
- 最新行政区划编码数据
- PHP内核探索之变量(2)-理解引用
- hdu3313 最大流找关键点,或者最短路找关键点.
- linux Centos7下安装python3及pip3
- Windows10下搭建Java环境(最新教程)
- C++ Primer 5th笔记(9)chapter9 顺序容器 get insert delete
- 跨浏览器Ajax调用封装
- PIC单片机精通_串口通讯与串口调试实例
- Raw Socket编程
- 仪表盘加载数据nan_6种数据格式对比,用Jupyter+pandas高效数据分析
- https的ssl证书申请及服务器的nginx的配置教程
- mpvue微信小程序引入腾讯地图sdk
- 黑莓手机用desktop manager安装了一些软件后重启出现erro523无法进入桌面
- sql语句where的执行顺序
- 【安全资讯】熊猫烧香之后15年,网络变安全了吗?
- Win10 环境变量配置
- lol服务器维护局,lol维护局 英雄联盟钻石维护局掉多少分