【视频编码】视频编码中拉格朗日乘子法的简单理解

拉格朗日乘子法在诸多领域都有着重要的应用,通过使用拉格朗日乘子法,能够求解一些不易于解析的约束性问题,这在视频编码领域中也有重要的应用。

1.问题的定义

在视频编码器中,有些工具用来优化编码质量,而有些工具用于提升编码速度。在相同的码率(Bitrate)下,每增加一项工具都会对编码器的编码质量(PSNR)产生影响。这自然的衍生了一个问题,在给定码率的情况下,如何使得编码质量最优,即编码损失(Distortion)最小,这就是率失真优化(Rate Distortion Optimization,RDO)的问题,能够用一个约束性公式可以描述:
min ⁡ D ( B ) B ∈ S , s . t . R ( B ) < R c (1) \mathop{\min D(B)}\limits_{B \in S},s.t.R(B) <R_c \tag{1} BSminD(B),s.t.R(B)<Rc(1)
其中,D表示编码损失distortion,B表示使用的工具情况(或者说编码模式),R表示码率, R c R_c Rc表示限制的码率。我们的目的是,给定码率,找到一个最优的 B B B,使得 D ( B ) D(B) D(B)最小,记最优 B = B ∗ B=B^* B=B。由视频编码中质量和码率之间的关系可知,一般情况下,码率越高,质量也越好,所以如果码率取最大值 R c R_c Rc,损失也应该最小(至少是最小损失附近),即最优的 B B B B ∗ B^* B,有 R ( B ∗ ) = R c R(B^*)=R_c R(B)=Rc,最优的 B ∗ B^* B对应于最小的损失。

2.问题的求解

B B B通常是由一系列编码器内部的模式组成的,即 B = { b 1 , b 2 , . . . , b n } B=\{b_1,b_2,...,b_n\} B={b1,b2,...,bn}。先考虑最简单的情况,只有一个模式,即 B = { b 1 } B=\{b_1\} B={b1},此时能够根据 R R R的限制条件,求解出最佳的 B ∗ B^* B,因为这是一个一元函数,很容易求解。

假设现在 B B B由两个模式共同影响,即 B = { b 1 , b 2 } B=\{b_1,b_2\} B={b1,b2}。令 f ( b 1 , b 2 ) = D ( b 1 , b 2 ) f(b_1,b_2)=D(b_1,b_2) f(b1,b2)=D(b1,b2) g ( b 1 , b 2 ) = R ( b 1 , b 2 ) − R c g(b_1,b_2)=R(b_1,b_2)-R_c g(b1,b2)=R(b1,b2)Rc。由前述可知,当 g ( b 1 , b 2 ) = 0 g(b_1,b_2)=0 g(b1,b2)=0时取得最佳的模式,根据这个等式可以获得 b 1 b_1 b1 b 2 b_2 b2的关系,记为 b 2 = T ( b 1 ) b_2=T(b_1) b2=T(b1),此时有 f ( b 1 , b 2 ) = f ( b 1 , T ( b 1 ) ) f(b_1,b_2)=f(b_1,T(b_1)) f(b1,b2)=f(b1,T(b1)),这样就变成了一个一元函数,一元函数的极值点位于导数为零的点,对 f f f进行求导,有
d f ( b 1 , b 2 ) d b 1 = ∂ f ∂ b 1 + ∂ f ∂ b 2 d b 2 d b 1 = 0 (2) \frac{df(b_1,b_2)}{db_1}=\frac{\partial f}{\partial b_1}+\frac{\partial f}{\partial b_2}\frac{db_2}{db_1}=0 \tag{2} db1df(b1,b2)=b1f+b2fdb1db2=0(2)
如果上式成立,则对应的 b 1 b_1 b1 b 2 b_2 b2就是最佳模式。

由隐函数求导公式可知
d b 2 d b 1 = − ∂ g ∂ b 1 ∂ g ∂ b 2 (3) \frac{db_2}{db_1}=-\frac{\frac{\partial g}{\partial b_1}}{\frac{\partial g}{\partial b_2}} \tag{3} db1db2=b2gb1g(3)
因此,有
d f ( b 1 , b 2 ) d b 1 = ∂ f ∂ b 1 − ∂ f ∂ b 2 ∂ g ∂ b 1 ∂ g ∂ b 2 = 0 (4) \frac{df(b_1,b_2)}{db_1}=\frac{\partial f}{\partial b_1}-\frac{\partial f}{\partial b_2}\frac{\frac{\partial g}{\partial b_1}}{\frac{\partial g}{\partial b_2}}=0 \tag{4} db1df(b1,b2)=b1fb2fb2gb1g=0(4)
简化(4)中的公式,有
d f ( b 1 , b 2 ) d b 1 = f b 1 − f b 2 g b 1 g b 2 = 0 (4) \frac{df(b_1,b_2)}{db_1}=f_{b_1}-f_{b_2}\frac{g_{b_1}}{g_{b_2}}=0 \tag{4} db1df(b1,b2)=fb1fb2gb2gb1=0(4)
λ = − f b 2 g b 2 \lambda = -\frac{f_{b_2}}{g_{b_2}} λ=gb2fb2,有
{ f b 2 + λ ∗ g b 2 = 0 f b 1 + λ ∗ g b 1 = 0 g ( b 1 , b 2 ) = 0 (5) \left\{ \begin{matrix} f_{b_2} + \lambda * g_{b_2} = 0 \\ f_{b_1} + \lambda * g_{b_1} = 0 \\ g(b_1,b_2) = 0 \end{matrix} \right. \tag{5} fb2+λgb2=0fb1+λgb1=0g(b1,b2)=0(5)
根据公式(5),能够求解出对应的 b 1 b_1 b1 b 2 b_2 b2。如果将公式(5)进行抽象化,获得
D + λ ∗ R = C (6) D + \lambda * R = C \tag{6} D+λR=C(6)
其中,C为一个常数。如果此时再构建一个R-D曲线的话,那么这个R-D曲线与斜率为 − λ -\lambda λ的直线的切点就是最佳R-D点,这个最佳R-D点对应的模式就是最佳的模式。
在这里插入图片描述

3.实际应用

在RDO实际应用于编码器时,通常决定的是某一个模块,例如帧内预测选择何种模式,可能是16x16,也可能是4个8x8,或者是SKIP模式。评判如何选择最佳模式的方式就是
J = D + λ ∗ R J = D + \lambda * R J=D+λR
哪一种模式带来的 J J J最小(最接近于C),说明最接近于上述的切点。

需要注意的是,上述第2节中只讨论了2种模式的情况,如果是更多的模式,再依次类推即可。实际上,RDO过程中有很多子任务互不影响,是可以单独拆解的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值