【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

题目:SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM
地址:spla-tam.github.io
机构:CMU(卡内基梅隆大学)、MIT(美国麻省理工)

在这里插入图片描述


总结:SplaTAM,一个新的SLAM系统,利用3D Gaussian Splatting作为底层map表示,渲染和优化更快,明确的地图空间范围,和流线型的地图稠密化。可以同时优化pose估计、场景重建和新视图合成。

文章目录

  • 摘要
  • 一、引言
  • 二、相关工作
    • 2.1 密集SLAM的传统方法
    • 2.2 预训练的神经网络表示
    • 2.3 隐式场景表示
    • 2.4 3D Gaussian Splatting(简称GS)
  • 三、方法
    • 3.1 高斯地图表示
    • 3.2 通过 Splatting的可微渲染
    • 3.3 SLAM 系统
    • 3.4 初始化
    • 3.5 像机跟踪
    • 3.6 高斯稠密化
    • 3.7 高斯地图更新
  • 四、实验
    • 4.1 数据集和验证设置
    • 4.2 相机pose估计实验
    • 4.3 高斯图重建与摄像机pose的可视化
    • 4.4 渲染质量
    • 4.5 颜色和深度损失消融
    • 4.6 局限性
  • 总结


摘要

提示:这里可以添加本文要记录的大概内容:

  密集的同步定位和建图(SLAM)是具体化场景理解的关键。最近的工作表明,三维高斯使用多个姿态相机,高质量重建和实时渲染场景。我们首次表明,用三维高斯表示一个场景,可以使用无pose的单目RGB-D像机实现密集的SLAMSplaTAM,解决了辐射场的表示的局限性,包括 快速渲染和优化,确定区域是否已经被map的能力,以及通过添加高斯的结构化地图扩展 。我们 采用了一个在线跟踪和建图框架,同时裁剪它,以专门使用底层的高斯表示和通过可微渲染的silhouette(轮廓)引导的优化 。实验表明,SplaTAM在相机pose估计、地图构建和新视图合成方面达到了高达2×的最先进的性能,同时允许实时渲染高分辨率的密集3D地图。

一、引言

   视觉同时定位和建图(SLAM)——估计视觉传感器pose和环境地图的任务——是视觉或机器人系统在以前看不见的3D环境中操作的基本能力。在过去的30年里,SLAM的研究广泛地集中在地图表示的问题上——导致了各种稀疏的[2,3,7,23]、密集的[4,6,8,13,15,25,26,34,41,42]和神经场景表示[21,29,30,37,45,54]。映射表示(Map representation)是一个基本的选择,它会极大地影响到SLAM系统中的每个处理块的设计,以及依赖于SLAM的输出的下游任务。

  就密集的视觉SLAM而言,最成功的手工表示是点、surfels/flats 和符号距离场 虽然基于这种地图表示的系统在过去几年中已经成熟到生产水平,但仍有重大的缺陷需要解决。跟踪显式表示的关键是依赖于丰富的三维几何特征和高帧率捕获的可用性。此外,这些方法只能可靠地解释场景中观察到的部分;许多应用程序,如混合现实和高保真度3D捕获,需要的技术也能够解释/合成未观察到的/新的相机视点

  手工表示的缺点,加上辐射场表示的高质量图像的出现,推动了将场景编码到神经网络的权重空间的方法。基于辐射场的SLAM算法[30,53]受益于高保真的全局地图和图像重建损失,这些损失通过可微渲染捕获密集的光度信息。然而,目前的方法使用隐式神经表示来模拟体辐射场,在SLAM中导致许多问题——计算效率低,不容易编辑,不明确地建模空间几何,以及灾难性遗忘。

  “ 如何使用显式的体积表示来设计一个SLAM解决方案 ?”我们使用一个基于三维高斯的辐射场,来Splat(渲染),跟踪,和建图SLAM。有以下好处:

  1. 快速渲染,实现丰富的优化

