【论文#快速算法】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,modeQP]表示的是原始和重建的亮度分量,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(mp)仅表示运动信息,并通过查表计算。因此,只有属于最佳大小块的运动矢量实际被使用,其余的运动矢量在最后被丢弃。因此,通过 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}\} D i,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%,这些影响可以忽略不计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础数据结构——数组(动态数组,二维数组,缓存与局部性原理)

1.概述 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识 因为数组内的元素是连续存储的&#xff0c;所以数组中元素的地址&#xff0c;可以通过其索引计算出来&#xff0c;例如&…

生产力工具|vscode for mac的安装python库和使用虚拟环境(一)

一、在vscode中运行python代码&#xff08;mac或windows&#xff09; &#xff08;一&#xff09;在vscode中安装Python插件 若想在vscode中高效率的编辑Python代码&#xff0c;需要安装Python插件&#xff0c;点击下图中红框内的按钮&#xff1a; 然后在左上角的搜索框中输入…

Vue前端开发2.1 单文件组件

文章目录 一、单文件组件概念二、单文件组件构成1. 模板&#xff08;Template&#xff09;2. 样式&#xff08;Style&#xff09;3. 逻辑&#xff08;Script&#xff09; 三、单文件组件演示1. 创建Vue项目2. 启动Vue项目3. 用VS Code打开项目4. 清空样式文件代码5. 创建欢迎组…

【redis】热点key问题

【redis】热点key问题 【一】什么是热点key问题【二】什么样的key被称为热key【三】热点Key问题的危害【四】如何监控发现热点key【五】热点Key的解决方案【1】使用二级缓存【2】将热key分散到不同的服务器中【3】热key拆分【4】将核心/非核心业务做Redis的隔离 【六】业界已有…

Nature 正刊丨细菌免疫蛋白直接感知两种不同的噬菌体蛋白

01摘要 真核先天免疫系统使用模式识别受体通过检测病原体相关的分子模式来感知感染&#xff0c;然后触发免疫反应。细菌也进化出了类似的免疫蛋白&#xff0c;可以感知其病毒捕食者的某些成分&#xff0c;即噬菌体1,2,3,4,5,6。尽管不同的免疫蛋白可以识别不同的噬菌体编码的触…

log4j2.xml

log4j2.xml 1、log4j2.xml使用2、日志器的流程解析2.1、几个重要的类2.2、整体流程图 3、部分源码3.1、通过简单例子看源码3.2、log4j2.xml配置指导 如侵权&#xff0c;请联系&#xff0c;无心侵权&#xff5e; 如有错误&#xff0c;也请指正。 1、log4j2.xml使用 <?xml v…

Anaconda虚拟环境安装cuda和pytorch

首先电脑上要有Anaconda&#xff0c;使用conda创建一个虚拟环境,并激活 conda create yolov8 conda activate yolov8winR输入cmd&#xff0c;在命令窗口输入 NVIDIA-smi可以查看到自己电脑支持的cuda环境&#xff0c;如下图 再打开torch的官网 pytorch官网 查看目前支持的版…

目标检测——Cascade R-CNN算法解读

论文&#xff1a; Cascade R-CNN: Delving into High Quality Object Detection (2017.12.3) 链接&#xff1a;https://arxiv.org/abs/1712.00726 Cascade R-CNN: High Quality Object Detection and Instance Segmentation (2019.6.24) 链接&#xff1a;https://arxiv.org/abs…

Z 字形变换(6)

这道题之前一直不会做&#xff0c;明白他是什么意思&#xff0c;但是找不到方法或者方法过于繁琐 方法1&#xff1a; 这是我在力扣评论区看到的方法&#xff0c;太精彩了。 虽然我实现起来效率并不高&#xff0c;可能是我代码的问题&#xff0c;但是他的思路很巧妙。 字符串的…

Spring--1

