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

题目: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的输入,而删除这些依赖关系是未来的一个有趣的途径。

  

  








d \sqrt{d} d 1 0.24 \frac {1}{0.24} 0.241 x ˉ \bar{x} xˉ x ^ \hat{x} x^ x ~ \tilde{x} x~ ϵ \epsilon ϵ
ϕ \phi ϕ

总结

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

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

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

相关文章

【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II

博主简介&#xff1a;努力学习和进步中的的22级计科生博主主页&#xff1a; Yaoyao2024每日一句: “ 路虽远&#xff0c;行则将至。事虽难&#xff0c;做则可成。” 前言 前言&#xff1a;动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组&#xff08;dp tab…

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频&#xff0c;涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述&#xff0c;使得视频创作变得前所未有的简单和高效。 Sora的一些能力&#xff1a; Text-to-video…

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Qt篇——QTableWidget选中多行右键删除

效果如图&#xff1a; 代码如下&#xff1a; 头文件中&#xff1a; QTableWidgetItem *selectedItem; //表格被选中的一行 QMenu* originDataTableContextMenu; //表格右键菜单 QAction* originDataTableActionDel; //表格右键菜单…

腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

分组背包(相关解析及例题)

1.概念 分组背包&#xff1a; 分组背包就是有n组物品&#xff0c;每组物品中只可以选择一个物品。 每个物品都有体积和价值&#xff0c;求总体积不超过m的情况下的价值最大值。 那么我们就可以通过概念来得到状态转移方程&#xff1a; dp[ j ]max(dp[ j ],dp[ j -w[ i ][ …

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

RT-Thread+ENV+MDK+STM32CubeMX适配

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动/单片机/RTOS的实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff…

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化&#xff1a;将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize()&#xff0c;将一个对象转换成一个字符&#xff1b;反序列化&#xff1a;将数组或字符串等格式还成对象。代表函数unserialize()&#xff0c;将字符串还原成一个对象。 P…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目&#xff0c;硬件是ESP32-C3&#xff0c;目前准备量产&#xff0c;我需要提供固件以供加工厂批量烧录&#xff0c;需要把我有程序的板子里的程序读出来&#xff0c;然后下到别的板子上&#xff0c;以下做这件事情的过程记录。 1.固件…

mysql5.7源码安装

1.下载MySQL源码包 mysql-5.7.30.tar.gz 2.下载Boost库 tar xf /usr/local/src/boost_1_59_0.tar.bz2 3.解压源码包到指定的目录&#xff1a;安装 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DSYSCONFDIR/etc \ -DWITH_MYISAM_STORA…

ElasticSearch架构介绍及原理解析

ElasticSearch架构介绍及原理解析文章目录 一、Elasticsearch是什么&#xff1f;1.简介2.历史与发展3.有关概念1.cluster2.shards3.replicas4.recovery5.river6.gateway7.discovery.zen8.Transport 4.安装 二、ElasticSearch架构介绍及原理解析1.基本架构1.1 进程节点1.2 负载均…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

Programming Abstractions in C阅读笔记:p306-p307

《Programming Abstractions in C》学习第75天&#xff0c;p306-p307总结&#xff0c;总计2页。 一、技术总结 1.Quicksort algorithm(快速排序) 由法国计算机科学家C.A.R(Charles Antony Richard) Hoare&#xff08;东尼.霍尔&#xff09;在1959年开发(develop), 1961年发表…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

LeetCode——栈和队列(Java)

栈和队列 简介[简单] 232. 用栈实现队列[简单] 225. 用队列实现栈[简单] 20. 有效的括号[简单] 1047. 删除字符串中的所有相邻重复项[中等] 150. 逆波兰表达式求值[困难] 239. 滑动窗口最大值[中等] 347. 前 K 个高频元素 简介 记录一下自己刷题的历程以及代码。写题过程中参考…

【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级&#xff1f;   进程优先级用于确定在资源竞争的情况下&#xff0c;哪个进程将被操作系统调度为下一个运行的进程。进程…