【辐射场】3D Gaussian Splatting
三维高斯…喷喷
\, 3D Gaussian Splatting,下文简称3DGS,是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。
它属于基于图像的三维重建方法,意思就是你对现实物体或者场景拍照片,就能给你训练成一个场景模型,能够被渲染出来给你看。
它产生的模型可以作为三维内容创作的资产,什么意思呢,就是你可以搞一点视频或者很多图片作为输入,丢进什么应用等一会就变成一个3DGS,最后过几个插件就可以拖进大家最爱的blender/ue/unity里面用啦。
所谓的辐射场方法意思就是它们会存一些辐射度(radiance),类似于存储你位于某个地点、从某个视角、看场景里面的各个点发出的光的属性。这些方法一般基于体渲染、光线步进(Ray Marching)或者光线追踪(Ray Tracing),得到的重建结果模型自然属于一种独特的格式。虽然说还是比较方便兼容真实感渲染(PBR)的,就像houdini里面的SDF、VDB,都是根据体积组织的……不过万一如果想要变成有mesh那类表面建模的:那就还需要相当多的额外工作(Sugar、此外DreamGaussian也有一个小工具)
最新的一些工作例如4DGS、4K4D甚至可以把视频(连续图像序列)重建成动态场景,就是对于动态场景的修改暂时可能比较尴尬。GS的小物体比较有优势,静态大场景看起来比较捉急,但是4D的工作同向对比目前看起来会比较好看。
自然还有GS进SLAM的工作(GS-SLAM、SplaTAM),就不多嘴了。
先质疑再质疑
俗话说,demo都是骗人的 。上图只是相对第一张图稍微往右上转了一点点,把焦点从桌子转到背景物件,有点难看吧。当然如果增加训练步数和图片数量能好看一点,不过缺陷确实是存在的。随便抓一个3DGS的演示基本都能看到这个问题,只要你不是站在被训练到的视角,那么你往背景看大概率就会出现如上图所示的破洞。然而你拍场景的时候会对着墙角的杂草全方位覆盖吗?
如果你往被遮盖的地方、或者图上这种地方跑近了,你就会看到糊糊的Gaussian Splats。
如果你想要从3DGS得到一个完整的、有精细材质的、甚至能估计碰撞体积的物体,就需要首先保证那个物体不能动、其次从各个角度多拍点图(如果你有三十万相机能够同时从各个角度拍完也行吧)。对于大场景来说,这种要求就有点严苛了,结果就是稍微远一点、几米开外的地方都不能细看。
那么为啥会破洞呢?我们观察这个例子
上面是3DGS、下面是点云。这两幅图照样是在角落,那个桌子附近点特别多的。呃,当然点云初始化来自于NeRF360V2 dataset,其实跟他一开始大差不差,这也是我们亲爱的3DGS原论文里面指出故意的。
你可以简单地把3DGS理解成一种基于好多个点(点云)的结构,每个点在渲染的时候会变成一个从各个角度看可以有不同光泽的一坨球面高斯splat,形似椭球,上面的颜色是一个椭球面上的关于极坐标角度的函数,那不管是分段线性插值还是怎么的总要想个办法近似吧,GS就是用球谐函数(图是形似原子轨道,实际上还是球面上的函数,极坐标半径是指那个角度上球谐函数值大小)作为基函数,组合出一个比较丰富的函数,拉一拉变成椭圆。虽然在训练和优化的过程中这些椭圆的位置、尺寸朝向和圆润程度、不同方向上辐射折射反射出来的颜色等等(多元正态分布的均值、协方差、球面高斯的球谐系数)可以有一定变化,但是假如一开始点没安放好、分布相当不均匀,那就会四处破大洞了。
呃呃。虽然破洞,还是有不少优点。
表现上来说就和一般NeRF类似,着色还是相当真实的(可以补光,不好把场景本来有的光去掉(relighting));另外因为是把信息存在点里面、而不是像NeRF那样跟你的视线强相关,总的来说多个3DGS可以方便地合并到一起。
从效率来说、一个是炼起来不算龟速,另一个是渲染快。上面那个小花园拿A5k跑大概一小时能有好几万steps(参考:论文里面拿来抢SOTA用的是5k/7k/30k iters);渲染的时候能做到实时的,20系以上跑起来可以有一百到几百fps。
顺带一提一个3DGS一般是1GB起步。这方面也有能缩到1/15的工作。
咋办啊?
\, 3DGS的结果有时候看起来不理想,主要是那些位置本身并没有充分的信息。哪怕有,注意到直接对比渲染结果和ground truth图像的优化目标函数又不能很好地反应三维重建的质量和真实度,结果就是你从训练的时候相机的位置和姿态看过去它能拟合,结果挪动一下看见面前的splats马上偏离位置四处漏风。考虑到真实世界各种经验和物理先验,例如局部一般会有比较重复自相似的样式等等,或许能有帮助。
更加NeRF的Plenoctrees→Plenoxels几乎可以说是3DGS的前身,之前许多工作其实也是强相关的,可以作为参考(就像Mip-splatting干的那样)。
NeRF的时候一种思路是提出新的有关不确定性的量度(Bayes’ Rays),一种思路是利用真实世界信息来补全那些不确定的部分(Nerfbusters)。比如利用Segment Anything、利用3D Diffusion、配合深度等等(SparseGS)……反正能保证渲染实时就挺好的。
另外GS虽然又独创又高效、不过在诸多NeRF类方法之中,其他方法在精度方面也还是很有价值的,而且有相当一部分还能实现实时渲染。
顺带一提,如果你拍的时候拍太久了,环境光变化比较大;或者在涉及尤其是大面积阴影的情况下,呃,想想就知道会有麻烦。拍得充分一点,不然会起黑雾的。自己拍着玩还可能要小心镜头光晕。
能讲讲原理吗?
, , , 讲完啦!想看定义看公式听名词还是看代码啊?
3DGS整个过程主要包括从运动结构恢复(SfM)得到点云、通过渲染得到loss再反向传播训练其各点上球面高斯各项参数(它的位置都是比较清楚的,方便sort)。因为splat除了是各向异性之外基本可以类比一堆堆物理世界的粒子模型、有辐照度和各向异性颜色、有一定的不透明度以及一定的透光度,多个splat就要α-blending。训练的时候要把渲染结果跟ground truth比出loss,因为渲染过程是视野/视锥范围内部分点云各个点上根据存的系数得到3dsplat再被rasterize(三维正态分布沿一维积分(或者说求边缘分布)得到二维,alpha-blending到你的screen uv上光栅化),就能顺着或者逆着渲染过程变成图像,这样就有forward跟backward,顺便还可以做点小并行。得益于它的splats可以排序,backward的时候alpha blending的逆过程是比较直接可行的。光栅化时还希望在经过透视变换的时候splat不会被扭曲变形,要把变换矩阵近似一下。
3DGS的split clone prune有点被逼的,不过既然约等于一个个椭球球那也确实有一点难搞,不像NeRF那样隐式了根本操心不了这些问题。4DGS里面专门关于位置做了点工作,如果能够减轻对可能不太靠谱的SfM的依赖或许会更好一点,像COLMAP-free 3DGS等等。PAPR里面也指出SfM不给力的情况下,对于clone的情况因为梯度不对头,有的点如果一开始就离splat远,最后也几乎不可能被照顾到。此外,split clone的方式面对纹理上的精细细节也比较乏力。
此外,输入(多个)连续图像序列,一开始就重建出动态场景表示,有需要再截取某一帧或许不失为一种选择,也有机会利用其比较充分的信息让那一帧的状态更确定、说不定还能做一些物理模拟等等工作对比loss。
相关文章:

【辐射场】3D Gaussian Splatting
三维高斯…喷喷 \, 3D Gaussian Splatting,下文简称3DGS,是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。 它属于基于图像的三维重建方法,意思就是你对现实物体或者场景拍照片,就能给你训练成一个场景模型&a…...

冒泡排序--------(C每日一题)
冒泡排序: 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论: n个数要进行n-1轮比较,第j轮要进行n-j次两两比较 循环体代码: int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…...
每日一练:LeeCode-347. 前 K 个高频元素(中) - 【优先级队列】
本文是力扣LeeCode-347. 前 K 个高频元素 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输…...

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上答疑&#x…...

PowerShell Instal 一键部署TeamCity
前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…...

将“渴望“乐谱写入AT24C02并读出播放
#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…...

Vue独立组件开发-动态组件
文章目录 一、前言二、实现三、优化四、总结五、最后 一、前言 在开发中,你经常会遇到这么一种情况:根据条件动态地切换某个组件,或动态地选择渲染某个组件。 Vue 提供了另外一个内置的组件 <component> 和 is 特性,可以更…...
前端八股文(HTML篇)
目录 1.什么是DOCTYPE,有何用呢? 2.说说对html语义化的理解 3.src和href的区别? 4.title与h1的区别,b与strong的区别,i与em的区别? 5.什么是严格模式与混杂模式? 6.前端页面有哪三层构成,分…...
RivaGAN 水印项目
git地址 https://github.com/DAI-Lab/RivaGAN Dockerfile (/tools下文件为git下的文件) ############################################### # 使用 NVIDIA CUDA 10.0 开发环境作为基础镜像 FROM kaldiasr/kaldi:gpu-ubuntu18.04-cuda10.0 # 设置非交互式安装模式以避免某些命…...