Gaussian Splatting高达400 FPS的渲染速度,是隐式的替代方案,关键因素是3Dprimitives 的栅格化。SplaTAM做了简单修改,,包括去除与视图相关的外观使用各向同性高斯分布。此外,这允许我们实时使用密集光度损失的SLAM,而传统的和隐式映射表示分别依赖于稀疏的三维几何特征或像素采样来保持效率。

  1. 可以显式延申空间的地图

通过只在观察到的部分场景中添加高斯分布,可以很容易地控制现有地图的空间边界。给定一个新的图像帧,这允许人们通过渲染一个silhouette(轮廓)来有效地识别场景的哪些部分是新的内容(在地图的空间边界之外)。这对于相机跟踪至关重要,因为我们只想将场景的映射区域与新图像进行比较。这对于隐式映射表示来说是困难的,因为网络在对未映射空间的基于梯度的优化过程中会受到全局变化的影响

  1. 显式地图

通过简单地添加更多的高斯分布,增加map的容量。显式的体积表示能够编辑场景的部分,同时仍然允许逼真的渲染。隐式方法不能轻易地增加它们的能力或编辑它们所表示的场景

  1. 参数的直接梯度流

场景是用物理三维位置、颜色和大小的高斯表示的,在参数和渲染之间有一个直接的、几乎线性的(投影的)梯度流。因为相机的运动可以被认为是保持相机的静止和移动的场景,我们也有一个直接的梯度到相机的参数,从而实现快速优化。基于神经的表示没有这一点,因为梯度需要流过(可能有很多)非线性神经网络层

  图1在模拟和真实数据的实验结果:

在这里插入图片描述

二、相关工作

  简要回顾使用密集SLAM的各种方法,特别是最近利用过拟合神经网络中编码的隐式表示进行跟踪和映射的方法。

2.1 密集SLAM的传统方法

  传统的密集SLAM方法探索了各种显式表示,包括2.5D图像、(截断)符号距离函数、高斯混合模型[9,10]和圆形曲面(平面)。与这项工作特别相关的是Keller等人[13]提出的基于点的融合,它在其映射表示中使用了一个flat作为原子单元。flat,或surfels,是通过RGB-D图像输入进行实时优化的彩色圆形表面元素每个surfel 都能够编码一个表面上的多个点,允许更紧凑的映射表示。Surfels很容易被栅格化,就像[33,42]中通过可微栅格化跟踪相机的pose。虽然上述的SLAM方法不假定可见性函数是可微的,但存在现代可微栅格器,使梯度流可以通过depth discontinuities[49]。本文使用三维高斯形式的volumetric(相对于仅表面)场景表示,这可以实现快速和准确的跟踪和映射

2.2 预训练的神经网络表示

  该方法已经与传统的SLAM技术集成,主要集中于预测RGB图像的深度。这些方法从直接将神经网络的深度预测集成到SLAM [38]中,学习可解码的变分自动编码器,到同时学习预测深度成本量和跟踪的方法。

2.3 隐式场景表示

  iMAP [37]首先使用神经隐式表示进行跟踪和映射。为了提高可伸缩性,NICE-SLAM [53]提出了使用分层的多特征网格。在类似的线上,与[25,27]相比,iSDF [28]使用隐式表示来有效地计算有符号的距离。在此之后,[11,18,19,22,29,31,40,50,54]的一些工作最近通过多种方式推进了基于隐式的SLAM——通过持续学习(体验回放)减少灾难性遗忘,捕获语义,合并不确定性,使用高效分辨率hash-grid和编码,以及使用改进的损失。最近,Point-SLAM [30]提出了一种替代路线,类似于[44],通过使用神经点云,并使用特征插值进行体积渲染,提供了更好的三维重建,特别是对于机器人技术。然而,与其他隐式表示一样,体积射线采样极大地限制了其效率,因此求助于稀疏像素集的优化,而不是每像素密集的光度误差。相反,SplaTAM的显式体积辐射模型利用了快速的栅格化,使其能够完全使用每像素密集的光度误差

