音视频之H.265/HEVC率失真优化
H.265/HEVC系列文章:
1、音视频之H.265/HEVC编码框架及编码视频格式
2、音视频之H.265码流分析及解析
3、音视频之H.265/HEVC预测编码
4、音视频之H.265/HEVC变换编码
5、音视频之H.265/HEVC量化
6、音视频之H.265/HEVC环路后处理
7、音视频之H.265/HEVC熵编码
8、音视频之H.265/HEVC网络适配层
9、音视频之H.265/HEVC编解码并处理
10、音视频之H.265/HEVC率失真优化
为了将具有庞大数据量的视频在有限信道内传输、存储,高压缩率的编码算法往往会造成编码重建视频与原始视频存在差别,即重建视频产生失真,该类压缩被称为有损压缩。对于有损压缩算法,其性能需要根据编码输出的比特率和编码带来的失真度共同衡量。编码比特率和失真度相互制约、相互矛盾,如降低比特率往往会增加视频的失真度,相反要想获得更好的视频质量,又会提高视频的编码比特率。因此,视频编码的主要目的就是在保证一定视频质量的条件下尽量减少编码比特率,或在一定编码比特率限制条件下尽量地减小编码失真。在固定的编码框架下,为了应对不同的视频内容,往往有多种候选的编码方式,编码器的一个主要工作就是以某种策略选择最优的编码参数,以实现最优的编码性能。基于率失真理论的编码参数优化方法被称为率失真优化,率失真优化技术是保证编码器编码效率的主要手段。
一、率失真优化技术:
在系列文章7中音视频之H.265/HEVC熵编码讨论了熵编码,即无失真信源编码,它可以保证解码重建信息与编码前的原始信息完全一致。但针对视频信息,无失真编码并非必需。如传送图像时,并不需要全部精确地把图像传送到观察者,电视信号每一像素的黑白灰度级只需要分成256级,屏幕上的画面就已足够清晰悦目了。又如静止图像或视频帧中,从空间频域来看,若将高频分量丢弃,只传输或存储低频分量,数据率可以大大减少,多数图像质量仍能令人满意,这是因为人的视觉特性允许传送的图像存在一定的误差。
另外,由系列文章2中音视频之H.265/HEVC编码框架及编码视频格式可知视频的数据量极大,采用无损压缩仍然无法满足通常的信道带宽限制。因此,需要采用量化等手段进一步提高压缩率,这也会导致解码重建信息与编码前的原始信息不一致,产生失真。只使用压缩率无法衡量有损压缩算法的性能,需要同时考虑重建信息的质量和压缩率。
在允许一定程度失真的条件下,能够把信源信息压缩到什么程度,即最少需要多少比特数才能描述信源。针对这个问题,香农在1959年发表了“保真度准则下的离散信源编码定理”,定义了信息率失真函数R(D),并论述了其相关基本定理。之后逐渐受到了人们的重视,Berger的著作比较系统、完整地给出了一般信源的信息率失真函数及其定理证明。
1、互信息量:
设有两个离散的符号消息集合X和Y,X是信源发出的符号集合,Y是信宿收到的符号集合。接收者事先不知道信源发出的是哪一个符号消息,信源发送每个符号消息是一个随机事件。信源发出符号通过信道传递给信宿,如图11.1所示,信源发出的消息称为信道输入消息,信宿收到的消息称为信道输出消息。由于信道噪声,信道输入消息与信道输出消息不一定相同。
通常信源集合X包含的各个符号消息X={}及它们的概率分布
已知,也就是预先知道信源集合X的概率空间。即
其中为集合X中各个符号消息的取值,概率
为符号
消息出现的先验概率。
信宿收到的符号消息集合了的概率空间可以表示为
其中,为集合Y中各个消息的取值,概率
为符号消息
出现的概率。当信宿收到集合中的一个符号消息
后,接收者重新估计关于信源各个消息发生的概率就为条件概率
,这种条件概率又被称后验概率。
对于两个离散随机事件集X和Y,事件为的出现给出的关于事件
的信息量定义为互信息量
。其定义式为:
即互信息量定义为后验概率与先验概率比值的对数。互信息量的单位与自信息量一样取决于对数的底。由式(11-1)又可得 :
即互信息量等于自信息量减去条件自信息量。或者说,互信息量是一种消除的不确定性的度量,亦即互信息量等于先验的不确定性减去尚存在的不确定性。互信息量可取正值,也可取负值。如果互信息
取负值,说明信宿在未收到消息
以前对消息
是否出现的猜测的难易程度较小,但由于噪声的存在,接收到消息
后,反而使信宿对消息是否出现的猜测难易程度增加了。也就是,信宿接收到消息万后对出现的不确定性反而增加,所以获得的信息量为负值。
为了从整体上表示从一个随机变量Y所给出关于另一个随机变量X的信息量,定义互信息在X和Y的联合概率空间中的统计平均值为随机变量X和了间的平均互信息量。
2、失真度:
图11.3给出了一个通信系统的框图,由于率失真理论只涉及信源编码问题,所以可以将信道编码和译码看成信道的一部分,把信道编码、信道、信道译码这3部分看成一个没有任何干扰的广义信道。从直观感觉可知,若允许失真越大,信息传输速率可越小;若允许失真越小,则信息传输速率越大。所以信息传输速率与信源编码所引起的失真是相关的,并且信宿收到消息的失真只是由信源编码引起的,讨论信息传输速率和失真的关系可以略去广义的无扰信道。另外可以用虚拟手法拿信道来表示失真信源编码的作用,把信源编码和信源译码等价成一个信道,由于是失真编码,所以信道不是一一对应的,用信道传递概率来描述编译码前后关系,简化的通信系统如图11.4所示。
失真函数可有多种形式,但应尽可能符合信宿的主观特性,如人们的实际需要、失真引起的损失、风险大小等。常用的失真函数如下。
- 平方失真:
- 绝对失真:
- 相对失真:
- 误码失真:
式中,x——信源输出消息;
y——信宿收到消息。
前3种失真函数适用于连续信源,后一种适用于离散信源。均方失真和绝对失真只与(x-y)有关,数学处理上比较方便,且与主观特性比较匹配。不同的信源可以根据实际需求,选择合适的失真函数。
由于X和Y都是随机变量,故单个符号失真度也是随机变量。显然,规定了单个符号失真度
之后,传输一个符号引起的平均失真,即信源的平均失真为
它是在X和Y的联合概率空间求平均。对于不同的信源符号和不同的接收符号,产生的失真不同。但平均失真度已对信源和信道进行了统计平均,所以此值是描述某一信源在某一试验信道传输下的失真大小,是从总体上描述整个系统的失真情况。若信源符号的平均失真不大于所允许的失真D,即≤D,称为保真度准则。
可以看到,平均失真度不仅与单个符号的失真度有关,还与信源的概率分布和信道的转移概率有关。当信源和单个符号失真度固定,即P(X)和
给定时,选择不同的试验信道相当于选择不同的编码方法,所得的平均失真度
不同,在有些试验信道下
≤D,而有些试验信道下
>D。凡满足保真度准则的信道被称为D失真许可的试验信道,所有D失真许可的试验信道的集合用
表示,即
在这集合中,任一个试验信道矩阵下的平均失真度都不大于 D。
3、率失真函数:
假设信源输出的信息速率为R,在信道容量为C的信道上传输。如果R>C,就需要对信源进行压缩,使压缩后信源输出的信息速率R*小于信道容量C,这一压缩过程也势必会引入失真。因此,对于这一压缩过程,总是希望在满足一定信息速率限制的情况下(如不大于信道容量C),使其引起的失真尽量小。而对于很多实际的应用,该问题等价于希望在满足一定失真的情况下,使信源必须传输给收信者的信息传输速率R尽可能小。从接收端来看,就是在满足保真度准则下,寻找再现信源消息所必需获得的最低平均信息量。
接收端获得的平均信息量可用平均互信息量来表示,这就变成了在满足保真度准则的条件下(
≤D),寻找平均互信息量
的最小值。
是所有满足保真度准则的试验信道集合,可以在失真D的限制下在试验信道集合
中寻找某一个信道
,使
取最小值。由于平均互信息量
是
的U型凸函数,所以在
集合中,极小值存在。这个最小值就是在
≤D的条件下,信源必须传输的最小平均信息量,即
这就是信息率失真函数,简称率失真函数。
注意,在研究R(D)时,引用的条件概率并没有实际信道含义,只是为了求平均互信息的最小值而引用的假想可变试验信道,实际上这些信道反映的仅是不同的信源编码方法。所以改变试验信道求平均互信息的最小值,实质上是选择一种编码方式使信息传输速率最小。
在实际应用中,研究信息率失真函数是为了在已知信源和允许失真度的条件下,使信源必须传送给信宿信息的传输速率最小,即用尽可能少的码符号尽快地传送尽可能多的消息,以提高通信的有效性,这是信源编码问题。离散信源率失真函数
的一般曲线图形如图11.5所示。由此图可知,当限定失真度等于
时,信息率失真函数(D是信息压缩所允许的最低限度。若
>
,则必有
<
,即如果信息率压缩至
<
,则最小失真度
必大于限定失真度
。所以说,信息率失真函数给出了限定失真条件下信息压缩允许的下界。
率失真函数 对于信源编码具有指导意义。然而,对于一个实际信源,计算其
函数很困难。这是因为信源符号的概率分布很难确知,而且即便知道了概率分布,求解其
也极为困难,它是一个条件极小值的求解问题。利用上述理论知识,可以得到几种典型的信源率失真函数,例如高斯信源、拉普拉斯信源等。在率失真理论中,这些典型的率失真函数常常作为给定失真条件下信息可被压缩的下界。
当信源服从参数为的拉普拉斯分布:
4、率失真信源编码定理:
对于无失真信源编码来说,每一个信源符号(或符号序列)必须对应一个码字(或码字序列),信源输出信息率不能减少。而在允许一定失真的情况下,信源输出信息率最少可减少到信息率失真函数,有可能是多个信源符号(或符号序列)对应一个码字(或码字序列)。率失真信源编码定理就是关于信息率和失真关系的一个极限定理,也称香农第三定理,即保真度准则下的离散信源编码定理。
定理11.1 保真度准测下信源编码定理:
设是离散无记忆平稳信源的信息率失真函数,并且有有限的失真测度。对于任意的允许失真度
≥0和任意小的正数
> 0,
> 0,当信源序列长度1足够长时,一定存在一种信源编码
,其码字个数为
而编码后码的平均失真度
定理告诉我们:对于任何失真度 > 0,只要码长
足够长,总可以找到一种编码
,使编码后每个信源符号的信息传输速率
即
而码的平均失真度。即在允许失真
的条件下,信源可达到的最小传输速率是信源的
。
定理11.2保真度准测下信源编码逆定理:
不存在平均失真度为 ,而平均信息传输率
的任何信源码。亦即对任意码长为
的信源码
,若码字个数
,一定有
,逆定理告诉我们:如果编码后平均每个信源符号的信息传输速率
小于信息率失真函数
,就不能在保真度准则下再现信源的消息。
保真度准则下的信源编码及其逆定理在实际通信理论中有着重要的意义。这两个定理证实了在允许失真确定后,总存在一种编码方法,使编码后的信息传输速率
大于
且可任意接近于
,而平均失真度小于允许失真
。反之,若
,那么编码后的平均失真度将大于
。如果用二进制符号来进行编码的话,在允许一定量失真
的情况下,平均每个信源符号所需二进制码符号的下限值就是
。可见,从香农第三定理可知,
确实是允许失真度为
的情况下信源信息压缩的下限值。比较香农第一定理和第三定理可知,当信源给定后,无失真信源压缩的极限值是信源熵
;而有失真信源压缩的极限值是信息率失真函数
。在给定某
后,一般
。香农第三定理是有失真信源压缩的理论基础。
香农第三定理只是一个最优编码方法的存在定理,对于复杂信源的有损编码实际中还存在大量的问题。
实际信源的函数的计算相当困难。第一,需要对实际信源的统计特性有确切的数学描述。第二,需要对符合主客观实际的失真给予正确的度量,否则不能求出符合主客观实际的
函数。例如,通常采用均方误差来表示信源的平均失真度,但对于视频信源来说,均方误差与人眼主观失真感受不一致,如何定义符合主观感受的失真测度非常困难。第三,即便对实际信源有了确切的数学描述,又有符合主观感受的失真测度,率失真函数
的计算是一个条件极小值的求解问题,复杂信源往往无法得到具体的率失真函数。即便求得了符合实际的信息率失真函数,如何寻找最佳压缩编码方法才能达到
。目前,对于视频编码通常采用统一的编码框架,如基于块的混合编码框架,率失真优化是指从有限多种候选编码参数中选择最优编码参数。
二、视频编码中的率失真优化:
视频压缩的目标为在保证视频质量的前提下尽量降低视频流的压缩码率。但编码输出的码率和压缩后的失真度这两者之间的关系是相互制约和矛盾的。低码率更适应于网络传输带宽需求,但会加大视频的失真度。相反,想要获得更好的视频重构质量必然会提高传输的码率。如何在视频质量和压缩码率之间取得好的平衡无疑是一个必须解决的问题。
1、视频失真测度:
准确度量视频的失真是权衡编码性能的先决条件。一般来说,视频的客观失真测度应与人类视觉系统的感知失真一致。主观评价方法是由观看者根据主观感受来给出视频质量的整体好坏,这种评价结果必然符合人的视觉感受。但其耗时耗力,无法用数学模型描述,不能直接用于度量视频编码中的失真,而且主观评价易受主观因素影响。
近期客观质量评估模型一直是视频领域的研究热点,但由于人们对人眼的视觉和认知机制仍不清楚,使用已有的客观评估方法得到的视频质量仍与主观体验质量一致性较差。在实际应用中常常采用平方误差和(SSE)、均方误差(MSE)、绝对误差和(SAD)以及峰值信噪比(PSNR)等客观评价方法来作为失真测度。
其中,和
为位于(x,y)处的原始像素值和重构像素值,MxN 为视频的空间分辨率。
2、视频率失真曲线:
码率和失真的关系可以用一条光滑的下凸单调曲线刻画,称为率失真曲线。当率失真曲线已知时,对于给定的失真限制D*,在率失真曲线上可以直接得到最小速率R(D*),如图11.5所示。在实际编码系统中,通常对系统的编码复杂度、延时和内存等都有一定的要求,因此实际系统的最优性能并不能达到率失真曲线定义的理论值。能够满足约束条件的最优编码方案所能达到的最好性能是实际编码系统的最优性能,高效视频编码的任务就是找到更靠近实际率失真曲线的压缩方法。
对于一个特定的视频编码系统,如H.265/HEVC 视频压缩标准,编码结构及可采用的编码技术已经确定。使用不同的编码参数可以得到不同的率失真性能,具体的编码参数包括量化参数、编码单元的分割模式、预测模式、变换模式等。使用一组特定的编码参数对视频源进行编码,就可以获得该编码参数条件下的编码速率和失真,即率失真性能,这组编码参数对应的(R,D)称为实际率失真曲线的一个可操作点。
遍历所有可行的编码参数组合就可以得到所有可操作点,由于实际编码系统中参数的取值是有限的,比如在H.265/HEVC中量化参数只有52个,得到的可操作点的数量也是有限的,如图11.6所示。对于任意给定的速率限制R*,总可以找到一个D最小的可操作点,该操作点就是满足速率限制R*下的最优可操作点,相应的编码参数则为最优的编码参数。遍历速率限制R*,就可以得到一组最优的可操作点,这些最优可操作点的连线称为可操作率失真曲线,如图11.6所示。该曲线反映的是系统实际可达到的性能,其下边界也就是可操作率失真曲线的凸包络定义的系统最优的率失真性能。在给定码率约束的条件下,最小失真的可操作点出现在凸包络上,可操作点越靠近率失真曲线的凸包络,它的率失真性能就越好。率失真优化的目的就是找到一组编码参数使得对应的可操作点尽可能接近凸包络,也就是在一组可能的操作点中确定能使系统性能最优的操作点。
3、视频编码率失真优化:
不同的编码参数可以得到不同的率失真性能,最优的编码方案就是在编码系统定义的所有编码参数中使用能够使系统性能最优的参数值,视频编码系统中的率失真优化就是基于率失真优化理论选择最优的编码参数。对于一个典型的基于混合编码框架的视频编码系统,有大量编码参数,包括预测模式、运动估计、量化、编码模式等,且每个参数都有多个候选值,如在H.265/HEVC 中帧内预测模式包括33种角度模式、DC模式和 Planar 模式。
对需要编码的视频序列,遍历所有的参数候选模式对视频进行编码,满足码率限制的失真最小的一组参数集即为最优的视频编码参数。将一个视频序列作为编码单元,遍历大量的参数组合需要极大的计算量,实际的视频编码中无法使用这类穷举搜索方法。视频编码过程往往将视频序列分为多个较小的子任务,分别为每个子任务确定最优的参数集。这里的子任务可以是编码一个CU、一幅图像或一个GOP。假设编码中共包含N个子任务,第i个子任务有M种不同的参数组合,其对应M个可操作点,即码率和失真
,
=1,2,…,M,则确定最优参数集的过程等价于最小化所有子任务的失真和:
值得注意的是,这里假设失真,具有可加性,实际的视频质量在空时域都不是加性的,但由于目前视频编码中常用的质量测度MSE是加性的,后续内容仍使用这一加性假设。另外,实际视频编码系统中子任务之间的可操作点有一定的相关性,这就导致当前子任务的参数选择结果会影响下一个子任务参数选择的结果。如图像编码单元使用帧间预测时,参考图像选择不同的编码参数会影响当前图像的编码性能。
关于上述的限定性优化问题,它的求解方法通常有动态规划法(Dynamic Programming)和拉格朗日优化法。拉格朗日优化方法是视频率失真优化中最常见和最有力的优化工具,它是由H.Everett在1963年提出的,在1988年首次被应用在信源编码中,接着被用于树裁剪和熵受限的资源分配问题中,之后拉格朗日优化方法得到了广泛应用。假设S表示变量B的有限,B的目标函数和限定函数分别是D(B)和R(B)。则约束性优化问题可以描述为在给定一个限定码率R下,寻找最优的 B,使得
根据上述理论,在给定非负数的下,最优解
可以通过式(11-5)获取。不同的
则对应不同的限定码率
。但在约束性优化问题中常常是先给定
。而不是,因此应该在进行优化之前就确定出
。那么,如何得到合适的入来在给定限定码率
下确定最优解
。一种途径是根据经验选择合适的
,如采用二分法搜索算法尝试不同的
取值,最终得到满足限定码率
的
。视频编码中的取值与量化参数有较固定的函数关系,已有的速率控制往往首先根据限定码率预测编码单元的量化参数,然后利用量化参数与之间的映射关系确定出合适的入。最近直接根据限定码率
计算的方法被提出,并应用到H.265/HEVC的速率控制算法中,即直接根据限定码率预测出
的取值。
动态规划法通过构造网格来代表所有可能的解,网格的每一个阶段代表每一个子任务的输入,每一个状态都表示每一组参数集对应的累积失真和码率,如图11.8所示。在编码中,查看每一个阶段上所有状态的累积失真和码率,删除那些率失真性能较差的路径,最终得到一条失真最小的路径作为最优路径,该路径上的参数集作为最优的编码模式。该算法可以求解可操作率失真曲线上的任何点,而不受率失真曲线凸包络的限制。动态规划法适用于编码单元的率失真性能相互依赖的情况,然而其复杂度随着网格数的增加而递增,这使得动态规划法在实际编码系统中难以得到应用。
三、H.265/HEVC编码器中的率失真优化方法:
率失真优化技术在视频编码中扮演了重要的角色,使用其选择最优的编码参数是保证视频编码效率的关键。但值得注意的是,率失真优化技术不属于视频编码标准化的范畴,编码器可以使用不同的优化方法选择编码参数。不过,为了追求高编码效率,率失真优化方法是最主要的编码参数选择优化技术。与以往的编码标准相比,H.265/HEVC采用了更先进的编码算法和多种高效的编码工具,因此编码过程也面临着更多的编码参数选择。针对H.265/HEVC标准,
接下来首先从理论的角度讨论拉格朗日率失真优化方法在图像组层、片层、CTU层、CU层和PU层如何应用,继而从实现的角度介绍H.265/HEVC参考模型HM中确定最优编码参数的具体过程。由于主要编码参数属于CTU及其以下层,接下来的内容只关注CTU及其以下层编码单元编码参数的优化过程。
1、视频图像组的率失真优化:
时域预测允许使用其他图像组(GOP)的图像,图像组已经不是完全独立的编码单元。但是简单起见,本节讨论的图像组仍看成相互独立编码,但后续的优化方法仍然适用于现有标准的编码结构。不同图像组的编码过程相互独立,不同图像组间的编码参数及率失真性能互不影响,因此不同图像组可以独立优化编码参数。一个图像组包含多幅图像,时域预测技术把当前编码图像与参考图像关联起来,图11.9给出了一个低时延编码结构。可以看到第1幅图像作为后续多图像的参考图像,这就使得这些图像的率失真性能相互依赖。因此,图像组率失真优化过程需要考虑图像之间的依赖关系。
对于给定的图像组,视频编码的率失真优化是在满足该图像组编码比特数(目标比特数)限制下获取一组最佳的编码参数集,使用该参数集可以获得最优的重建视频质量。
其中,N为图像组包含的图像数,和
分别表示第
幅图像采用第
组编码参数所产生的失真和比特数,
为目标比特数。假设对每一幅图像,可以选择M个编码参数集中的任一组,那么对于一个含有幅图像的图像组,一共有
组选择。为了获得最优的编码参数,应该计算使用每一组编码参数时的比特数和失真,从中选择出满足目标比特数条件下失真最小的那一组编码参数作为图像组的最优编码参数。这种穷举算法的计算复杂度极高,在实际视频编码中无法应用。
根据"视频编码中率失真优化"的方法,可以将这一约束问题,通过拉格朗日优化方法转化为一个等价的无约束问题:
如果图像间的编码比特数和失真互不相关,可以通过最小化每一幅图像的率失真代价分别确定图像的最优编码参数。
其中,的值是获得优化参数的关键,其值由总目标码率
决定的。
在实际视频编码中,如H.265/HEVC 标准使用了帧间预测技术,包括运动估计补偿、运动矢量预测等。这种帧间预测技术使得不同图像的编码比特数和失真具有相互依赖的关系,即不同图像的率失真性能相互依赖,式(11-7)中率失真代价的计算应考虑图像间的依赖关系。下面将针对如图11.9所示的低时延编码结构,分析图像组的率失真优化技术。
式(11-7)中和
分别表示第
幅图像的编码失真和比特数。由于当前图像会使用前面已编码图像作为参考,因此当前图像的失真
不但与其编码比特数
相关,也与已编码的重构图像质量相关,即
因此,图像组率失真优化可以通过依次独立确定每幅图像的最优编码参数来实现,每一幅图像通过值来反映其与后续图像率失真性能的依赖关系。
主要与视频的内容特性和总的目标比特数相关,可以通过实验方法获取。
需要强调的是,以上分析中失真以图像为单位,假设图像的率失真性能有稳定的依赖关系。实际图像不同空间区域的内容不同,导致不同区域的率失真性能与其他区域的依赖关系也不同。因此,该优化方法推广到CTU 级可以获得更优的编码性能。
2、片层的率失真优化:
在H.265/HEVC标准中,片(Slice)是相对独立的编码单元,如编码、帧内预测、运动矢量预测等关键编码模块都不使用当前图像其他片的信息,只是在片边界进行环路滤波时可能会使用相邻片的信息。一个片包含整数个CTU编码单元,其编码参数的率失真优化问题可描述为
其中,N为片包含的CTU数,和
,分别表示第
个CTU采用第i组编码参数所带来的失真和码率,
为片的目标码率。
同理,可以将这一约束问题,通过拉格朗日优化方法转化为一个等价的无约束问题:
如果Slice 中不同CTU的码率和失真互不相关,可以通过最小化每个CTU的率失真代价分别确定CTU的最优编码参数:
其中,的值是获得优化参数的关键,其值由Slice总目标码率
决定
然而,空域预测技术使CTU间的率失真性能相互影响,如内预测使用相邻CTU的重建像素值,运动矢量预测使用相邻CTU的运动矢量。这种空域预测关系复杂多变,CTU间率失真性能的相互关系更难描述,片层的率失真优化的关键是明晰CTU间率失真性能的关系。目前率失真优化中CTU间率失真性能的相关性还未被考虑,通常按CTU具有独立的率失真性能进行优化。
3、CTU层率失真优化:
CTU是H.265/HEVC的基本编码单元,每一个CTU可以被划分为不同的编码单元 CU,每个CU 可以使用不同的PU 模式和 TU 模式,每个PU 又可以选择不同的预测模式。因此,可以把CTU编码参数的优化过程分成:CTU层主要选择不同的CU分式、CU层主要选择不同的PU 模式和 TU 模式、PU 层主要选择不同的预测模式。
每一个CTU 以四叉树的形式可以被划分为不同的编码单元CU,包括64x64、32x32、16x16和8x8,具体的CU划分模式是 CTU的关键编码参数。CTU层的率失真优化的目的是确定最优的CU划分模式,也称CU 模式选择。CTU层的CU模式选择的率失真优化问题可以描述为:在总比特数R受限的情况下,选择一个CU划分模式,使得一个CTU的总失真 D最小。
其中,为CTU的限定码率,
和
分别表示一种CU模式组合中第
个CU采用第
组编码参数所带来的失真和码率。将该约束问题使用拉格朗日优化法转化为无约束问题:
对每一个CU划分模式,按编码顺序对每个CU进行编码,并选取最优CU的编码参数,按式(11-11)求该划分模式中所有CU代价和,代价最小的划分模式则为最优划分模式。
不同的划分模式中,一个CU可能使用其他CU的重建像素值(如帧内预测)或编码参数(如运动矢量预测),这将导致不同划分模式会形成CU间不同的依赖关系。为了降低计算复杂度,实际优化过程往往按顺序对CTU进行四叉树递归分割,当前CU编码参数的优化过程不考虑对后续CU率失真性能的影响。
4、CU层率失真优化:
在H.265/HEVC中,每个CU可以采用不同的PU划分,不同的PU又包含着不同的预测模式,PU划分和预测模式的组合称为CU层的PU模式。如P-Slice或B-Slice下的CU层可选PU模式有SKIP模式、帧内PART_2Nx2N、帧内PART_NxN、PCM、帧间PART_2Nx2N、帧间PART_NxN、帧间PART_2NxN、帧间PART_Nx2N、帧间 PART_2NxnU、帧间PART_2NxnD、帧间PART_nLx2N和帧间PART_nRx2N。
经过预测后的残差信息还需要进行变换,H.265/HEVC 中允许采用不同大小的变换单元 TU,TU 的大小有 32x32、16x16、8x8和4x4。以CU为单位采用基于四叉树的结构进行TU划分,形成了多种TU组合,称为CU 层的 TU 模式。CU 层不同的 PU 模式和 TU 模式又形成了大量的组合每一种组合都是CU的一种候选模式。
CU层率失真优化的目的是确定最优的PU模式和TU模式,可以描述为:在总比特数R受限的情况下,适当的选择一个PU模式和 TU 模式,使得一个CU的总失真D最小:
在可选的候选集中,遍历每种 PU模式和TU模式,计算出相应的编码比特数和压缩失真,以及各个模式的率失真代价,可以确定出CU层的最优编码模式。同理,对于一个具体的PU模式,不同PU的率失真性能相互依赖。为了降低计算复杂度,实际优化过程常按顺序确定所有PU的编码参数,当前PU编码参数的优化过程不考虑对后续PU率失真性能的影响。另外,TU 模式会影响PU编码参数的选取,而往往为了降低计算复杂度,只对最优的PU 模式尝试不同的TU模式。
5、PU层率失真优化:
预测单元PU的主要模式可分为两类:内预测模式和帧间预测式。PU层率失真优化的目的是为PU选择最优的预测模式及预测参数。
帧内预测是利用当前图像已编码的像素对当前编码块进行预测,H.265/HEVC 提供了35 种帧内预测模式,包括33种角度模式、DC模式和 Planar 模式。帧内预测就是从35种帧内预测模式中选择出一种最优的预测模式,可以采用基于拉格朗日的率失真优化方法:
其中,D(Mode)、R(Mode)分别表示采用不同内预测模式时的失真和比特数, 为拉格朗日因子,最优的预测模式为率失真代价最小的模式。
帧间预测是利用已编码其他图像的像素预测当前编码块,H.265/HEVC 除了允许使用不同的运动矢量、多个参考图像,还增加了Merge、AMVP等新技术。因此,间预测模式需要结合Merge、AMVP等技术,为每个 PU选择运动矢量、参考图像、预测权值等编码参数。可以采用基于拉格朗日的率失真优化方法
其中,D(Motion)、R(Motion)分别表示采用不同运动模式(包括运动矢量、参考图像、预测权值等)时的失真和比特数,为拉格朗日因子,最优的预测模式为率失真代价最小的运动模式。
对于一个采用帧间预测的PU,包含大量的运动模式,计算每种运动模式下的D(Motion)和R(Motion)都需要使用该运动模式进行编码,计算复杂度极高。因此,通常可以简化式(11-14)为
其中,DFD(Motion)为采用不同运动模式时运动补偿预测误差,Rwv(Motion)为运动矢量相关信息(运动量、参考图像索引、参考队列索引等)的编码比特数,为拉格朗日因子。
6、编码参考模型HM中的率失真优化方法:
目前实际的视频编码率失真优化过程包括两部分:速率控制部分将视频序列分成编码单元,考虑编码单元的相关性通过码率分配技术确定每个编码单元目标码率,根据目标码率独立确定关键编码参数--量化参数;利用拉格朗日优化确定每个编码单元的其他编码参数(除量化参数)。本节的率失真优化内容主要包括量化参数外其他编码参数的确定方法。本节主要介绍H.265/HEVC参考模型HM10.0中使用的确定CTU编码参数的率失真优化方法。
CTU优化方法:
H.265/HEVC参考模型HM采用拉格朗日优化方法为每个CTU确定除量化参数外的编码参数,主要包括CU划分模式、CU的PU模式和TU模式、PU的预测参数等。一个CTU包含大量的编码参数组合,其采用分级的方式确定不同层的编码参数,主要步骤如下。
- 遍历所有的CU 划分模式进行编码,按式(11-11)确定最优的CU 划分模式。
- 对其中的每个CU,遍历所有的PU模式和TU模式组合,按式(11-12)确定最优的 PU 模式和 TU 模式。
- 对其中的每个PU,遍历所有的预测模式,按式(11-13)或式(11-14)确定最优的预测模式。
计算每个编码参数组合的率失真代价都需要采用这组编码参数对CTU 进行编码,这会导致计算复杂度非常高。为了降低计算复杂度,可以根据不同的编码参数采用不同的简化方法,如式(11-15)中的失真为运动补偿预测误差,可以为
其中,表示编码单元经过运动补偿后预测误差位于
处的值。
另外,采用Hadamard 变换代替实际的DCT(DST)也可以有效降低计算复杂度,且其率失真性能与使用DCT(或DST)相近。
由关键优化公式(11-11)、公式(11-12)、公式(11-13)、公式(11-15)可以看到,拉格朗日因子是采用拉格朗日优化方法确定编码参数的关键。速率控制已经为每个CTU确定了量化参数,然后可以根据拉格朗日因子与量化参数的关系进一步确定拉格朗日因子。HM中使用了两个拉格朗日因子:式(11-11)、式(11-12)、式(11-13)中的,式(11-14)中的
,具体为
其中,QP为量化参数,表示加权因子,该值由编码配置和编码图像在GOP中所处的位置决定。变量
的取值依赖于当前图像是否作为参考图像,计算方法如下:
其中,表示B参考图像个数。
以上为亮度分量的拉格朗日因子,而色差分量的拉格朗日因子计算方法为
其中,为色差分量的量化参数。
快速模式判决策略:
为了降低编码器的计算复杂度,HM采用多种快速优化方法。
- 提前终止策略(Early CU):若当前CU的最优编码模式是MODE_SKIP 模式,则终止该CU后续四叉树划分及模式判决。
- 早期跳出策略(Early SKIP):若CU的PU划分模式为PART_2Nx2N,预测模式为MODE_INTER(帧间预测),运动矢量差(MVD)为(0,0),且预测残差不包含非零的变换系数,则判定当前模式为该CU的最优编码模式,跳过其剩余候选模式,直接进行下一步的四叉树分割及子 CU 模式判决。
- 快速 CBF 策略(CBF Fast):若CU的预测模式为 MODE_INTER其对应的预测残差不包含非零的变换系数,则跳过该CU的其余候选模式判决,当前模式为该CU的最优编码模式,且直接进行下一步的四叉树分割。
- 缩减AMP模式:依据两个参数来判断是否缩减当前AMP模式。具体是利用在进行 AMP模式判决前的最优分割模式,以及父节点C内采用的分割模式和预测模式,来确定后续编码中可使用的AMP模式。
CTU编码参数优化流程:
下面将给出HM10.0中利用拉格朗日率失真优化方法确定一个CTU编码参数的过程,具体参数包括CU划分模式、CU的PU模式和TU 模式、PU的预测参数等。这一过程即为从众多候选模式集中得到一组最优模式,这也称CTU的模式判别。主要步骤如下。
- 分层递归遍历所有的CU划分模式进行编码,按式(11-11)选取率失真代价最小的划分模式确定为最优的CU划分式,这一过程称为CU 划分模式判别。
- 对其中的每个CU,遍历所有的PU 模式进行编码,按式(11-12)选取率失真代价最小的PU模式作为最优的PU模式,这一过程称为PU模式判别。并在此基础上,选择最优的TU模式。
- 对其中的每个PU,遍历所有的预测模式,帧内预测和帧间预测分别按式(11-13)或式(11-14)选取率失真代价最小的预测模式作为最优的预测模式,这一过程被称为预测模式判别。预测模式判别可以分为帧内预测模式判别和帧间预测模式判别。
帧内预测模式判别:
每个PU的候选帧内预测模式包括33种角度模式、DC模式和Planar模式。帧内预测模式判别的目的是为PU从候选模式中选取最优的预测模式。一个PU的亮度块的最优帧内预测模式判别过程如下。
- 遍历所有的预测模式得到采用每种预测模式时的残差信号,再对残差信号进行Hadamard变换(代替DCT或DST)计算SATD值;
- 按式(11-13)计算每种预测模式的率失真代价,其中D(Mode,)为SATD 值、R(Mode,)为该帧内预测模式所需的编码比特数,选取率失真代价最小的几种模式(与PU大小相关)为最可能预测模式集。
- 将已编码相邻块的预测模式补充到最可能预测模式集。
- 遍历最可能预测模式集中的所有预测模式,并对残差信号进行正常编码,根据式(11-13)计算率失真代价,其中D(
)为编码失真,R(
)为表示预测模式和残差变换系数的编码比特数。
- 选取率失真代价最小的预测模式作为该PU亮度块的最优帧内预测模式。
当PU亮度块的最优帧内预测模式确定后,将该预测模式以及DC模式、Planar 模式、水平方向模式、垂直模式作为色度块的候选模式,按步骤4、5确定色度块的最优帧内预测模式。
帧间预测模式判别:
帧间预测模式判别是指为PU选择最优的间预测参数,主要参数包括参考图像列表、参考图像索引、运动矢量和加权值等。由于 H.265/HEVC采用了Merge和AMVP技术,可以更高效地表示帧间预测参数,且这两种方式有较大区别。因此,帧间预测模式又可以分为Merge帧间预测模式和非Merge帧间预测模式(采用AMVP技术),分别选取最优 Merge 帧间预测模式和非 Merge 帧间预测模式,然后从这两种最优模式中选择率失真代价最小的模式作为最终的候选模式。
对于 Merge 帧间预测模式,遍历Merge 候选集中的候选模式,根据式(11-14)计算每种模式的率失真代价,其中D(Motion)为SATDR(Motion)为Merge索引的编码比特数。选择率失真代价最小的模式为最优 Merge帧间预测模式。当采用Merge 帧间预测模式编码,且预测残差信号的编码比特数为零时,只需要编码skip标识和Merge 索引两个语法元素,这时该模式称为MODE_SKIP模式。
对于非 Merge 帧间预测模式,需要搜索不同的运动参数组合,根据式(11-15)计算每种模式的率失真代价,选择率失真代价最小的模式为最优非 Merge 帧间预测模式。运动参数包括参考图像索引、MVP索引、运动矢量差值、加权值等,搜索过程为在每个参考图像中考虑AMVP技术获取最优运动预测块。HM10.0中的在一个参考图像中的运动预测过程如下。
- 根据AMVP技术确定MVP列表,计算每个候选 MVP的率失真代价,得到最优 MVP。
- 以最优 MVP为起始点,进行整像素运动预测,得到最优的整像素运动矢量。
- 以整像素的运动矢量为中心,进行半像素搜索,从周围的8个点中确定最优的半像素精度运动矢量。
- 以最优半像素精度运动矢量为中心,进行1/4像素精度的运动搜索,确定最优的1/4像素精度运动矢量。
PU模式判别:
PU模式判别就是遍历所有的PU模式进行编码,确定最优的P模式。HM10.0中的PU模式判别过程如图11.10所示,具体步如下。
CU划分模式判别:
CU划分模式判别就是遍历所有的CU分式,确定率失真代价最小的划分为最优 CU划分模式。具体步骤如下。
- 将CTU作为CU,计算其最小率失真代价(最优PU式时),此时应包含CU分割标识(spit_flag)的编码比特数。
- 对CU进行四叉树划分,计算每个子CU的最小率失真代价,并对该CU内所有子CU的最小率失真代价求和,得到该CU的率失真代价。
- 为每个子 CU 作为 CU 重复步骤2。
- 重复步骤3直到最大编码深度。
- 从最大编码深度,比较4个子CU与CU的率失真代价,依次确定出最优的划分方式。
对于每个CU,如果其帧间PART 2NX2N模式为MODESKIP,则满足Early_SKIP条件,直接结束该CU的进一步划分。
参考资料:
《新一代高效视频编码 H.265/HEVC 原理、标准与实现》——万帅 杨付正 编著
相关文章:
音视频之H.265/HEVC率失真优化
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
linux安装git
[rootMiWiFi-RC06-srv rpm-gpg]# yum install git 已加载插件:fastestmirror Repository base is listed more than once in the configuration Repository updates is listed more than once in the configuration Repository extras is listed more than once in …...
Node 服务监控及通过钉钉推送告警提醒
背景:需要监控某个服务是否在线,运行是否正常; 实现步骤: 1、需要在项目中内置一个可以监控的健康状态接口,详情可参考之前的文章:使用 PM2 启动node服务,并添加监控接口_node pm2-CSDN博客 2、再添加另外一个进程来监控这个接口是否正常在线,然后通过钉钉推送异常消…...
健康生活指南:从日常细节开启养生之旅
在数字化与快节奏交织的时代,健康危机常潜伏于日常的点滴疏忽中。想要保持良好的身体状态,不妨从这些容易被忽视的生活细节入手,开启科学养生之路。 长期伏案工作和沉迷电子设备,让颈椎与腰椎承受巨大压力。调整办公环境&#…...
Node-Red通过Profinet转ModbusTCP采集西门子PLC数据配置案例
一、内容简介 本篇内容主要介绍Node-Red通过node-red-contrib-modbus插件与ModbusTCP设备进行通讯,这里Profinet转ModbusTCP网关作为从站设备,Node-Red作为主站分别从0地址开始读取10个线圈状态和10个保持寄存器,分别用Modbus-Read、Modbus-…...
# YOLOv4:目标检测的全新突破
YOLOv4:目标检测的全新突破 在目标检测领域,YOLO(You Only Look Once)系列算法一直以其高效的检测速度和出色的性能受到广泛关注。从最初的 YOLOv1 到如今的 YOLOv4,这一系列算法不断进化,为实时目标检测和…...
计算机视觉设计开发工程师学习路线
以下是一条系统化的计算机视觉(CV)学习路线,从基础到进阶,涵盖理论、工具和实践,适合逐步深入,有需要者记得点赞收藏哦: 相关学习:python深度学习,python代码定制 python…...
CLIP:论文阅读 -- 视觉模型
更多内容:XiaoJ的知识星球 目录 1.CLIP概述2.CLIP的方法2.1. 自然语言监督2.2. 创建足够大的数据集2.3. 选择有效的预训练方法2.4. 选择和缩放模型1)CLIP模型选择:2)模型缩放 2.5 训练 3.CLIP 核心伪代码3.1. CLIP伪代码3.2. CLIP…...
26、DAPO论文笔记(解耦剪辑与动态采样策略优化,GRPO的改进)
DAPO论文笔记 1、项目背景与目标2、DAPO算法与关键技术3、过长响应奖励塑形(Overlong Reward Shaping)**一、问题背景:截断惩罚的缺陷****二、解决方案:分层惩罚与软截断策略**1. **过长过滤:屏蔽无效惩罚**2. **软过长…...
【框架安装】win10 配置安装GPU加速的tensorflow和keras教程
本机配置 win10 4090,需要安装最后支持windows GPU加速的最后版本tensorflow2.10 重点安装命令 pip install tensorflow-gpu2.10.0 protobuf3.19.6 numpy1.23.5 pip install keras2.10.0 pip install keras-cv0.3.5 pip install tensorflow-addons0.17.1conda li…...
整合安全能力:观测云进一步强化数据价值
在 2025 年 5 月 13 日的观测云年度发布会上,观测云发布了 GuanceDB 3.0 全新数据引擎。这次更新标志着观测云进一步整合了云端安全能力,帮助用户进一步挖掘数据的价值。 全新底座:GuanceDB 3.0,数据驱动的安全基石 GuanceDB 3.…...
质检LIMS系统检测数据可视化大屏 全流程提效 + 合规安全双保障方案
在质检实验室的数字化转型浪潮中,「数据看得见、问题找得准、决策下得快」成为衡量管理水平的核心标准。然而传统模式下,检测数据分散在设备日志、纸质记录和 Excel 表格中,管理者如同在迷雾中摸索,决策失误率高达 30% 以上。 一、…...
企业销售管理痛点解析与数字化解决方案
在数字化转型浪潮中,传统销售模式正面临多重挑战: ▫️ 数据决策滞后:缺乏实时市场洞察,热销趋势依赖经验预判,战略响应慢半拍 ▫️ 客户管理碎片化:信息散存于纸质记录 / 聊天窗口,跟进细节遗漏…...
关于海光22DC4_2主板获取usb3.0端口信息重复问题的解决方案
需求 使用qt程序实现以下功能:检查主机所有usb端口是否可用,检查方法为:使用同一个3.0u盘,依次插入usb所有的端口,读取以下代码中所写的端口信息 #include <libusb-1.0/libusb.h>//只保留键鼠和u盘的设备 if (…...
GStreamer (三)常⽤插件
常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…...
Jenkins 使用技巧
1. 通过配置文件更改Jenkins默认端口(8080)? 这里以macos 为例来说明 Jenkins在macOS上通常通过Homebrew或类似的包管理器运行,这与Linux或Windows相比,使用了不同的配置文件布局。默认Jenkins端口8080在启动配置中是…...
Pichome 任意文件读取漏洞复现(CVE-2025-1743)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...
Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】
前言: 在前面的 Elasticsearch 系列文章中,分享了 Elasticsearch 的各种查询,分页查询也分享过,本篇将再次对 Elasticsearch 分页查询进行专题分析,“深度分页” 这个名词对于我们来说是一个非常常见的业务场景&#…...
避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践
1. 为什么需要动态IP? 在日常网络操作中,你是否遇到过: 爬虫被封:频繁请求目标网站,IP被限制访问。跨境业务受限:某些平台对特定地区的账号有限制。数据采集失败&#x…...
公网ip是固定的吗?动态ip如何做端口映射?内网ip怎么让外网远程访问?
网络IP地址有内网与公网区分,公网IP同时有固定IP和动态IP之分。很多企业所用的办公网络都是公网ip,下载文件的速度更快,而且平台存储的问题可以让他人看得到,体验度比较好。对于无公网IP环境想要申请公网ip的用户来说,…...
MyBatis入门指南
查询user表中所有数据 创建user表,添加数据导入依赖,创建模块编写MyBatis核心配置文件编写SQL映射文件编写代码 定义P0J0类加载核心配置文件,获取SqlSessionFactory对象获取SqlSession对象,执行SQL语句释放资源 一、创建user表…...
GitHub排名第一的开源ERP项目:Odoo生产计划与执行的功能概述
Odoo生产计划与执行隶属于Odoo MRP与MES的运营管理解决方案。Odoo中生产计划有多种形式,从销售预测到销售运作计划(SOP)开始,到随后的主生产计划、物料需求计划(MRP)、分销需求计划(DRP)、长期生产计划,以及粗能力计划(RCCP)和详细能力计划。…...
使用 OpenCV 实现 ArUco 码识别与坐标轴绘制
🎯 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制(含Python源码) Aruco 是一种广泛用于机器人、增强现实(AR)和相机标定的方形标记系统。本文将带你一步一步使用 Python OpenCV 实现图像中多个 ArUco 码的检测与坐标轴…...
RAC共享存储扩容
存储工程师扩完共享存储后,DBA做如下操作: 1.主机端识别磁盘 在两个节点扫描磁盘命令 # for i in find /sys/class/scsi_host/host*; do echo - - - > $i/scan; done lsblk 2.比对确定新加的盘的uuid,确保uuid是一致的,别…...
高德地图 MCP,可用 Java SolonMCP 接入(支持 java8, java11, java17, java21)
1、MCP技术概述 1.1 什么是 MCP MCP (Model Control Protocol) 是一种允许大模型与外部工具交互的协议,高德地图基于此协议提供了地图服务能力,使 AI 大模型能够直接调用高德的 LBS。 1.2 两种接入架构对比 高德地图 MCP 提供了两种不同的接入方式&a…...
rosbag使用记录
1. 查看某个话题频率 rqt—topic 2. 查看对齐 rqt_bag...
7. 数据库技术
在数据库技术实战中,我们通过MySQL数据库的安装与操作,掌握了从创建数据库、数据表到插入、查询、更新和删除记录的全过程。借助Navicat工具,我们能够更直观地进行数据库管理与开发,提升效率。同时,通过JDBC技术&#…...
Python中的整型(int)和浮点数(float)
在很多初学者眼中,int和float不过是Python中代表整数和小数的基本类型,似乎只是编程语言中最“平凡”的组成部分。但在真正深入软件开发、测试乃至AI数值计算的世界后,你会发现,这两个基础类型背后隐藏着诸多重要的设计哲学、性能…...
Python元组全面解析:从入门到精通
文章目录 Python元组全面解析:从入门到精通一、元组的基本概念1. 什么是元组?2. 元组与列表的对比3. 为什么需要元组? 二、元组的创建方式1. 基本创建方法2. 其他创建方式 三、元组的访问与操作1. 访问元素2. 切片操作3. 元组解包 四、元组的…...
1 asyncio模块
1.1核心概念 1.1.1协程 协程是一种特殊的函数,可以在执行过程中暂停,也可以稍后恢复执行。协程通过async关键字来指定。 await关键字:如果想要立即执行,那调用协程的时候,前面加上await关键字。只想创建协程对象稍后…...
交通拥堵预测器(python)
这是一个基于机器学习的交通拥堵预测应用,使用随机森林算法。 功能特点: - 使用随机森林算法进行交通拥堵预测 - 直观的图形用户界面 - 支持模型训练、评估和保存/加载 - 实时预测特定时间段的拥堵程度 - 数据可视化功能(按星期分布、按时间段分布、热力图) - 支持自…...
解决服务器重装之后vscode Remote-SSH无法连接的问题
在你的windows命令窗口输入: ssh-keygen -R 服务器IPssh-keygen 不是内部或外部命令 .找到Git(安装目录)/usr/bin目录下的ssh-keygen.exe(如果找不到,可以在计算机全局搜索) 2.属性–>高级系统设置–>环境变量–>系统变量,找到Path变量&#…...
STM32实战指南:DHT11温湿度传感器驱动开发与避坑指南
知识点1【DHT11的概述】 1、概述 DHT是一款温湿度一体化的数字传感器(无需AD转换)。 2、驱动方式 通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信,仅需要一个IO口。 相对于单片机…...
使用 Terraform 创建 Azure Databricks
使用 Terraform 创建 Azure Databricks Terraform 是一种基础设施即代码(IaC)工具,允许用户通过声明式配置文件来管理和部署云资源。Azure Databricks 是一个基于 Apache Spark 的分析平台,专为数据工程和数据科学设计。通过 Terraform,可以自动化 Azure Databricks 的创…...
对话即编程:如何用 Trae 的 @智能体 5 分钟修复一个复杂 Bug?
引子:当新手遇到 "天书" 般的报错 作为刚加入团队的开发者,我在接手一个遗留的 Python 数据处理项目时,遇到了一个诡异报错: python 复制 下载 ValueError: shape mismatch: value array of shape (500,) could no…...
【工具使用】STM32CubeMX-片内Flash读写操作
一、概述 无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。 本文主要讲述STM32芯片片内Flash功能的应用及其相关知识…...
Java转Go日记(三十九):Gorm查询
1.1.1. 查询 // 获取第一条记录,按主键排序db.First(&user)SELECT * FROM users ORDER BY id LIMIT 1;// 获取最后一条记录,按主键排序db.Last(&user)SELECT * FROM users ORDER BY id DESC LIMIT 1;// 获取所有记录db.Find(&users)SELECT *…...
终端安全与终端管理:有什么区别及其重要性?
在当今快速发展的远程和混合工作环境中,IT 团队面临双重挑战:一方面需保护终端免受日益增长的网络风险,另一方面要管理跨越日益分散网络的设备。这些需求催生了两个关键的 IT 解决方案:终端安全和终端管理。尽管二者时常被共同讨论…...
【二分 优先队列】P3611 [USACO17JAN] Cow Dance Show S|普及+
本文涉及的基础知识点 C二分查找 C堆(优先队列) [USACO17JAN] Cow Dance Show S 题面翻译 题目描述 经过几个月的排练,奶牛们基本准备好展出她们的年度舞蹈表演。今年她们要表演的是著名的奶牛芭蕾——“cowpelia”。 表演唯一有待决定的是舞台的尺寸。一个大…...
蓝桥杯分享经验
系列文章目录 提示:小白先看系列 第一章 蓝桥杯的钱白给吗 文章目录 系列文章目录前言一、自我介绍二、经验讲解:1.基础知识2.进阶知识3.个人观点 三、总结四、后续 前言 第十六届蓝桥杯已经省赛已经结束了,相信很多小伙伴也已经得到自己的成绩了。接下…...
TDengine 安全部署配置建议
背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明,并提供部署和配置建议,为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…...
Grafana当前状态:SingleStat面板
Grafana的SingleStat面板是一种用于展示单个关键指标(KPI)的可视化组件,特别适合需要突出显示核心业务指标的场景(如实时销售额、在线用户数、系统错误率等)。它通过简洁的布局和丰富的样式选项,帮助用户快速聚焦核心数据。Singlem Panel侧重于展示系统的…...
专题五:floodfill算法(太平洋大西洋水流问题)
以leetcode417题为例 题目解析: 整张图,左边深蓝的是太平洋,右边浅蓝的是大西洋,你需要在矩阵中找到一个点,使其可以流向太平洋又可以流向大西洋,并且你每次流的时候只能由高到低,或者相等到相…...
【HTML】【面试提问】HTML面试提问总结
第一章 HTML基础相关提问 1.1 HTML基本概念 1.1.1 什么是HTML HTML 即超文本标记语言(HyperText Markup Language)😎,它是用于创建网页的标准标记语言。简单来说,HTML 就像是搭建房屋的砖块🧱࿰…...
解锁MySQL性能调优:高级SQL技巧实战指南
高级SQL技巧:解锁MySQL性能调优的终极指南 开篇 当前,随着业务系统的复杂化和数据量的爆炸式增长,数据库性能调优成为了技术人员面临的核心挑战之一。尤其是在高并发、大数据量的场景下,SQL 查询的性能直接影响到整个系统的响应…...
数据分析与应用---数据可视化基础
目录 Matplotlib基础绘图 (一)、pyplot绘图基础语法与常用参数 1、pyplot基础语法 (1) 创建画布与创建子图 (2) 添加画布内容 (3) 保存与显示图形 案例代码 2. 设置pyplot的动态…...
android双屏之副屏待机显示图片
摘要:android原生有双屏的机制,但需要芯片厂商适配框架后在底层实现。本文在基于芯发8766已实现底层适配的基础上,仅针对上层Launcher部分对系统进行改造,从而实现在开机后副屏显示一张待机图片。 副屏布局 由于仅显示一张图片&…...
oracle序列自增问题
1.先查询表名对应的序列名称 SELECT trigger_name, trigger_type, triggering_event FROM all_triggers WHERE table_name 表名;2. 查询id最大值 SELECT MAX(ID) FROM 表名;3. 查询下一次生成ID SELECT SJCJ_ENERGY_DATA_INSERTID.NEXTVAL FROM DUAL;4. 设置临时步长,越过…...
FLASHDB API分析
fdb_kvdb_init 函数详解 fdb_kvdb_init 是 FlashDB 框架中用于 初始化键值数据库(KVDB) 的核心接口,其功能涵盖底层存储配置、默认数据加载与多模式适配。以下从功能、参数、使用场景及注意事项展开分析: 一、功能与作用 …...
使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
🚀 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务 本文基于 ABP vNext MinIO 的对象存储集成实践,系统讲解从 MinIO 部署、桶创建、ABP 集成、上传 API、安全校验、预签名访问,到测试、扩展及多租户支持的全过程。目标是构建一套可复…...