当前位置: 首页 > news >正文

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering

  • 一、前言
  • Abstract
  • 1 INTRODUCTION
  • 2 RELATED WORK
    • 2.1 Traditional Scene Reconstruction and Rendering
    • 2.2 Neural Rendering and Radiance Fields
    • 2.3 Point-Based Rendering and Radiance Fields
  • 3 OVERVIEW
  • 4 DIFFERENTIABLE 3D GAUSSIAN SPLATTING
  • 5 OPTIMIZATION WITH ADAPTIVE DENSITY CONTROL OF 3D GAUSSIANS
    • 5.1 Optimization
    • 5.2 Adaptive Control of Gaussians
  • 6 FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS
  • 7 IMPLEMENTATION, RESULTS AND EVALUATION
    • 7.1 Implementation
    • 7.2 Results and Evaluation
    • 7.3 Ablations
    • 7.4 Limitations
  • 8 DISCUSSION AND CONCLUSIONS
  • A DETAILS OF GRADIENT COMPUTATION
  • B OPTIMIZATION AND DENSIFICATION ALGORITHM
  • C DETAILS OF THE RASTERIZER
  • D PER-SCENE ERROR METRICS

一、前言

Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, George Drettakis

【Paper_arxiv】 > 【Github_Code】 > 【Project】

  1. 引入了三个关键要素,能够在保持有竞争力的训练时间的同时实现最先进的视觉质量,并且重要的是允许以 1080p 分辨率进行高质量实时(≥ 30 fps)新颖的视图合成。首先,从相机校准期间产生的稀疏点开始,用 3D 高斯表示场景,保留连续体积辐射场的所需属性以进行场景优化,同时避免在空白空间中进行不必要的计算;其次,对 3D 高斯进行交错优化/密度控制,特别是优化各向异性协方差以实现场景的准确表示;第三,开发了一种快速可见性感知渲染算法,该算法支持各向异性泼溅,既加速训练又允许实时渲染。

Abstract

背景问题:辐射场方法最近彻底改变了用多张照片或视频捕获的场景的新颖视图合成。然而,实现高视觉质量仍然需要训练和渲染成本高昂的神经网络,而最近更快的方法不可避免地会牺牲速度来换取质量。对于无界且完整的场景(而不是孤立的物体)和1080p分辨率渲染,当前没有方法可以实现实时显示速率。
介绍:我们引入了三个关键要素,使我们能够在保持有竞争力的训练时间的同时实现最先进的视觉质量,并且重要的是允许以 1080p 分辨率进行高质量实时(≥ 30 fps)新颖的视图合成。首先,从相机校准期间产生的稀疏点开始,我们用 3D 高斯表示场景,保留连续体积辐射场的所需属性以进行场景优化,同时避免在空白空间中进行不必要的计算;其次,我们对 3D 高斯进行交错优化/密度控制,特别是优化各向异性协方差以实现场景的准确表示;第三,我们开发了一种快速可见性感知渲染算法,该算法支持各向异性泼溅,既加速训练又允许实时渲染。
实验:我们在几个已建立的数据集上展示了最先进的视觉质量和实时渲染。
CCS Concepts: • Computing methodologies → Rendering; Point-based models; Rasterization; Machine learning approaches.
其他关键词和短语:新颖的视图合成、辐射场、3D 高斯、实时渲染

1 INTRODUCTION

网格和点是最常见的 3D 场景表示,因为它们是显式的并且非常适合基于 GPU/CUDA 的快速光栅化(rasterization)。相比之下,最近的神经辐射场(NeRF)方法建立在连续场景表示的基础上,通常使用体积光线行进(volumetric ray-marching)来优化多层感知器(MLP),以对捕获的场景进行新颖的视图合成。类似地,迄今为止最有效的辐射场解决方案通过对存储在体素等中的值进行插值来构建连续表示[Fridovich-Keil 和 Yu 等人。 2022] 或哈希 [Müller 等人。 2022] 网格或点 [Xu 等人。 2022]。虽然这些方法的连续性质有助于优化,但渲染所需的随机采样成本高昂,并且可能会导致噪声。我们引入了一种结合了两全其美的新方法:我们的 3D 高斯表示允许通过最先进的 (SOTA) 视觉质量和有竞争力的训练时间进行优化,而我们基于图块的(tile-based)泼溅解决方案可确保实时渲染在几个先前发布的数据集上达到 1080p 分辨率的 SOTA 质量 [Barron 等人。 2022 年;赫德曼等人。 2018;纳皮奇等人。 2017](见图1)。
在这里插入图片描述

我们的方法实现了辐射场的实时渲染,其质量与之前的方法的最佳质量相当[Barron 等人。 2022],同时只需要与之前最快的方法竞争的优化时间[Fridovich-Keil 和 Yu 等人。 2022 年;穆勒等人。 2022]。此性能的关键是新颖的 3D 高斯场景表示与实时可微分渲染器,它为场景优化和新颖的视图合成提供了显着的加速。请注意,对于与 InstantNGP 相当的训练时间 [Müller 等人。 2022],我们达到了与他们相似的质量;虽然这是他们达到的最高质量,但通过 51 分钟的训练,我们实现了最先进的质量,甚至比 Mip-NeRF360 稍好一些 [Barron 等人。 2022年]。

我们的目标是允许对使用多张照片捕获的场景进行实时渲染,并以与典型真实场景的最有效的先前方法一样快的优化时间创建表示。最近的方法实现了快速训练\cite{plenoxels,mueller2022instant},但很难达到当前 SOTA NeRF 方法(即 Mip-NeRF360 \cite{barron2022mipnerf360})获得的视觉质量,这需要长达 48 小时的训练时间。快速但质量较低的辐射场方法可以根据场景实现交互式渲染时间(每秒 10-15 帧),但达不到实时渲染 {( ≥ \geq 30~fps )} 高分辨率。

我们的解决方案基于三个主要组件。我们首先引入 3D 高斯作为灵活且富有表现力的场景表示。我们从与之前类似 NeRF 的方法相同的输入开始,即使用运动结构 (SfM) 校准的相机 [Snavely 等人。 2006] 并使用作为 SfM 过程的一部分免费生成的稀疏点云来初始化 3D 高斯集。与大多数需要多视图立体 (MVS) 数据的基于点的解决方案相比 [Aliev 等人。 2020;科帕纳斯等人。 2021 年;吕克特等人。 2022],我们仅使用 SfM 点作为输入就获得了高质量的结果。请注意,对于 NeRF 合成数据集,我们的方法即使在随机初始化的情况下也能达到高质量。我们证明 3D 高斯是一个很好的选择,因为它们是可微分的体积表示,但也可以通过将它们投影到 2D 并应用标准混合(使用与 NeRF 等效的图像形成模型)来非常有效地进行光栅化。我们方法的第二个组成部分是优化 3D 高斯的属性 - 3D 位置、不透明度、各向异性协方差和球谐(SH)系数 - 与自适应密度控制步骤交错,其中我们在优化过程中添加和偶尔删除 3D 高斯。优化过程产生相当紧凑、非结构化且精确的场景表示(所有测试场景为 1-5 百万高斯)。我们方法的第三个也是最后一个元素是我们的实时渲染解决方案,它使用快速 GPU 排序算法,并受到基于图块的光栅化(tile-based rasterization)的启发,遵循最近的工作 [Lassner 和 Zollhofer 2021]。然而,借助我们的 3D 高斯表示,我们可以执行尊重可见性排序的各向异性泼溅(得益于排序和混合),并通过跟踪所需数量的排序泼溅的遍历来实现快速、准确的向后传递。

总而言之,我们提供以下贡献:

  • 引入各向异性3D 高斯作为辐射场的高质量、非结构化表示。
  • 3D 高斯属性的优化方法,与自适应密度控制相结合,为捕获的场景创建高质量的表示。
  • GPU 的快速、可微分渲染方法具有可见性,允许各向异性泼溅和快速反向传播,以实现高质量的新颖视图合成。

我们对之前发布的数据集的结果表明,我们可以通过多视图捕获来优化 3D 高斯,并获得与之前最佳质量的隐式辐射场方法相同或更好的质量。我们还可以实现与最快方法类似的训练速度和质量,重要的是为新视图合成提供第一个高质量的实时渲染。

2 RELATED WORK

我们首先简要概述传统重建,然后讨论基于点的渲染和辐射场工作,讨论它们的相似性;辐射场是一个广阔的领域,因此我们只关注直接相关的工作。
有关该领域的完整报道,请参阅最近的精彩调查\cite{tewari2022advances,xie2022neural}。

2.1 Traditional Scene Reconstruction and Rendering

第一个新颖的视图合成方法基于光场,首先是密集采样的 [Gortler 等人。 1996; Levoy 和 Hanrahan 1996] 然后允许非结构化捕获(unstructured capture) [Buehler 等人。 2001]。运动结构 (SfM) 的出现 [Snavely 等人。 2006]启用了一个全新的领域,可以使用一组照片来合成新颖的视图。 SfM 在相机校准期间估计稀疏点云,最初用于 3D 空间的简单可视化。随后的多视图立体 (MVS) 多年来产生了令人印象深刻的全 3D 重建算法 [Goesele 等人。 2007],使得多种视图合成算法的开发成为可能[Chaurasia 等人。 2013年;艾斯曼等人。 2008年;赫德曼等人。 2018;科帕纳斯等人。 2021]。所有这些方法都将输入图像重新投影并混合到新颖的视图相机中,并使用几何形状来指导这种重新投影。这些方法在许多情况下产生了出色的结果,但当 MVS 生成不存在的几何体时,通常无法从未重建区域或“过度重建”中完全恢复。最近的神经渲染算法 [Tewari 等人。 2022]大大减少了此类伪影,并避免了将所有输入图像存储在 GPU 上的巨大成本,在大多数方面都优于这些方法。

2.2 Neural Rendering and Radiance Fields

