【辐射场】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,还是选择删除一下,重点是关闭服…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
