首页 > 其他分享 >III. NeRF 代码框架

III. NeRF 代码框架

时间:2024-05-28 19:55:43浏览次数:17  
标签:采样 框架 代码 像素 MLP III 坐标系 NeRF

NeRF 代码框架。

一、所有深度学习的大致框架

我们看任何一个深度学习代码,都是找这三部分的位置,分析其作用。

56f3aa827f263cb9d36609d39e888bc9.png

最后把 Loss 的梯度更新到 DNN 中,便能不断提高网络的准确度。

二、训练代码的细节

(一)采样区间

首先,作者通过设置 near 和 far 限制了采样区间,如下图所示为 \([2,6]\) 之内。
330d388704f62c3caa4532e153a1ffa9.png

(二)训练的两个阶段

训练分为两个阶段,会得到 model_courasemodel_fine 两个模型。
Stage 1 先进行等间距采样,目的是发现密度 \(\sigma\) 较大的点,从而确定下一个阶段的精细采样的“小范围”;Stage 2 在这个小范围内进行精细化采样。

(三)位置编码 positional encoding

一般的 MLP 函数是连续的,因此如果输入的两个 input 点很近(如下图曲线上的蓝色点),那么最终的 output 也会很近。也就是说:一般的 MLP 是没法完成“输入距离很近、输出结果差距却很大”这个任务,但是图像恰巧是这样的任务(相邻位置的像素值差距可能会很大),因此如果直接把坐标 \((x,y)\) 输入到 MLP 中,最后的结果图片是很模糊的(因为没法输出相邻差距很大的结果)。

我们先界定“频率”:(参考Fourier Feature Networks)如果一个点附近都是没有纹理的区域(可以理解成像素值的梯度不大),称为“低频区”,而反之则称为“高频区”。

因此直接输入坐标\((x,y)\)给 MLP 会导致 DNN 没法学习到“高频”的变化,而通过位置编码\(\gamma(x)\),即便两个很近的点,其编码结果也会相差很大(如下图左侧曲线上的黑色点,也就是横轴的坐标差异大),这样一个连续的 MLP 函数也能学到更多的变化。因此频率大小控制的是:可以学习到变化程度多大的图片
9760e8d566a8fdbd301b705cc108e88e.png

在 NeRF 中,频率不能太小,否则学不到足够的信息;也不能太大,否则会出现过拟合(出现噪点)的现象。NeRF 通过实验发现了合适的值。

代码实现中:如果直接把位置 x 输入到 MLP 得到颜色 c,效果并不好,所以引入positional encoding函数 \(\gamma(x)\) 将位置 x 变成一系列 sin 和 cos 的表达式,如果定义了频率 p,那么总共会到 \(2^{p-1}\)  级别。
feaa2cb0a82f027802c673bd0e812115.png

get_embedder() 中返回位置编码的维度时,有个小细节。这里博主提到:原始论文中引入了 x 作为第一个量,但是后来发现有没有它对结果的影响不大,所以之后就舍去了,但是在看这个初版代码时需要注意这个小细节。

(四)采样点的坐标系变换推导

关于采样点变换坐标的代码如下所示:
00113564aaa6d7fb851ad6857f4ff128.png

下面解释一下上面的变换,其目的是:返回“相机中心”和“像素中心”连线的向量,在世界坐标系下的表示
9e1d62c1fa9981a2b91616a90f171357.png

那么首先是图像坐标系,坐标原点在左上角,x 轴向右,y 轴向下,然后需要变换到相机坐标系,x 轴仍然保持向右,但是 y 轴却变为向上,因此上面的代码中,y 方向的差值算完后又加上了一个负号。

上图所有的单位都是“像素”,包括焦距 focal 的表示,直接除以焦距即可把所有值归一化到“归一化平面”上。并且,相机坐标系的 z 轴和之前的设定是相反的,即从图像中心到相机中心,所以上面代码里 z 的值是 -1 。

接下来就是要把相机坐标系转换到世界坐标系,这个是三维坐标系的刚体变换,如果已知变换矩阵 C2W ,那么只需要把第一步的向量也乘以这个变换矩阵即可变换到世界坐标系下面。代码最后就在做这个相乘的工作。

(五)训练用的像素点采样策略

下图是代码中的 use_batching 的不同策略,区别是采样点来自多张随机图片 or 一张随机图片。
49d3753c581c38bea6969c7b8c5ae522.png

下面这段代码是用来防止 OOM ,让训练继续下去。
68e54fb2d7eb89552ef363bd99c85a87.png

原理解释如下图所示:
dde5dc0f403e4bbd672104d1be46cb8a.png

采样的两个阶段会分别采样 64 和 192 个点,所以一条 ray 上共有 256 个采样点;而每次训练会采样 b=1024 个像素,每个像素都有自己的一条射线,所以共要计算 1024*256 个点。

Question 1: 我们如何知道某个地方有物体呢?每个采样点会通过 MLP 函数计算得到颜色 \(c_i\) ** 和密度 \(\sigma_i\)** ** 的值,然后可以画出 \(\sigma-N\) **** 的函数图**(如右下角所示),从而就能知道哪些地方会有物体了;对可能有物体的地方再进行 stage 2 即可。

Question 2: 如何避免 OOM 呢?把 1024*256 分成小块  1024*32 进行分批次训练。

(六)如何计算颜色和密度

