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

【万字详解】三维重建(二)——NeRF、NeuS、MeshUDF、NeuralUDF、3DGS、GShell

文章目录

  • 一、NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis(推荐读)
    • 1.1 式1 神经网络的输入和输出
    • 1.2 式2 体素渲染算法
    • 1.3 式3 损失函数
    • 1.4 位置编码
    • 1.5 基本原理
  • 二、经典的重建流程
    • 2.1 传统的三维重建pipeline
    • 2.2 神经网络回归
    • 2.3 可微渲染最优化
  • 三、NeuS:Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction(推荐读)
  • 四、MeshUDF:Fast and Differentiable Meshing of Unsigned Distance Field Networks
  • 五、NeuralUDF:Learning Unsigned Distance Fields for Multi-view Reconstruction of Surfaces with Arbitrary Topologies(推荐读)
  • 六、3DGS:3D Gaussian Splatting for Real-Time Radiance Field Rendering
  • 介于六和七之间:显隐式结合
  • 七、GShell(推荐读)
  • 八、陌生词汇整理
    • 8.1 光栅化渲染(√)
    • 8.2 IDR——隐式可微渲染器(√)
    • 8.3 DVR渲染occupancy的(√)
    • 8.4 stable normal(√)
    • 8.5 instant ngp(√)
    • 8.6 torch ngp(√)
    • 8.7 marching cube(√)
    • 8.8 神经网络是可微的,如果不可微,那么就会引入一个很大的误差——?(√)
    • 8.9 正则项(√)
    • 8.10 如果不加激活函数,那么多层感知机,其实就是一层——理论推理(√)
    • 8.11 在NeRF里面有个不透明度的概念,这个概念转换到NeuS里面,网络表示SDF,把SDF到不透明度又加上了一个网络。这里是用了一个策略,把SDF转到不透明度再做积分——对于这句话的理解(√——按照NeRF理解就行)
    • 8.12 什么是光追?——光线追踪?(√)
    • 8.12 SDF和Occupancy什么区别?(√)
    • 8.13 SDF——NeuS渲染、UDF——MeshUDF提取、Occupancy——DVR渲染(√)
      • 8.13.1 什么是渲染,什么是提取(√)
      • 8.13.2 SDF怎么提取、UDF用什么渲染、Occupancy怎么提取(√)
    • 8.14 nvdiffrast和nvdiffrecmc(√)
      • 8.14.1 nvdiffrast(√)
      • 8.14.2 nvdiffrecmc(√)
    • 8.15 什么几何任务,什么是渲染任务(√)
    • 8.16 因为一定要有渲染到2D,才能做端到端的优化——?(√)
    • 8.17 DMTet和neural defer shading(√)
      • 8.17.1 DMTet(√)
      • 8.17.2 neural defer shading(√)
    • 8.18 artifacts-伪影(√)
    • 8.19 3d的体和球面的流形——GShell是把mSDF定义在了体中,而不是球面上(√)
  • 九、感悟
    • 9.1 对于marching cube

一、NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis(推荐读)

在这里插入图片描述

1.1 式1 神经网络的输入和输出

输入是5个参数,(x,y,z)的坐标的位置,其他两个是对于仰角和方位角,通过神经网络得出RGB和体素密度
体素密度只和空间位置有关,而颜色则与空间位置以及观察的视角有关

1.2 式2 体素渲染算法

r(t)就是射线:起点开始,以时间为改变量的距离,两者相加,将一条射线的原点标记为o,射线方向(即相机视角)标记为d,则可将射线表示为r(t)=o+td
所以c就是表示RGB,在这里插入图片描述这个就是体素密度
T(t)表示的是射线从tn到t这一段的累计透明度,即,该射线从tn到t都没有因击中任何粒子而被停下的概率

1.3 式3 损失函数

对于损失函数的定义,其中C就是上文中提到的体素渲染算法
分层抽样(Stratified Sampling)的方法对数据进行离散处理
在这里插入图片描述

1.4 位置编码

在这里插入图片描述
所以就是一个线性变换之后,相邻之间的差距拉大

1.5 基本原理

所描述的2D图像表示,我们只需要明确像素位置,即可找到对应的颜色值。但对于3D场景表示,我们在某个确定视点看到的2D视图就很难被单一表示出来。因为,确定视点下看到的2D图像是一组图像的加权叠加,而这组图像是你观测视角射线上依次采样出来的,准确来说,2D视图上每一个像素颜色值都是3D场景上在该观测方向的射线上一组采样点的加权叠加。了解到这里,我们可以回头看图(2),先看子图(a),其中黑色的小圆点就是射线上的采样点,每个小圆点就能获得一组9D的训练样本( x , y , z , θ , ϕ ; r , g , b , σ ) {(x,y,z,\theta,\phi;r,g,b,\sigma)}(x,y,z,θ,ϕ;r,g,b,σ),可直接用来训练MLP。在推理阶段,我们也需要在观测射线进行采样。
所以,NeRF是用MLP来隐式表达一个场景,它是点对点的表示方式。我们如果想要获得一个新视角的试图,我们则需要获得这个视角下,观测射线上所有采样点的( r , g , b , σ ) (r,g,b,\sigma)(r,g,b,σ),假设我们视图的分辨率是224x224的,每个点回引出一条射线(如图r所示),假设每条射线上采样16个点,那我们NeRF中的MLP需要进行224x224x16次推理,得到的结果可以用来进行体渲染。理解这一段相当于懂了NeRF的基本原理。

