PointRend: 将图像分割视为渲染——PointRend:Image Segmentation as Rendering

news2024/11/17 3:43:15

0.摘要

        我们提出了一种新的方法,用于高效、高质量的对象和场景图像分割。通过将经典的计算机图形学方法与像素标记任务中面临的过采样和欠采样挑战进行类比,我们开发了一种将图像分割视为渲染问题的独特视角。基于这个视角,我们提出了PointRend(基于点的渲染)神经网络模块:一个在自适应选择的位置上执行基于点的分割预测的模块,该位置是基于迭代细分算法选择的。PointRend可以灵活地应用于实例分割和语义分割任务,通过构建在现有的最先进模型之上。虽然许多具体实现都是可能的,但我们表明,一个简单的设计已经可以实现出色的结果。在质量上,PointRend在先前方法平滑过度的区域输出清晰的物体边界。在数量上,PointRend在COCO和Cityscapes上为实例分割和语义分割带来了显著的收益。PointRend的效率使得输出分辨率比现有方法在存储器或计算方面都更加实用。代码已经在https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend上开放。

1.引言

图像分割任务涉及将在规则网格上采样的像素映射到相同网格上的标签地图或一组标签地图。在语义分割的情况下,标签地图指示每个像素的预测类别。在实例分割的情况下,预测每个检测到的对象的二进制前景与背景地图。这些任务的现代工具是建立在卷积神经网络(CNN)[24、23]上的。用于图像分割的CNN通常在规则网格上运行:输入图像是像素的规则网格,它们的隐藏表示是规则网格上的特征向量,它们的输出是规则网格上的标签地图。规则网格很方便,但不一定是适合图像分割的计算理想。这些网络预测的标签地图应该是大部分光滑的,即相邻的像素通常取相同的标签,因为高频区域被限制在对象之间稀疏的边界上。规则网格将不必要地过采样光滑区域,同时欠采样对象边界。结果是在光滑区域中进行过度计算和模糊的轮廓(图1,左上角)。图像分割方法通常在低分辨率规则网格上预测标签,例如,在语义分割中输入的1/8 [30]或在实例分割中的28×28 [17],以在欠采样和过采样之间进行折衷。

类似的采样问题在计算机图形学中已经研究了几十年。例如,渲染器将一个模型(例如,一个三维网格)映射到光栅化图像,即像素的规则网格。虽然输出是在规则网格上的,但计算并不均匀地分配在网格上。相反,一个常见的图形策略是在图像平面上计算自适应选择的点的不规则子集的像素值。例如,[43]的经典细分技术产生了一种类似四叉树的采样模式,可以有效地渲染高分辨率的抗锯齿图像。本文的核心思想是将图像分割视为渲染问题,并从计算机图形学中借鉴经典思想,以高效地“渲染”高质量的标签地图(见图1,左下角)。我们将这个计算思想封装在一个新的神经网络模块中,称为PointRend,它使用细分策略来自适应地选择计算标签的非均匀点集。PointRend可以集成到流行的元架构中,用于实例分割(例如,Mask R-CNN [17])和语义分割(例如,FCN [30])。它的细分策略使用比直接密集计算少一个数量级的浮点运算来高效地计算高分辨率的分割地图。

PointRend是一个通用模块,可以有许多可能的实现方式。抽象地看,一个PointRend模块接受一个或多个在规则网格上定义的典型CNN特征图f(xi,yi),并在更细的网格上输出高分辨率的预测p(x′i,yi′)。PointRend不会在输出网格上过度预测所有点,而是仅在精心选择的点上进行预测。为了进行这些预测,它通过插值f提取所选点的逐点特征表示,并使用一个小的点头子网络从逐点特征中预测输出标签。我们将提供一个简单而有效的PointRend实现。我们使用COCO [26]和Cityscapes [8]基准测试来评估PointRend在实例分割和语义分割任务中的性能。在质量方面,PointRend能够高效地计算对象之间的锐利边界,如图2和图8所示。我们还观察到定量的改进,尽管这些任务的标准交集联合比度量(mask AP和mIoU)偏向于对象内部像素,并且相对于边界改进比较不敏感。PointRend显著地改进了强大的Mask R CNN和DeepLabV3 [4]模型。

