【论文#快速算法】Fast Intermode Decision in H.264/AVC Video Coding
目录
- 摘要
- 1.前言
- 2.帧间模式决策概览
- 2.1 H.264/AVC中的帧间模式决策
- 2.2 发现和动机
- 3.同质性和平稳性的确定
- 3.1 同质性区域的确定
- 3.2 稳定性区域的决定
- 3.3 整体算法
- 4.实验结果
- 4.1 IPPP序列的测试
- 4.2 IBBP序列测试
- 5.结论
《Fast Intermode Decision in H.264/AVC Video Coding》
Author: D. Wu; F. Pan; K.P. Lim; S. Wu; Z.G. Li; X. Lin
Published in: IEEE Transactions on Circuits and Systems for Video Technology ( Volume: 15, Issue: 7, July 2005)
Page(s): 953 - 958
Date of Publication: 27 June 2005
ISSN Information:
Print ISSN: 1051-8215
Electronic ISSN: 1558-2205
DOI: 10.1109/TCSVT.2005.848304
Publisher: IEEE
摘要
新的视频编码标准H.264/MPEG-4 AVC在帧间编码中使用了从4x4到16x16的可变块大小。这一新特性相比使用固定块大小对宏块(MB)进行编码,实现了显著的编码增益。然而,当使用暴力率失真优化(RDO)算法时,这一特性会导致极高的计算复杂度。本文提出了一种快速帧间模式决策算法,用于决定帧间编码的最佳模式。该算法利用了视频对象的空间同质性和时间平稳性特征。具体而言,宏块的空间同质性是基于宏块的边缘强度来决定的,而时间平稳性则是通过当前宏块与其在参考帧中对应位置的宏块之间的差异来决定的。基于视频对象的同质性和平稳性,RDO过程中仅选择少量的帧间模式。实验结果表明,快速帧间模式决策算法能够平均减少30%的编码时间,且峰值信噪比损失仅为0.03 dB,相当于比特率增加0.6%。
1.前言
最近,由ISO/IEC MPEG和ITU-T VCEG联合视频团队(JVT)共同努力完成的新自然视频图像编码标准H.264(也称为MPEG-4第10部分,高级视频编码(AVC))已经定稿[1]。与之前的视频编码标准相比,H.264/AVC在相同比特率下的峰值信噪比(PSNR)和视觉质量方面表现出显著更好的性能[2]。这是由于该标准采用了多种新技术,例如内编码块的方向预测、可变块大小的运动估计、多参考帧运动估计、整数变换(离散余弦变换(DCT)的近似)、环路去块滤波器和基于上下文的自适应二进制算术编码(CABAC)。为了实现最高的编码效率,H.264/AVC使用率失真优化(RDO)技术来获得最佳的编码结果,即最大化编码质量和最小化生成的数据位。RDO的基本过程可以简要概括如下:编码器使用所有可能的模式对宏块(MB)进行编码,例如不同块大小的内预测、不同块大小的运动估计、多个参考帧。最终编码中将使用产生最低率失真(RD)成本的编码模式。然而,由于RD成本是在一系列操作之后才能获得的,例如运动估计/运动补偿(在帧间编码的情况下)、整数变换、量化、反量化、逆整数变换和熵编码,这导致编码器的计算复杂度极高。因此,为了实现实时应用,减少H.264/AVC计算复杂度而不牺牲编码效率的算法是必不可少的。
近期,针对H.264/AVC视频编码提出了多种快速运动估计算法[3]–[5]。这些算法在几乎不损失编码效率的情况下实现了显著的时间节省。在[5]中,提出了一种模式决策方法,作为运动估计前的预处理部分。该方法基于不同模式的RD成本之间的预测关系来选择模式。然而,一个宏块中不同模式的RD成本不易预测,它们之间的关系也不确定。Pan等人也尝试使用局部边缘信息来指导内预测过程[6]。通过使用从边缘图中提取的边缘方向直方图,仅使用少数几个内预测模式进行RDO计算,从而大大提高了内编码的速度。最近的一项JVT提案[7],源自[8],提供了一种结合快速内模式决策和快速帧间模式决策的方法。该方法根据某些标准,如果选定的帧间模式足够好,将跳过内模式决策。
在H.264/AVC中,帧间运动估计针对不同的块大小进行,如16x16、16x8、8x16、8x8、8x4、4x8和4x4。对于每个宏块(MB),所有这些大小都会尝试,选择导致最低RD成本的大小。这种“尝试所有并选择最佳”的理念在决定最终编码的块大小时是最优的。然而,这种最优决策是以高计算复杂度为代价的。然而,在使用H.264/AVC编解码器对各种视频序列进行实验时,我们观察到自然视频序列中普遍存在同质区域。此外,许多自然视频序列包含静止区域。这两种类型的区域,即空间同质和/或时间静止,大多使用较大的块大小(如16x16或“跳过”模式)进行编码。因此,如果我们能够在编码前确定一个宏块是同质的和/或时间静止的,我们可以安全地跳过所有其他模式,并使用较大的块大小(如16x16或8x8)对该宏块进行编码。为此,我们使用边缘信息来确定16x16或8x8块的同质性,并使用当前宏块与其在参考帧中对应位置的宏块之间的差异来决定16x16块的时间静止性。所提出的这种方法能够在几乎不损失编码效率的情况下减少高达45%的总编码时间。本文的其余部分组织如下:第二节概述了H.264/AVC中的帧间编码。第三节详细介绍了快速帧间模式决策算法。第四节展示了实验结果,第五节给出了结论。
2.帧间模式决策概览
2.1 H.264/AVC中的帧间模式决策
如H.264/AVC所规定,共有7种不同的块大小(16x16、16x8、8x16、8x8、8x4、4x8和4x4)可用于帧间运动估计/补偿。这些不同的块大小实际上在宏块(MB)内部形成了两级层次结构。第一级包括16x16、16x8或8x16的块大小。在第二级,宏块被指定为P8x8类型,其中每个8x8块可以是8x8、8x4、4x8或4x4等子类型之一。这些不同块大小之间的关系如图1所示。