二、经典的重建流程

在这里插入图片描述

2.1 传统的三维重建pipeline

就是直接用深度相机采集到的深度数据进行输入,转成点云,再生成网格,增加纹理,比如“光栅化”进行渲染

2.2 神经网络回归

神经网络:A到B的映射
输入图像(不是深度),进行映射,重建出几何。所以只要不断输入数据对。比较卷的赛道。
怎么找数据对: 输入的图像和几何需要配对,数据需要有准确的几何。没法从图像得到准确的几何,所以需要数据反过来(首先要有带纹理的几何数据,渲染到2D),给个虚拟相机,渲染图像(对一类的数据的重建-但是工作量大)

2.3 可微渲染最优化

主要是做的这个,这个时间周期短,只是对单一的场景做重建。
首先有个神经隐式函数(不一定式隐式),总体就是可微3D表示,再做一个可微3D渲染。渲染结果图像和真实结果做一个loss,再返回。

三、NeuS:Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction(推荐读)

基于神经网络下的可微渲染:第一种:NeRF在整条线上做采点;第二种:直接去找这个表面(类似于光追这种思路),从相机出发去找那个表面,然后直接对表面进行渲染(本质上就是找到一种不透明表面的位置)
NeuS是基于SDF的渲染/和NeRF说不清谁好谁坏,但是NeuS用起来更方便。
(可微渲染当作工具来用,用NeuS来做渲染工作)
在NeRF里面有个不透明度的概念,这个概念转换到NeuS里面,网络表示SDF,把SDF到不透明度又加上了一个网络。这里是用了一个策略,把SDF转到不透明度再做积分。
在这里插入图片描述需要重建几何的渲染,本质上是找到不透明表面的位置

在这里插入图片描述
这个是NeuS,这个就当作工具来用,如果是使用SDF做的,那么就用NeuS来做渲染工具.如果用的Occupancy,那就用DVR渲染
如果用隐式表示来做的话,用NeuS来做

四、MeshUDF:Fast and Differentiable Meshing of Unsigned Distance Field Networks

如果用了UDF那么就用这篇文章去提取

UDF:(小众),赛道没有SDF那么卷。
SDF是水密的,给几何分内外;可以找到一条封闭等值面;因为水面所以很受局限;如果是有开口之类的,(如下图,那么就是对于衣服的袖口的处理)就会不太好处理。所以就有了UDF

SDF:可以看成一个过一三象限的一次函数(有正有负,有小有大)
UDF:就像一个|x|的x的绝对值的函数。所以只有一个等值面,不存在正负号,就是说数值就是表示距离等值面的距离。
理论上通过神经网络,UDF可以把世界上的东西都可以表示出来
在这里插入图片描述
缺点就是在这个零点处,不可微;第一个问题,神经网络是可微的,如果不可微,那么就会引入一个很大的误差;而这个位置,又是我们想要的,所以这个位置不是很准;第二个就是:传统的marching cube,设定好了一些基元(小正方体),进行切割;但是只能是流形,如果是非流形表面,没办法去处理,下面这张图如果是褶皱的,那么神经网络没法去处理。就算用神经网络去表示,也只是一个函数,但是网格没法提取出来(那种尖角的),或者说,提取出来是错误的。

在这里插入图片描述

所以UDF只能表示开口的(但还是流形的,只不过不是水密的)——下面这张图,但是不能表示下下面那种图,就是有个额外的东西在内部

上面都是传统的Marching cube的,下面就是讲这篇文章的创新点——可微的提取表面

UDF中不存在正负,但是存在梯度的方向。0的两端导数不一样,所以梯度也就不一样,梯度就是法向。UDF的距离场,因为梯度是最快下降方向,所以也就是法相方向

在这里插入图片描述
在这里插入图片描述
优点:可以可微的提取表面(传统Marching Cube从隐式表示提取表面是不可微的)

缺点:虽然隐式表达能力很强,但是使用的是Marching Cube基元,无法提取非流形表面(Non-manifold)

五、NeuralUDF:Learning Unsigned Distance Fields for Multi-view Reconstruction of Surfaces with Arbitrary Topologies(推荐读)

这篇文章对应的就是NeuS,对应可微渲染;也就是UDF的渲染

GT网格是通过扫面得到的(比如扫描仪


http://www.kler.cn/a/430611.html

相关文章:

  • windows C++ TCP客户端
  • 《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南
  • Linux之ARM(MX6U)裸机篇----2.汇编LED驱动实验
  • android sqlite 数据库简单封装示例(java)
  • 62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
  • C语言单元总结
  • 虚幻引擎游戏开发专题-1-引擎术语
  • 关于转包关系和挂靠关系的认定
  • 【JavaEE初阶】CSS
  • 云贝教育【Oracle技术文章-Oracle 19c之PDB重命名】
  • 网络安全法 -网络信息安全
  • 深度学习的unfold操作
  • Flink WebUI解析(待更新)
  • 【iOS】UITextView
  • Ubuntu20.04调整swap分区大小笔记
  • 若依集成更好用的easyexcel
  • Freertos任务切换
  • P2440 木材加工(py)
  • 智能电网技术如何助力能源转型?
  • 暴⼒匹配算法和KMP算法介绍
  • 【实验15】LSTM的记忆能力实验
  • C++参数传递
  • 汽车总线协议分析-CAN总线
  • aosp15上winscope离线html如何使用?
  • Lambda表达式随记