深度学习(20):nerf论文翻译与学习

目录

1 Introduction

2 Related Work

3 Neural Radiance Field Scene Representation

4 Volume Rendering with Radiance Fields

5 Optimizing a Neural Radiance Field

5.1 Positional encoding

5.2 Hierarchical volume sampling

5.3 Implementation details

6 Results

6.1 Datasets

6.2 Comparisons

6.3 Discussion

7 Conclusion

A Additional Implementation Details

B Additional Baseline Method Details

C NDC ray space derivation

D Additional Results

参考:

(1)朗伯体:

(2)level sets

(3)alpha合成

(4)PDF

(5)逆变换采样

(6)PSNR、SSIM、LPIPS


注:红色字体、???、注等处为自己进行的学习与标注

NeRF:将场景表示为用于视图合成的神经辐射场

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

摘要:我们提出了一种方法,通过使用稀疏的输入视图集优化底层连续体积场景函数(an under-lying continuous volumetric scene function),实现了合成复杂场景新视图的最优结果。我们的算法使用全连接(非卷积)深度网络表示场景,其输入是单个连续的5D坐标(空间位置(x, y, z)和观看方向(θ)),其输出是该空间位置的体积密度和与视点相关的发射辐射(view-dependent emitted radiance。我们通过沿相机光线查询5D坐标来合成视图(synthesize views),并使用经典的体积渲染技术(volume rendering techniques)将输出的颜色和密度投影到图像中由于体积渲染是自然可微分的(differentiable),优化我们的表示方法所需的唯一输入是一组具有已知摄像机姿势的图像。我们描述了如何有效优化神经辐射场(neural radiance fields),以渲染具有复杂几何体和外观的场景的照片级真实感新视图(photorealistic novel views),并展示了优于先前神经渲染(neural rendering)和视图合成(view synthesis)工作的结果。视图合成结果最好作为视频观看,因此我们敦促读者观看我们的补充视频,以便进行令人信服的比较。

Keywords: scene representation, view synthesis, image-based rendering, volume rendering, 3D deep learning

关键词:场景表示、视图合成、基于图像的渲染、体渲染、3D深度学习

1 Introduction

       在这项工作中,我们通过直接优化连续5D场景表示(a continuous 5D scene representation)的参数以最小化渲染一组捕获图像的误差,以新的方式解决了视图合成中的长期问题。

       我们将静态场景表示为一个连续的5D函数,该函数输出空间中每一点(xyz)的每个方向(θ)的辐射度,以及每一点的密度,其作用类似于一个微分不透明度(a differential opacity),控制通过(xyz)的光线积累多少辐射度。我们的方法通过从单个5D坐标(x,y,z,θ,∅)回归到单个体积密度和视角相关RGB颜色(a single volume density and view-dependent RGB color),优化了没有任何卷积层的深度全连接神经网络(通常称为多层感知器或MLP)来表示此函数。为了从一个特定的视角渲染这个神经辐射场(NeRF),我们:1)将相机光线穿过场景,产生一组采样的三维点,2)将这些点和它们相应的二维观察方向作为神经网络的输入,产生一组颜色和密度的输出,3)使用经典的体积渲染技术,将这些颜色和密度累积成二维图像。因为这个过程是自然可微的(naturally differentiable),我们可以使用梯度下降来优化这个模型,通过最小化每个观测图像和从我们的表示中呈现的相应视图之间的误差(和真值进行对比)。在多个视图中最小化这一误差,鼓励(encourages)网络通过为包含真正的基本场景内容(the true underlying scene content)的位置分配高体积密度和准确的颜色来预测一个连贯的场景模型(a coherent model of the scene)。图2显示了整个流程。

       我们发现,优化复杂场景的神经辐射场表示法的基本实现并没有收敛到足够高的分辨率表示(a sufficiently high-resolution representation),并且在每个摄影机光线所需的采样数方面效率低下。我们通过将输入5D坐标转换为位置编码来解决这些问题,位置编码使MLP能够表示更高频率的函数,并且我们提出了一种分层采样程序,以减少对这种高频场景表示进行充分采样所需的查询数

图1:我们提出了一种方法,从一组输入图像中优化场景的连续5D神经辐射场表示(任何连续位置的体积密度和视线相关的颜色)。我们使用来自体积渲染(volume rendering)的技术,沿着射线积累这个场景表示的采样样本,从任何视角渲染场景。在这里,我们将在周围半球上随机捕获的合成鼓场景的100个输入视图的集合可视化,并展示了从优化的NeRF表示中渲染的两个新视图。