深度学习技术早期被用于新视图合成 [Flynn et al. 2016; Zhou et al. 2016];CNNs 用于估计混合权重 [Hedman et al. 2018],或用于纹理空间解决方案 [Riegler and Koltun 2020; Thies et al. 2019]。使用基于 MVS 的几何图形是大多数这些方法的主要缺点;此外,使用 CNNs 进行最终渲染经常会导致时间闪烁。

新颖视图合成的体积表示由 Soft3D 发起[Penner 和Zhang 2017];随后提出了与体积射线行进(volumetric ray-marching)相结合的深度学习技术[Henzler et al.。 2019;西茨曼等人。 2019]建立在连续可微密度场上来表示几何。由于查询体积需要大量样本(samples ),因此使用体积光线行进进行渲染的成本很高。神经辐射场 (NeRF) [Mildenhall 等人。 2020]引入了重要性采样和位置编码(importance sampling and positional encoding)来提高质量,但使用了大型多层感知器对速度产生了负面影响。 NeRF 的成功导致了解决质量和速度问题的后续方法的激增,通常是通过引入正则化策略;当前用于新颖视图合成的最先进的图像质量是 Mip-NeRF360 [Barron 等人。 2022]。虽然渲染质量非常出色,但训练和渲染时间仍然非常长;我们能够达到或在某些情况下超过这种质量,同时提供快速训练和实时渲染。

最新的方法主要通过利用三种设计选择来专注于更快的训练和/或渲染:使用空间数据结构来存储随后在体积光线行进期间插值的(神经)特征不同的编码和 MLP 容量。此类方法包括
空间离散化的不同变体、\cite{nglodcvpr2021,plenoxels,yu2021plenoctrees,hedman2021snerg,chen2022mobilenerf,garbin2021fastnerf,Reiser2021ICCV,tensorf-eccv2022,wu2022snisr},密码本\cite{takikawa2022variable},
以及哈希表等编码\cite{mueller2022instant},允许使用更小的 MLP 或完全前述的(foregoing)神经网络\cite{plenoxels,dvgo-cvpr2022}。

这些方法中最值得注意的是 InstantNGP [Müller 等人。 2022]它使用哈希网格和占用网格(a hash grid and an occupancy grid )来加速计算,并使用更小的MLP来表示密度和外观;和 Plenoxels [Fridovich-Keil 和 Yu 等人。 2022]使用稀疏体素网格来插值连续密度场,并且能够完全放弃(forgo)神经网络。两者都依赖于球谐函数(Spherical Harmonics):前者直接表示方向效应,后者将其输入编码到颜色网络。虽然两者都提供了出色的结果,但这些方法仍然难以有效地表示空白空间部分取决于场景/捕获类型。此外,图像质量在很大程度上受到用于加速的结构化网格的选择的限制,并且渲染速度由于需要查询给定光线行进步骤的许多样本而受到阻碍。我们使用的非结构化、显式 GPU 友好的 3D 高斯函数无需神经组件即可实现更快的渲染速度和更好的质量。

2.3 Point-Based Rendering and Radiance Fields

基于点的方法有效地渲染断开连接和非结构化的几何样本(即点云)[Gross and Pfister 2011]。在最简单的形式中,点样本渲染 [Grossman and Dally 1998] 光栅化(rasterizes)具有固定大小的非结构化点集,为此它可以利用图形 API 的本机支持的点类型 [Sainz and Pajarola 2004] 或 GPU 上的并行软件光栅化(rasterization )[莱恩和卡拉斯 2011;舒茨等人。 2022]。虽然符合底层数据,但点样本渲染存在漏洞,导致锯齿,并且是严格不连续的。高质量基于点渲染的开创性工作通过“喷射”(“splatting”)大于像素的点基元(point primitives)(例如圆形或椭圆盘、椭球体或面元 circular or ellipticdiscs, ellipsoids, or surfels)来解决这些问题[Botsch 等人,2017]。 2005年;菲斯特等人。 2000;任等人。 2002年;茨威克等人。 2001b]。

最近人们对可微分的基于点的渲染技术产生了兴趣[Wiles 等人。 2020;一帆等人。 2019]。点已通过神经特征进行了增强,并使用 CNN 进行了渲染 [Aliev 等人。 2020;吕克特等人。 2022] 实现快速甚至实时视图合成;然而,它们仍然依赖于 MVS 来获取初始几何形状,因此继承了它的伪影,最明显的是在困难情况下的过度或不足重建,例如无特征/闪亮区域或薄结构。

基于点的 α \alpha α 混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。
具体来说,颜色 C C C 由沿射线的体积渲染给出:
C = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i with  T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) , \begin{equation} C = \sum_{i=1}^N T_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i \hspace{0.5em} \text{ with } \hspace{0.5em} T_i = \exp\left(-\sum_{j=1}^{i-1}\sigma_j\delta_j\right), \end{equation} C=i=1NTi(1exp(σiδi))ci with Ti=exp(j=1i1σjδj),其中密度 σ \sigma σ、透射率(transmittance) T T T 和颜色 c \mathbf{c} c 的样本是沿着射线按一定间隔 δ i \delta_i δi采集的.
这可以重写为
C = ∑ i = 1 N T i α i c i , \begin{equation} C = \sum_{i=1}^N T_i\alpha_i\mathbf{c}_i, \end{equation} C=i=1NTiαici,with
α i = ( 1 − exp ⁡ ( − σ i δ i ) ) and T i = ∏ j = 1 i − 1 ( 1 − α i ) . \begin{equation*} \alpha_i = (1-\exp(-\sigma_i\delta_i)) \hspace{0.5em} \text{and} \hspace{0.5em} T_i = \prod_{j=1}^{i-1}(1-\alpha_i). \end{equation*} αi=(1exp(σiδi))andTi=j=1i1(1αi).典型的基于神经点的方法(例如\cite{kopanas21,kopanas22})通过混合与像素重叠的 N \mathcal{N} N 有序点来计算像素的颜色 C C C
C = ∑ i ∈ N c i α i ∏ j = 1 i − 1 ( 1 − α j ) , \begin{equation} C = \sum_{i \in \mathcal{N}} c_{i}\alpha_{i} \prod_{j=1}^{i-1}(1-\alpha_{j}), \end{equation} C=iNciαij=1i1(1αj),其中 c i \mathbf{c}_i ci 是每个点的颜色, α i \alpha_i αi 是通过评估协方差 Σ \Sigma Σ \cite{yifan19} 乘以学习的每点不透明度(opacity)来评估二维高斯给出的。

从等式 2 和等式3所示,我们可以清楚地看到成像模型是相同的。然而,渲染算法却非常不同。 NeRF 是隐式表示空/占用空间的连续表示;需要昂贵的随机抽样才能找到方程式2中的样本,随之而来的噪声和计算费用。相比之下,点是一种非结构化、离散的表示形式,它足够灵活,可以像 NeRF 一样创建、破坏和位移几何图形。这是通过优化不透明度和位置来实现的,如之前的工作所示 [Kopanas 等人,2017]。 2021],同时避免了完整体积表示的缺点。

Pulsar [Lassner 和 Zollhofer 2021] 实现了快速球体光栅化,这启发了我们基于图块和排序的渲染器。然而,考虑到上面的分析,我们希望在排序的图上保持(近似)传统的 α − \alpha- α混合,以具有体积表示的优点:与顺序无关的方法相比,我们的光栅化尊重可见性顺序。此外,我们在像素中的所有片(splats)上反向传播梯度并对各向异性片(anisotropic splats)进行光栅化。这些元素都有助于我们结果的高视觉质量(参见第 7.3 节)。此外,上面提到的先前方法也使用CNNs进行渲染,这导致时间不稳定。尽管如此,Pulsar [Lassner 和 Zollhofer 2021] 和 ADOP [Rückert 等人] 的渲染速度。 2022] 成为开发我们的快速渲染解决方案的动力。

在关注镜面反射效果(specular effects,)的同时,Neural Point Catacaustics(神经点灾难) 的基于漫反射点的渲染轨迹 [Kopanas 等人。 2022]通过使用 MLP 克服了这种时间不稳定性,但仍然需要 MVS 几何形状作为输入。最新的方法[Zhang et al. 2022]此类别不需要MVS,也使用SH作为方向;然而,它只能处理一个对象的场景,并且需要掩码进行初始化。虽然对于小分辨率和低点数来说速度很快,但尚不清楚它如何扩展到典型数据集的场景 [Barron 等人。 2022 年;赫德曼等人。 2018;纳皮奇等人。 2017]。我们使用 3D 高斯函数来实现更灵活的场景表示,避免了对 MVS 几何体的需求,并通过我们用于投影高斯函数的基于图块的渲染算法实现了实时渲染。

最近的一种方法[Xu 等人。 2022]使用点通过径向基函数(radial basis function)方法来表示辐射场。他们在优化过程中采用点修剪和致密化(point pruning and densification)技术,但使用体积光线行进并且无法实现实时显示速率。

在人体表演捕捉领域,3D 高斯已被用来表示捕捉到的人体 [Rhodin et al. 2017]。 2015年;斯托尔等人。 2011];最近,它们已与体积光线行进一起用于视觉任务 [Wang 等人。 2023]。神经体积基元已在类似的背景下被提出[Lombardi 等人。 2021]。虽然这些方法启发了我们选择 3D 高斯作为我们的场景表示,但它们专注于重建和渲染单个孤立对象(人体或面部)的特定情况,从而导致场景的深度复杂度较小。相比之下,我们对各向异性协方差的优化、交错优化/密度控制以及用于渲染的高效深度排序使我们能够处理完整、复杂的场景,包括室内和室外的背景,并且具有较大的深度复杂性。

3 OVERVIEW

