目录
一、Deformable 3D Gaussians 环境配置
二、Deformable 3D Gaussians 代码运行
四、4D Gaussian Splatting 代码运行 这部分先空一下吧,还没有真正跑代码测试。
零、文章介绍
这次选取的是两篇文章,《Deformable 3D Gaussians for High-Fidelity Monocular Dynamic Scene Reconstruction》和《4D Gaussian Splatting for Real-Time Dynamic Scene Rendering》。之所以把两篇放在一起,是因为它们面向的是同一个问题,都是对动态场景的重建,而且它们解决问题的思路在我看来本质上是基本相同的,只是技术细节或者说使用的手法有所差别。巧的是这两个文章也基本上是同期出来的,挂在arxiv的时间一个是去年9月下旬一个是去年10月上旬。这两篇文章在cvmj最新的那篇suvey《Recent advances in 3D Gaussian splatting》中,在当前对动态场景重建方面的相关工作中效果算是名列前茅,deformable 3dgs的成绩要略优于4dgs。
blog中夹杂了许多我个人的粗浅理解与思考,可能比较片面而且甚至可能是错误理解,希望大佬们能够不吝赐教帮忙指正。
一、面向问题
通过3dgs进行静态场景重建的路子出来以后,自然而然就会关心3dgs有没有能力对动态场景进行重建和渲染。最trivial的想法就是每一帧都去重建一个静态场景,最早针对3dgs方法来进行动态场景重建的文章就是这个思路。这个思路存在三个比较明显的问题,一个是这种思路对于单目视频会非常不友好,信息的缺失让重建难度大幅度提升;一个是场景的帧间的不连续会严重影响重建质量,尤其是长时间段的动态场景重建问题尤为严重;另一个大的问题就是重建场景的存储会耗费大量的内存。
通过借鉴基于NeRF重建动态场景的相关研究,一个比较好的解决思路就是将动态场景的时间与空间进行解耦,重建时构造一个规范静态场景G = {x,y,z; r,s,c,α} 和一个变形场{δx,δy,δz;δr,δs}=F(x,y,z,t),最终的动态场景即为G'={x+δx,y+δy,z+δz; r+δr,s+δs,c,α}。规范静态场景的构造就是可以直接套用3DGS的pipeline,由于采集的数据是规范静态场景与变形场共同作用的结果,在优化静态场景时可以使用交替迭代的思路,对规范静态场景和变形场轮流进行优化。那么现在面临问题就只剩下如何构造变形场。
二、技术细节
这两篇文章的技术的主要差别就在于上文中提到的变形场的构造方式。deformable 3d gaussian是使用了一个MLP,4DGS使用了一个4d的k-plane。虽然是用了不同的网络架构,不过个人感觉本质上是相同的,下面就分别介绍一下两篇文章各自的架构。
-
Deformable 3D Gaussians的网络架构
整体pipeline如下图
变形场的主体就是一个类似NeRF的MLP模型
输入是位置x和时间t,根据NeRF相关的研究直接用x,t学习出的MLP结果太光滑,需要对输入做一个位置编码(positional encoding),也就是公式中的γ(p)。
这里还有一个sg( · ),停止梯度操作,个人感觉上应该是为了解变形场得到的位置δ量和3dgs优化过程中对位置的偏移之间的耦合,有点让规范场景和变形场交替优化的意思。
对于其中的超参,在合成场景中,γ(x) 中L=10,γ(t)中L=6,而真实场景中γ(x)和γ(t)均为L=10。变形场网络的深度D=8,隐藏层的维度W=256,激活函数是ReLU,最终通过三个额外的全连接层(不含激活函数)分别输出x,s,r的δ量,网络结构如下图需要注意的是,与NeRF类似,编码后的输入会和第四层的输出特征连接起来(concatenate)。这个MLP的额外存储空间仅为2MB。
除了上述的基本网络架构,本文还提了一个AST(annealing smooth training),退火平滑训练机制,首先看看它的表达
这里N(0,1) 表示一个标准高斯分布;β 是一个是常量,根据经验取0.1;Δt 表示平均时间间隔;τ 是退火平滑训练的迭代次数阈值(根据经验设置为 20k)。
可以看出来这个其实就是在训练变形场的过程中对时间输入加了一个随着迭代次数增多而减小的随机扰动。为什么要加这个东西呢,按照我的理解是原本的结果会受到colmap对输入位姿估计不准的影响,训练出来的结果过拟合,导致在生成新视角(视点新,时间新)的时候,结果会有时域上的抖动。这个退火平滑并不是在从根源上解决位姿估计不准引入的重建结果不准确问题,而是通过以在训练的过程中添加扰动的方式,使得训练出的变形场在时域上比较光滑,来减少抖动。 -
4D Gaussian Splatting 的网络架构
整体pipeline如下图
变形场的构造基本上就是直接适配NeRF方向动态场景重建的一个工作,K-Plane。它的主体是6个多分辨率平面模型(每个平面模型类似一张图片,每个格点储存的是要编解码的特征,也就是变形场的输出值,即δx,δy,δz,δr,δs)+一个用于编码上述特征的小型MLP模型+三个用于解码的MLP模型。
上面说的6个多分辨率平面模型是指,原始的输入是x,y,z,t四个维度张成的空间,把这四个维度两两组合得到6个投影平面{{x,y}{x,z}{y,z}{x,t}{y,t}{z,t}},每个投影平面又用多个不同分辨率的图片来记录格点的待编码属性。对于每个4维空间的输入(x,y,z,t),通过将其投影到各个平面后使用格点进行双线性插值来进行属性编码
这个式子表示的就是将每个隐藏属性元素的双线性插值结果分别乘积(hadamard product),然后对每个分辨率的结果进行级联,得到一个长度为l * h的特征向量,这里l表示不同分辨率的数量(作者他们应该是使用了3层分辨率),h表示要编码的属性的维度(这里应该是位置偏移量的3维+scale偏移量的3维+rotation偏移量的4维一共10个维度,透明度和球谐函数系数虽然也是高斯的属性,但是作者们实验了把这些也进行编码效果并不好)。下图就是K-Planes中对这个编码过程的图示编码后的特征向量使用一个tiny MLP模型进行处理,这里也没有介绍这个MLP具体的样子,有没有激活函数,维度是多少,有没有隐藏层,这些在文中好像都没看到。后面接的三个MLP来解码得到δx,δy,δz,δr,δs,这三个MLP也是没有看到具体的构造细节,不知道是我漏掉了还是文章缺失没有提,可能需要看代码去到底是怎么构造的。
在整个的训练流程中,前3000次迭代只优化3DGS部分,后续迭代才把变形场的部分加上一起优化。
在优化变形场的时候能量和3DGS有所不同,增加了一个Total variation能量,就是
这个公式我是在K-Planes文章里面截取的,4DGS这个文章中并没有这个细节描述,公式里的P是上文中的R,表示投影平面模型的某个分辨率的图像。这个能量我觉得应该是给图像做一个平滑约束,让特征属性在空间中变化更加光滑一些。
三、一些个人理解
感觉上4DGS像是把特征属性在原本四维空间中的分布投影到6个投影平面后,将这个投影结果栅格化的记录在图片中,有点数据压缩的味道。由于它是直接训练优化每个投影平面的储存信息的,如果输入比较稀疏的时候会“猜”成一个有歧义的结果,这个就是低维度恢复高维数据的歧义性导致的。所以这个方法虽然能使用单目视频(每个时间戳只有一个视角,非常稀疏)作为输入,但是效果可能会差一些。
deformable 3dgs的MLP模型感觉上也像是有点数据压缩的味道,不过它是在4D空间直接压缩的,所以对单目视频可能会友好一些。
这两类方法在我看来都是将变形场的4维信息压缩了起来,所以它们只是一个“记录”动态场景,而不太能让静态场景”变得动态“。
对于代码实现,我没有实操过和机器学习相关的项目,也没看过代码,就我的猜测,很多网络的架构和一些对优化的操作现在应该是做到了模块儿化和插件化,只要调用一些现成的函数就能实现?比如说MLP模型的架构,只要指定一下层数,维度,激活函数类型,输入变量是啥,写写目标函数的式子,指定一下哪个梯度停止反向传递,然后就能直接交给pytorch它自己就能训练了?不知道这个认知是不是准确的。
四、一些碎碎念
这篇blog难产了好久,一个是因为最近待业在家学习效率着实有点低有些懈怠,还有一个原因是本来想在问题部分写一下我对场景重建问题的理解和总结,但是写写删删总是感觉表达不清楚(终于体会到能讲清楚课的老师们有多牛逼了),而且自己在这方面的知识体系还是梳理的不够清晰,后面再单独做一个梳理的blog吧,立此贴为证。
接下来要读的文章是《SC-GS: Sparse-Controlled Gaussian Splatting for Editable Dynamic Scenes》,这个是我觉得做到了上问题到的让静态场景”变得动态“,请各位大佬到时候继续帮忙指正。
附录:
一、Deformable 3D Gaussians 环境配置
-
下载项目工程
git clone https://github.com/ingra14m/Deformable-3D-Gaussians%20 --recursive
-
配置pytorch环境
conda create -n deformable3dgs --clone torchbase
-
安装依赖库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
里面包括了两个子模块,plyfile,tqdm,imageio,imageio-ffmpeg,opencv-python,scipy,dearpygui,lpips
二、Deformable 3D Gaussians 代码运行
-
数据准备
主要使用了三个数据集:生成数据 D-NeRF;真实采集数据 NeRF-DS 和 Hyper-NeRF;
数据的路径组织如下图
-
训练
python train_gui.py -s path/to/your/dataset -m output/exp-name --eval --is_blender
对于d-nerf数据只能用is_blender 模式,自动识别出它是生成数据,初值是随机生成的点。尝试用colmap的结果来做初值,但是生成数据做colmap会有问题
hypernerf的数据跑不成功,提示什么index out of range,还没研究出来是怎么处理
-
显示
python render.py -m output/exp-name --mode render
python metrics.py -m output/exp-name
三、4D Gaussian Splatting 环境配置
-
下载项目工程
git clone https://github.com/hustvl/4DGaussians --recursive
-
配置pytorch环境
conda create -n 4dgs--clone torchbase
-
安装依赖库
修改了一下requirements.txt,把两个子模块写了进去,删除了pytorch相关的三个库(2中已经配置好了)
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple