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

III. NeRF 代码框架

时间:2024-05-28 16:22:44浏览次数:21  
标签:采样 框架 代码 像素 MLP III 坐标系 NeRF

本文介绍了初代NeRF的训练大致框架。

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

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

56f3aa827f263cb9d36609d39e888bc9.png

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

二、训练代码的细节

(一)采样区间

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

(二)训练的两个阶段

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

(三)位置编码 positional encoding

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

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

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

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

代码实现中:如果直接把位置 x 输入到 MLP 得到颜色 c,效果并不好,所以引入positional encoding函数 将位置 x 变成一系列 sin 和 cos 的表达式,如果定义了频率 p,那么总共会到  级别。
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 函数计算得到颜色和密度的值,然后可以画出的函数图(如右下角所示),从而就能知道哪些地方会有物体了;对可能有物体的地方再进行 stage 2 即可。

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

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

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

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

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

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

距离 最后的值是 ,代表无限远。

三、延伸

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

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

相关文章

  • I. NeRF及其衍生算法的初步探究
    视频链接:【AI講壇】NeRF與它的快樂夥伴們[Neuralradiancefields]NeRF的主要优势:能够正确处理反光、估算的深度较准、等等。一、nerfinthewildGoogleResearch、未开源NeRFintheWild:NeuralRadianceFieldsforUnconstrainedPhotoCollections.CVPR2021(Oral)......
  • 基于java中的springboot框架实现医药管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现医药管理系统项目演示【内附项目源码+LW说明】摘要计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即......
  • 基于java中的springboot框架实现秒杀系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现秒杀系统项目演示【内附项目源码+LW说明】摘要社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套基于SpringBoo......
  • Python中Web开发-Flask框架
            大家好,在当今数字化的世界中,Web应用程序已经成为人们日常生活和商业活动中不可或缺的一部分。为了满足用户需求,开发人员需要选择适合他们项目需求的工具和技术。PythonFlask就是这样一款灵活而强大的工具,它能够帮助开发人员快速构建轻量级的Web应用程序......
  • 顶刊IJCV 2024 | EfficientSCI++:高效的视频单曝光压缩成像重建框架
    前言 来自浙江大学和西湖大学的研究人员提出了一种基于CNN-Transformer架构的高效、大尺度视频单曝光压缩成像重建算法EfficientSCI++。欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。本文转载自PaperWeekly仅用于学术分......
  • 边缘计算|Hadoop——边缘计算,有没有对应的软件?例如数据中心或云计算环境进行数据处理
    边缘计算确实没有直接对应于Hadoop这样的单一软件框架,因为边缘计算更多的是一个概念或技术架构,它涵盖了在网络的边缘(即设备或数据源附近)进行数据处理和计算的能力。然而,这并不意味着边缘计算没有相应的软件支持或解决方案。在边缘计算环境中,通常会使用各种软件、工具和框架来支持......
  • 使用 Flask 框架编写的一个简单的 Python POST和GET接口
    安装FlaskpipinstallFlask 使用python实现POST接口fromflaskimportFlask,request,jsonifyapp=Flask(__name__)@app.route('/test',methods=['POST'])defsubmit():#获取JSON请求体data=request.get_json()#从请求体中提取参数......
  • SqlSugar:基于SQLSugar框架在 .Net环境中搭建PostgreSQL数据库访问、操作的框架,C#连接
    SqlSugar 是一款老牌.NET开源ORM框架,由果糖大数据科技团队维护和更新,开箱即用最易上手的ORM 优点:【生态丰富】【高性能】【超简单】【功能全面】【多库兼容】【适合产品】 【SqlSugar视频教程】 支持:.netframework .netcore3.1 .ne5.net6.net7.net8.n......
  • Vue框架-路由
    VueRouter笔记1.路由管理安装方式一:采用单页面CDN引入方式使用.方式二:基于vite构建的前端项目工程,安装依赖:在项目根目录下,安装:npminstallvue-router@4-s检查项目根目录下package.json中的dependencies是否多出:"vue-router"依赖.路由简单使用在sr......
  • [分享]OffensiveCon24 UEFI 和翻译器的任务:使用跨架构 UEFI Quines 作为 UEFI 漏洞开
    链接:OffensiveCon24-uefi-task-of-the-translator目录x64assemblyx64程序集x64assemblysourcecodeforBGGP4entry:bggp4winningentry-x64assemblysourcecodeBGGP4UEFISelf-replicatingapp:bggp4winningentry-UEFIself-replicatingapp,compiledfromx64......