2.4 3D Gaussian Splatting(简称GS)

  最近,3D高斯算法已经成为一种很有前途的3D场景表示[14,16,17,39],特别是能够通过Splatting[14]极快地渲染。该方法也被扩展到具有密集6-DOF运动[20]的动态场景[20,43,46,47]模型。这种针对静态和动态场景的方法都要求每个输入帧都有一个精确的已知的6-DOF摄像机姿态,以成功地优化表示。SplaTAM首次消除了这个约束,同时估计相机的pose,同时也拟合潜在的高斯表示

三、方法

  SplaTAM是第一个使用三维GS的密集RGB-D SLAM解决方案。通过将世界建模为可以渲染成高保真彩色和深度图像的三维高斯图像的集合,能够直接使用可微渲染和基于梯度的优化,来优化每一帧的相机pose和一个 underlying volumetric discretized世界地图。

3.1 高斯地图表示

  splatam将场景的底层地图表示为一组三维高斯分布,基于原始GS进行了一些简化, 只使用与视图无关的颜色,并迫使高斯分布是各向同性的。这意味着每个高斯值只由8个值参数化:3个为其RGB颜色c,3个为其中心位置µ∈R3,一个为其半径r,一个为其不透明度o∈[0,1]。根据由高斯分布的不透明度加权的标准(非归一化)高斯方程,每个高斯分布会影响三维空间x∈r3中的一个点:
在这里插入图片描述

3.2 通过 Splatting的可微渲染

  方法的核心是能够将底层高斯地图中的高保真颜色、深度和轮廓图像渲染到任何可能的相机参考帧中。这种 可微渲染允许我们直接计算底层场景表示(高斯)和相机参数的梯度,利用渲染和真实的RGB-D帧之间的误差,并更新高斯和相机参数来减少误差。

  GS渲染RGB图像如下:给定一个三维高斯和相机pose的集合,首先从前到后对所有高斯进行排序。通过在像素空间中,依次α-合成每个高斯分布的二维投影,来渲染RGB图像
像素 p =(u, v) 渲染颜色公式:
在这里插入图片描述
其中,fi(p) 的计算方法如等式(1),但在像素空间中splat的二维高斯的 µr 为:

在这里插入图片描述
这里,K是相机内参,Et 是第 t 帧处的相机旋转和平移的外参,f 是焦距(已知),d 是相机坐标下的第 i 个高斯值的深度。

我们提出类似的深度渲染(可以与输入深度图比较,返回相对于3D地图的梯度):

在这里插入图片描述

  我们还渲染一个silhouette(轮廓)图像来确定可见性——例如,一个像素是否包含来自当前地图的信息:
在这里插入图片描述

3.3 SLAM 系统

在这里插入图片描述

  我们从高斯表示和可微渲染器建立了一个SLAM系统。先简要概述:假设我们有一个现有的地图(通过一组三维高斯分布表示),它已经拟合了第 1 帧到 t帧。给定一个新的RGB-D帧 t+1,SLAM系统执行以下步骤(见图2):

1.像机跟踪。我们利用t+1 帧的相机pose参数,最小化RGB-D序列的图像和深度重建误差,但只评估可见轮廓内的像素的误差
2. 高斯密度。根据渲染的轮廓和输入深度,向地图中添加新的高斯

3. 地图更新。给定从帧1到帧t+1的相机pose,通过最小化所有图像的RGB和深度误差来更新高斯分布参数。在实践中,为了保持批处理大小的可管理性,将对选好的,与最近帧重叠的关键帧子集进行优化

3.4 初始化

  初始化。第一帧跳过跟踪步骤,将相机pose设置为identity。在稠密化步骤中,由于渲染的轮廓为空,所有像素都用于初始化新的高斯。具体来说,对于每个像素,我们添加一个颜色为像素的新高斯,中心位置为投影的像素深度,不透明度0.5,半径等于一个像素半径投影到2d图像的深度除以焦距:在这里插入图片描述