我们方法的输入是一组静态场景的图像,以及由 SfM [Schönberger 和 Frahm 2016] 校准的相应相机,这会产生稀疏点云作为副作用。从这些点出发,我们创建了一组 3D 高斯(第 4 节),由位置(均值)、协方差矩阵和不透明度 α \alpha α定义,这允许非常灵活的优化机制。这导致了 3D 场景的相当紧凑的表示,部分原因是高度各向异性的体积图(anisotropic volumetric splats)可以用来紧凑地表示精细结构。辐射场的方向外观分量(颜色)通过球谐函数 (SH) 表示,遵循标准实践 [Fridovich-Keil 和 Yu 等人。 2022 年;穆勒等人。 2022]。我们的算法继续通过 3D 高斯参数的一系列优化步骤(即位置、协方差和 SH 系数)与高斯密度自适应控制的操作交织来创建辐射场表示**(第 5 节)**。我们方法效率的关键是基于图块的光栅化器(第 6 节),它允许 α − \alpha - α混合各向异性图块,通过快速排序尊重可见性顺序。快速光栅化器还包括通过跟踪累积 α \alpha α值的快速向后传递,而对可以接收梯度的高斯数量没有限制。我们的方法的 概述如图2所示
在这里插入图片描述

4 DIFFERENTIABLE 3D GAUSSIAN SPLATTING

我们的目标是优化场景表示,从一组没有法线(normals)的稀疏 (SfM) 点开始,实现高质量的新颖视图合成。为此,我们需要一个基元(primitive),它继承可微分体积表示的属性,同时是非结构化和显式的,以允许非常快速的渲染。我们选择 3D 高斯,它是可微分的,可以轻松投影到 2D splats,从而实现快速 α − \alpha - α混合渲染。

我们的表示与以前使用 2D 点的方法有相似之处 [Kopanas 等人。 2021 年;一帆等人。 2019]并假设每个点都是一个具有法线的小平面圆。鉴于 SfM 点极其稀疏,很难估计法线。同样,从这样的估计中优化非常嘈杂的法线将非常具有挑战性。
相反,我们将几何体建模为一组不需要法线的 3D 高斯函数。我们的高斯由在世界空间中定义的完整 3D 协方差矩阵 Σ \Sigma Σ 定义\cite{zwicker2001ewa} 以点(平均值) μ \mu μ 为中心:
G ( x ) = e − 1 2 ( x ) T Σ − 1 ( x ) \begin{equation} G(x)~= e^{-\frac{1}{2}(x)^{T}\Sigma^{-1}(x)} \end{equation} G(x) =e21(x)TΣ1(x)
\CORRECTION{并且 ∣ Σ ∣ |\Sigma| ∣Σ∣ Σ \Sigma Σ 的行列式, Σ \Sigma Σ 是对称 3 × \times × 3 矩阵}{}。在我们的混合过程中,该高斯乘以 α \alpha α

然而,我们需要将 3D 高斯投影到 2D 进行渲染。
茨威克等人。 \shortcite{zwicker2001ewa} 演示如何对图像空间进行投影。给定一个视图变换 W W W
相机坐标中的协方差矩阵 Σ ′ \Sigma' Σ 给出如下:
Σ ′ = J W Σ W T J T \begin{equation} \Sigma' = J W ~\Sigma ~W ^{T}J^{T} \end{equation} Σ=JW Σ WTJT其中 J J J 是射影变换(projective transformation)的仿射近似( affine approximation)的雅可比行列式。 {Zwicker 等人。 \shortcite{zwicker2001ewa}} 还表明,如果我们跳过 Σ ′ \Sigma' Σ 的第三行和第三列,
我们获得了一个 2 × \times × 2 方差矩阵,其结构和属性与我们从法线的平面点(planar points)开始一样,如之前的工作\cite{kopanas21}。

一个明显的方法是直接优化协方差矩阵 Σ \Sigma Σ 以获得表示辐射场的 3D 高斯分布。然而,协方差矩阵仅在半正定时(positive semi-definite)才具有物理意义。
为了优化所有参数,我们使用梯度下降,它不能轻易地被约束来产生这样的有效矩阵,并且更新步骤和梯度可以很容易地创建无效的协方差矩阵。

因此,我们选择了一种更直观、但同样具有表达能力的表示方式来进行优化。
3D 高斯的协方差矩阵 Σ \Sigma Σ 类似于描述椭球体(ellipsoid)的配置。
给定一个缩放矩阵 S S S和旋转矩阵 R R R,我们可以找到对应的 Σ \Sigma Σ
Σ = R S S T R T \begin{equation} \Sigma = RSS^TR^T \end{equation} Σ=RSSTRT
为了允许对这两个因素进行独立优化,我们将它们分开存储:用于缩放的 3D 向量 s s s 和表示旋转的四元数 q q q。这些可以简单地转换为各自的矩阵并组合,确保标准化 q q q 以获得有效的单位四元数(unit quaternion)。