目前,在H.264/AVC的帧间模式RDO实现中,使用所有可能的块大小进行运动估计,以找到RD成本最低的块大小,这一过程使用拉格朗日乘子法。该过程可以定义如下:

其中,s和c分别表示源视频信号和重建视频信号,QP是量化参数, λ M O D E λ_{MODE} λMODE是拉格朗日乘子,SSD是s和c之间的平方差之和 ,MODE表示一个宏块模式,可以是16x16、16x8、8x16或P8x8中的任意一种。R(s,c,MODE|QP)是与所选MODE和QP相关的比特数。在P片中还有一个SKIP模式,指的是16x16模式,其中不编码运动和残差信息。SSD的计算公式为:

其中 s Y [ x , y ] s_Y[x,y] sY[x,y]和 c Y [ x , y , m o d e ∣ Q P ] c_Y[x,y,mode|QP] cY[x,y,mode∣QP]表示的是原始和重建的亮度分量,cu,cv和su,sv表示的是对应的色度分量。拉格朗日乘子 λ M O D E λ_{MODE} λMODE计算方式为

8x8子类型的模式决策类似于宏块模式决策,通过最小化公式(1)中的拉格朗日函数来完成,其中MODE表示从潜在的预测模式集合中选择的模式,如8x8、8x4、4x8和4x4。
请注意,帧间模式决策是一个极其耗时的过程。对于搜索窗口中的每个位置,都需要进行运动估计,以找到使以下表达式最小化的运动矢量:

其中 m = ( m x , m y ) T m=(m_x,m_y)^T m=(mx,my)T是运动向量, p = ( p x , p y ) T p=(p_x,p_y)^T p=(px,py)T是预测的运动向量,SA(T)D表示绝对误差和(SAD)或者经过Hadamard变换之后系数的绝对误差和。速率项 R ( m − p ) R(m-p) R(m−p)仅表示运动信息,并通过查表计算。因此,只有属于最佳大小块的运动矢量实际被使用,其余的运动矢量在最后被丢弃。因此,通过 exhaustive(穷尽)地尝试所有块大小显然浪费了计算资源。
2.2 发现和动机
在H.264/AVC帧间编码中采用七种不同块大小的原因之一是为了更准确地表示场景运动,从而减少使用固定块大小预测时的误差。一般来说,具有相似运动的较大区域更可能使用较大的块大小进行编码,而包含移动物体边界的区域更可能使用较小的块大小进行编码。在自然视频序列中观察到,存在大量属于同一视频对象的同质区域,当视频对象移动时,这些对象的各个部分通常以相似的方式移动。图片中的同质块具有相似的运动,很少会被分割成更小的块。
图2分别展示了QCIF序列“News”和CIF序列“Paris”的两个示例帧。覆盖在图像上的不同大小的白框表示由H.264/AVC中的RDO确定的不同块模式。统计数据显示,在图2(a)中,16x16、16x8、8x16和P8x8块的百分比分别为82.95%、1.14%、3.41%和12.50%。而在图2(b)中,这些比例分别为71.87%、4.26%、3.98%和19.89%。从图2(a)中可以看出,同质区域如背景和男子的黑色西装使用16x16块大小进行编码。尽管女士西装的边界区域具有强烈的边缘且不均匀,但由于在某些时间段内物体保持静止,因此该区域也因时间平稳性而使用16x16块大小进行编码。另一方面,图像上部的舞者相对较小且包含较多运动,因此使用较小的块大小进行编码。同样,在图2(b)中,同质区域如西装、桌子、男女的头发使用较大的16x16块进行编码,而运动区域或运动边界如手、人头和肩膀的边缘则使用较小的块大小进行编码。尽管背景中的书架包含大量的边缘信息,但由于时间平稳性,它们仍然使用较大的块大小进行编码。

对JVT测试模型临时小组[9]使用的测试视频序列进行的广泛实验表明,典型视频帧中平均有35%的同质区域,这些区域适合使用较大尺寸的帧间模式编码,可以避免小尺寸模式的RD成本计算。因此,如果能够预先确定宏块(MB)的同质性,就可以在运动估计和RDO计算中实现显著的时间节省。在实际实现中,空间同质性和时间平稳性区域是选择最佳帧间模式的良好指示,从而可以跳过不必要的模式试验,减少编码器的计算复杂度。
3.同质性和平稳性的确定
3.1 同质性区域的确定
如果一个区域内的纹理具有相似的空间属性,则该区域被认为是同质的。有许多技术可以用于检测图像中的同质区域[10]、[11]。简单的统计测量方法,如标准差、方差、偏度和峰度,是确定同质性的好方法[10]。在[11]中,纹理使用高斯马尔可夫随机场进行建模。通过基于假设和检验的方法在不同窗口大小的纹理上分别标记不同的纹理。这种方法非常有效,但计算成本较高,因此不适合在快速算法中实现。另一种确定同质区域的方法是使用边缘信息,因为视频对象边界通常表现出强烈的边缘。边缘检测已经在快速内模式决策算法中进行了[6],因此我们可以利用这些现有的信息,避免额外的计算。
在[6]中,使用Sobel算子为每一帧创建了一个边缘图。对于亮度图像中的一个像素 p i , j p_{i,j} pi,j,定义对应的边缘向量为 D ⃗ i , j = { d x i , j , d y i , j } \vec{D}_{i,j}=\{dx_{i,j}, dy_{i,j}\} Di,j={dxi,j,dyi,j}为

其中, d x i , j dx_{i,j} dxi,j和 d y i , j dy_{i,j} dyi,j分别表示在垂直和水平方向上的差异程度。边缘向量的幅度通过以下公式计算:

一个大小为N×N 的块的同质性(其中N为16或8)通过使用块中边缘向量的幅度来确定,具体使用公式(6)。如果块中所有像素位置的边缘向量幅度之和小于某个阈值 T h d H Thd_H ThdH,则该块被分类为同质块。否则,该块为非同质块。块的同质性阈值 T h d H Thd_H ThdH是一个预设参数。设 r和c分别为块 B r , c B_{r,c} Br,c的行索引和列索引,块的同质性度量 H r , c H_{r,c} Hr,c定义如下:

其中, H r , c = 1 H_{r,c}=1 Hr,c=1表示NxN块 B r , c B_{r,c} Br,c是同质块,如果 H r , c = 0 H_{r,c}=0 Hr,c=0,则认为是非同质块。在对各种视频序列进行的详尽实验中,我们观察到,当16x16块的同质性阈值设置为20,000,8x8块的同质性阈值设置为5,000时,性能最佳。必须强调的是,边缘幅度的计算已经在快速内模式决策之前完成,唯一需要的额外任务是根据公式(7)进行 H r , c H_{r,c} Hr,c的决策。
3.2 稳定性区域的决定
虽然同质性指的是单个视频帧内的纹理相似性,平稳性则指连续帧在时间维度上的“静止”状态。如第二节B部分所述,在自然视频序列中,许多图像区域,尤其是在背景区域,即使不是完全静止,也表现出相似的运动,因此被认为是时间上的平稳区域。这些平稳区域通常在RDO计算后使用16x16模式进行编码。因此,我们可以使用绝对差之和来检查这个宏块是否发生变化。差异定义如下:

其中, M [ i , j ] M[i,j] M[i,j]和 N [ i , j ] N[i,j] N[i,j]分别表示前一个宏块和当前宏块中的像素强度。如果两个宏块之间的变化小于某个阈值 T s T_{s} Ts,则该宏块被分类为时间平稳的,并使用16x16模式进行运动估计,从而可以跳过所有其他模式。基于对所有测试序列的实验结果,我们发现将阈值 T s T_{s} Ts设置为200可以为所有测试序列取得良好且一致的结果。
3.3 整体算法
如前所述,当一个宏块被确定为同质块时,选择16x16块大小。此外,16x8或8x16块大小也包括在RDO计算中。包含16x8或8x16块大小的RDO计算的原因是,当宏块位于物体边界附近,且其一小部分在前一帧中被覆盖时,这种情况需要特别考虑。如果发生这种情况,编码器无法从前一帧中找到16x16同质块的良好预测。然而,需要注意的是,这种情况较为罕见,因为大多数同质区域不会分裂成更小的块大小。选择16x8或8x16块大小的决策利用了快速内模式决策[6]的结果。如果选择的帧内模式使用垂直预测,我们将使用8x16块。如果选择的模式是水平预测,我们将使用16x8块。否则,仅使用16x16块。同样,当检测到8x8块为同质区域时,选择的块大小就是8x8,从而跳过8x4、4x8和4x4块大小的RDO计算。
当视频序列中的对象是静止的时,有很大可能性会使用16x16块进行编码。因此,如果预测的运动矢量为零且宏块差异很小,仅使用16x16块大小进行RDO计算,而跳过所有其他块大小。整个算法如下所示。需要注意的是,步骤1和步骤2已经在快速内模式决策算法[6]中实现,因此在将这两个算法结合时不会重复执行这些步骤。
(步骤1)执行边缘检测。
(步骤2)生成边缘方向直方图。
(步骤3)预测当前宏块是否有零向量;如果没有零向量,转到步骤6。
(步骤4)否则,计算宏块差异;如果差异之和大于阈值,转到步骤6。
(步骤5)如果差异之和小于或等于阈值;对16x16块进行RDO计算。转到步骤13。
(步骤6)确定宏块是否同质;
(步骤7)如果宏块同质;对16x16块进行RDO计算,并选择性地对16x8或8x16块进行RDO计算。在这些模式中选择最佳模式。转到步骤13。
(步骤8)如果宏块非同质;对16x16、16x8和8x16块进行RDO计算,保存这三种模式中的最佳模式。
(步骤9)对于宏块中的每个8x8块,如果8x8块同质,对8x8块进行RDO计算,并选择最佳类型为8x8。
(步骤10)否则,对8x8、8x4、4x8和4x4块进行RDO计算,并选择最佳块子类型。
(步骤11)重复步骤9和10,直到确定所有最佳的8x8块子类型。
(步骤12)确定P8x8类型和步骤8中的最佳类型之间的最佳模式:
(步骤13)在帧内模式、帧间模式和‘Skip’模式中选择最终的最佳模式,转到步骤3,继续处理下一个宏块。
Comments:
上述算法流程换成伪代码的方式描述一下:
// 1.计算纹理方向
calculate_sobel_direction();
// 2.生成纹理直方图
generate_sobel_histogram();
// 3.进入分支判断
MVs = x264_mb_predict_mv_16x16(); // 根据相邻块的MV预测当前块的MV
if (has_zero_mv(MVs)) // 检查预测出来的MV中是否具有零向量
{MB_diff = ABS(col_mb - cur_mb); // 根据同位块col_mb和当前块cur_mb来计算数值差异// 如果MB差异小于阈值,说明当前块具有比较强的稳定性,只需要进行16x16块的RDO计算,无需继续划分if (MB_diff < Ts) {RDO_candidates = { RDO_16x16 };}
}
else // 检测出来的MV中没有零向量,说明时域上存在一定的运动量,此时检查空域上的同质性
{H_rc = check_homogeneity(); // 检查是否具有同质性if (H_rc) // 如果宏块具有同质性{RDO_candidates = { RDO_16x16 }; // 添加16x16尺寸的RDOhist_direction = get_best_historgram(); // 检查直方图中最大倾向的方向if (hist_direction == DIRECTION_VERTICAL) // 如果最大倾向的方向是垂直{RDO_candidates = { RDO_16x16, RDO_8x16 }; // 添加8x16尺寸}if (hist_direction == DIRECTION_HORIZONTAL) // 如果最大倾向的方向是水平{RDO_candidates = { RDO_16x16, RDO_16x8 }; // 添加16x8尺寸}}else // 如果宏块没有同质性 {RDO_candidates = { RDO_16x16, RDO_8x16, RDO_16x8 }; // 3种划分方式都会尝试// 遍历每个8x8块for (;;){H_rc_8x8 = check_homogeneity_8x8(); // 检查8x8块是否具有同质性,这里是针对8x8块的检查if (H_rc_8x8) // 如果8x8具有同质性{// 添加8x8尺寸RDO_candidates = { RDO_16x16, RDO_8x16, RDO_16x8, RDO_8x8 };}else{ // 8x8块不具有同质性,则会对小于8x8的尺寸进行RDORDO_candidates = { RDO_16x16, RDO_8x16, RDO_16x8, RDO_8x8, RDO_8x4, RDO_4x8, RDO_4x4 };}} }
}
check_best_mode(); // 从inter、intra和skip这三个模式中选择最佳的模式
4.实验结果
快速帧间模式决策算法已集成至JM5.0c编码器中,该编码器同时采用了快速运动估计(ME)算法和快速内模式决策算法。所使用的快速运动估计算法源自JVT-F017 [4],而快速内模式决策算法则来自JVT-G013 [6]。我们比较了我们提出的快速运动估计、快速内模式和快速帧间模式技术与原有的快速运动估计和快速内模式技术。根据规范[12],测试条件如下:
a) 对于QCIF和CIF格式,MV搜索范围为像素级。
b) 使用Hadamard变换。
c) 启用RD优化。
d) 参考帧数量设置为5。
e) 启用CABAC。
f) MV分辨率设为像素级。
g) GOP结构为IPPP或IBBP。
h) 序列中的帧数为150帧。
一组实验在测试序列上进行,使用了4个量化参数,即QP=28,32,36,40,如[12]中所规定的。需要注意的是,测试序列具有代表性,涵盖了从低运动活动的序列(如“News”)到高运动活动的序列(如“Mobile”和“Stefan”)。在实验中,16x16块的同质性阈值 T H T_H TH设置为20,000,8x8块的同质性阈值 T H T_H TH设置为5,000,时间平稳性阈值 T s T_s Ts设置为200。关于平均PSNR差异和平均比特率差异的计算遵循[13]中的规范。结果汇总在表I和表II中,分别对应IPPP和IBBP切片类型。表III至表VI提供了更详细的信息,展示了我们在不同QP条件下序列的表现。在表格中,“Time(%)”、“Psnr(dB)”和“Bits(%)”分别表示时间变化的百分比、PSNR变化和比特率变化的百分比。正值表示增加,负值表示减少。
4.1 IPPP序列的测试
从表I的实验结果中可以看出,所提出的方法平均减少了30%的编码时间。对于所有视频序列,编码速度都有所提升,其中“Mobile”序列的最小增益为9.97%,而“Silent”序列的最大增益为45.16%。最大的PSNR损失为0.065 dB,相当于比特率增加了1.28%,因此可以忽略不计。对于“Silent”和“News”序列,编码速度的提升较高,因为这两个序列都表现出强烈的空域同质性和时间平稳性。另一方面,“Mobile”序列包含许多小的移动物体,例如日历上的字母。因此,帧内同质区域和帧间平稳区域较少,因此该序列的时间节省不如其他序列显著。图3和图4分别显示了“News”(IPPP)和“Mobile”(IPPP)的RD曲线。从这两幅图中可以看出,与原方法相比,所提出的方法没有引入任何明显的PSNR损失。表III和表IV显示了一般趋势,即随着QP的减小,时间节省增加。这是可以理解的,因为在较小的QP下,编码质量较高,保留了许多细节,因此使用了较小的块大小模式。由于篇幅有限,没有列出所有测试序列的结果,但这一趋势适用于所有测试的序列。