图2:使用带有标准掩膜头的Mask R-CNN [17](左图)与使用PointRend(右图)的示例结果对比,使用ResNet-50 [18]和FPN [25]。请注意,PointRend在物体边界周围预测具有更细致的细节的掩膜。

2.相关工作

        计算机图形学中的渲染算法输出像素的规则网格。然而,它们通常在非均匀的点集上计算这些像素值。像细分[43]和自适应采样[33,37]这样的高效程序可以在像素值方差较大的区域中细化粗略的光栅化。射线追踪渲染器通常使用超采样[45],这是一种比输出网格更密集地采样某些点的技术,以避免走样效应。在这里,我们将经典的细分应用于图像分割。非均匀网格表示。在二维图像分析中,基于规则网格的计算是主导范式,但对于其他视觉任务来说并非如此。在三维形状识别中,由于立方体缩放,大型三维网格是不可行的。大多数基于CNN的方法不超过64×64×64的粗略网格[11,7]。相反,最近的作品考虑更高效的非均匀表示,例如网格[42,13]、符号距离函数[32]和oc树[41]。与符号距离函数类似,PointRend可以在任何点计算分割值。最近,Marin等人[31]提出了一种基于输入图像非均匀子采样的高效语义分割网络,然后再使用标准语义分割网络进行处理。相比之下,PointRend专注于输出时的非均匀采样。可能可以将这两种方法结合起来,但是[31]目前尚未证明适用于实例分割。

        基于Mask R-CNN元架构[17]的实例分割方法在最近的挑战中占据了前几名[29,2]。这些基于区域的架构通常在一个28×28的网格上预测掩膜,而不考虑物体的大小。这对于小物体已经足够,但对于大物体,它会产生不良的“blobby”输出,过度平滑大物体的细节(见图1,左上角)。另一方面,自底向上的方法将像素分组形成对象掩膜[28,1,22]。这些方法可以产生更详细的输出,但在大多数实例分割基准测试[26,8,35]中落后于基于区域的方法。TensorMask [6]是一种替代的滑动窗口方法,使用复杂的网络设计来预测大物体的清晰高分辨率掩模,但它的准确性也略低。在本文中,我们展示了一个配备PointRend的基于区域的分割模型可以产生具有细节层次的掩膜,同时提高了基于区域的方法的准确性。

        语义分割。全卷积网络(FCNs)[30]是现代语义分割方法的基础。它们通常预测输出比输入网格具有更低的分辨率,并使用双线性上采样来恢复其余的8-16×分辨率。可以通过用一些下采样层替换膨胀/空洞卷积[3,4]来改进结果,但代价是更多的内存和计算。替代方法包括编码器-解码器架构[5,21,39,40],其中编码器对网格表示进行下采样,然后在解码器中进行上采样,使用跳连接[39]来恢复过滤的细节。当前的方法将膨胀卷积与编码器解码器结构相结合[5,27],在应用双线性插值之前,将输出产生在比输入网格稀疏4×的网格上。在我们的工作中,我们提出了一种方法,可以在与输入网格一样密集的网格上高效地预测细节层次。

图3: PointRend应用于实例分割。标准的实例分割网络(实线红箭头)接受输入图像,并使用轻量级分割头为每个检测到的对象(红框)产生粗略(例如7×7)的掩膜预测。为了细化粗糙的掩膜,PointRend选择一组点(红色点),并使用小型MLP独立地对每个点进行预测。MLP使用从(1)主干CNN的细粒度特征映射和(2)粗略预测掩膜计算的这些点的插值特征(虚线红箭头)。粗略掩膜特征使MLP能够在包含两个或多个框的单个点上进行不同的预测。所提出的细分掩膜渲染算法(见图4和§3.1)迭代地应用这个过程,以细化预测掩膜的不确定区域。

3.方法

我们将计算机视觉中的图像分割(对象和/或场景)类比于计算机图形学中的图像渲染。渲染是关于将模型(例如,3D网格)显示为像素的常规网格,即图像。虽然输出表示是一个常规网格,但底层的物理实体(例如,3D模型)是连续的,其物理占用和其他属性可以使用物理和几何推理(如射线跟踪)在图像平面上的任何实值点进行查询。类比地,在计算机视觉中,我们可以将图像分割看作是底层连续实体的占用地图,并且从中“渲染”分割输出,该输出是预测标签的常规网格。该实体被编码在网络的特征图中,并且可以通过插值在任何点访问。一个参数化函数,该函数通过这些插值点特征表示来训练预测占用的,是物理和几何推理的对应项。

基于这个类比,我们提出了PointRend(基于点的渲染)作为使用点表示的图像分割方法。一个PointRend模块接受一个或多个C通道的典型CNN特征图f∈RC×H×W,每个特征图都在一个常规网格上定义(通常比图像网格粗略4到16倍),并输出在不同(可能更高)分辨率的常规网格上的K类标签p∈RK×H′×W′的预测。PointRend模块由三个主要组成部分组成:(i)点选择策略选择少量实值点进行预测,避免高分辨率输出网格中所有像素的过度计算。(ii)对于每个选择的点,提取点特征表示。实值点的特征是通过对f进行双线性插值计算得出的,使用f的正常网格上的点的4个最近邻居。因此,它能够利用编码在f的通道维度中的亚像素信息来预测具有比f更高分辨率的分割。(iii)点头:一个小型神经网络,训练预测每个点的标签。PointRend架构可以应用于实例分割(例如,Mask R-CNN [17])和语义分割(例如,FCN [30])任务。对于实例分割,PointRend被应用于每个区域。它通过在一组选定的点上进行预测以粗到细的方式计算掩膜(见图3)。对于语义分割,整个图像可以被视为单个区域,因此在不失一般性的情况下,我们将在实例分割的上下文中描述PointRend。接下来,我们将详细讨论三个主要组成部分。

3.1.推理和训练的点选择

我们方法的核心思想是灵活和自适应地选择图像平面上预测分割标签的点。直观地,这些点应该位于高频区域附近更密集的位置,例如物体边界,类似于射线追踪中的抗锯齿问题。我们针对推断和训练开发了这个想法。推断。我们的推断选择策略受计算机图形学中自适应细分[43]的启发。该技术用于通过仅在可能值与其邻居显著不同的位置计算高分辨率图像(例如,通过射线追踪),对于所有其他位置,值是通过插值已经计算的输出值获得的(从粗网格开始)。

对于每个区域,我们以粗到细的方式迭代地“渲染”输出掩膜。最粗糙的级别预测是在常规网格上的点上进行的(例如,通过使用标准的粗糙分割预测头)。在每次迭代中,PointRend使用双线性插值上采样其先前预测的分割,然后在这个更密集的网格上选择N个最不确定的点(例如,对于二进制掩膜,概率最接近0.5的点)。然后,PointRend计算每个这些N个点的点特征表示(稍后在§3.2中描述),并预测它们的标签。该过程重复进行,直到分割被上采样到所需的分辨率。该过程的一步在图4的玩具示例中说明。对于所需的输出分辨率为M×M像素和起始分辨率为M0×M0,PointRend所需的点预测不超过N log2 MM0。这比M×M小得多,使PointRend能够更有效地进行高分辨率预测。例如,如果M0为7,所需分辨率为M=224,则需要5个细分步骤。如果在每个步骤中选择N=282个点,PointRend仅对282·4.25个点进行预测,这比2242小15倍。请注意,总体选择的点数少于N log2 MM0,因为在第一次细分步骤中,只有142个点可用。

在训练期间,PointRend还需要选择点来构建用于训练点头的点特征。原则上,点选择策略可以类似于推断中使用的细分策略。然而,细分引入了顺序步骤,不利于使用反向传播训练神经网络。相反,在训练中,我们使用基于随机采样的非迭代策略。采样策略在特征图上选择N个点进行训练。它旨在偏向于不确定区域的选择,同时保持一定程度的均匀覆盖,使用三个原则。(i)过度生成:我们通过从均匀分布中随机采样kN个点(k>1)来过度生成候选点。(ii)重要性采样:我们通过在所有kN个点上插值粗糙预测值并计算特定任务的不确定性估计(在§4和§5中定义)来关注具有不确定粗略预测的点。从kN个候选点中选择最不确定的βN个点(β∈[0,1])。(iii)覆盖:剩余的(1−β)N个点从均匀分布中采样。我们在图5中使用不同的设置说明了这个过程,并将其与常规网格选择进行了比较。在训练时,预测和损失函数仅在N个采样点(除了粗糙分割)上计算,这比通过细分步骤反向传播更简单和更有效。这个设计类似于在Faster R-CNN系统[12]中并行训练RPN + Fast R-CNN,其推断是顺序的。

3.2.点表示和点头

PointRend通过组合(例如,连接)两种特征类型,即细粒度和粗略预测特征,在所选点上构建点特征,下面进行描述。细粒度特征:为了允许PointRend呈现细分割细节,我们从CNN特征图中在每个采样点提取一个特征向量。因为一个点是一个实值2D坐标,我们对特征图执行双线性插值来计算特征向量,遵循标准实践[19,17,9]。特征可以从单个特征图(例如ResNet中的res2)中提取;它们也可以从多个特征图(例如res2到res5或它们的特征金字塔[25]对应项)中提取并连接,遵循Hypercolumn方法[15]。粗略预测特征:细粒度特征使得分辨细节变得可行,但在两个方面也存在缺陷。首先,它们不包含区域特定的信息,因此,两个实例的边界框重叠的同一点将具有相同的细粒度特征。然而,该点只能在一个实例的前景中。因此,对于实例分割任务,不同区域可能会为同一点预测不同的标签,需要其他区域特定的信息。

其次,根据用于细粒度特征的特征图,特征可能仅包含相对较低级别的信息(例如,我们将使用DeepLabV3中的res2)。在这种情况下,具有更多上下文和语义信息的特征源可能会有所帮助。这个问题影响实例和语义分割。基于这些考虑,第二个特征类型是来自网络的粗略分割预测,即表示K类预测的每个区域(框)中每个点的K维向量。通过设计,粗略分辨率提供了更全局的上下文,而通道传达语义类别。这些粗略预测类似于现有架构产生的输出,并以与现有模型相同的方式在训练期间进行监督。对于实例分割,粗略预测可以是例如Mask R-CNN中轻量级7×7分辨率掩模头的输出。对于语义分割,它可以是例如来自步幅16特征图的预测。点头。给定每个选择点的点级特征表示,PointRend使用简单的多层感知器(MLP)进行点级分割预测。这个MLP在所有点(和所有区域)之间共享权重,类似于图卷积[20]或PointNet[38]。由于MLP为每个点预测分割标签,因此可以通过标准的特定任务分割损失(在§4和§5中描述)进行训练。

4.实验:实例分割

数据集。我们使用两个标准的实例分割数据集:COCO [26]和Cityscapes [8]。我们使用中位数报告COCO的3次运行和Cityscapes的5次运行的标准掩码AP度量[26](其方差较高)。COCO具有80个具有实例级注释的类别。我们在train2017(约118k张图像)上进行训练,并在val2017(5k张图像)上报告结果。正如[14]中所述,COCO的真实情况通常很粗糙,数据集的AP可能无法完全反映掩码质量的改进。因此,我们使用LVIS [14]的80个COCO类别子集进行AP补充,表示为AP!。LVIS的注释质量显著更高。请注意,对于AP!,我们使用在COCO上训练的相同模型,并使用LVIS评估API重新评估其预测,以针对更高质量的LVIS注释进行评估。Cityscapes是一个自我中心的街景数据集,具有8个类别,2975个训练图像和500个验证图像。与COCO相比,这些图像具有更高的分辨率(1024×2048像素),并且具有更精细,更像素准确的地面实例分割注释。

架构。我们的实验证明使用ResNet-50 [18] + FPN [25]骨干网络的Mask R-CNN。Mask R-CNN中的默认蒙版头是区域级FCN,我们将其表示为“4×conv”。2我们使用这个作为比较的基线。对于PointRend,我们对这个基线进行适当的修改,下面描述了这些修改。轻量级、粗略的掩码预测头。为了计算粗略的预测,我们使用一个更轻量级的设计来替换4×conv掩码头,类似于Mask R-CNN的框头,并产生一个7×7的掩码预测。具体来说,对于每个边界框,我们使用双线性插值从FPN的P2级别中提取一个14×14的特征图。特征在边界框内的正则网格上计算(这个操作可以看作是RoIAlign的简单版本)。接下来,我们使用一个步长为2的2×2卷积层,具有256个输出通道,后跟ReLU [34],将空间大小减小到7×7。最后,类似于Mask R-CNN的框头,应用一个具有两个1024宽隐藏层的MLP,以产生每个K类的7×7掩码预测。在MLP的隐藏层中使用ReLU,并将sigmoid激活函数应用于其输出。PointRend。在每个选择点处,使用双线性插值从粗略预测头的输出中提取一个K维特征向量。PointRend还使用双线性插值从FPN的P2级提取一个256维的特征向量。这个级别相对于输入图像具有4个步长。这些粗糙预测和细粒度特征向量被连接起来。我们使用具有256个通道的3个隐藏层的MLP在选择点处进行K类预测。在MLP的每个层中,我们使用K个粗略预测特征来补充256个输出通道,以使输入向量用于下一层。我们在MLP内部使用ReLU,并将sigmoid应用于其输出。

训练。我们默认使用Detectron2 [44]的标准1×训练计划和数据增强(完整的细节在附录中)。对于PointRend,我们使用k = 3和β = 0.75的偏置采样策略随机采样142个点。我们使用从粗糙预测中插值出的与地面实例分割类别概率的0.5之间的距离作为点级不确定度度量。对于具有地面实例分割类别c的预测框,我们对142个点上c-th MLP输出的二元交叉熵损失进行求和。轻量级粗略预测头使用平均交叉熵损失来预测类别c的掩码,即与基线4×conv头相同的损失。我们将所有损失相加,没有任何重新加权。在训练期间,Mask R-CNN并行应用框和掩码头,而在推理期间,它们作为级联运行。我们发现级联训练不会改善基线Mask R-CNN,但PointRend可以从中受益,因为它在更准确的框内采样点,略微改善了整体性能(约0.2%AP,绝对)。推理。对于预测类别c的框,在没有特殊说明的情况下,我们使用自适应细分技术将类别c的粗略7×7预测优化到224×224,需要5步。在每一步中,我们基于预测值与0.5之间的绝对差异选择并更新(最多)N = 282个最不确定的点。

4.1.主要结果

我们在表1中将PointRend与Mask R-CNN中的默认4×conv头进行了比较。PointRend在两个数据集上都优于默认头。当使用LVIS注释评估COCO类别时(AP!),以及在Cityscapes上,差距更大,我们将其归因于这些数据集中的优越注释质量。即使具有相同的输出分辨率,PointRend也优于基线。28×28和224×224之间的差异相对较小,因为AP使用交并比[10],因此严重偏向于对象内部像素,对边界质量不太敏感。然而,在视觉上,边界质量的差异是显而易见的,见图6。

Subdivision推理允许PointRend使用超过30倍的计算(FLOPs)和内存来产生高分辨率224×224预测,而默认的4×conv头需要输出相同分辨率(基于采用112×112 RoIAlign输入),见表2。PointRend通过忽略物体的粗略预测足够的区域(例如,远离物体边界的区域)使高分辨率输出成为Mask R-CNN框架中的可行方案。就墙钟运行时间而言,我们的未优化实现以∼13 fps输出224×224掩码,这与修改为输出56×56掩码(通过加倍默认的RoIAlign大小)的4×conv头具有大致相同的帧速率,实际上,这种设计与28×28的4×conv头相比,COCO AP更低(34.5%vs.35.2%)。表3显示了在每个细分步骤中选择不同输出分辨率和点数的PointRend细分推理。在更高的分辨率上预测掩码可以改善结果。尽管AP饱和,但在从较低(例如56×56)到更高(例如224×224)分辨率输出时,视觉改进仍然显而易见,见图7。由于点是首先在最模糊的区域中选择的,因此随着每个细分步骤中采样的点数量增加,AP也会饱和。额外的点可能会在已经足够粗略预测的区域中进行预测。然而,对于具有复杂边界的物体,使用更多的点可能是有益的。

4.2.消融实验

我们进行了许多分析来分析PointRend。总体而言,我们注意到它对点头MLP的确切设计是稳健的。在我们的实验中,其深度或宽度的变化没有显示出任何显着差异。训练期间的点选择。在训练期间,我们按照偏倚的采样策略(§3.1)选择每个对象的142个点。仅采样142个点使训练具有计算和内存效率,我们发现使用更多的点并不会改善结果。令人惊讶的是,每个框仅采样49个点仍然保持AP,尽管我们观察到AP的增加方差。表4显示了不同选择策略下PointRend的性能。在训练期间,正则网格选择实现了类似于均匀采样的结果。而偏向于模糊区域的偏倚采样可以提高AP。然而,过于偏向于粗略预测的边界的采样策略(k>10且β接近1.0)会降低AP。总体而言,我们发现广泛的参数2<k<5和0.75<β<1.0可以提供类似的结果。更大的模型,更长的训练。使用1×调度在COCO上训练ResNet-50 + FPN(表示为R50-FPN)会导致欠拟合。在表5中,我们展示了PointRend相对于基线的改进在更长的训练计划和更大的模型上仍然有效(详情请见附录)。

5.实验:语义分割

PointRend不仅限于实例分割,还可以扩展到其他像素级别的识别任务。在这里,我们展示了PointRend如何受益于两个语义分割模型:使用扩张卷积在更密集的网格上进行预测的DeeplabV3 [4]和简单的编码器-解码器结构SemanticFPN [21]。数据集。我们使用包含19个类别、2975张训练图像和500张验证图像的Cityscapes [8]语义分割集。我们报告了5次试验的中位数mIoU。实现细节。我们重新实现了DeeplabV3和SemanticFPN,遵循它们各自的论文。SemanticFPN使用标准的ResNet-101 [18],而DeeplabV3使用[4]中提出的ResNet-103。我们遵循原始论文的训练计划和数据增强(详细信息请见附录)。我们使用与实例分割相同的PointRend架构。粗略预测特征来自语义分割模型的(已经粗略的)输出。细粒度特征从res2插值得到DeeplabV3,从P2插值得到SemanticFPN。在训练期间,我们采样与输入的stride 16特征图上的点数相同的点(deeplabV3为2304,SemanticFPN为2048)。我们使用相同的k=3,β=0.75点选择策略。在推理期间,细分使用N=8096(即1024×2048图像的stride 16映射中的点数),直到达到输入图像分辨率。为了衡量预测的不确定性,我们在训练和推理期间使用相同的策略:最自信和次自信类别概率之间的差异。

在DeeplabV3中,表6比较了DeepLabV3和带有PointRend的DeeplabV3。输出分辨率也可以通过在res4阶段使用扩张卷积将其增加2倍,在[4]中进行了描述。与两者相比,PointRend具有更高的mIoU。定性的改进也很明显,见图8。通过自适应地采样点,PointRend通过仅对32k个点进行预测就可以达到1024×2048分辨率(即2M个点),见图9。SemanticFPN。表7显示,带有PointRend的SemanticFPN比没有PointRend的8×和4×输出步幅变体都有所改进。

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

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

相关文章

昂首资本通过套期保值,MT4和MT5这样选

对冲模式允许交易者为一项资产开立任意数量的头寸&#xff0c;但只能进行多单交易&#xff0c;无法改变开仓的成交量。 套期保值系统由MT4和MT5两款软件提供支持&#xff0c;自2016年起&#xff0c;套期保值系统由MT5取代了MT4。净额结算模式允许交易者一次只有一个金融工具的…

TensorRT的结构

Builder&#xff08;网络原数据&#xff09;&#xff1a;模型搭建的入口&#xff0c;网络的tensorRT内部表示以及可执行程序引擎都是由该对象的成员方法生成的 BuiderConfig&#xff08;网络原数据的选项&#xff09;&#xff1a;负责设置模型的一些参数&#xff0c;如是否开始…

R语言R包详解——stringr包:字符处理

R语言 R语言R包详解——stringr包&#xff1a;字符处理 一切用法皆以说明书为准&#xff0c;想要了解该包&#xff0c;请多查阅说明书或者查看底层算法。 文章目录 R语言一、安装与加载R包二、函数简介三、函数详解3.1、str_c: 字符串拼接3.2、str_trim: 去掉字符串的空格和TA…

2核4G服务器支持多少用户同时在线访问?卡不卡?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;从CPU内存的角度&#xff0c;网站程序效…

Java 19的未来:新特性、性能优化和更多

文章目录 新特性的引入1. 模式匹配的扩展2. 增强的模式匹配异常处理3. 基于记录的反射4. 引入静态方法的接口 性能优化1. 垃圾收集器的改进2. 即时编译器的增强3. 并行处理的改进 Java编程的前景展望1. 更多的应用场景2. 更强的生态系统3. 更广泛的社区参与4. 面向未来的编程 结…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件

