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

【万字详解】三维重建(二)——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 的背景与开…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...