4.2 IBBP序列测试
在表II中,实验结果显示快速帧间模式决策算法在IBBP切片类型上的表现与IPPP切片类型相似。平均而言,编码时间减少了30%。所有视频序列都实现了持续的时间节省,其中“Mobile”序列的最小时间节省为9.21%,而“Silent”序列的最大时间节省为45.92%。最大的PSNR损失为0.055 dB,相当于比特率增加了1.21%。考虑到所实现的时间节省,这种损失可以忽略不计。IBBP和IPPP序列的时间节省相似是预期的,因为同质性指的是帧内的区域,不受参考帧的影响,而平稳性指的是相对于附近参考帧变化不大的区域。类似地,图5和图6分别显示了“News”(IBBP)和“Mobile”(IBBP)的RD曲线。表V和表VI显示,对于IBBP切片类型,随着QP的减小,时间节省增加的一般趋势仍然成立。




5.结论
本文提出了一种利用视频对象纹理的同质性和视频序列的时间平稳性特征的快速帧间模式决策算法。块的同质性决策依赖于边缘信息,而宏块差异用于判断宏块是否时间平稳。该快速帧间模式决策算法能够平均减少30%的编码时间,同时PSNR损失仅为0.03 dB,比特率增加0.6%,这些影响可以忽略不计。
相关文章:
【论文#快速算法】Fast Intermode Decision in H.264/AVC Video Coding
目录 摘要1.前言2.帧间模式决策概览2.1 H.264/AVC中的帧间模式决策2.2 发现和动机 3.同质性和平稳性的确定3.1 同质性区域的确定3.2 稳定性区域的决定3.3 整体算法 4.实验结果4.1 IPPP序列的测试4.2 IBBP序列测试 5.结论 《Fast Intermode Decision in H.264/AVC Video Coding》…...
Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)
文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介 本文将介绍Git几个核心概念…...
【人工智能在医疗企业个人中的应用】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
IPv4头部和IPv6头部
IPv4和IPv6是互联网协议(IP)中的两个主要版本,它们在数据包头部(Header)结构上存在显著差异。以下是IPv4头部和IPv6头部的主要结构和区别: IPv4头部结构 IPv4(Internet Protocol Version 4&…...
从零开始手把手带你训练LLM保姆级教程,草履虫都能学会!零基础看完这篇就足够了~
导读 ChatGPT面世以来,各种大模型相继出现。那么大模型到底是如何训练的呢,在这篇文章中,我们将尽可能详细地梳理一个完整的 LLM 训练流程,包括模型预训练(Pretrain)、Tokenizer 训练、指令微调࿰…...
strcat函数追加字符串
char * strcat ( char * destination, const char * source ); dest:目标字符串,即要将源字符串追加到其末尾的字符串。src:源字符串,即要追加到目标字符串末尾的字符串 使用strcat函数给目标字符串追加字符时,首先要…...
每月洞察:App Store 和 Google Play 的主要更新
Google Play 和 App Store 的算法不断发展,定期更新和变化会显着影响其功能。对于开发人员和营销人员来说,跟上这些变化至关重要,因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新,解释它…...
【python openai function2json小工具】
两种方法 一种openai-swarm中提供的、一种langchain实现的 一、openai工具函数调用 import inspectdef merge_chunk(final_response: dict, delta: dict) -> None:delta.pop("role", None)merge_fields(final_response, delta)tool_calls delta.get("tool_…...
super()和super().__init__()的解释
一、super 1.基本概念 在python继承当中,super()函数主要用在子类中调用父类的方法。它返回一个特殊对象,这个对象会帮我们调用父类方法 class Parent:def __init__(self, name):self.name namedef say_hello(self):print(f"Hello, Im {self.nam…...
【C++】—— 多态(下)
【C】—— 多态(下) 4 多态的原理 4.1 虚函数表指针4.2 多态的原理4.3 动态绑定和静态绑定 4.4 虚函数表 4 多态的原理 4.1 虚函数表指针 我们以一道题来引入多态的原理 下面编译为 32 位程序的运行结果是什么() A、编译报错 B…...
idea 2023 配置 web service
前言 能在网上查到的资料,都是比较老的,搞了一上午才配置好了环境 因此记录一下,服务你我他 我的环境: java 1.8,Idea2023.1 配置web service 服务端 直接新建一个java新项目 下载插件 添加框架支持 启动项目 配置web service 客户端 新建项目,下载三个插件的步骤和上面服务…...
MYSQL数据库SQL+DQL
关于MySQL数据库中的SQL和DQL,以下是一些关键信息: SQL概述 SQL(Structured Query Language,结构化查询语言)是用于操作关系型数据库的编程语言。它定义了一套操作关系型数据库的统一标准。SQL语句可以单行或多行书写…...
Java中的异常Throwable
原文链接https://javaguide.cn/java/basis/java-basic-questions-03.html#%E5%BC%82%E5%B8%B8 Java 异常类层次结构图 Exception 和 Error 的区别 在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类: Excep…...
Day4顺序表c++代码实现
代码中实现,顺序表的初始化,插入,查找,删除 废话不多说,直接上 #include<iostream> using namespace std; #define eleType int struct SequentialList {eleType* elements;//指针int size;int capacity;//容量…...
将图片转换成base64格式
1.先创建一个canvas对象,然后给canvas对象设置图片对象的宽高,再调用canvas的getContext获取2d上下文对象,再调用上下文对象的drawImage方法,再通过canvase对象的toDataURL方法,将图片转换成base64格式的字符串 2.将b…...
征服ES(ElasticSearch)的慢查询实战
在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。 一、常见问题分析 深分页、大排序 大量数据扫描与多分片上的多次排序会严…...
如何才能从普通程序员转行AI大模型?
人工智能已经成为一个非常火的方向。作为一名普通的程序员,该如何转向AI大模型方向。以程序员为例,看看普通程序员如何开启AI大模型之路。 接下来给大家分享一下程序员转大模型的一些注意点: 作为一名程序员,在考虑转行至大模型领…...
【番外】软件设计师中级笔记关于数据库技术更新笔记问题
提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多,我应该分几期发布呢?还是一期一次性发布完成。 如果分为一期发布,可能需要给我多一些时间,由于markdown格式有所差异,所以我需要部分进行修改与调…...
【代码】约瑟夫问题——故事背景
Hello!大家好,我是学霸小羊,今天先来讲讲约瑟夫问题的背景。 在古罗马时期,犹太历史学家约瑟夫斯领导犹太人反对罗马帝国的统治,并与罗马军队进行激烈的战斗。然而,在罗马军队的围困下,约瑟夫与…...
什么是事件冒泡和事件捕获
文章目录 1. 事件传播机制2. 事件冒泡(Event Bubbling)3. 事件捕获(Event Capturing)4. 事件冒泡和事件捕获的区别5. 阻止事件传播总结 事件冒泡和事件捕获是两种处理网页中事件传播的机制,特别是在 JavaScript 中处理…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