为了避免训练过程中自动微分带来的巨大开销,我们显式地导出所有参数的梯度。精确导数计算的详细信息在附录A中。
\CORRECTION{接下来我们讨论 3D 高斯的缩放和旋转(即形状)的具体情况。}{}
\CORRECTION{可微分渲染器输出
2 × 2 2\times2 2×2 屏幕空间协方差矩阵 Σ ′ \Sigma' Σ
给定损失的梯度 d L d Σ ′ \frac{dL}{d\Sigma'} dΣdL
我们假设它是可微渲染器的输出,
我们可以应用链式法则来计算梯度并传播损失。}{}

这种各向异性协方差的表示(适合优化)允许我们优化 3D 高斯以适应捕获场景中不同形状的几何形状,从而产生相当紧凑的表示。
图3说明了这种情况。
在这里插入图片描述

我们通过将优化后的 3D 高斯缩小 60%(最右侧)来可视化。这清楚地显示了优化后紧凑地表示复杂几何形状的 3D 高斯的各向异性形状。留下了实际渲染的图像。

5 OPTIMIZATION WITH ADAPTIVE DENSITY CONTROL OF 3D GAUSSIANS

我们方法的核心是优化步骤,它创建一组密集的 3D 高斯函数,准确地表示自由视图合成的场景。
除了位置 p p p α \alpha α 和协方差 Σ \Sigma Σ 之外,我们还优化表示每个高斯颜色 c c c 的 SH 系数,以正确捕获场景的视图相关外观。
这些参数的优化与控制高斯密度的步骤交织在一起,以更好地表示场景。

5.1 Optimization

优化基于渲染的连续迭代并将生成的图像与捕获的数据集中的训练视图进行比较。由于 3D 到 2D 投影的模糊性,几何图形不可避免地可能会被错误放置。因此,我们的优化需要能够 create 几何体,并且还能够 destroymove 几何体(如果其位置不正确)。 3D 高斯协方差参数的质量对于表示的紧凑性至关重要,因为可以用少量大的各向异性高斯函数捕获大的均匀区域。

我们使用随机梯度下降技术进行优化,充分利用标准 GPU 加速框架,以及为某些操作添加自定义 CUDA 内核的能力,遵循最近的最佳实践\cite{plenoxels,dvgo- CVPR2022}。特别是,我们的快速光栅化(参见 Sec.6)对于优化的效率至关重要,因为它是优化的主要计算瓶颈。

我们对 α \alpha α 使用 sigmoid 激活函数将其限制在 [ 0 − 1 ) [0-1) [01) 范围内并获得平滑梯度,出于类似的原因,我们对协方差尺度使用指数激活函数。

我们将初始协方差矩阵估计为具有轴的各向同性高斯矩阵等于到最近的三个点的距离的平均值。
我们使用类似于 Plenoxels \cite{plenoxels} 的标准指数衰减调度技术,但仅适用于位置。损失函数是 L 1 \mathcal{L}_1 L1 与 D-SSIM 项的结合:
L = ( 1 − λ ) L 1 + λ L D-SSIM \begin{equation} \mathcal{L} = (1 - \lambda) \mathcal{L}_1 + \lambda \mathcal{L_{\textrm{D-SSIM}}} \end{equation} L=(1λ)L1+λLD-SSIM我们在所有测试中都使用 λ = 0.2 \lambda~=~0.2 λ = 0.2
我们在 Sec.7.1 中提供了learning schedule和其他元素的详细信息。

5.2 Adaptive Control of Gaussians

我们从 SfM 的初始稀疏点集开始,然后应用我们的方法自适应控制高斯的数量及其在单位体积上的密度,允许我们从最初的稀疏高斯集变为更密集的集,以更好地表示场景并具有正确的参数。优化预热后(参见第 7.1 节),我们每 100 次迭代进行一次致密化,并删除任何本质上透明的(transparent)高斯分布,即 α \alpha α 小于阈值 ϵ α \epsilon_{\alpha } ϵα 的高斯分布。
\footnote{当然,高斯密度不应与 NeRF 文献中的密度 σ \sigma σ混淆。}

我们对高斯的自适应控制需要填充(populate)空白区域。它重点关注缺少几何特征的区域(“重建不足”),但也关注高斯覆盖场景中大面积的区域(通常对应于“过度重建”)。
我们观察到两者都有 large 视图空间位置梯度。
直观上,这可能是因为它们对应于尚未很好重建的区域,并且优化尝试移动高斯来纠正这一点。

由于这两种情况都是致密化(densification)的良好候选者,所以我们使用高于阈值~ τ pos \tau_{\textrm{pos}} τpos 的视空间位置梯度的平均幅度来致密高斯,我们在测试中将其设置为 0.0002 0.0002 0.0002

接下来我们介绍这个过程的细节,如图4所示。
在这里插入图片描述

我们的自适应高斯致密化方案。顶行(重建不足):当小规模几何体(黑色轮廓)未被充分覆盖时,我们克隆相应的高斯。底行(过度重建):如果小规模几何体由一个大的板表示,我们将其分成两部分。

对于重建不足区域中的小高斯,我们需要覆盖必须创建的新几何形状。
为此,最好通过简单地创建相同大小的副本并将其沿位置梯度的方向移动来克隆高斯。

另一方面,具有高方差的区域中的大高斯需要被分割成更小的高斯。我们用两个新的来替换这些高斯,并将它们的尺度除以我们通过实验确定的系数 ϕ = 1.6 \phi~=~1.6 ϕ = 1.6 。我们还通过使用原始 3D 高斯作为 PDF 进行采样来初始化它们的位置。

在第一种情况下,我们检测并处理增加系统总体积和高斯数量的需要,而在第二种情况下,我们保留总体积但增加高斯数量。
与其他体积表示类似,我们的优化可能会因靠近输入摄像机的浮动体而陷入困境;在我们的例子中,这可能会导致高斯密度的不合理增加。
缓和高斯数量的增加的有效方法是每 N = 3000 N=3000 N=3000 迭代将 α \alpha α 值设置为接近于零。然后,优化会在需要时增加高斯函数的 α \alpha α,同时允许我们的剔除(culling )方法删除 α \alpha α 小于 ϵ α \epsilon_{\alpha} ϵα 的高斯函数,如上所述。 高斯可能会缩小或增长,并且与其他高斯有相当大的重叠,但我们会定期(periodically)删除在世界空间中非常大的高斯以及在视空间中具有较大足迹的高斯。该策略可以总体上很好地控制高斯总数。
我们模型中的高斯始终在欧几里得空间中保持原语;与其他方法不同[Barron 等人。 2022 年;弗里多维奇-凯尔和于等人。 2022],我们不需要针对远距离或大高斯的空间压缩、扭曲或投影策略。

6 FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS

我们的目标是实现快速的整体渲染和快速排序,以允许近似的 α \alpha α 混合——包括各向异性的 splats——并避免对可以接收先前工作中存在的梯度的 splats 数量的硬性限制 \cite {拉斯纳_2021_CVPR}。

为了实现这些目标,我们受最新软件光栅化方法的启发,为高斯图设计了一个基于图块的光栅化器 \cite{Lassner_2021_CVPR},一次对整个图像的基元进行预排序,避免了对每个像素进行排序的费用,这会阻碍之前的排序 α \alpha α-混合解决方案 \cite{kopanas21,kopanas22}。我们的快速光栅化器允许在任意数量的混合高斯上进行有效的反向传播,并且附加内存消耗低,每个像素只需要恒定的开销。
我们的光栅化管道是完全可微分的,并且给定到 2D 的投影(Sec.4)可以对各向异性 splats 进行光栅化,类似于之前的 2D splatting 方法 \cite{kopanas21}。

我们的方法首先将屏幕分割成 16 × \times × 16 个图块,然后根据视锥体(view frustum)和每个图块( tile)剔除 3D 高斯。
具体来说,我们只保留与视锥体相交的置信区间为 99 % 的高斯分布。
此外,我们使用保护带来简单地拒绝极端位置(即那些均值接近近平面且远离视锥体的位置)的高斯分布,因为计算它们的投影 2D 协方差将不稳定。
然后,我们根据每个高斯重叠的图块数量来实例化它们,并为每个实例分配一个结合了视图空间深度和图块 ID 的键。然后,我们使用单个快速 GPU 基数排序(Radix sor)基于这些键对高斯进行排序 \cite{merrill2010revisiting}。
请注意,没有额外的每像素点排序,并且混合是基于此初始排序执行的。 因此,我们的 α \alpha α 混合在某些配置中可以是近似的。
然而,当图块接近单个像素的大小时,这些近似值变得可以忽略不计。我们发现这种选择极大地增强了训练和渲染性能,而不会在融合场景中产生可见的伪影。

对高斯进行排序后,我们通过识别第一个和最后一个映射到给定图块的深度排序条目来为每个图块生成一个列表。对于光栅化,我们为每个图块启动一个线程块。每个块首先协作地将 Gaussians 数据包加载到共享内存中,然后对于给定像素,通过从前到后遍历列表来累积颜色和 α \alpha α 值,从而最大化并行性增益两者都用于数据加载/共享和处理。
当我们达到像素中 α \alpha α 的目标饱和度时,相应的线程就会停止。每隔一段时间,就会查询图块中的线程,并且当所有像素都饱和时(即 α \alpha α 变为 1),整个图块的处理就会终止。 %
附录C中给出了排序的详细信息和总体光栅化方法的高级概述。

在光栅化过程中, α \alpha α 的饱和度是唯一的停止标准。与之前的工作相比,我们不限制接收梯度更新的混合基元的数量。我们强制执行此属性,以允许我们的方法处理具有任意、不同深度复杂性的场景并准确地学习它们,而不必求助于特定于场景的超参数调整。
因此,在后向传递过程中,我们必须恢复前向传递中每个像素的混合点的完整序列。一种解决方案是在全局内存中存储任意长的每个像素的混合点列表 \cite{kopanas21}。为了避免隐含的动态内存管理开销,我们选择再次遍历每个图块列表;我们可以重用前向传递中的高斯排序数组和平铺范围。为了便于梯度计算,我们现在从后到前遍历它们。

遍历从影响图块中任何像素的最后一个点开始,并且再次将点加载到共享内存中协同发生。此外,如果每个像素的深度低于或等于前向传递过程中对其颜色有贡献的最后一个点的深度,则每个像素只会开始(昂贵的)点重叠测试和处理。
Sec.4 中描述的梯度计算需要原始混合过程中每个步骤的累积不透明度值。
我们可以通过在前向传递结束时仅存储累积的总不透明度来恢复这些中间不透明度,而不是在后向传递中遍历逐渐缩小的不透明度的显式列表
具体来说,每个点存储的是前向过程中最终累积的不透明度 α \alpha α;我们在从后到前的遍历中将其除以每个点的 α \alpha α 以获得梯度计算所需的系数。

7 IMPLEMENTATION, RESULTS AND EVALUATION

接下来我们讨论一些实现细节、当前结果以及与之前的工作和消融研究相比对我们算法的评估。

7.1 Implementation

我们使用 PyTorch 框架在 Python 中实现了我们的方法,并编写了用于光栅化的自定义 CUDA 内核,它们是以前方法的扩展版本 \cite{kopanas21},并使用 NVIDIA CUB 排序例程进行快速基数排序 \cite{merrill2010revisiting}。
我们还使用开源 SIBR \cite{sibr2020} 构建了一个交互式查看器,用于交互式查看。 {我们使用此实现来测量我们实现的帧速率}。
源代码和我们的所有数据均可在以下位置获取:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting

Optimization Details. 为了稳定性,我们以较低的分辨率“预热”计算。具体来说,我们使用 4 倍小的图像分辨率开始优化,并在 250 次和 500 次迭代后上采样两次。
SH 系数优化对角度信息的缺乏很敏感。对于典型的“类似 NeRF”通过在其周围的整个半球拍摄的照片来捕捉中心物体的观察位置,优化效果很好。
但是,如果捕获丢失了角度区域(例如,当捕获场景的角落或执行“由内而外” \cite{HRDB16} 捕获时)SH 的零阶分量的值完全不正确(即,基础颜色或漫反射颜色)可以通过优化产生。
为了克服这个问题,我们首先仅优化零阶分量,然后每 1000 次迭代后引入一个 SH 频带,直到表示所有 4 个 SH 频带。

7.2 Results and Evaluation

Results. 我们在总共 13 个真实场景上测试了我们的算法,这些场景取自之前发布的数据集和合成 Blender 数据集 [Mildenhall 等人。 2020]。特别是,我们在 Mip-Nerf360 中呈现的全套场景上测试了我们的方法 [Barron 等人。 2022],这是 NeRF 渲染质量的当前SOTA技术水平,来自 Tanks&Temples 数据集 [2017] 的两个场景和 Hedman 等人提供的两个场景。 [赫德曼等人。 2018]。我们选择的场景具有非常不同的捕捉风格,并且涵盖有界的室内场景和大型无界的室外环境。我们在评估中对所有实验使用相同的超参数配置。所有结果均报告在 A6000 GPU 上运行,Mip-NeRF360 方法除外(见下文)。

在补充中,我们显示了包含远离输入照片的视图的精选场景的渲染视频路径。

Real-World Scenes. 就质量而言,当前最先进的是 Mip-Nerf360 [Barron 等人。 2021]。我们将此方法作为质量基准进行比较。我们还与两种最新的快速 NeRF 方法进行比较:InstantNGP [Müller 等人。 2022] 和 Plenoxels [Fridovich-Keil 和 Yu 等人。 2022]。

我们对数据集使用训练/测试分割,使用 Mip-NeRF360 建议的方法,每 8 张照片进行测试,以进行一致且有意义的比较,以生成误差指标,并使用所使用的标准 PSNR、L-PIPS 和 SSIM 指标最常见于文献中;请参阅Tab.1。表中的所有数字均来自我们自己运行的作者之前所有方法的代码,除了 Mip-NeRF360 在其数据集上的数字,我们从原始出版物中复制了数字,以避免对当前的 SOTA 产生混淆。
对于图中的图像,我们使用了我们自己的 Mip-NeRF360 运行:这些运行的数字在附录 D 中。
我们还显示了平均训练时间、渲染速度以及用于存储优化参数的内存。我们报告了运行 35K 次迭代的 InstantNGP (Base) 基本配置以及作者建议的稍大的网络 (Big) 的结果,以及我们的两种配置(7K 和 30K 迭代)的结果。
我们在图6中展示了两种配置的视觉质量差异。在许多情况下,7K 迭代的质量已经相当不错了。
在这里插入图片描述

在这里插入图片描述

对于某些场景(上图),我们可以看到,即使在 7K 次迭代(该场景约 5 分钟)下,我们的方法也能很好地捕获列车。在 30K 次迭代(~35 分钟)时,背景伪影已显着减少。对于其他场景(如下),差异几乎不可见; 7K 迭代(∼8 分钟)已经是非常高质量的了。

训练时间因数据集而异,我们单独报告。请注意,图像分辨率也因数据集而异。在项目网站中,我们提供了用于计算所有场景上所有方法(我们的和以前的工作)的统计数据的测试视图的所有渲染。请注意,我们保留了所有渲染的本机输入分辨率。

该表显示,我们的完全融合模型的质量与 SOTA Mip-NeRF360 方法相当,有时甚至略好;请注意,在相同的硬件上,他们的平均训练时间为 48 小时(),而我们的训练时间为 35-45 分钟,并且他们的渲染时间为 10 秒/帧。经过 5-10m 的训练后,我们达到了与 InstantNGP 和 Plenoxels 相当的质量,但额外的训练时间使我们能够达到 SOTA 质量,而其他快速方法则不然。对于 Tanks & Temples,我们在相似的训练时间(在我们的案例中约为 7 分钟)内实现了与基本 InstantNGP 相似的质量。

我们在 4-GPU A100 节点上训练 Mip-NeRF360 12 小时,相当于在单个 GPU 上训练 48 小时。请注意,A100 GPU 比 A6000 GPU 更快。

我们还在图 5 中展示了我们的留出测试视图和之前选择用于比较的渲染方法的视觉结果;我们的方法的结果是 30K 次训练迭代的结果。我们发现,在某些情况下,甚至 Mip-NeRF360 也存在我们的方法避免的残留伪影(例如,自行车、树桩中或房间墙壁上的植被模糊)。在补充视频和网页中,我们提供了远距离路径的比较。我们的方法倾向于保留覆盖良好的区域的视觉细节,即使是从远处看,这对于以前的方法来说并不总是如此。
在这里插入图片描述
在这里插入图片描述

我们展示了我们的方法与之前的方法以及来自测试视图的相应地面实况图像的比较。这些场景从上到下分别是:来自 Mip-NeRF360 数据集的自行车、花园、树桩、柜台和房间; Playroom,来自深度混合数据集的 DrJohnson [Hedman 等人。 2018] 以及 Tanks&Temples 的卡车和火车。箭头/插图突出显示质量上不明显的差异。

Synthetic Bounded Scenes. 除了现实场景之外,我们还在合成 Blender 数据集 \cite{mildenhall2020nerf} 上评估我们的方法。所讨论的场景提供了一组详尽的视图,尺寸有限,并提供了精确的相机参数。在这种情况下,即使使用随机初始化,我们也可以实现最先进的结果:我们从包围场景边界的体积内的 100K 均匀随机高斯函数开始训练。我们的方法可以快速、自动地将它们修剪为大约 6–10K 有意义的高斯。经过 30K 次迭代后,训练模型的最终大小达到每个场景约 200–500K 高斯。我们在 Tab.2中报告并比较我们获得的 PSNR 分数与以前的方法,使用白色背景以实现兼容性。示例可以在Fig.10(左起第二张图片)和补充材料中看到。 经过训练的合成场景以 180–300 FPS 渲染。
在这里插入图片描述
在这里插入图片描述

Compactness. 与之前的显式场景表示相比,我们优化中使用的各向异性高斯能够使用较少数量的参数来建模复杂的形状。我们通过根据 [Zhang 等人获得的高度紧凑的、基于点的模型] 评估我们的方法来展示这一点。 2022]。我们从他们的初始点云开始,该点云是通过使用前景掩模进行空间雕刻获得的,并进行优化,直到我们与他们报告的 PSNR 分数持平。这通常会在 2-4 分钟内发生。我们使用大约四分之一的点数来超越他们报告的指标,导致平均模型大小为 3.8 MB,而不是他们的 9 MB。我们注意到,在这个实验中,我们只使用了两度的球谐函数,与他们的相似。