下面这个公式便是用来计算该像素点最终的颜色 \(\hat{c}\) (也就是 DNN 的预测值)。
7adfbd3c0c83253e0880e11a728552c9.png

作者引入了“透明度” \(\alpha_i\) 和“采样间隔” \(\delta\) 两个变量。我们采用上图中 \(\hat{c}\) 的公式进行解释会更好些。

“透明度”和“密度” \(\sigma\) 有关,而密度是个不变的属性,当采样间隔确定时,透明度也是不变的,并且 \(\sigma\) 越大,\(\alpha\) 越大(无限趋近于 1,这里的 \(\alpha\) 理解成“被遮挡的程度”更恰当些~)。但是因为前面的点会对后面的点产生遮挡关系,因此,比如在计算 \(c_2\) 对 \(\hat{c}\) 的影响时,首先是 \(c_2\) 自己的透明度,然后是 \(c_1\) 的透明度也会它产生影响,因此最后的效果是这两个量叠加的结果,这个乘积被称为 transmittance ,往后 \(c_i\) 的结果依此类推即可。

这种计算颜色的方法首先在 DeepView 这种 MPI(Multi Plane Image) 算法中使用到了,它是很多个图层叠加在一起,每个图层的 \(\alpha\) 值不同。

距离 \(\delta_i\) 最后的值是 \(10^{10}\) ,代表无限远。

三、延伸

只有颜色和其真值做了 back propogation(做差),而形状并没有,因为实现不知道物体的形状。其他研究,比如 Depth-Supervised NeRF,将 NeRF 输出的 Depth 和用其他方法得到的 Sparse 3D points 做差。
1283d27b38624c2631a063400d1586eb.png
这个方法降低了生成同样效果所需图片的数量,比如从 20 张减少到 3 张,即可得到同样的效果。

标签:采样,框架,代码,像素,MLP,III,坐标系,NeRF
From: https://www.cnblogs.com/7ytr5/p/18218715

相关文章

  • IV. Mip-NeRF
    Mip-NeRF算法思想。PaperexplanationMip-NeRF360andBlockNeRF一、NeRF的缺点所有采样点都是:光心+像素中心的射线确定的,如果给定的图像分辨率比较低,那么每个像素会很大,中心点是不足以代表整个像素的颜色的;这会导致NeRF锯齿化太严重的问题(边缘不是直接从白到黑,而是慢慢渐......
  • Keras深度学习框架第三十一讲:KerasTuner定制搜索空间
    1、绪论在本文中我们将深入探讨如何在不直接修改HyperModel代码的情况下,定制KerasTuner的搜索空间。在深度学习的超参数优化过程中,搜索空间的定制是一个关键的步骤,因为它决定了Tuner将尝试哪些不同的配置组合。通过定制搜索空间,我们可以更有效地探索那些可能对模型性能产......
  • JAVA计算机毕业设计基于SpringBoot框架的民俗文化交流与交易平台的设计与实现(附源码+s
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球化的今天,文化交流日益频繁,民俗文化作为各国独特的文化符号,其传承与保护显得尤为重要。然而,传统的民俗文化交流方式受限于地域、时间等因素,难以......
  • 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框
    升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(二)    客户订货---订货模板      客户订货模板      ......
  • llamafactory框架下微调llama3-70b推理问题
    问题描述使用llamafactory+npulora微调llama3-70b后,最终推理出现乱码以及不能自动停止生成。如下所示:derrickroseofthechicagobullshasthemostcareerassistsamongplayerswhohaveneverbeennamedtoanall-stargamewith3,339assists.IICIII.џџџ.3......
  • vue+uniapp框架开发的电影评分系统 微信小程序
    前端:vue语法,uniapp框架,微信小程序后端:springboot,java数据库:mysql环境:intellijidea,支持eclipse前端技术:Vue+elementui、Html、CSS语言框架:springbootjava+spring、mybatis、Springmvc数据库:mysql代码结构讲解如下config:主要用来存储配置文件,以及其他不怎么动用的信......
  • II. 在 Google Colab 上运行 NeRF
     一、运行官方数据集直接跟着NeRF(NeuralRadianceFields)tutorialusinggooglecolab这个视频操作即可,顺便验证一下CoLab作为以后深度学习环境的可行性。二、训练自己的数据博主是以SilicaGGO,他自己拍摄的二次元玩偶。工程链接:kewa123/nerf_pl作者建议的拍摄方......
  • III. NeRF 代码框架
    本文介绍了初代NeRF的训练大致框架。一、所有深度学习的大致框架我们看任何一个深度学习代码,都是找这三部分的位置,分析其作用。​最后把Loss的梯度更新到DNN中,便能不断提高网络的准确度。二、训练代码的细节(一)采样区间首先,作者通过设置near和far限制了采样区间,如......
  • I. NeRF及其衍生算法的初步探究
    视频链接:【AI講壇】NeRF與它的快樂夥伴們[Neuralradiancefields]NeRF的主要优势:能够正确处理反光、估算的深度较准、等等。一、nerfinthewildGoogleResearch、未开源NeRFintheWild:NeuralRadianceFieldsforUnconstrainedPhotoCollections.CVPR2021(Oral)......
  • 基于java中的springboot框架实现医药管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现医药管理系统项目演示【内附项目源码+LW说明】摘要计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即......