3.5 像机跟踪

  相机跟踪:旨在估计当前输入的在线RGB-D图像的相机pose。通过对相机中心+四元数空间中姿态参数的恒定速度正向投影,为一个新的时间步初始化相机pose。例如,初始化(公式7)

在这里插入图片描述
然后,通过基于梯度的优化,通过可微分地渲染RGB,深度和轮廓图,并更新相机参数,同时保持高斯参数不变,以最小化损失(公式8):

  以上为深度和颜色渲染上的L1损失,颜色的权重减少了一半。只应用以上损失于通过轮廓图渲染的像素。轮廓图捕获了地图的不确定性。这对于跟踪新的相机姿势非常重要,因为新帧通常包含在我们的地图中尚未捕获或经过良好优化的新信息。如果一个像素没有Grountruth深度,那么L1损失为0。

  

3.6 高斯稠密化

  稠密化的目的是:为每个进入的在线,在地图中初始化新的高斯分布。在跟踪之后,我们对这一帧的相机pose有了一个准确的估计,对于深度图像,我们对高斯分布在场景中的位置有了好的估计。然而,当前的高斯已经准确地表示场景几何时,不需要添加高斯,因此,我们创建了一个密集化mask来确定哪些像素应该被密集化:

在这里插入图片描述
  此mask指示地图密度不足的地方(S < 0.5),或者在当前估计的几何图形前面应该有新的几何图形(地面真实深度在预测深度的前面,并且深度误差大于中值深度误差(MDE)的50倍)。对于每个像素,基于这个mask,添加一个新的高斯进行第一帧初始化。

  

3.7 高斯地图更新

  旨在基于估计的在线相机pose下,更新三维高斯地图的参数。这也是通过可微渲染和基于梯度的优化来实现的,然而与跟踪不同的是,相机pose是固定的,高斯分布的参数被更新

  这相当于对已知pose的图像拟合辐射场的“经典”问题。然而,我们做了两个重要的修改。1.不是从头开始,而是从最近构建的地图中预热,开始优化。2.不优化所有之前的(关键)帧,而是选择了可能影响新添加的高斯分布的帧。我们将每n帧保存为关键帧,并选择k帧进行优化,包括当前帧、最近的关键帧,以及k−2之前与当前帧重叠最高的关键帧。重叠是通过取当前帧深度图的点云,并确定每个关键帧的错误点数来确定的

  阶段优化与跟踪过程中类似的损失,不使用轮廓mask(因为要优化所有的像素)。此外,我们在RGB渲染中添加了一个SSIM损失,并剔除了不透明度接近0的无用高斯分布。

四、实验