图2:我们的神经辐射场场景表示(neural radiance field scene representation)和可微分渲染(differentiable rendering)过程概述。我们通过沿摄影机光线(a)采样5D坐标(位置和观察方向),将这些位置输入MLP以生成颜色和体积密度(b),并使用体积渲染技术将这些值合成为图像(c),从而合成图像。该渲染函数(rendering function)是可微的,因此我们可以通过最小化合成图像和真实观测图像(d)之间的残差来优化场景表示

       我们的方法继承了体积表示(volumetric representations)的优点:两者都可以表示复杂的真实世界几何体和外观,并且非常适合使用投影图像进行基于梯度的优化。重要的是,我们的方法克服了在高分辨率建模复杂场景时离散化体素网格(discretized voxel grids)的高昂存储成本。总之,我们的技术贡献是:

       ·一种将具有复杂几何和材料的连续场景表示为5D神经辐射场的方法,参数化为基本MLP网络

       ·一种基于经典体积渲染(volume rendering)技术的可微分渲染过程,我们使用它从标准RGB图像中优化这些表示。这包括分层采样策略,以向具有可见场景内容(visible scene content)的空间分配MLP的容量

       ·将每个输入5D坐标映射到更高维空间的位置编码,使我们能够成功优化神经辐射场以表示高频场景内容(high-frequency scene content

       我们证明,我们得到的神经辐射场方法在定量和定性上优于最先进的视图合成(view synthesis)方法,包括将神经3D表示拟合到场景的工作,以及训练深度卷积网络以预测采样体积表示(sampled volumetric representations)的工作。据我们所知,本文提出了第一个连续的神经场景表示,它能够从自然环境中捕获的RGB图像中渲染真实对象和场景的高分辨率照片真实感的新视图

2 Related Work

       计算机视觉最近的一个很有前途的方向是用MLP的权重对对象和场景进行编码,MLP直接从3D空间位置映射到形状的隐式表示,例如该位置的符号距离(the signed distance[6]然而,这些方法到目前为止还无法重现具有复杂几何体的真实场景,其逼真度与使用离散表示(如三角形网格或体素网格)表示场景的技术相同(好像这几年已经解决了hxz。在本节中,我们将回顾这两条工作线,并将其与我们的方法进行对比,我们的方法增强了神经场景表示的能力,以产生用于渲染复杂逼真场景的最优结果。

       使用MLP将低维坐标映射到颜色的类似方法也用于表示其他图形功能,如图像[44]、纹理材料(textured materials)[12,31,36,37]和间接照明值[38]。

       Neural 3D shape representations(神经3D形状表示):最近的工作通过优化将xyz坐标映射到有符号距离函数(signed distance functions[15,32]或占用域(occupancy fields[11,27]的深度网络,研究了连续3D形状作为水平集(level sets)的隐式表示。然而,这些模型受限于其对真实(ground truth)3D几何结构的获取要求,通常从合成3D形状数据集(如ShapeNet[3])获得。随后的工作通过制定可差分渲染函数来放宽真实3D形状的这一要求,该函数允许仅使用2D图像来优化神经隐式形状表示(neural implicit shape representations)。Niemeyer等人[29]将表面表示为3D占用场(3D occupancy fields,并使用数值方法找到每条射线的表面交点,然后使用隐式微分计算精确导数。每个光线相交位置(ray intersection location)都作为神经3D纹理场(a neural 3D texture field)的输入提供,该纹理场预测该点的漫反射颜色(diffuse color)。Sitzmann等人[42]使用了一种不太直接的神经3D表示法,只需在每个连续的3D坐标处输出一个特征向量和RGB颜色,并提出了一种可微分的渲染函数,该函数由沿每条光线行进的递归神经网络组成,以确定曲面的位置。

       尽管这些技术可能表示复杂和高分辨率的几何体,但迄今为止,它们仅限于几何复杂度较低的简单形状,导致渲染过度平滑。我们表明,优化网络以编码5D辐射场(optimizing networks to encode 5D radiance fields)(具有二维视角外观的三维体)的替代策略可以代表更高分辨率的几何形状和外观,以呈现复杂场景的逼真的新视图。

       View synthesis and image-based rendering(视图合成和基于图像的渲染):给定稠密的视图采样,可以通过简单的光场采样插值(light field sample interpolation)技术重建逼真的新视图[21,5,7]。对于具有稀疏视图采样的新视图合成,计算机视觉和图形社区通过从观察到的图像中预测传统的几何和外观表示而取得了重大进展。一类流行的方法使用基于网格(mesh-based的场景表示,具有漫反射[48]或依赖于视图[2,8,49]的外观。可差分光栅化器(Differentiable rasterizers)[4,10,23,25]或路径跟踪器(pathtracers)[22,30]可以直接优化网格表示,以使用梯度下降再现一组输入图像。然而,基于图像重投影的梯度网格优化(gradient-based mesh optimization通常很困难,可能是因为局部极小值或损失情况(loss landscape)的条件较差。此外,该策略要求在优化之前提供具有固定拓扑的模板网格(a template mesh)作为初始化[22],这通常不适用于无约束的真实场景(unconstrained real-world scenes)。

       另一类方法使用体积表示(volumetric representations)来解决从一组输入RGB图像进行高质量真实感视图合成(photorealistic view synthesis)的任务。体积方法能够真实地表示复杂的形状和材质,非常适合基于梯度的优化,并且与基于网格的方法相比,倾向于产生较少的视觉干扰伪影(visually distracting artifacts)。早期的体积方法使用观察到的图像直接为体素网格着色[19,40,45]。最近,有几种方法[9,13,17,28,33,43,46,52]使用多个场景的大型数据集来训练深层网络,这些深层网络根据一组输入图像预测采样的体积表示,然后使用alpha-compositing [34]或沿射线学习合成,在测试时渲染新视图。其他工作针对每个特定场景优化了卷积网络(CNN)和采样体素网格的组合,使得CNN可以补偿低分辨率体素网格中的离散化伪影[41],或者允许预测的体素网格根据输入时间或动画控制而变化[24]。尽管这些体积技术在新的视图合成方面取得了令人印象深刻的成果,但由于离散采样(discrete sampling),它们缩放到更高分辨率图像的能力基本上受到了时间和空间复杂性的限制-渲染更高分辨率的图像需要对3D空间进行更精细的采样。我们通过在深度全连接神经网络的参数内编码连续体积来绕过这个问题,这不仅比以前的体积方法产生了更高质量的渲染,而且只需要这些采样体积表示的存储成本的一小部分。

3 Neural Radiance Field Scene Representation

       我们将连续场景表示为5D向量值函数,其输入为3D位置x=(x,y,z)和2D观看方向(θ,∅),其输出为发出的颜色c=(r,g,b)和体积密度σ。在实践中,我们把方向表示为三维笛卡尔单位矢量d我们用MLP网络FФ:(x, d)(c, σ)近似这个连续的5D场景表示并优化其权重Ф,以从每个输入5D坐标映射到其相应的体积密度和方向发出颜色。

       我们通过限制网络来预测体积密度σ(仅作为位置x的函数),同时允许RGB颜色c(作为位置和观看方向的函数)来预测,从而鼓励表示具有多视图一致性。为了实现这一点,MLP FФ首先用8个全连接层处理输入3D坐标x(使用ReLU激活和每层256个通道),并输出σ256维特征向量。然后,该特征向量与摄影机光线的查看方向(the camera ray’s viewing direction)连接,并传递到另一个完全连接的层(使用ReLU激活和128通道),该层输出与视图相关的RGB颜色。

图7:我们全连接的网络架构的可视化。输入向量以绿色显示,中间隐藏层以蓝色显示,输出向量以红色显示,每个块内的数字表示向量的维度。所有层都是标准的完全连接层,黑色箭头表示具有ReLU激活的层,橙色箭头表示没有激活的层、黑色虚线箭头表示具有sigmoid形激活的层以及“+”表示矢量连接。输入位置(γ(x))的位置编码通过8个完全连接的ReLU层,每个层有256个通道。我们遵循DeepSDF[32]架构,并包含一个跳过连接,将此输入连接到第五层的激活。附加层输出体积密度σ(使用ReLU进行校正,以确保输出体积密度为非负)和256维特征向量。这个特征向量与输入观察方向的位置编码(γ(d))相连接,并由一个具有128个通道的额外全连接ReLU层处理。最后一层(有一个sigmoid激活)输出位置x的RGB辐射度,由方向为d的射线观察。

       关于我们的方法如何使用输入观察方向来表示非朗伯效应(non-Lambertian effects的示例,请参见图3。如图4所示,在不依赖视图的情况下训练的模型(只有x作为输入)很难表示镜面反射度(specularities

图3:视角依赖的发射辐射度(view-dependent emitted radiance)的可视化。我们的神经辐射场表示法输出RGB颜色作为空间位置x和观察方向d的5D函数。在这里,我们在船舶场景的神经表示中可视化了两个空间位置的示例方向颜色分布。在(a)和(b)中,我们展示了来自两个不同相机位置的两个固定3D点的外观:一个在船侧(橙色插图),另一个在水面(蓝色插图)。我们的方法预测了这两个三维点不断变化的镜面外观(the changing specular appearance),在(c)中,我们展示了这种行为如何在整个半球的观察方向上不断泛化。

图4:在这里,我们展示了我们的完整模型如何从表示依赖于视图的发射辐射以及通过高频位置编码传递输入坐标中受益。移除视图相关性(view dependence)可阻止模型在推土机踏板(the bulldozer tread)上重新创建镜面反射(不能够表示镜面反射了hxz。删除位置编码(the positional encoding)会大大降低模型表示高频几何体和纹理(high frequency geometry and texture)的能力,从而导致外观过于平滑。

4 Volume Rendering with Radiance Fields

       我们的5D神经辐射场将场景表示为空间任意点的体积密度和定向发射辐射(directional emitted radiance。我们使用经典体积渲染(classical volume rendering)的原理渲染穿过场景的任何光线的颜色[16]。体积密度σ(x)可以解释为射线在x处终止于无穷小粒子(an infinitesimal particle)的微分概率(the differential probability)相机光线rt=o+td的预期颜色Cr(具有近边界和远边界tntf)为:

函数T(t)表示光线从tnt的累积透射率(transmittance),即光线从tnt传播而不撞击任何其他粒子的概率。我们的连续神经辐射场中渲染一个视图需要估计这个积分Cr,用于追踪通过所需虚拟摄像机(the desired virtual camera,假设有一个相机,用相机拍照就可以得到一个图片 hxz)的每个像素的摄像机光线

       我们用求积法(quadrature)数值估计(numerically estimate)这个连续积分。确定性求积通常用于渲染离散化体素网格(discretized voxel grids),它将有效地限制表示的分辨率,因为MLP只能在固定的离散位置集查询。相反,我们使用分层抽样方法,将[tn,tf]划分为N个均匀间隔的箱子,然后从每个箱子内均匀随机抽取一个样本:

尽管我们使用离散样本集来估计积分,但分层采样使我们能够表示连续的场景表示,因为它导致在优化过程中在连续的位置对MLP进行评估。我们使用这些样本通过Max[26]在体积渲染审查中讨论的求积规则来估计C(r)

其中δi=ti+1ti是相邻采样点之间的距离。从(ciσi)值集合计算Cr的函数是细致的可微函数,并简化为具有alpha的传统alpha合成

5 Optimizing a Neural Radiance Field

       在上一节中,我们描述了将场景建模为神经辐射场(a neural radiance field)和从该表示中渲染新视图所需的核心组件。然而,我们注意到,这些组件不足以达到第6.4节所示的最优(state-of-the-art)质量。我们引入了两个改进,以实现高分辨率复杂场景的表示。第一种是输入坐标的位置编码,有助于MLP表示高频函数,第二种是分层采样过程,允许我们有效地对该高频表示进行采样

5.1 Positional encoding

       尽管神经网络是通用的函数近似器[14],但我们发现让网络FФ直接对xyzθ∅输入坐标进行操作,导致渲染结果在表现颜色和几何的高频变化方面表现不佳。这与Rahaman等人[35]最近的研究一致,该研究表明深度网络倾向于学习低频函数(lower frequency functions)。他们还表明,在将输入传递到网络之前,使用高频函数将输入映射到更高维空间,能够更好地拟合包含高频变化的数据

     我们在神经场景表征的背景下利用这些发现,并表明将FФ重新表述为两个函数FФ=FФ'°γ的组成,一个是学过的,一个是没有学过的,明显提高了性能(见图4和表2)。这里γ是从R到更高维空间R2L的映射,而FФ'仍然是简单的正则MLP。形式上,我们使用的编码函数是:

可以理解为,这种表示方法,即便两个点在原空间中的距离很近,很难分辨,但通过上面的编码函数,可以很轻松地分辨两个点。

这个函数γ(·)分别应用于x中的三个坐标值(被归一化为位于[-1, 1])和笛卡尔观测方向单位矢量d的三个分量(根据结构,它们位于[-1, 1])。在我们的实验中,我们为γ(x)设置L=10,为γ(d)设置L=4

       流行的Transformer架构[47]中使用了类似的映射,它被称为位置编码。然而,Transformers将其用于不同的目的,即提供序列中令牌的离散位置(the discrete positions of tokens),作为不包含任何顺序概念(any notion of order)的架构的输入。相反,我们使用这些函数将连续的输入坐标映射到更高维的空间,以使MLP更容易地逼近更高频率的函数。同时,关于从投影中建立三维蛋白质结构模型的相关工作[51]也利用了类似的输入坐标映射。

5.2 Hierarchical volume sampling

       我们的渲染策略是在沿着每个相机光线的N个查询点处密集评估神经辐射场网络,这种策略效率低下:对渲染图像没有贡献的自由空间和遮挡区域(free space and occluded regions)仍会重复采样。我们从早期的体积渲染工作中获得灵感[20],并提出了一种分层表示法,通过按样本对最终渲染的预期效果按比例分配样本来提高渲染效率

       我们不只是使用单个网络来表示场景,而是同时优化两个网络:一个“coarse”网络和一个“fine”网络。我们首先使用分层抽样对一组Nc地点进行抽样,并在这些地点评估"coarse"网络,如公式2和3所述。给定这个“coarse”网络的输出,然后我们沿着每条射线对点进行更细致的采样(more informed sampling),其中采样偏向于体积的相关部分。为了做到这一点,我们首先将公式3中coarse网络的alpha合成颜色Ccr重写为沿射线的所有采样颜色ci的加权和。(就是更为细致的alpha合成

将这些权重归一化为,可产生沿射线的片状恒定(piecewise-constant)的PDF(PDF是啥,是“偏微分方程吗”,评论区有伙伴理解为“概率密度函数”,感觉更靠谱)。我们使用逆变换抽样(inverse transform sampling)从这个分布中抽取第二组Nf位置,在第一组和第二组样本的结合处评估我们的"fine"网络,并使用公式3但使用所有Nc+Nf样本计算射线的最终渲染颜色此过程将更多样本分配给我们希望包含可见内容的区域。这解决了与重要性采样(importance sampling)类似的目标,但我们将采样值用作整个积分域的非均匀离散化,而不是将每个采样作为整个积分的独立概率估计(an independent probabilistic estimate of the entire integral)。

5.3 Implementation details

       我们为每个场景优化了一个单独的神经连续体积表示网络。这只需要一个捕捉到的场景的RGB图像的数据集,相应的相机姿势和内在参数,以及场景的边界(scene bounds)(我们使用真实摄像机的姿势、内在参数和合成数据的界限。并使用COLMAP结构-运动软件包[39]来估计真实数据的这些参数)。在每次优化迭代中,我们从数据集中所有像素的集合中随机采样一批相机光线,然后按照第5.2节中描述的分层采样,coarse网络中查询Nc个样本,从fine网络中查询Nc+Nf个样本。然后,我们使用第4节中描述的体积渲染过程来渲染两组样本中每条光线的颜色。我们的损失只是coarse渲染和fine渲染的渲染和真实像素颜色之间的总平方误差:

其中R是每个批次中的光线集分别是光线r的真值、coarse体积预测和fine体积预测RGB颜色。请注意,即使最终渲染来自Cfr,我们也将Ccr的损失最小化,以便coarse网络的权重分布可以用于在fine网络中分配样本。

       在我们的实验中,我们使用了4096条射线的批量大小,每个射线在coarse体积中的Nc=64坐标处采样,在fine体积中的额外坐标为Nf=128。我们使用Adam优化器[18],学习速率从并指数衰减到(其他Adam超参数的默认值为和ϵ=10−7)。在单个NVIDIA V100 GPU上,单个场景的优化通常需要大约10-30万次迭代才能收敛(大约1-2天)。

6 Results

       我们定量(表1)和定性(图8和6)表明,我们的方法优于先前的工作,并提供了广泛的消融研究(ablation studies)来验证我们的设计选择(表2)。我们敦促读者观看我们的补充视频,以更好地理解我们的方法在渲染新视图的平滑路径时相对于对照方法的显著改进。

6.1 Datasets

Synthetic renderings of objects(物体的合成渲染)我们首先展示了物体合成渲染的两个数据集的实验结果(表1,“漫反射合成(Diffuse Synthetic)360°”和“真实合成(Realistic Synthetic)360°”)。DeepVoxels[41]数据集包含四个具有简单几何结构的朗伯对象(Lambertian objects)。每个对象以512×512像素从上半球(the upper hemisphere)采样的视点渲染(479个作为输入,1000用于测试)。此外,我们还生成了自己的数据集,其中包含八个对象的路径跟踪图像(pathtraced images),这些对象具有复杂的几何结构和逼真的非朗伯材质(non-Lambertian materials)。六个从上半球上采样的视点渲染,两个从整个球体上采样的点渲染。我们渲染每个场景的100个视图作为输入,200个视图用于测试,所有视图均为800×800像素。

表1:我们的方法在合成图像和真实图像的数据集上的定量表现优于先前的工作。我们报告PSNR/SSIM(越高越好)和LPIPS[50](越低越好)。DeepVoxels[41]数据集由4个具有简单几何结构的漫反射对象(diffuse objects)组成。我们的真实合成数据集由具有复杂非朗伯材料的8个几何复杂对象的路径跟踪渲染组成。真实数据集由8个真实世界场景的手持式前向捕捉(handheld forward-facing captures)组成(NV无法基于此数据进行评估,因为它仅重建有界体积内的对象)。虽然LLFF的LPIPS稍好一些,但我们敦促读者观看我们的补充视频,因为我们的方法实现了更好的多视图一致性,并且比所有对照(baselines)产生的工件(artifacts)更少。

Real images of complex scenes(复杂场景的真实图像)我们展示了用大致面向前方的图像(roughly forward-facing images)拍摄的复杂真实世界场景的结果(表1,“真实面向前方(Real Forward-Facing)”)。这个数据集由8个场景组成,这些场景是用手持手机拍摄的(5个取自LLFF文章,3个是我们拍摄的),用20到62张图像拍摄的,并为测试集保留其中的1/8。所有图片都是1008×756像素。

6.2 Comparisons

       为了评估我们的模型,我们将其与当前表现最好(top-performing)的视图合成技术进行比较,详情如下。所有方法都使用相同的一组输入视图来为每个场景训练单独的网络;但局部光场融合(Local Light Field Fusion[28]除外,该方法在大型数据集上训练单个3D卷积网络,然后使用相同的训练网络在测试时处理新场景的输入图像

       Neural Volumes (NV) [24](神经体积)合成对象的新颖视图,这些对象完全位于不同背景前面的有界体积内(必须在没有感兴趣对象的情况下单独捕捉)。它优化了一个深度三维卷积网络,以预测具有128^3个样本的离散化RGBα体素网格(voxel grid)以及具有32^3个样本的三维翘曲网格(3D warp grid)。该算法通过使摄像机光线穿过扭曲的(warped)体素网格来渲染新的视图

       Scene Representation Networks (SRN) [42](场景表示网络)将一个连续的场景表示为一个不透明的表面,由一个MLP隐式定义,将每个(x,y,z)坐标映射为一个特征向量。他们训练一个递归神经网络,通过使用任何三维坐标的特征向量来预测沿射线的下一步大小,从而沿着射线行进。最后一步的特征向量被解码为表面上该点的单一颜色。请注意,SRN是同一作者的DeepVoxels[41]的后续产品(followup),性能更好,这就是为什么我们不包括与DeepVoxels的比较。

       Local Light Field Fusion (LLFF) [28](局部光场融合) LLFF被设计用于为采样良好的前向场景产生逼真的新视图(photorealistic novel views)。它使用一个训练有素的三维卷积网络来直接预测每个输入视图的离散地壳采样(a discretized frustum-sampled)RGBα网格(多平面图像或MPI[52]),然后通过alpha合成和混合(alpha compositing and blending)附近的MPI到新的观点来渲染新的视图。

6.3 Discussion

       我们在所有场景中都彻底超越了同样对每个场景单独网络进行优化的两个对照(NV和SRN)。此外,与LLFF相比,我们产生的渲染在质量和数量上都更胜一筹(除一项指标外),同时只使用他们的输入图像作为我们的整个训练集(这句话是为了表明什么,是说明针对每一个场景,NeRF采用的训练集比LLFF小嘛???)

       SRN方法产生了严重的平滑几何和纹理,而且由于每条摄像机光线只选择单一的深度和颜色,它对视图合成的表现力受到限制。NV对照能够捕捉合理详细的体积几何和外观,但它使用的是明确的128^3个体素网格,这使它无法在高分辨率下扩展以表示精细的细节。LLFF特别提供了一个"采样准则(sampling guideline",即输入视图之间的差距不超过64像素,因此它经常无法在合成数据集中估计出正确的几何形状,而合成数据集在视图之间的差距高达400-500像素。此外,LLFF在不同的场景表征之间混合渲染不同的视图,导致感知上的不一致,在我们的补充视频中很明显。

       这些方法之间最大的实际权衡(tradeoffs)是时间与空间的关系。所有比较过的单场景方法都需要至少12个小时来训练每个场景。相比之下,LLFF可以在10分钟内处理一个小的输入数据集。然而,LLFF为每个输入图像生成一个大的3D体素网格,这导致了巨大的存储需求(对于一个“真实合成”场景超过15GB)。我们的方法只需要5MB的网络权重(与LLFF相比,相对压缩了3000倍),这甚至比我们任何一个数据集的单个场景的输入图像的内存还要少。

6.4 Ablation studies

       我们通过表2中广泛的消融研究验证了我们算法的设计选择和参数。我们提出了关于我们的 "现实合成(Realistic Synthetic)360°"场景的结果。9行显示了我们的完整模型作为参考点。第1行显示了我们的模型的最小化版本,没有位置编码(PE),视图依赖(VD),或分层采样(H)。在第2-4行中,我们从完整的模型中逐一去除这三个成分,观察到位置编码(第2行)和视图依赖性(第3行)提供了最大的定量效益(the largest quantitative benefit),其次是分层采样(第4行)。第5-6行显示了随着输入图像数量的减少,我们的性能如何下降。请注意,当提供100幅图像时,我们的方法仅使用25幅输入图像的性能在所有指标上仍然超过NVSRNLLFF(参见补充资料)。在第7-8行中,我们验证了我们对x的位置编码中所使用的最大频率L的选择(对d使用的最大频率是按比例缩放的)。只使用5个频率会降低性能,但将频率的数量从10个增加到15个并不能提高性能。我们认为,一旦2^L超过了采样输入图像中存在的最大频率(在我们的数据中大约是1024),增加L的好处就会受到限制。

表2:我们模型的消融研究。指标是我们现实合成数据集中8个场景的平均数。详细说明见第6.4节。

7 Conclusion

       我们的工作直接解决了之前使用MLPs将物体和场景表示为连续函数(continuous functions)的工作的不足之处。我们证明了将场景表现为5D神经辐射场(一个MLP,输出体积密度和与视角相关的发射辐射,作为三维位置和二维观察方向的函数)比之前训练深度卷积网络输出离散体素表征(discretized voxel representations)的主流方法产生更好的渲染。

       尽管我们已经提出了一种分层采样策略,以使渲染更有效(用于训练和测试),但在研究有效优化和渲染神经辐射场的技术方面仍需要很大进展。未来工作的另一个方向是可解释性(interpretability:):体素网格(voxel grids)和网格(meshes)等采样表征承认对渲染视图的预期质量和故障模式(the expected quality of rendered views and failure modes)的推理,但目前还不清楚当我们在深度神经网络的权重中编码场景时如何分析这些问题。我们相信,这项工作在实现基于真实世界图像的图形流程方面取得了进展,复杂的场景可以由实际物体和场景的图像优化的神经辐射场组成。

A Additional Implementation Details

Network Architecture 图7详细说明了我们简单的全连接架构。

 图7:我们全连接的网络架构的可视化。输入向量以绿色显示,中间隐藏层以蓝色显示,输出向量以红色显示,每个块内的数字表示向量的维度。所有层都是标准的完全连接层,黑色箭头表示具有ReLU激活的层,橙色箭头表示没有激活的层、黑色虚线箭头表示具有sigmoid形激活的层以及“+”表示矢量连接。输入位置(γ(x))的位置编码通过8个完全连接的ReLU层,每个层有256个通道。我们遵循DeepSDF[32]架构,并包含一个跳过连接,将此输入连接到第五层的激活。附加层输出体积密度σ(使用ReLU进行校正,以确保输出体积密度为非负)和256维特征向量。这个特征向量与输入观察方向的位置编码(γ(d))相连接,并由一个具有128个通道的额外全连接ReLU层处理。最后一层(有一个sigmoid激活)输出位置x的RGB辐射度,由方向为d的射线观察。

Volume Bounds 我们的方法通过查询沿着相机光线的连续5D坐标处的神经辐射场表示来渲染视图。在合成图像的实验中,我们对场景进行缩放,使其位于以原点为中心的边长为2的立方体中,并且只查询这个边界体积内的表示我们的真实图像数据集包含的内容可以存在于最接近的点和无穷大之间的任何地方,所以我们使用归一化的设备坐标将这些点的深度范围映射到[-1, 1]。这将所有的光线原点转移到场景的近平面(the near plane of the scene),将摄像机的透视光线映射到转换后的体积中的平行光线,并使用差距(反深度)而不是度量深度,所以现在所有的坐标都是有界的

Training Details 对于真实的场景数据,我们通过在优化过程中向输出的σ值(在通过ReLU之前)添加随机的高斯噪声来规范我们的网络,发现这略微提高了渲染新观点的视觉性能。

Rendering Details 为了在测试时渲染新的视图,我们通过coarse网络对每条射线采样64个点,通过fine网络对每条射线采样64+128=192个点,每条射线总共有256次网络查询。我们的真实合成数据集每幅图像需要640k射线,而我们的真实场景每幅图像需要762k射线,因此每幅渲染的图像需要1.5亿到2亿的网络查询。在NVIDIA V100上,每帧大约需要30秒。

B Additional Baseline Method Details

Neural Volumes (NV) [24] 我们使用了作者在https://github.com/facebookresearch/neuralvolumes 上公开的NV代码,并按照他们的程序在没有时间依赖性(time dependence)的单一场景上进行训练。

Scene Representation Networks (SRN) [42] 我们使用作者开源的SRN代码https://github.com/vsitzmann/scene-representation-networks并按照他们的程序在单个场景上进行训练。

Local Light Field Fusion (LLFF) [28] 我们使用作者开源的预训练的LLFF模型,网址是https://github.com/Fyusion/LLFF。

Quantitative Comparisons 作者发表的SRN实现需要大量的GPU内存,即使在4个NVIDIA V100 GPU上并行化,也仅限于512×512像素的图像分辨率。我们在512×512像素的合成数据集和504×376像素的真实数据集上计算SRN的量化度量(quantitative metrics),而对于可以在更高分辨率下运行的其他方法,分别为800×800和1008×752。

C NDC ray space derivation

注:这个部分可以参考OpenGL中的坐标变换、矩阵变换_孙群的博客-CSDN博客_opengl矩阵变换进行理解

       我们在归一化设备坐标(NDC)空间中用 "正向(forward facing)"捕获物重建真实场景,该空间通常作为三角形栅格化(the triangle rasterization)管道/方法(the triangle rasterization pipeline,不理解这个名词,管道理解为方法???)的一部分。这个空间很方便,因为它保留了平行线,同时将z轴(相机轴)转换为线性的差距。

       在这里,我们推导出应用于射线的变换,将它们从相机空间映射到NDC空间。同一坐标(homogeneous coordinates)的标准三维透视投影矩阵是

其中,n、f是近剪平面(clipping planes)和远剪平面,r和t是近剪平面处场景的右界和上界。(请注意,这是基于摄像机朝-z方向看的惯例。) 为了投影一个同质点(a homogeneous point,注:是相同点,还是一个点在不同坐标系中的称呼吗,我们M进行左乘,然后除以第四坐标

 

投影点(The projected point)现在是在归一化设备坐标(NDC)空间中,原来的视域(the original viewing frustum)已经被映射到立方体

       我们的目标是取一条射线o+td,并计算出NDC空间中的射线原点o'和方向d',这样对于每一个t,都存在一个新的t',对于这个t'πo+td=πo'+t'd'(其中π是使用上述矩阵进行投影)。换句话说,原始射线的投影和NDC空间射线追踪出相同的点(但速度不一定相同)

       让我们把公式9中的投影点改写为(对照式17-20进行理解 hxz)。新原点o'和方向d'的分量必须满足:

 

 为了消除自由度(a degree of freedom),我们决定t'=0和t=0应该映射到同一点。将t=0和t'=0代入公式10,直接得到我们的NDC空间原点o' 

这正是原射线原点的投影π(o)。通过将其代入公式10的任意t,我们可以确定t'和d'的值。

 分解出一个仅依赖于t的通用表达式(t是步长,所以可以这样分 hxz),我们可以得到:

注意,根据需要,当t =0时,t'=0。此外,我们看到,当t→∞时,t'→1。回到最初的投影矩阵,我们的常数是:

使用标准针孔相机模型,我们可以重新参数化为:

其中W和H是以像素为单位的图像的宽度和高度,是相机的焦距。

       在我们真正的前向捕捉中,我们假设远处的场景边界(the far scene bound)是无穷大(即f很大 hxz)(这对我们的损失很小,因为NDC使用 维度来表示反深度(inverse depth),即差距(disparity))。在此极限下,z常数简化为:将所有内容结合在一起:在我们的实现中还有一个细节:我们将 移到射线与近平面的交点z=-n处(在这个NDC转换之前),为。一旦我们转换为NDC射线,这就允许我们简单地从0到1线性采样t',以便在原始空间中得到从n到∞的线性差异采样。

D Additional Results

Per-scene breakdown(按场景分类) 表3、表4、表5和表6包括了主文中提出的定量结果在每个场景中的细分指标。每个场景的细分与本文提出的总体定量指标一致,我们的方法在定量上优于所有对照(baseline)。尽管LLFF取得了略好的LPIPS指标,但我们敦促读者观看我们的补充视频,我们的方法取得了更好的多视图一致性,并且比所有对照产生更少的伪影。

 表3:DeepVoxels[41]数据集的每场景定量结果。此数据集中的“场景(scenes)”都是具有简单几何结构的漫反射对象,由3D扫描仪捕获的纹理映射网格(texture-mapped meshes)渲染。DeepVoxels方法的指标直接取自他们的论文,其中没有报告LPIPS,只报告了SSIM的两个有效数字。

 表4:我们真实合成数据集的每场景定量结果。此数据集中的“场景(scenes)”都是具有更复杂的几何和非朗伯材质的对象,使用Blender的Cycles路径跟踪器(pathtracer)进行渲染。

 表5:来自真实图像数据集的每场景定量结果。这个数据集中的场景都是用面向前方的手持(forward-facing handheld)手机拍摄的。

 表6:我们消融研究的每场景定量结果。这里使用的场景与表4中的场景相同。

 

图5:使用基于物理的渲染器(a physically-based renderer)生成的新合成数据集场景的测试集视图比较。我们的方法能够恢复几何和外观上的细微细节,例如Ship的索具、乐高的齿轮和踏板、麦克风闪亮的支架和网格格栅,以及Material的非朗伯反射。LLFF展示了麦克风支架和Material对象边缘上的带状伪影,以及Ship桅杆和Lego对象内部的重影伪影。SRN在任何情况下都会产生模糊和扭曲的渲染。Neural Volumes无法捕捉麦克风格栅或乐高(Lego)齿轮上的细节,并且完全无法恢复飞船索具的几何形状。

 

 图6:真实世界场景的测试集视图比较。LLFF是专门为这个用例设计的(真实场景的前向捕捉)。与LLFF相比,我们的方法能够在渲染视图中更一致地表示精细几何体,如Fern的叶子和T-rex中的骨架肋骨和栏杆所示。我们的方法还正确地重建了LLFF难以清晰渲染的部分遮挡区域,例如底部蕨类(Fern)作物叶子后面的黄色架子和底部兰花(Orchid)作物背景中的绿色叶子。多张渲染图之间的混合也会导致LLFF的重复边缘,如在顶部的兰花(Orchid)作物中看到的那样。SRN捕捉到每个场景中的低频几何和色彩变化,但无法再现任何精细的细节。

图8:对来自DeepVoxels[41]合成数据集的场景进行测试集视图(test-set views)的比较。该数据集中的对象具有简单的几何结构和完美的漫反射。由于大量的输入图像(479个视图)和渲染对象的简单性,我们的方法和LLFF[28]在这一数据上几乎表现完美。LLFF在其三维体积之间插值时仍偶尔会出现伪影(artifacts),如每个对象的顶部插图。SRN[42]和NV[24]不具有呈现精细细节的表现力。

参考:

(1)朗伯体:

       是指当入射能量在所有方向均匀反射,即入射能量以入射点为中心,在整个半球空间内向四周各向同性的反射能量的现象,称为漫反射,也称各向同性反射,一个完全的漫射体称为朗伯体。理想的漫反射应遵循这个规律。例如积雪和白墙。

(2)level sets

       水平集,下面参考:Level Sets、https://www.zhihu.com/question/22608763,

       水平集算法是一种隐式的表示曲线的方法。就是把低维目标用比他高一维的水平集函数的零水平集来表示(增加一个维度,并强行把该维度赋值为0吗???)。

(3)alpha合成

       RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(RGB)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。

       Alpha混色是将源图像像素和背景像素/或其他图像的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示:

       显示颜色 = 源图像素颜色×alpha/255 + 背景颜色×(255-alpha)/255

       文中将不同t处的像素颜色进行合成。

(4)PDF

         partial differential equations 偏微分方程

         probability density function 概率密度函数--来自评论区的伙伴的建议

(5)逆变换采样

知乎文章

这一篇(逆变换采样)是最近刚理解的逆变换采样的文章,讲解的很清楚,大家可以看看。

第一次看的时候可以只看到“正态分布”之前的。

下面这部分是逆变换采样的原理推导,理解后面的案例后就不难理解了,第一次读的时候可以先忽略

 作者的案例中,用简单的均匀分布“drand48()”来生成其他不同的/复杂的分布的概率密度函数,说明了逆变换采样的可靠性。

而在nerf的分层采样中使用coarse 分布去逆变换采样fine 分布的概率密度分布。

chatGPT解释如下:

逆变换抽样(Inverse Transform Sampling),也称为反函数法,是一种生成服从任意概率分布的随机数的方法。

逆变换抽样的基本思想是,根据给定的概率密度函数(Probability Density Function, PDF),求出其累积分布函数(Cumulative Distribution Function, CDF),然后将一个均匀分布的随机数 $u$ 代入 CDF 中,得到一个服从所求概率分布的随机数 $x$。

具体来说,设随机变量 $X$ 的概率密度函数为 $f(x)$,累积分布函数为 $F(x)$,则逆变换抽样的步骤如下:

1. 求出概率密度函数 $f(x)$ 的累积分布函数 $F(x)$;
2. 生成一个均匀分布的随机数 $u \in [0, 1]$;
3. 计算 $F(x)$ 的反函数 $F^{-1}(u)$;
4. $F^{-1}(u)$ 即为服从 $f(x)$ 的随机数。

其中,步骤 3 中的反函数 $F^{-1}(u)$ 可以通过求解以下方程来得到:

$$
F(x) = u
$$

逆变换抽样的优点在于可以生成任意分布的随机数,并且相对于其他生成随机数的方法,它的计算效率比较高。但是它的缺点在于,在某些情况下,求解 $F^{-1}(u)$ 的过程可能比较困难。此外,在实际应用中,需要保证概率密度函数 $f(x)$ 可以被计算机高效地求解和逆变换,否则可能会影响生成随机数的效率。

(6)PSNR、SSIM、LPIPS

       PSNR:峰值信噪比。通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了。PSNR越高,压缩后失真越小。

       SSIM:结构相似性。是一种全参考的图像质量评价指标,它分别从亮度、对比度、结构三方面度量图像相似性。

       LPIPS:学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS)也称为“感知损失”(perceptual loss),用于度量两张图像之间的差别。来源于CVPR2018The Unreasonable Effectiveness of Deep Features as a Perceptual Metric

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

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

相关文章

软件测试相关的一些笔记(七拼八凑笔记)

小插曲 IT行业职位简称 PD---product director(产品总监/部门经理)比项目经理级别高 PM---Project Management (项目经理) PL---Project Leader项目组长 PG---Prograer 程序员 SA---SystemAnalyst 系统分析师 QA--- QUALITY ASSU…

VALSE2023-内容总结(正在更新)

博文为精选内容,完整ppt请留言索取 一周内更新完毕,敬请期待 2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE)于6月10日至12日在无锡太湖国际博览中心召开,由中国人工智能学会、中国图象图形学学会主办,…

特斯拉今天拉了,马斯克迟到半小时,一开口市值蒸发2048亿元

编辑部 发自 凹非寺量子位 | 公众号 QbitAI 啥也没有! 17万新车、HW4.0、4D雷达……在大伙儿万众期待的特斯拉投资者日活动上,统统都没有! 而且马斯克还迟到整整半小时,一张口股价就跌了1.43%,市值直接蒸发约2048亿元&…

【Shader Graph】SmoothStep节点详解及其应用

目录 一、SmoothStep函数 二、基础图像 情况一&#xff1a;t1 > t2 情况二&#xff1a;t1 < t2 三、两个SmoothStep函数相减的图像 1&#xff09;SmoothStep(t1&#xff0c;t2&#xff0c;x) - SmoothStep(t2&#xff0c;t3&#xff0c;x) 2&#xff09;SmoothS…

【Unity_Input System】Input System新输入系统(一)

目录 一、导入Input System包 二、使用方式1&#xff1a;直接从输入设备对应类中获取输入 三、使用方式2&#xff1a;用代码创建InputAction获取输入 四、使用方式3&#xff1a;用Player Input组件获取输入 五、使用方式4&#xff1a;用Input Action Asset生成C#代码获取输…

Echarts的地图实现拖拽缩放同步功能(解决多层geo缩放、拖动卡顿问题)

项目场景&#xff1a; 大屏项目显示云南省3D的地图&#xff0c;可拖拽缩放、地图打点、点击图标弹框等等功能 问题描述 多图层拖拽时会上下层会分离&#xff0c;延迟卡顿 原因分析&#xff1a; 1、拖拽时不同图层的中心坐标没有保持一致&#xff0c; 2、卡顿是数据更新动画时…

php编写年历流程图,使用PHP怎么编写一个万年历功能

使用PHP怎么编写一个万年历功能 发布时间&#xff1a;2020-12-25 14:27:13 来源&#xff1a;亿速云 阅读&#xff1a;94 作者&#xff1a;Leah 这篇文章将为大家详细讲解有关使用PHP怎么编写一个万年历功能&#xff0c;文章内容质量较高&#xff0c;因此小编分享给大家做个参考…

mysql审计audit插件_MySQL审计工具Audit插件使用

MySQL审计工具Audit插件使用一、介绍MySQL AUDIT MySQL AUDIT Plugin是一个 MySQL安全审计插件&#xff0c;由McAfee提供&#xff0c;设计强调安全性和审计能力。该插件可用作独立审计解决方案&#xff0c;或配置为数据传送给外部监测工具。支持版本为MySQL (5.1, 5.5, 5.6, 5.…

计算机小知识应用,电脑使用小知识

办公用品网平台正在火热招商中&#xff01;&#xff01;&#xff01; 1.在我们使用软件时&#xff0c;大部分软件(如word&#xff0c;excel&#xff0c;PPT&#xff0c;等)会使用CTRL键加s键进行快捷保存。比如说&#xff0c;我们在写word文档时&#xff0c;写完一段&#xff0…

linux tree工具使用,Dutree–Linux上磁盘使用情况分析的免费开源命令行工具

Dutree是一款免费的开源&#xff0c;快速的命令列工具&#xff0c;用于分析磁碟使用情况。Dutree是Durep和Tree的组合。Durep用图表创建磁盘使用情况报告&#xff0c;这使我们能够确定哪些目录使用了最多的空间。尽管durep可以产生类似于du的文本输出&#xff0c;但其真正的功能…

直播预告 | 虹科Vuzix AR眼镜赋能汽车业“智慧眼”

就在今天20:00-21:00&#xff01; 虹科行业AR解决方案直播课程《虹科AR汽车行业解决方案》&#xff0c;深刻透析汽车业诊断、维修、培训的“四大痛点”&#xff0c;介绍汽车行业AR创新解决方案、培训场景解决方案、数字化工作流解决方案、远程协助全场景解决方案&#xff01; …

2023,智能硬件的AIGC“又一春”

​ 文|智能相对论 作者|佘凯文 消费电子产品风光不再&#xff0c;特别是自去年以来&#xff0c;电子消费市场经历了一整年的寒潮袭击&#xff0c;智能手机等产品达到10年消费谷底&#xff0c;PC出货量整体下降16%&#xff0c;不仅如此&#xff0c;包括平板、可穿戴设备也一改…

ChatGPT 速通手册——开始提问

开始提问 当我们完成注册后&#xff0c;页面自动会跳转到ChatGPT的主页面&#xff0c;在这里我们就可以开始进行对话了。 我们在页面下方的输入框中填写问题&#xff0c;然后回车或者点击小飞机&#xff0c;我们的问题和ChatGPT的答案就会在页面上方以一问一答的格式展现出来…

小牛情报APP最强攻略

下面博主就为您写一波小牛情报最强攻略。 首先&#xff0c;我们来介绍一下小牛情报&#xff0c;是国内专业的独立第三方区块链数据服务平台&#xff0c;一直致力于数据的深耕与数据价值的挖掘&#xff0c;从数据的采集、处理到数据的分析&#xff0c;再到数据的应用于咨询。它…

北京市小牛电动车选购指南

由于北京市对可上牌照的电动自行车的配置有要求&#xff1a;速度不能超过25km/s&#xff0c;必须带有脚踏板。本文写于2019年11 月&#xff0c;当前&#xff0c;小牛在北京可选的车型也就只有如下几种&#xff1a;U/U1、US、UM、U了&#xff0c;它们在《北京市电动自行车产品目…

小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍

​智能化时代已经来临&#xff0c;智能产品对于我们来说都已经不再陌生&#xff0c;硬件配置似乎永远是智能产品中恒古不变的主题。 和科技沾边的东西&#xff0c;似乎很难添加什么感性的包装。虽然如今我们看到不少强调梦想与情怀的产品层出不穷&#xff0c;但归根结底&#x…

MAC下查看JDK1.8中文文档CHM教程

下载JDK文档资源&#xff0c;本文结尾会提供资源链接。下载打开Mac,下载可以识别CHM的软件如CHM Reader&#xff0c;ReadCHM。 注意&#xff1a;升级Mac系统到10.15后我自己电脑的CHM Reader已经不能使用&#xff0c;应该是不兼容。重新找了其他的软件替代即可比如&#xff1a;…

大牛生小牛的问题

问题&#xff1a; 一只刚出生的小牛&#xff0c;4年后生一只小牛&#xff0c;以后每年生一只。现有一只刚出生的小牛&#xff0c;问20年后共有牛多少只&#xff1f; 思路&#xff1a; 这种子生孙&#xff0c;孙生子&#xff0c;子子孙孙的问题&#xff0c;循环里面还有循环的嵌…

小牛N1S改装60A大单体宁德时代

N1s是19年底动力版&#xff0c;目前行驶12000公里没有任何故障&#xff0c;也没做任何改装&#xff01;由于电池26A续航55公里左右还是不能满足个人使用习惯&#xff0c;官方电池太贵&#xff0c;所以有了自己改装大单体的想法&#xff0c;目前采购电池等配件中&#xff0c;选择…

求母牛生小牛函数c语言,编程求解以下问题 若一头母小牛,从出生的第四个年头开始每年生一头小母牛,按此规律,第n年时有多少头母牛?(要求用两种方法)...

满意答案 zoav7 2015.10.15 采纳率&#xff1a;59% 等级&#xff1a;7 已帮助&#xff1a;962人 //第一种方法 int n 100; //假设n100 int[] Group new int[1]; //初设牛的数量 Group[0] 1; for (int i 1; i < n; i) {//循环经过的 时间/年 int count Group.Length;…