Games101作业5
1.实现Renderer.cpp 中的 Render():为每个像素生成光线 这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 我们要做的就是将屏幕空间下的坐标最后转换到世界空间的坐标…...
Golang解决跨域问题【OPTIONS预处理请求】
Golang解决跨域问题 前置知识:跨域问题产生条件及原因 跨域是是因为浏览器的同源策略限制,是浏览器的一种安全机制,服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口,三者有任一不相同即会产生跨域…...
复试 || 就业day05(2023.12.31)算法篇
文章目录 前言找不同最长回文串找到所有数组中消失的数字下一个更大元素 I键盘行 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台 💫…...

Spring-4-代理
前面提到过,在Spring中有两种类型的代理:使用JDK Proxy类创建的JDK代理以及使用CGLIB Enhancer类创建的基于CGLIB的代理。 你可能想知道这两种代理之间有什么区别,以及为什么 Spring需要两种代理类型。 在本节中,将详细研究代理…...

设计模式:抽象工厂模式(讲故事易懂)
抽象工厂模式 定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。 设计模式有三大分类:创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…...
C语言中的Strict Aliasing Rule
文章目录 前言没有警告不代表没有问题目前的应对方法 前言 很久没写了,水一篇。 最近有个代码在gcc 4.8.5上编译失败。编译失败的提示是: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werrorstrict-aliasing]查了下…...

单字符检测模型charnet使用方法,极简
Git链接 安装按照上面的说明,说下使用。 把tools下面的test做了一点修改,可以读取一张图片,把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…...

Erlang、RabbitMQ下载与安装教程(windows超详细)
目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址:Installing on Windows — RabbitMQ,找到 2.配置RabbitMQ环境变量࿰…...

2023年终总结丨很苦,很酷!
文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址:https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…...

鸿蒙 DevEco Studio 3.1 入门指南
本文主要记录开发者入门,从软件安装到项目运行,以及后续的学习 1,配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成,按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…...

ubuntu多用户环境dockerbug,卸载重装docker流程
之前不小心误操作删除重装docker,结果删除没成功,更没法重装,每次apt install都会报一个docker错误,虽然不影响软件的常规安装~但是现在还是需要装一个完整docker,还是选择删除一下,重点是关闭服…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...