4.1 数据集和验证设置

  在四个数据集上评估了我们的方法: ScanNet++ 、Replica、TUM-RGBD 和原始的ScanNet 。选择后三种方法是为了遵循以往基于辐射场的SLAM方法Point-SLAM [30]和NICE-SLAM [53]的评价程序。然而,我们也添加了ScanNet++ [48]评估,因为其他三个基准测试中都没有一个能够评估新视图上的渲染质量,并且只评估训练视图上的摄像机姿态估计和渲染。

  Replica是最简单的基准测试,因为它包含合成场景,高度精确和完整的(合成)深度地图,以及连续的相机姿态之间的小位移TUM-RGBD 和原始的ScanNet比较困难,特别是对于密集的方法,因为RGB和深度图像质量都很差,因为它们都使用旧的低质量的相机。深度图像非常稀疏,缺少大量的信息,并且彩色图像有非常多的运动模糊量。对于ScanNet++ [48],我们使用来自两个场景的DSLR捕获,在这些场景中存在完全密集的轨迹。与其他基准测试相比,ScanNet++的颜色和深度图像是非常高的质量,并为每个场景提供了第二个捕获循环来评估完全新颖的保留视图。然而,每个相机的姿势之间相距很远,这使得姿势估计非常困难。在ScanNet++上,连续帧之间的差异与复制品上的30帧间隙大致相同。对于除ScanNet++之外的所有基准测试,我们从Point-SLAM [30]中获取基线数字。类似于Point-SLAM,我们对每5帧的训练视图渲染基准进行评估。此外,对于所有与之前基线的比较,我们将结果表示为3个种子(0-2)的平均值,并使用种子0进行消融

  评价指标为了测量RGB渲染性能,我们使用了PSNR、SSIM和LPIPS。对于深度渲染性能,我们使用深度L1损失。对于摄像机姿态估计跟踪,我们使用平均绝对轨迹误差(ATE RMSE)

  Baselines我们比较的主要基线方法是Point-SLAM [30],因为它是以前的基于密集辐射场的SLAM的最先进的(SOTA)方法。我们还与较旧的密集SLAM方法进行了比较,如NICE-SLAM [53]、Vox-Fusion [45]和适当的ESLAM [12]。在TUM-RGBD上,我们还比较了三种传统的SLAM系统:Kintinuous[41]、ElasticFusion[42]和ORB-SLAM2 [23]。在困难的ScanNet++上,除了点-SLAM外,我们还评估了ORB-SLAM3 [3]作为一个具有代表性的基于特征的传统SLAM系统。

4.2 相机pose估计实验

在这里插入图片描述

  在ScanNet++ [48]上,SOTA SLAM接近点SLAM[30]和ORB-SLAM3 [3](RGB-D变体)由于相邻摄像机之间的位移,完全无法正确跟踪摄像机的姿态,因此给出非常大的姿态估计误差。特别是,对于ORB-SLAM3,我们观察到无纹理的ScanNet++扫描由于缺乏特性而导致跟踪多次重新初始化。相比之下,我们的方法成功地在两个序列上跟踪摄像机,平均轨迹误差仅为1.2厘米

  在相对简单的合成Replica数据集上,即之前事实上的评估基准,我们的方法将比之前的SOTA [30]的轨迹误差减少了30%以上,从0.52cm减少到0.36cm。

  在TUM-RGBD [36]上,由于深度传感器信息差(非常稀疏)和RGB图像质量差(极高的运动模糊),所有的体积方法都非常困难。然而,与这类[30,53]方法相比,我们的方法仍然明显优于这类[30]中先前SOTA的轨迹误差减少了近40%,从8.92cm减少到5.48cm。然而,在这个基准测试中,基于特征的稀疏跟踪方法,如ORB-SLAM2 [23],仍然优于密集的方法

  在ScanNet++上的结果表明,如果有高质量的干净输入图像,我们的方法可以成功地和准确地执行SLAM,即使在相机位置之间的巨大运动。

4.3 高斯图重建与摄像机pose的可视化

  图3展示了来自ScanNet++在两个序列上重建的高斯图的可视化结果。我们还展示了相机的轨迹和相机的pose frustums,由我们的方法估计的这两个序列叠加在地图上。人们可以很容易地看到经常发生在连续相机姿态之间的大位移,这是一个非常困难的SLAM基准,然而我们的方法却非常准确地解决了这个问题。

在这里插入图片描述