本章要实现的整体效果如下&#xff1a; QEvent::KeyPress ​ 键盘按下时&#xff0c;触发该事件&#xff0c;它对应的子类是 QKeyEvent QEvent::KeyRelease ​ 键盘抬起时&#xff0c;触发该事件&#xff0c;它对应的子类是 QKeyEvent 本节通过两个案例来讲解这 2 个事件&…

C++学习day4

作业&#xff1a; 1> 思维导图 2> 整理代码 1. 拷贝赋值函数课上代码 //拷贝赋值函数课上代码 #include<iostream> using namespace std;//创建类 class Stu { private://私有的string name;int socer;int *age;//此处注意用到指针类型 public://共有的//无参构…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

每日leetcode_193二叉搜索树的最近公共祖先

每日leetcode_193二叉搜索树的最近公共祖先 记录自己的成长&#xff0c;加油。 题目出处&#xff1a;LCR 193. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 题目 思路&#xff1a; 解题 class Solution {public TreeNode lowestCommonAncestor(TreeNod…

孙帅Spring源码

【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】

【二维前缀和】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 #include <iostream> using namespace std; #include<vector> int main() {int n0,m0,q0;cin>>n>>m>>q;vector<vector<int>> arr(n1,vector&l…

Easysearch Chart 0.2.0都有哪些变化

Easysearch Chart 包更新了&#xff0c;让我们来看看都有哪些变化&#xff1a; Docker 镜像升级 Service 名称调整&#xff0c;支持 NodePort 模式部署 现在让我们用 NodePort 模式部署一下&#xff1a; # helm search repo infinilabs NAME CHART VERSION …

移动应用-Android-开发指南

Android-UI开发指南 Android Studio调试UI设计UI框架布局Layout文本框 android的活动Activity基本概念Activity的生命周期Activity栈创建Activity管理ActivityActivity间传递数据 FragmentAdapterRecyclerViewRecyclerView Adapter&#xff08;适配器&#xff09;事件setOnItem…

C++ 与基本数据类型:整型、布尔型与字符型

文章目录 参考描述数据类型基本数据类型与复合数据类型静态数据类型 整形数据类型有符号整型数据类型无符号整型数据类型符号位 最少内存空间概念确定大小sizeof 运算符 进制C 中的不同进制数值表示cout 与进制转化影响范围二进制 后缀字面量整型字面量的默认数据类型主动权整型…

【UE5 Cesium】17-Cesium for Unreal 建立飞行跟踪器(2)

目录 效果 步骤 一、飞机沿航线飞行 二、通过切换相机实现在不同角度观察飞机飞行 效果 步骤 一、飞机沿航线飞行 先去模型网站下载一个波音737飞机模型 然后将下载好的模型导入到UE项目中&#xff0c;导入时需要勾选“合并网格体”&#xff08;导入前最好在建模软件中将…

阿里云上了新闻联播

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里新任的CEO吴泳铭上央视新闻联播了! 在昨天的新闻联播里&#xff0c;出席科技座谈会&#xff0c;有一个特别镜头&#xff0c;出现了阿里新任CEO吴泳铭的镜头。 这个信号意义明显&#xff0c;我…

sentinel的启动与运行

首先我们github下载sentinel Releases alibaba/Sentinel (github.com) 下载好了后输入命令让它运行即可&#xff0c;使用cmd窗口输入一下命令即可 java -Dserver.port8089 -jar sentinel-dashboard-1.8.6.jar 账号密码默认都是sentinel

20哈希表-三数之和

目录 LeetCode之路——15. 三数之和 分析&#xff1a; 官方题解&#xff1a; LeetCode之路——15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nu…

黄金票据和白银票据

文章目录 Kerberos使用背景kerberos认证流程黄金票据和白银票据 Kerberos使用背景 1、个人文件还是公司文件以及服务都存在于一台系统上&#xff0c;所有人都要去一台机器办公&#xff0c;效率非常低&#xff0c;为每个人分配了电脑以后就需要考虑安全问题 2、如何让服务器正确…

一款好用的leetcode周赛插件:再也不用写代码的时候来回看描述了

今天发现了一个群友分享的一款leetcode插件&#xff0c;分享给大家。 对于熟悉leetcode的小伙伴应该会有一个困扰&#xff0c;那就是在leetcode打周赛的时候&#xff0c;题目描述和编辑区不是左右排版的&#xff0c;而是上下排版的&#xff0c;我们代码写着写着就需要移到最上…