【万字详解】三维重建(二)——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网格是通过扫面得到的(比如扫描仪
相关文章:

【万字详解】三维重建(二)——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 传统的三维重建pipeline2.2 神经网络回归2.3 可微渲染最优…...
【RK3588 Linux 5.x 内核编程】-内核线程与Seqlock
内核线程与Seqlock 文章目录 内核线程与Seqlock1、Seqlock介绍2、Seqlock相关API2.1 初始化2.2 写操作2.3 读操作3、驱动实现4、驱动验证在前面的文章中,我们介绍了 Mutex、Spinlock、Read/Write Spinlock 的使用及其实现。 它们都用于保护共享资源不被两个或多个进程同时修改…...

访问者模式的理解和实践
在软件开发过程中,设计模式为我们提供了解决常见问题的最佳实践。访问者模式(Visitor Pattern)是行为设计模式之一,它将数据操作与数据结构分离,使得在不修改数据结构的前提下,能够定义作用于这些元素的新的…...
在Scala中对Map函数的使用
package pp28{object cscc {def main(args: Array[String]): Unit {val m1 Map("马云 — 阿里巴巴" -> 1964,"马化腾 — 腾讯" -> 1971,"李彦宏 - 百度" -> 1968,"雷军 - 小米" -> 1969,"丁磊 - 网易" -> …...
PyTorch基本使用-张量的索引操作
在操作张量时,经常要去获取某些元素进行处理或者修改操作,在这里需要了解torch中的索引操作。 准备数据: data torch.randint(0,10,[4,5]) print(data--->,data)输出结果: data---> tensor([[3, 9, 4, 0, 5],[7, 5, 9, …...

OpenCV实验:图片加水印
第二篇:图片添加水印(加 logo) 1. 实验原理 水印原理: 图片添加水印是图像叠加的一种应用,分为透明水印和不透明水印。水印的实现通常依赖于像素值操作,将水印图片融合到目标图片中,常用的方法…...
sql server log文件
确定 SQL Server 实例中具有大量 VDF 的数据库 SELECT [name], COUNT(l.database_id) AS vlf_count FROM sys.databases AS s CROSS APPLY sys.dm_db_log_info(s.database_id) AS l GROUP BY [name] HAVING COUNT(l.database_id) > 100; 在收缩日志文件之前确定事务日志中…...

Elasticsearch 集群部署
Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我…...

微信小程序5-图片实现点击动作和动态加载同类数据
搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读,初学小白,有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片,来实现一个可以点击的搜索button,但是遇到两个难点,一是按钮大小调整不方便(网上搜索…...
策略梯度定理公式的详细推导
策略梯度定理公式的详细推导 以下是策略梯度定理公式从基础概率公式到最终形式的完整推导,帮助更清晰地理解推导过程中的每一个步骤。 1. 策略梯度的目标 我们希望最大化期望累积奖励 ( J ( θ ) J(\theta) J(θ) ),其定义为: J ( θ ) E…...

力扣-图论-10【算法学习day.60】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
《Python WEB安全 库全解析》
《Python WEB安全 库全解析》 一、Python WEB安全 库概述二、常见的 Python WEB安全 库介绍1. Jiasule2. Awesome Python Security3. Flask-Security4. Flask-SeaSurf 三、Python WEB 安全库的优缺点1. 优点2. 缺点 四、Python WEB 安全库的使用场景1. 开发 Web 应用2. 处理敏感…...
Linux yum-config-manager命令异常
错误信息 使用 yum-config-manager命令时错误信息如下 sudo yum-config-manager \ > --add-repo \ > https://download.docker.com/linux/centos/docker-ce.repo sudo: yum-config-manager: command not found 解决办法 第一步: sudo yum -y install yum-u…...
ios 开发配置蓝牙
如果使用了蓝牙功能, 又没有配置, 会出现以下错误: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The apps Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaini…...

geoserver(1) 发布sql 图层 支持自定义参数
前提使用postgis 数据库支持关联 join 支持 in,not in,like,及其他sql原生函数 新增sql图层 编写自定义sql 编辑sql语句必须输出带有geom数据 正则表达式去除 设置id以及坐标参考系 预览sql图层效果 拼接sql参数 http://xxx.com/geoserver/weather/wms?SERVICEWMS&VERSI…...
Linux:network:添加ip的时候自动添加一个本地路由
文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…...
go 集成nacos注册中心、配置中心
使用限制 Go>v1.15 Nacos>2.x 安装 使用go get安装SDK: go get -u github.com/nacos-group/nacos-sdk-go/v2 快速使用 初始化客户端配置ClientConfig constant.ClientConfig{TimeoutMs uint64 // 请求Nacos服务端的超时时间,默…...

ssd202d-badblock-坏块检测
这边文章讲述的是坏快检测功能 思路: 1.第一次烧录固件会实现跳坏块,但是后续使用会导致坏块的产生; 于是我在uboot环境变量添加了两个变量来控制坏快 lb_badnum //坏块个数 lb_badoff //坏块所在位置 2.第一次开机会根据lb_badnum是否…...

MySQL-练习-数据介绍
文章目录 一. 数据介绍1. 数据结构2. 创建数据库,数据表3. 员工表(employees)练习1 4. 顾客表(customers)练习2 5. 商品(products)和商品类别(categories)表练习3 6. 供应商表(suppliers)练习4 7. 订单和订单明细表练习5 二. 数据汇总三. 使用CASE WHEN …...
React框架:解锁现代化Web开发的新维度
在当今前端开发领域,React 无疑是一颗璀璨的明星。React 是由 Facebook 开发的用于构建用户界面的 JavaScript 库,它在前端开发中占据着重要的地位,为开发者提供了一种高效、灵活且可维护的方式来构建复杂的用户界面。 一、React 的背景与开…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...