7.3 Ablations

我们隔离了我们做出的不同贡献和算法选择,并构建了一组实验来衡量它们的效果。具体来说,我们测试了算法的以下方面:SfM 的初始化、我们的致密化策略、各向异性协方差、我们允许无限数量的图块具有梯度的事实以及球谐函数的使用。表 3 总结了每种选择的定量影响。在这里插入图片描述
Initialization from SfM. 我们还评估了从 SfM 点云初始化 3D 高斯的重要性。对于这种消融,我们对一个大小等于输入相机边界框范围三倍的立方体进行均匀采样。我们观察到我们的方法表现相对较好,即使没有 SfM 点也避免了完全失败。相反,它主要在背景中退化,见图 7。此外,在训练视图没有很好覆盖的区域中,随机初始化方法似乎有更多无法通过优化去除的漂浮物。另一方面,合成 NeRF 数据集没有这种行为,因为它没有背景并且受到输入摄像机的良好约束(请参见上面的讨论)。
在这里插入图片描述
Densification. 接下来我们评估我们的两种致密化方法,更具体地说是第 5 节中描述的克隆和分割(clone and split)策略。 我们分别禁用每个方法,并使用该方法的其余部分不变进行优化。结果表明,分割大高斯对于实​​现背景的良好重建非常重要,如图 8 所示,而克隆小高斯而不是分割它们可以实现更好更快的收敛,尤其是当场景中出现薄结构时。
在这里插入图片描述
Unlimited depth complexity of splats with gradients. 我们评估在 N N N 最前面的点之后跳过梯度计算是否会在不牺牲质量的情况下提高速度,如 Pulsar \cite{Lassner_2021_CVPR} 中所建议的。在本次测试中,我们选择N=10,比~Pulsar中的默认值高两倍,但由于梯度计算中的严重近似,导致优化不稳定。对于 Truck 场景,PSNR 质量下降了 11dB(参见表 3,Limited-BW),而 Garden 的视觉结果如图 9 所示。
在这里插入图片描述
Anisotropic Covariance. 我们的方法中一个重要的算法选择是 3D 高斯的完整协方差矩阵的优化。为了演示此选择的效果,我们执行消融,通过优化控制所有三个轴上 3D 高斯半径的单个标量值来消除各向异性。这种优化的结果如图 10 所示。我们观察到,各向异性显着提高了 3D 高斯与表面对齐的能力的质量,这反过来又允许在保持相同数量的点的同时实现更高的渲染质量。
在这里插入图片描述

Spherical Harmonics. 最后,球谐函数的使用提高了我们的整体 PSNR 分数,因为它们补偿了视图相关的影响(表 3)。

7.4 Limitations

我们的方法并非没有局限性。在场景观察不佳的区域,我们会出现伪影;在这些区域,其他方法也很困难(例如图 11 中的 Mip-NeRF360)。尽管各向异性高斯函数具有如上所述的许多优点,但我们的方法可以创建拉长的伪影或“斑点”高斯函数(见图 12);同样,以前的方法在这些情况下也很困难。
在这里插入图片描述
在这里插入图片描述
当我们的优化产生较大的高斯分布时,我们偶尔也会出现突出的伪影;这往往发生在外观依赖于视图的区域。这些弹出伪影的原因之一是通过光栅化器中的保护带对高斯函数进行了微不足道的拒绝。更有原则的剔除方法将减轻这些伪影。另一个因素是我们简单的可见性算法,这可能导致高斯突然切换深度/混合顺序。这个问题可以通过抗锯齿来解决,我们将其留作未来的工作。此外,我们目前没有对我们的优化应用任何正则化;这样做将有助于处理看不见的区域和弹出的伪影。

虽然我们使用相同的超参数进行全面评估,但早期实验表明,为了在非常大的场景(例如城市数据集)中收敛,降低位置学习率可能是必要的。

尽管与以前的基于点的方法相比,我们非常紧凑,但我们的内存消耗明显高于基于 NeRF 的解决方案。在大型场景的训练过程中,在我们未经优化的原型中,峰值 GPU 内存消耗可能超过 20 GB。然而,通过仔细的低级优化逻辑实现(类似于 InstantNGP),这个数字可以显着减少。渲染经过训练的场景需要足够的 GPU 内存来存储完整模型(大型场景需要数百兆字节),并需要额外的 30-500 MB 内存用于光栅化器,具体取决于场景大小和图像分辨率。我们注意到,有很多机会可以进一步减少我们方法的内存消耗。点云压缩技术是一个经过充分研究的领域 [De Queiroz and Chou 2016];看看这些方法如何适应我们的代表将会很有趣。

8 DISCUSSION AND CONCLUSIONS

我们提出了第一种真正允许在各种场景和捕捉风格中进行实时、高质量辐射场渲染的方法,同时需要与之前最快的方法相媲美的训练时间。

我们选择的 3D 高斯基元保留了体积渲染的属性以进行优化,同时直接允许快速基于 splat 的光栅化。我们的工作表明,与广泛接受的观点相反,连续表示对于快速、高质量的辐射场训练来说并不是严格必要的。

我们的大部分(∼80%)训练时间都花在 Python 代码上,因为我们在 PyTorch 中构建了我们的解决方案,以便其他人可以轻松使用我们的方法。仅光栅化例程被实现为优化的 CUDA 内核。我们期望将剩余的优化完全移植到 CUDA,例如在 InstantNGP 中完成的[Müller 等人。 2022],可以使性能至关重要的应用程序进一步显着加速。

我们还展示了基于实时渲染原理、利用 GPU 的强大功能和软件光栅化管道架构的速度的重要性。这些设计选择是训练和实时渲染性能的关键,与以前的体积光线行进相比,在性能上具有竞争优势。

看看我们的高斯是否可以用于对捕获的场景进行网格重建,这将是很有趣的。除了考虑到网格的广泛使用的实际意义之外,这将使我们能够更好地理解我们的方法在体积表示和表面表示之间的连续体中到底处于什么位置。

总之,我们提出了第一个针对辐射场的实时渲染解决方案,其渲染质量可与之前最昂贵的方法相匹配,并且训练时间可与最快的现有解决方案相媲美。

A DETAILS OF GRADIENT COMPUTATION

