【三维重建】【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估计、场景重建和新视图合成的最新结果方面的有效性。

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

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

相关文章

ywtool network命令

一.network功能介绍 network功能就是通过脚本的方式配置IP信息&#xff0c;分为4项: (1) 配置单网卡(2)配置br网桥(单网卡)(3)配置bond(两张网卡)(4)配置ovs网桥(单网卡) 日志文件:/var/log/ywtools/ywtools-network.log/usr/local/ywtools/config/config.ini中network参数:…

从预训练到通用智能(AGI)的观察和思考

1.预训练词向量 预训练词向量&#xff08;Pre-trained Word Embeddings&#xff09;是指通过无监督学习方法预先训练好的词与向量之间的映射关系。这些向量通常具有高维稠密特征&#xff0c;能够捕捉词语间的语义和语法相似性。最著名的预训练词向量包括Google的Word2Vec&#…

项目实现json字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…

应用存储与持久化数据卷

1、PV 引入场景&#xff1a; ① Deployment 管理的 pod&#xff0c;在做镜像升级的过程中&#xff0c;会产生新的 pod并且删除旧的 pod &#xff0c;新旧 pod 之间如何复用数据&#xff1f; ② 宿主机宕机的时候&#xff0c;如何实现带卷迁移&#xff1f; ③ 多个 pod 之间&…

Redis 之三:发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff0c;它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中&#xff0c;有三种角色&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;负责发送信…

[分类指标]准确率、精确率、召回率、F1值、ROC和AUC、MCC马修相关系数

准确率、精确率、召回率、F1值 定义&#xff1a; 1、准确率&#xff08;Accuracy&#xff09; 准确率是指分类正确的样本占总样本个数的比例。准确率是针对所有样本的统计量。它被定义为&#xff1a; 准确率能够清晰的判断我们模型的表现&#xff0c;但有一个严重的缺陷&…

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库&#xff0c;常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步&#xff1a;确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本&#xff0c;您可…

低代码中的可视化表单:效率与灵活兼备的设计工具

近年来&#xff0c;随着数字化转型的加速推进&#xff0c;企业对于高效率、灵活性和可定制性的软件开发需求不断增长。传统的软件开发过程通常需要耗费大量的时间和资源&#xff0c;而低代码开发平台的出现为企业提供了一种更加快速和灵活的解决方案。在低代码开发平台中&#…

Linux centos 变更MySQL数据存储路径

Linux centos 变更MySQL数据存储路径 登录mysql&#xff0c;查看数据存储路径创建新目录准备迁移数据检查是否配置成功 登录mysql&#xff0c;查看数据存储路径 mysql -u root -pshow global variables like "%datadir%";创建新目录 查看磁盘空间 df -h选取最大磁…

不可多得的干货,网易的朋友给我这份339页的Android面经

这里先放上目录 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 首先从函数的耗时来说&#xff0c;有一个工具TraceView 这是androidsdk自带的工作&#xff0c;用于测量函数耗时的。 UI布局的分析&#xff0c;可以有2块&#x…

本届挑战赛亚军方案:基于大模型和多AGENT协同的运维

“轻舟已过万重山团队”荣获本届挑战赛亚军&#xff0c;该团队来自华为集团IT-UniAI 产品和openEuler系统智能团队。 方案介绍 自ChatGPT问世以来&#xff0c;AI迎来了奇点iPhone时刻&#xff0c;这一年来大模型深入影响企业办公&#xff0c;金融&#xff0c;广告&#xff0c;…

打造去中心化透明储蓄罐:Solidity智能合约的又一实践

一、案例背景 传统的储蓄罐通常是由个人或家庭使用&#xff0c;用于存放硬币或小额纸币。然而&#xff0c;这样的储蓄罐缺乏透明性&#xff0c;用户无法实时了解储蓄情况&#xff0c;也无法确保资金的安全性。 通过Solidity智能合约&#xff0c;我们可以构建一个去中心化…

转前端了!!

大家好&#xff0c;我是冰河~~ 没错&#xff0c;为了更好的设计和开发分布式IM即时通讯系统&#xff0c;也为了让大家能够直观的体验到分布式IM即时通讯系统的功能&#xff0c;冰河开始转战前端了。也就是说&#xff0c;整个项目从需求立项到产品设计&#xff0c;从架构设计到…

leetcode 热题 100_字母异位词分组

题解一&#xff1a; 排序&#xff1a;对两个字母异位词&#xff0c;二者排序后的字符串完全一样&#xff0c;因此可以对所给字符串进行排序&#xff0c;以排序后的字符串作为HashMap哈希表的键值&#xff0c;将排序前的字符串作为值进行存储分组&#xff0c;最后返回。 import…

Opencv基础与学习路线

Opencv Opencv每一篇目具体&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 Opencv(5)平滑处理 具体Opencv相关demo代码欢迎访问我的github仓库&#xff08;包含python和c代码&#xff09; demo代码 文章目录 Opencv一…

3d图形学基础(一):向量与坐标系

文章目录 1.1 向量与坐标系1.1.1 向量与坐标系的应用1.1.2 完整测试代码 1.1 向量与坐标系 1.1.1 向量与坐标系的应用 零向量&#xff1a; 零向量是没有方向的向量&#xff1b; 负向量&#xff1a; 负向量是与原向量方向相反、长度相等的向量&#xff1b; 向量的模&#xf…

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范&#xff0c;可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现&#xff0c;在使用husky之前&#xff0c;我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

QPaint绘制自定义仪表盘组件03

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 ui mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QDebug> #include <QtMath> #include <QDialog> #include <QPainter> #include …

网络安全概述(一)

目录 资产保护 资产的类型 资产损失类型 资产保护考虑因素 安全强度、安全代价和侵入可能性的关系 信息安全技术发展 单机系统的信息保密阶段 信息保障阶段 信息保障技术框架IATF PDRR模型 网络攻击类型 阻断攻击、截取攻击、篡改攻击、伪造攻击 被动攻击和主动攻…

C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

1 双向链表 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循…