4.4 渲染质量

  表2在Replica的输入视图上评估了渲染质量。我们的方法获得了与PointSLAM 相似的PSNR、SSIM和LPIPS结果,尽管比较不公平,因为PointSLAM具有不公平的优势,因为它将这些图像的真实深度作为输入,以便进行渲染。

  个更好的评价是评价新视图渲染。然而,目前所有的SLAM基准测试并没有一组与SLAM算法估计的相机轨迹分开的保留图像,因此它们不能用于此目的。因此,我们使用新的高质量ScanNet++数据集建立了一个新的基准, 新视图和训练视图渲染的结果可以在表3中找到。我们的方法获得了一个良好的新视图合成结果,平均为24.41 PSNR,在27.98 PSNR的训练视图上略高。请注意,这是在估计未知的相机pose时,即,完全未曝光的新视图合成结果。由于Point-SLAM [30]不能成功地估计相机的姿态,因此它也完全不能完成新视图合成的任务

  

  新视图和训练视图渲染的结果可以在表3中找到。我们的方法获得了一个良好的新视图合成结果,平均为24.41 PSNR,在27.98 PSNR的训练视图上略高。请注意,这是在估计未知的相机姿态时,即,完全未曝光的新视图合成结果。由于Point-SLAM [30]不能成功地估计相机的pose,因此它也完全不能完成新视图合成的任务

4.5 颜色和深度损失消融

在这里插入图片描述

4.6 局限性

  虽然SplaTAM达到了最先进的性能,但我们发现我们的方法对运动模糊、大深度噪声和侵略性旋转显示出一定的敏感性。我们认为,一个可能的解决办法是暂时模拟这些影响,并希望在今后的工作中解决这一问题。此外,SplaTAM可以通过像OpenVDB [24]这样的高效表示来扩展到大规模场景。最后,我们的方法需要已知的相机内部信息和密集的深度作为执行SLAM的输入,而删除这些依赖关系是未来的一个有趣的途径。

  

  

总结

  SplaTAM,一个新的SLAM系统,利用三维GS辐射场作为其底层地图表示,使更快的渲染和优化,明确的地图空间范围,和流线型的地图稠密化。我们证明了它在实现相机pose估计、场景重建和新视图合成的最新结果方面的有效性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在你的 Vue + Electron 项目里,引入 ESLint

因为我的项目是基于 Electron 平台的 Web 应用&#xff0c;使用 Vue 3 实现&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的时候&#xff0c;要考虑好几种规范的问题。 文章目录 零、简介1. 规则2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定义…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代&#xff0c;我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴&#xff0c;无论是工作上的重要事项&#xff0c;还是个人的私密心情。然而&#xff0c;当我在寻找一个能够安心记录私密事情的工具时&#xff0c;安全性成为了我最关心的因…

23.基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文PPT)

项目介绍 本旅游网站系统采用的数据库是MYSQL &#xff0c;使用 JSP 技术开发&#xff0c;在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

Matlab 机器人工具箱 动力学

文章目录 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload参考链接 官网&#xff1a;Robotics Toolbox - Peter Corke R.dyn 查看动力学参数 mdl_puma560; p560.dyn;%查看puma560机械臂所有连杆的动力学参数 p560.dyn(2);%查看puma560机械臂第二连杆的动力学…

MongoDB Java实战

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于MongoDB系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础…

SpringBoot+Vue实现el-table表头筛选排序(附源码)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;在笑大学牲 &#x1f39f;️个人主页&#xff1a;无所谓^_^ ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 前言 后台系统对table组件的需求是最常见的&#xff0c;不过element-ui的el…

机器学习-面经(part2)

3. 验证方式 3.1什么是过拟合?产生过拟合原因? 定义:指模型在训练集上的效果很好,在测试集上的预测效果很差 数据有噪声 训练数据不足,有限的训练数据 训练模型过度导致模型非常复杂3.2 如何避免过拟合问题? 3.3 什么是机器学习的欠拟合?产生原…

vmware扩容CentOS磁盘的两种方案

vmware扩容CentOS磁盘的两种方案 扩容磁盘的两种需求 扩容磁盘&#xff0c;一种情况&#xff0c;我们希望见原来不足的存储无缝伸缩扩容&#xff0c;通常是给原本的根目录/扩容&#xff0c;另一种是在另一个目录上挂载新磁盘。 本次记录第一种情况&#xff0c;主要参考https…

[LeetBook]【学习日记】寻找链表相交节点

来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 本题与主站 160 题相同&#xff1a;https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 训练计划 V 某教练同时带教两位学员&#xff0c;分别以…