回想一下, Σ \Sigma Σ/ Σ ′ \Sigma' Σ 是高斯的世界/视图空间协方差矩阵, q q q 是旋转, s s s 是缩放, W W W 是视图变换, J J J 是射影变换的仿射近似的雅可比行列式。
我们可以应用链式法则来求缩放和旋转的导数:
d Σ ′ d s = d Σ ′ d Σ d Σ d s \begin{equation} \frac{d\Sigma'}{ds} = \frac{d\Sigma'}{d\Sigma}\frac{d\Sigma}{ds} \end{equation} dsdΣ=dΣdΣdsdΣ
and
d Σ ′ d q = d Σ ′ d Σ d Σ d q \begin{equation} \frac{d\Sigma'}{dq} = \frac{d\Sigma'}{d\Sigma}\frac{d\Sigma}{dq} \end{equation} dqdΣ=dΣdΣdqdΣ
使用 U = J W U = JW U=JW Σ ′ \Sigma' Σ 简化方程 5 , Σ ′ \Sigma' Σ U Σ U T U \Sigma U^T UΣUT 的(对称)左上角 2 × 2 2\times2 2×2 矩阵,表示矩阵元素通过下标,我们可以求出偏导数
∂ Σ ′ ∂ Σ i j = ( U 1 , i U 1 , j U 1 , i U 2 , j U 1 , j U 2 , i U 2 , i U 2 , j ) \frac{\partial \Sigma'}{\partial \Sigma_{ij}} = \left(\begin{smallmatrix} U_{1,i}U_{1,j} & U_{1,i} U_{2,j}\\ U_{1,j} U_{2,i} & U_{2,i}U_{2,j} \end{smallmatrix}\right) ΣijΣ=(U1,iU1,jU1,jU2,iU1,iU2,jU2,iU2,j)

接下来,我们求导数 d Σ d s \frac{d\Sigma}{ds} dsdΣ d Σ d q \frac{d\Sigma}{dq} dqdΣ。由于 Σ = R S S T R T \Sigma = RSS^TR^T Σ=RSSTRT,我们可以计算 M = R S M = RS M=RS并重写 Σ = M M T \Sigma = MM^T Σ=MMT。因此,我们可以写成 d Σ d s = d Σ d M d M d s \frac{d\Sigma}{ds} = \frac{d\Sigma}{dM} \frac{dM}{ds} dsdΣ=dMdΣdsdM d Σ d q = d Σ d M d M d q \frac{d\Sigma}{dq} = \frac{d\Sigma}{dM} \frac{dM}{dq} dqdΣ=dMdΣdqdM。由于协方差矩阵 Σ \Sigma Σ (及其梯度)是对称的,因此共享的第一部分可以通过 d Σ d M = 2 M T \frac{d\Sigma}{dM} = 2M^T dMdΣ=2MT 紧凑地找到。为了缩放,我们进一步有
∂ M i , j ∂ s k = { R i , k if j = k 0 otherwise } \frac{\partial M_{i,j}}{\partial s_k} = \left\{\begin{array}{lr} R_{i,k} & \text{if j = k}\\ 0 & \text{otherwise} \end{array}\right\} skMi,j={Ri,k0if j = kotherwise}
为了导出旋转梯度,我们回顾从实部 q r q_r qr 和虚部 q i 、 q j 、 q k q_i、q_j、q_k qiqjqk 到旋转矩阵 R R R 的单位四元数 q q q 的转换:
R ( q ) = 2 ( 1 2 − ( q j 2 + q k 2 ) ( q i q j − q r q k ) ( q i q k + q r q j ) ( q i q j + q r q k ) 1 2 − ( q i 2 + q k 2 ) ( q j q k − q r q i ) ( q i q k − q r q j ) ( q j q k + q r q i ) 1 2 − ( q i 2 + q j 2 ) ) \begin{equation} R(q) = 2\begin{pmatrix} \frac{1}{2} - (q_j^2 + q_k^2) & (q_i q_j - q_r q_k) & (q_i q_k + q_r q_j)\\ (q_i q_j + q_r q_k) & \frac{1}{2} - (q_i^2 + q_k^2) & (q_j q_k - q_r q_i)\\ (q_i q_k - q_r q_j) & (q_j q_k + q_r q_i) & \frac{1}{2} - (q_i^2 + q_j^2) \end{pmatrix} \end{equation} R(q)=2 21(qj2+qk2)(qiqj+qrqk)(qiqkqrqj)(qiqjqrqk)21(qi2+qk2)(qjqk+qrqi)(qiqk+qrqj)(qjqkqrqi)21(qi2+qj2)
结果,我们发现 q q q 的分量具有以下梯度:
∂ M ∂ q r = 2 ( 0 − s y q k s z q j s x q k 0 − s z q i − s x q j s y q i 0 ) , ∂ M ∂ q i = 2 ( 0 s y q j s z q k s x q j − 2 s y q i − s z q r s x q k s y q r − 2 s z q i ) ∂ M ∂ q j = 2 ( − 2 s x q j s y q i s z q r s x q i 0 s z q k − s x q r s y q k − 2 s z q j ) , ∂ M ∂ q k = 2 ( − 2 s x q k − s y q r s z q i s x q r − 2 s y q k s z q j s x q i s y q j 0 ) \begin{equation} \begin{aligned} &\frac{\partial M}{\partial q_r} = 2 \left(\begin{smallmatrix} 0 & -s_y q_k & s_z q_j\\ s_x q_k & 0 & -s_z q_i\\ -s_x q_j & s_y q_i & 0 \end{smallmatrix}\right), &\frac{\partial M}{\partial q_i} = 2\left(\begin{smallmatrix} 0 & s_y q_j & s_z q_k\\ s_x q_j & -2 s_y q_i & -s_z q_r\\ s_x q_k & s_y q_r & -2 s_z q_i \end{smallmatrix}\right) \\ &\frac{\partial M}{\partial q_j} = 2\left(\begin{smallmatrix} -2 s_x q_j & s_y q_i & s_z q_r\\ s_x q_i & 0 & s_z q_k\\ -s_x q_r & s_y q_k & -2s_z q_j \end{smallmatrix}\right), &\frac{\partial M}{\partial q_k} = 2\left(\begin{smallmatrix} -2 s_x q_k & -s_y q_r & s_z q_i\\ s_x q_r & -2s_y q_k & s_z q_j\\ s_x q_i & s_y q_j & 0 \end{smallmatrix}\right) \end{aligned} \end{equation} qrM=2(0sxqksxqjsyqk0syqiszqjszqi0),qjM=2(2sxqjsxqisxqrsyqi0syqkszqrszqk2szqj),qiM=2(0sxqjsxqksyqj2syqisyqrszqkszqr2szqi)qkM=2(2sxqksxqrsxqisyqr2syqksyqjszqiszqj0)
导出四元数归一化的梯度很简单。

B OPTIMIZATION AND DENSIFICATION ALGORITHM

算法 1 总结了我们的优化和致密化算法。
在这里插入图片描述

C DETAILS OF THE RASTERIZER

Sorting. 我们的设计基于小 splats 高负载的假设,并且我们通过在开始时使用基数排序对每个帧对 splats 进行一次排序来对此进行优化。我们将屏幕分成 16x16 像素图块(或箱)。我们通过实例化每个重叠的 16×16 图块中的每个 splat 来创建每个图块的 splat 列表。这导致处理的高斯数适度增加,但通过更简单的控制流和优化的 GPU 基数排序的高并行性来摊销 [Merrill 和 Grimshaw 2010]。我们为每个 splats 实例分配一个最多 64 位的密钥,其中较低的 32 位编码其投影深度,较高的位编码重叠图块的索引。索引的确切大小取决于有多少块适合当前分辨率。因此,与单个基数排序并行地直接解决所有图块的深度排序。
排序之后,我们可以通过识别具有相同瓦片 ID 的排序数组中范围的开始和结束来有效地生成要处理的每个瓦片列表。这是并行完成的,每个 64 位数组元素启动一个线程来将其高 32 位与其两个邻居进行比较。与 [Lassner 和 Zollhofer 2021] 相比,我们的光栅化完全消除了顺序基元处理步骤,并生成更紧凑的每图块列表以在前向传递期间遍历。我们在算法 2 中展示了光栅化方法的高级概述。
在这里插入图片描述
Numerical stability. 在后向传递过程中,我们通过重复地将前向传递中累积的不透明度除以每个高斯的 α \alpha α 来重建梯度计算所需的中间不透明度值。简单地实现,这个过程很容易出现数值不稳定(例如,除以 0)。为了解决这个问题,在前向和后向传递中,我们跳过任何混合更新 α < ϵ \alpha < \epsilon α<ϵ (我们选择 ϵ \epsilon ϵ 1 255 \frac{1}{255} 2551),并用上面的 0.99 0.99 0.99 钳制 α \alpha α。最后,在前向光栅化通道中包含高斯之前,我们计算累积的不透明度(如果我们要包含它)并在其超过 0.9999 之前停止前后混合。

D PER-SCENE ERROR METRICS

表 4-9 列出了我们对所有考虑的技术和现实场景进行评估时收集的各种错误指标。我们列出了复制的 Mip-NeRF360 编号以及用于生成论文中图像的运行的编号;整个 Mip-NeRF360 数据集的平均值为 PSNR 27.58、SSIM 0.790 和 LPIPS 0.240。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering 一、前言Abstract1 INTRODUCTION2 RELATED WORK2.1 Traditional Scene Reconstruction and Rendering2.2 Neural Rendering and Radiance Fields2.3 Point-Based Rendering and Radiance Fields 3 O…...

【TB作品】atmega16 计算器,ATMEGA16单片机,Proteus仿真

实验报告&#xff1a;基于ATmega16单片机的简易计算器设计 1. 实验背景 计算器是日常生活和工作中不可或缺的工具&#xff0c;通过按键输入即可实现基本的四则运算。通过本实验&#xff0c;我们将利用ATmega16单片机、矩阵键盘和LCD1602显示屏&#xff0c;设计并实现一个简易…...

C++的IO流操作

文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…...

MacOS升级指定Python版本的pip

场景&#xff1a; 系统默认是Python2.7&#xff0c;已经通过brew install python3.11 python3.12安装了多个版本的Python 执行&#xff1a;pip --version pip 24.1 from /Users/mac10.12/Library/Python/3.11/lib/python/site-packages/pip (python 3.11) 用的是Python3.11…...

音频Balance源码总结

音频Balance源码总结 何为音频Balance&#xff1f; 顾名思义&#xff0c;Balance及平衡&#xff0c;平衡也就是涉及多方&#xff0c;音频左右甚至四通道&#xff0c;调节所有通道的音量比&#xff0c;使用户在空间内听到各个通道的音频大小不一&#xff0c;好似置身于真实环境…...

CesiumJS【Basic】- #043 绘制脉冲线(Entity方式)- 需要自定义着色器

文章目录 绘制脉冲线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制脉冲线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制脉冲线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumCont…...

Linux命令 wc(word count)-l(lines)用于统计文件中的行数。

文章目录 1、wc -l2、实战3、wc --help 1、wc -l 在命令 wc -l 中&#xff0c;-l 的英文全称是 lines。这个选项用于指定 wc&#xff08;word count&#xff0c;单词计数&#xff09;命令来统计文件的行数。 例如&#xff0c;当你运行 wc -l load_user_100w_sort.sql 时&…...

数据结构 - C/C++ - 链表

目录 结构特性 内存布局 结构样式 结构拓展 单链表 结构定义 节点关联 插入节点 删除节点 常见操作 双链表 环链表 结构容器 结构设计 结构特性 线性结构的存储方式 顺序存储 - 数组 链式存储 - 链表 线性结构的链式存储是通过任意的存储单元来存储线性…...

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识&#xff1a; 聚类&#xff0c;可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法&#xff0c;可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯&#xff0c;可参考 sheng的学习笔记-AI-…...

OFDM的缺点与关键技术

子载波间干扰英文简写ICI&#xff0c;ICI可能由各种原因引起 在多径信道中&#xff0c;CP小于最大附加时延时收发系统载波频率偏差和采样偏差收发系统相对移动&#xff0c;存在多普勒频移 ICI是制约OFDM系统性能的主要重要因素之一 对频率偏差敏感----->同步技术&#xff0…...

电脑录音软件哪个好?7款录制音频工具大盘点,赶快学起来!(2024)

也许你渴望提取你最喜欢的节目的背景音乐&#xff0c;或者你希望录制自己的声音制作教程。如果是这样&#xff0c;你就需要一款优秀的电脑录音软件&#xff0c;来帮助你捕捉任何你想要的声音&#xff0c;而且不会损失音质。目前市场上存在着大量的录制音频工具&#xff0c;面对…...

【Android面试八股文】你说你使用Leakcanary进行内存泄漏检测,那你能说一说Leakcanary的原理吗?

文章目录 一、 Java四大引用二、 LeakCanary示例工作机制注意事项三、 Leakcanary的原理四、 Leakcanary的源码分析LeakCanary#Install创建RefWatcherAndroidRefWatcherBuilder#buildAndInstall监听Activity的引用 : ActivityRefWatcher检查引用Dump Heap解析hprof定位泄露的引…...

蒂升电梯职业性格和Verify认知能力SHL测评答题攻略及薪资待遇解密!

​一、蒂升电梯职业性格和认知能力测评考什么 您好&#xff01;蒂升电梯公司邀请您参加的OPQ职业性格测评和Verify认知能力测评是两种常见的评估工具&#xff0c;用于帮助了解个人的职场性格特点和认知能力。 OPQ职业性格测评 这是一种性格测试&#xff0c;通常用于评估个人在…...

window上部署sql server改动端口、和sqlserver的一些还原、批量插入存储过程的命令

1.端口的查看和启动 --windows上安装上sql server数据库后&#xff0c;搜索界面搜索sql&#xff0c;会出现配置管理器&#xff0c;点击进入 --进入后再次选择配置管理器 2. sqlserver数据库还原图形化 sqlserver还原数据库时会使数据库进入一个restore的还原状态&#xff0c;…...

【单片机与嵌入式】stm32串口通信入门

一、串口通信/协议 &#xff08;一&#xff09;串口通信简介 串口通信是一种通过串行传输方式在电子设备之间进行数据交换的通信方式。它通常涉及两条线&#xff08;一条用于发送数据&#xff0c;一条用于接收数据&#xff09;&#xff0c;适用于各种设备&#xff0c;从微控制…...

启动Redis服务器

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、在 Linux 或 macOS 上启动 Redis二、在 Windows 上启动 Redis三、配置 Redis 为服务启动&…...

uniapp中使用threejs加载几何体

我的建议是使用这个库 https://github.com/deepkolos/three-platformize 为什么&#xff1f;我试了uniapp推荐的和threejs-miniprogram这个小程序官方库&#xff0c;都加载不出来我的obj模型。所有我推荐不要用obj模型最好&#xff0c;挺多都支持GLTF模型的&#xff0c;但是我不…...

【SQL注入】 数据库基础

MySQL中的库名 information_schema&#xff08;信息库&#xff09;—— 保存其他数据库里所有信息&#xff08;数据库名、表、字段的数据类型/访问权限&#xff09; mysql—— 存储用户名 密码 host performance_schema——内存数据库 数据放在内存中直接操作的数据库 sys—…...

文件操作~

目录 1.为什么使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3.⼆进制文件和文本文件&#xff1f; 4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 ⽂件的打开和关闭 5.文件的顺序读写 5.1 …...

身边的故事(十二):阿文的故事:消失

那以后就再也没有任何阿文的消息。刚开始还打过几次电话&#xff0c;他都没接。后来也就慢慢的淡忘了&#xff0c;为自己的工作生活而奔波&#xff0c;时间冲淡一切。在那几年里&#xff0c;阿文就像消失了一样。直到2021的某一天&#xff0c;电话那端传来了熟悉但是有点陌生的…...

智能扫地机器人程序中出现的问题可以参考的解决方案

在解决智能扫地机器人程序中可能遇到的问题时&#xff0c;可以参考以下分点表示和归纳的解决方案&#xff1a; 环境感知与地图构建 ① 使用先进的传感器技术&#xff1a;如激光雷达、超声波和红外传感器&#xff0c;以提高环境感知的准确性和可靠性。 ② 优化地图构建算法&a…...

如何借用物联网快速实现高标准农田信息化

如何借用物联网快速实现高标准农田信息化 高标准农田信息化&#xff0c;作为现代农业发展的重要基石&#xff0c;是指在建设高产、稳产、节水、环保的农田基础上&#xff0c;深度融合现代信息技术&#xff0c;实现农田管理的精准化、智能化和高效化。物联网&#xff08;Intern…...

计算机网络基础入门

计算机网络基础入门 目录&#xff1a; 简介网络分层模型数据封装与解封装IP地址与子网掩码网络协议示例代码 1. 简介 计算机网络是指将地理位置不同的多台计算机及外部设备通过通信线路连接起来&#xff0c;实现信息资源共享和信息传递的系统。计算机网络是现代信息社会的基…...

uniApp vue2 vue3配置代理

vue2配置代理 在manifest.json中增加如下配置 "h5" : {"router" : {"mode" : "history"},"devServer" : {"disableHostCheck" : true,"proxy" : {"/api" : {"target" : "请…...

运维锅总详解RocketMQ

本文尝试从Apache RocketMQ的简介、主要组件及其作用、3种部署模式、Controller集群模式工作流程、最佳实践等方面对其进行详细分析。希望对您有所帮助&#xff01; 一、Apache RocketMQ 简介 Apache RocketMQ 是一个开源的分布式消息中间件&#xff0c;由阿里巴巴集团开发并…...

【Linux】使用ntp同步时间

ntp介绍 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是一种用于同步计算机时间的协议&#xff0c;工作在UDP的123端口上。它是一种客户端-服务器协议&#xff0c;用于同步计算机的时钟。通过连接到网络上的时间服务器&#xff0c;计算机可以获…...

【FedMut】Generalized Federated Learning via Stochastic Mutation

基于随机变异的泛化联邦学习 来源&#xff1a;AAAI2024 Abstract 问题&#xff1a; FedAvg 将相同的全局模型派发给客户端进行本地训练&#xff0c;容易陷入尖锐解&#xff0c;导致训练出性能低下的全局模型 提出 FedMut&#xff1a; 本文提出了一种名为 FedMut 的新型FL方法…...

在线教育项目(一):如何防止一个账号多个地方登陆

使用jwt做验证&#xff0c;使用账号作为redis中的key,登录的时候生成token放到redis中&#xff0c;每次申请资源的时候去看token 有没有变&#xff0c;因为token每次登录都会去覆盖&#xff0c;只要第二次登录token就不一样了...

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置&#xff0c;尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压…...

LeetCode 1321, 209, 102

目录 1321. 餐馆营业额变化增长题目链接表要求知识点思路代码 209. 长度最小的子数组题目链接标签暴力法思路代码 滑动窗口思路代码 102. 二叉树的层序遍历题目链接标签思路代码 1321. 餐馆营业额变化增长 题目链接 1321. 餐馆营业额变化增长 表 表Customer的字段为custome…...

vant ( weapp ) - - - - - van-tabs组件选中下划线初始位置异常

这里写自定义目录标题 1. 当前效果展示2. 官方解释 & 方案 1. 当前效果展示 明显可以看到框内的光标位置偏移了&#xff0c;但当切换一次之后就会显示正常。 只有初次打开的时候&#xff0c;才会出现上述问题。 代码如下&#xff1a; <van-popup show"{{ makeSho…...

007 栈(lua)

文章目录 Lua本身支持动态数组&#xff0c;通过表&#xff08;table&#xff09;实现&#xff0c;它类似于Java中的ArrayList。Lua的表是灵活的数组和字典的混合体。对于栈的实现&#xff0c;我们可以简单地使用一个表来模拟。 这里是一个简单的Lua栈实现&#xff0c;它包含了p…...

SQL中Order by详解

在 MySQL 中&#xff0c;ORDER BY 语句用于对查询结果进行排序。 语法&#xff1a; SELECT column1, column2,... FROM table_name ORDER BY column_name [ASC | DESC];以下是对其主要部分的详细解释&#xff1a; column_name &#xff1a;指定要依据其进行排序的列名。 ASC…...

【git】存在git LFS文件时如何处理

目录 1. 安装 Git LFS2. 初始化 Git LFS3. 跟踪大文件4. 添加和提交文件5. 克隆和拉取包含 LFS 文件的仓库 1. 安装 Git LFS 首先&#xff0c;你需要在你的系统上安装 Git LFS。你可以使用以下命令来安装&#xff1a; 在 Linux 上 # 对于基于 Debian 的系统 (如 Ubuntu) sud…...

面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)路径跟踪方法

线性二次调节器&#xff08;Linear Quadratic Regulator&#xff0c;LQR&#xff09;是针对线性系统的最优控制方法。LQR 方法标准的求解体系是在考虑到损耗尽可能小的情况下, 以尽量小的代价平衡其他状态分量。一般情况下&#xff0c;线性系统在LQR 控制方法中用状态空间方程描…...

【运维】在 Docker 容器中指定 UTF-8 编码:方法与技巧

在 Docker 容器中指定 UTF-8 编码&#xff1a;方法与技巧 在日常开发中&#xff0c;我们常常需要确保应用程序能正确处理各种字符编码&#xff0c;尤其是 UTF-8 编码。在 Docker 容器中运行应用程序时&#xff0c;正确设置字符编码尤为重要&#xff0c;因为容器通常是跨平台、…...

primetime中cell和net的OCV

文章目录 前言一、Cell OCV1. POCV coefficient file2. POCV Slew-Load Table in Liberty Variation Format&#xff08;LVF lib&#xff09; 二、Net OCV三、如何check OCV是否已加上&#xff1f;总结 前言 在生产中&#xff0c;外界环境的各种变化&#xff0c;比如PVT&#…...

FlinkX学习

FlinkX学习 FlinkX安装 由于flinkx已经改名chunjun 官网已不存在 (https://gitee.com/lugela/flinkx#flinkx)这里可以看到flinkx的操作文档 1、上传并解压 unzip flinkx-1.10.zip -d /usr/local/soft/2、配置环境变量 FLINKX_HOME/usr/local/soft/flinkx-1.10 export PATH$F…...

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图&#xff1a; Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图&#xff1a;Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式&#xff0c;以及各自的AI功能和具体使用方法。除了讲解功能&#xff0c;还通过实际案例加…...

1111111111111

计算机视觉技术在医疗领域的应用正迅速成为推动医疗进步的关键力量。通过高级图像处理和分析&#xff0c;这项技术在医学影像分析&#xff08;包括CT、MRI和X光图像&#xff09;、实时手术辅助、患者监测和护理、以及疾病早期诊断等方面展现出巨大的潜力。然而&#xff0c;随着…...

云原生概念

云原生是一种新型的技术体系和方法论&#xff0c;旨在充分利用云计算环境的优势&#xff0c;使应用程序更具有弹性、可伸缩性、可靠性和效率。以下是云原生的详细解释&#xff1a; 定义&#xff1a; 云原生是一种基于分布部署和统一运管的分布式云&#xff0c;以容器、微服务、…...

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…...

MySQL 常见存储引擎详解(一)

本篇主要介绍MySQL中常见的存储引擎。 目录 一、InnoDB引擎 简介 特性 最佳实践 创建InnoDB 存储文件 二、MyISAM存储引擎 简介 特性 创建MyISAM表 存储文件 存储格式 静态格式 动态格式 压缩格式 三、MEMORY存储引擎 简介 特点 创建MEMORY表 存储文件 内…...

Leetcode 股票买卖

买卖股票最佳时机 I II 不限制交易次数 prices [7,1,5,3,6,4] 启发思路&#xff1a;最后一天发生了什么&#xff1f; 从第0天到第5天结束时的利润 从第0天到第4天结束时的利润 第5天的利润 &#xff08;第5天的利润&#xff1a;0/-4/4&#xff09; 关键词&#xff1a;天…...

小白学习手册:轻松理解MQ消息队列

目录 # 开篇 RabbitMQ介绍 通讯概念 1. 初始MQ及类型 2. MQ的架构 2.1 RabbitMQ的结构和概念 2.2 RabbitMQ消息流示意图 3. MQ下载使用 3.1 Docker下载MQ参考 3.2 进入RabbitMQ # 开篇 MessagesQueue 是一个抽象概念&#xff0c;用于描述消息队列系统的一般特性和功能…...

electron线上更新

一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…...

谈谈检测浏览器类型

前几天被问到如何检测浏览器类型&#xff0c;我突然发现我对此并不了解&#xff0c;之前的项目中也没有使用到过&#xff0c;只隐约记得通过一个自带的方法即可获取。所以今天特意来仔细补习一下。 核心&#xff1a;navigator.userAgent 1.正则表达式 2.引用外部库 3.判断浏…...

Django 和 Django REST framework 创建对外 API

1. 环境准备 确保你已经安装了 Python 和 Django。如果尚未安装 Django REST framework&#xff0c;通过 pip 安装它&#xff1a; pip install djangorestframework 2. 创建 Django 项目 如果你还没有 Django 项目&#xff0c;可以通过以下命令创建&#xff1a; django-ad…...

数据结构之“刷链表题”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…...

复分析——第9章——椭圆函数导论(E.M. Stein R. Shakarchi)

第 9 章 椭圆函数导论 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…...

ArcGIS Pro SDK (七)编辑 11 撤销重做

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 11 撤销&重做 文章目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 11 撤销&重做1 撤消/重做最近的操作 环境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 撤消/重做最近的操作 //撤销 if (MapV…...

R可视化数据必要格式——长格式

一、引言 我们在对数据进行可视化时遇到最头疼、最常见的问题是什么&#xff1f;数据问题。 因为我们往往不会从零自己编程进行可视化&#xff0c;往往是现有模板或积累&#xff0c;而正确的数据格式对应正确的图形包要求&#xff0c;一定会正确出图&#xff0c;所以只有一个问…...

解决 Docker 安装时“无法获取 dpkg 前端锁”错误的有效方法

在安装 Docker 的过程中&#xff0c;不少用户可能会遇到“无法获取 dpkg 前端锁”的错误提示。这是一个较为常见但也令人困扰的问题。下面为您详细介绍几种可能的解决方法&#xff1a; 方法一&#xff1a;检查并终止相关进程 首先&#xff0c;您可以通过以下命令检查是否有正…...

git简介以及git操作软件下载以及安装教程,git基础指令介绍,持续更新中~

什么是Git&#xff1f; 最近在学一些git的基础指令&#xff0c;仔细地了解了一下git&#xff0c;发现了他的强大功能&#xff0c;分享一下&#xff1a; Git是一个强大的工具&#xff0c;它在软件开发中扮演着至关重要的角色。 Git是一个开源的分布式版本控制系统&#xff0c;…...

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇&#xff08;一&#xff09;中&#xff0c;我们知道了如何创建数据库&#xff0c;这篇文章带大家了解创建的一些细节。 红色框&#xff1a;可省略&#xff0c;作用如果存在相同的数据库名称&#xff0c;就不会再创建&#xff0c;反之&#xff0c;创建。 蓝色框&…...

2021强网杯

一、环境 网上自己找 二、步骤 2.1抛出引题 在这个代码中我们反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…...

透视全新哈弗H6:价格“高开低走”,销量能否进阶尚待观察

全新哈弗H6的发布会主题为“底线与进阶”,关于这两个词品牌方有自己的解读,第三方也可以有自己的理解。新款车的价格坚守住的底线,只不过还是采用了“高开低走”的方案。新款1.5T7DCT系列,售价11.79、12.39、13.19万元新款2.0T9DCT系列,售价13.39、14.39万元对于一辆紧凑级…...

十几万预算还买威兰达?配置更高、动力更强的美系SUV不香

当大家手握十几万预算去选购合资SUV时,哪个品牌的车型更值得选购呢?要知道在十几万价位区间,合资SUV市场的竞争可以说是极其激烈,其中也涌现了许多热门产品,比如威兰达、CR-V和途岳等。不过问题来了,虽说大家花十几万块钱去选购威兰达并没有问题,但是却有比它性价比更高…...

gif帧数修改怎么操作?一键掌握GIF帧数修改技巧!

gif帧数修改怎么操作&#xff1f;在数字化信息爆炸的时代&#xff0c;GIF动图因其生动有趣的特性而备受广大网友喜爱。然而&#xff0c;很多时候我们可能会遇到GIF动图帧数过多或过少&#xff0c;导致动画效果不尽如人意的情况。那么&#xff0c;如何对GIF动图的帧数进行修改呢…...

在Go语言中如何实现变参函数和函数选项模式

在Go语言编程中,我们经常会遇到需要给函数传递可选参数的情况。传统的做法是定义一个结构体,将所有可选参数作为结构体字段,然后在调用函数时创建该结构体的实例并传递。这种方式虽然可行,但是当可选参数较多时,创建结构体实例的代码就会变得冗长และ不太直观。 Go语言的一个…...

景源畅信电商:做抖音运营怎么开始第一步?

在数字化时代的浪潮中&#xff0c;抖音作为一款短视频平台迅速崛起&#xff0c;成为许多人表达自我、分享生活的重要舞台。随着用户量的激增&#xff0c;如何做好抖音运营&#xff0c;尤其是迈出成功的第一步&#xff0c;成为了众多内容创作者和品牌主们关注的焦点。接下来&…...

Java学习-简单的用户管理系统

用户管理系统 实现基本的用户类&#xff0c;用于抽象出用户的基本信息(编号&#xff0c;姓名&#xff0c;性别&#xff0c;电话&#xff0c;邮件)–Student实现用户工具类&#xff0c;用于实现用户的增、删、改、查–StudentUtils测试类&#xff0c;用于测试使用–StudentTest…...