spring是一个轻量级的&#xff0c;采用IOC与AOP编程思想的java后端开发框架&#xff0c;简化了企业级的应用开发。 Spring体系 数据访问层&#xff0c;Web层&#xff0c;配置中心&#xff0c;测试区 IOC 控制反转&#xff0c;将创建对象的控制权交由Spring框架&#xff0c;需…

音频分割:长语音音频 分割为 短语音音频 - python 实现

在做语音任务时&#xff0c;有是会用到的语音音频是长音频&#xff0c;这就需要我们将长音频分割为短音频。 该示例将声音的音量和静默时间结合作为语音的分割条件。 使用音量和静默时间结合的分割条件&#xff0c;能够比较好的进行自然断句&#xff0c;不会话语没有说完就切断…

Spring声明式事务管理:深入探索XML配置方式

前言 Spring的事务管理&#xff0c;无论是基于xml还是注解实现&#xff0c;本质上还是实现数据库的事务管理机制&#xff0c;因此要注意发送SQL的连接是否为同一个&#xff0c;这是实现声明式事务的关键。 以下案例和实现基于SSM整合框架完成&#xff0c;不知道如何整合SSM&…

【K8S系列】Kubernetes Pod 状态详细介绍及异常状态解决方案

在 Kubernetes 中&#xff0c;Pod 是最小的可调度单元&#xff0c;负责运行一个或多个容器。Pod 的状态能够反映其生命周期中的不同阶段&#xff0c;帮助用户了解当前的运行状况。本文将详细介绍 Kubernetes Pod 的各种状态及其可能的异常状态解决方案。 一、Pod 状态概览 Po…

查缺补漏----数据结构树高总结

① 对于平衡二叉树而言&#xff0c;树高的规律&#xff1a; 高度为h的平衡二叉树的含有的最少结点数&#xff08;所有非叶节点的平衡因子均为1&#xff09;&#xff1a; n01&#xff0c;n11&#xff0c;n22 含有的最多结点数&#xff1a; (高度为h的满二叉树含有的结点数) ②…

Flutter在 iOS 中实现无弹窗获取剪切板内容

前言 在最新的项目需求中&#xff0c;我们需要在获取剪切板内容时避免弹出授权提示。这一功能是基于竞品的实现&#xff0c;旨在优化用户体验&#xff0c;特别是在推广获取跳转链接的场景下非常有用。 解决方案 通过查阅资料&#xff0c;我们发现对于 iOS 16 及以上的系统&a…

Fusion创建一个简单的api脚本文件

我的Fusion版本&#xff1a;Fusion 2.0.20476 x86_64 脚本模块在实用程序->附加模型->脚本和附加模块&#xff0c;快捷键为shifts 里面有一些演示脚本&#xff0c;可以直接使用 也可以自己创建一个新的脚本 创建的脚本在此处—— 选择脚本文件&#xff0c;点击编辑&a…

Unity Mirror NetworkManager初识

文章目录 Network Manager网络管理器什么是网络管理器&#xff1f;通过Transports进行定制化网络连接管理自定义连接地址和端口号Game State Management游戏状态管理Network Manager HUD玩家预制体及其生成控制Spawn Prefabs其他预制体注册Scene Management场景管理 Network Ma…

在Windows系统中,cmd 查看 MongoDB 相关信息

MongoDB是一种流行的NoSQL数据库&#xff0c;广泛应用于各种现代应用程序中。 1 查看MongoDB的版本号 要查看MongoDB的版本号&#xff0c;可以使用mongo命令连接到MongoDB&#xff0c;然后执行db.version()。 mongo连接到数据库后&#xff0c;执行以下命令&#xff0c;输出M…

读数据工程之道:设计和构建健壮的数据系统16源系统实际细节(下)

1. 数据共享 1.1. 云数据共享的核心概念是&#xff0c;多租户系统支持租户之间共享数据的安全策略 1.2. 任何具有细粒度权限系统的公有云对象存储系统都可以成为数据共享的平台 1.3. 数据共享也简化了数据市场的概念&#xff0c;在几个流行的云和数据平台上都可用 1.4. 数据…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…