Sqli-labs靶场第19关详解[Sqli-labs-less-19]自动化注入-SQLmap工具注入

Sqli-labs-Less-19 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了Referer &#xff0c;设想如果在Referer 尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

操作系统|概述|系统分类——笔记

1.1_1操作系统的概念和功能 操作系统的概念 操作系统&#xff08;Operating System&#xff0c; OS&#xff09; 是指控制和管理整个计算机系统的 硬件和软件 资源&#xff0c;并合理地组织调度计算机和工作和资源的分配&#xff1b; 1操作系统是系统资源的管理者 以提供给用…

macos docker baota 宝塔 搭建 ,新增端口映射

拉取镜像仅拉取镜像保存到本地&#xff0c;不部署容器&#xff0c;仅需拉取一次&#xff0c;永久存储到本地镜像列表 docker pull akaishuichi/baota-m1:lnmp 其他可参考&#xff1a;宝塔面板7.9.2docker镜像发布-集成LN/AMP支持m1/m2 mac版本 - Linux面板 - 宝塔面板论坛 运行…

Sora爆火,数字人IP如何借助AIGC视频生成软件制作短视频营销?

ChatGPT、Sora等大模型的出现&#xff0c;创新了短视频内容创作生产方式。但目前Sora模型无法准确模拟复杂场景的物理特性&#xff0c;并且可能无法理解因果关系导致视频失真。 广州虚拟动力基于用户使用需求&#xff0c;推出了AIGC数字人视频生成平台&#xff0c;企业、品牌可…

Java基础---lambda表达式

一、为什么要引入lambda表达式 lambda 表达式是一个可传递的代码块 &#xff0c; 可以在以后执行一次或多次 。 在介绍lambda表达式之前&#xff0c;我们看一下&#xff0c;以前&#xff0c;我们对于一个问题的通常写法。 假设你已经了解了如何按指定时间间隔完成工作&#xf…

Django官网项目 二

官网地址&#xff1a;Writing your first Django app, part 2 | Django documentation | Django 创建模组&#xff1a; 注册model &#xff08;bug&#xff1a;没有加后面的逗号&#xff09; 在manage.py 的目录下&#xff1a; python manage.py makemigrations polls pyth…

(十)SpringCloud系列——openfeign的高级特性实战内容介绍

前言 本节内容主要介绍一下SpringCloud组件中微服务调用组件openfeign的一些高级特性的用法以及一些常用的开发配置&#xff0c;如openfeign的超时控制配置、openfeign的重试机制配置、openfeign集成高级的http客户端、openfeign的请求与响应压缩功能&#xff0c;以及如何开启…

python实现有限域GF(2^8)上的乘法运算

有限域GF(2^8)上的乘法运算可以看成多项式的乘法 5e转换成二进制为0101 1110&#xff0c;对应的多项式为x^6x^4x^3x^2x 3f转换成二进制为0011 1111&#xff0c;对应的多项式为x^5x^4x^3x^2x1 将这两个多项式相乘再模多项式x^8x^4x^3x1得到结果为1110 0101&#xff0c;转换为…

CUDA 中的线程组织

明朝那些事中有一句话&#xff1a;我之所以写徐霞客是想告诉你&#xff0c;所谓千秋霸业万古流芳&#xff0c;与一件事相比&#xff0c;其实都算不了什么&#xff0c;这件事情就是——用你喜欢的方式度过一生。 我们以最简单的 CUDA 程序&#xff1a;从 GPU 中输出 Hello World…

ES入门四:Term Query Api实践

通过上一篇文章我们知道&#xff0c;在全文搜索的时候&#xff0c;系统会对检索内容进行分词&#xff0c;然后在对每个词项进行检索&#xff0c;但是我们今天介绍的基于词项查询的Api是不需要对输入内容进行分词的&#xff0c;Term Level Query会将输入的内容作为一个整体来进行…
最新文章