mip-splatting实现细节梳理与代码环境配置及运行

目录

零、文章介绍

一、面向的问题

二、算法的优化点

3d smooth filter

2d mip filter

附录:

一、环境配置

下载项目工程

配置pytorch环境

下载依赖库

安装子模块

二、代码运行

数据下载

训练

直接跑脚本

手动运行命令

训练

渲染

指标量化

显示


零、文章介绍

这是一篇对3dgs进行效果改进的文章,《Mip-Splatting: Alias-free 3D Gaussian Splatting》,好像是cvpr2024最佳学生论文,技术细节还是蛮简单的,不过想法还是挺不错的,而且效果不错。

这个文章在cvmj最新的那篇suvey《Recent advances in 3D Gaussian splatting》中,在当前对3dgs做质量提升方面的相关工作中算是名列前茅。另外还有两篇,《Scaffold-GS: Structured 3D Gaussians for viewadaptive rendering》,《GaussianPro: 3D Gaussian splatting with progressive propagation》,是我打算在3dgs质量提升这方面待看的文章。

一、面向的问题

简单来讲,通过原始3dgs的重建出的场景看起来结果是不错的,但是这个不错是建立在渲染时采样率与GT一致的情况下才会有不错的结果。

当改变采样率时(比如拉近镜头推远镜头),就走样的问题就暴露出来了。上面的图就反映了这个问题,镜头推远时候自行车辐条会显得很粗,镜头拉进的时候闸线和后座又会变得很细和有空洞。

产生这个问题的主要原因在于,3dgs本身在渲染时候虽然没有做反走样,但是为了避免高斯球太小或太细,出现高斯球无法覆盖一个像素的情况(包括在优化过程中,如果出现了这种情况会影响梯度计算与优化),它应该是有一个数值计算上的trick处理,加了一个2d dilation filter,即

这个filter在3dgs的原文中是没有被提及的(我来来回回看了好多遍没看到这个细节),应该是它的代码中有这个操作(虽然没有去看源码考证,但是在其他3dgs相关的项目中也看到了这个说法)。一方面这个filter导致了重建场景优化出的高斯球会偏小,也就是信号频率偏高,有时会出现极高的信号频率。另一方面这个filter并不是一个正确的反走样滤波,在改变相机采样率的情况下起不到一个合理的反走样效果。

二、算法的优化点

走样的原因无非就是信号频率太高而采样频率太低,所以反走样就要从两方面入手,一个是降低信号频率(预滤波),一个是提升采样频率(超采样)。本文的话主要走的是预滤波的路子,而且他的预滤波也是从两方面入手。一方面是在重建的过程中(3d世界空间)对高斯球进行预滤波,限制了重建结果的最高频率(从根源解决信号频率高);另一方面在渲染时(2d屏幕空间)进行预滤波(在过程中限制信号频率)。

  1. 3d smooth filter

    本质上就是在重建的过程中,对每个高斯球做一个低通滤波,来约束高斯球的尺度,使其不会变成过分小或者过分狭长的高斯球,这样重建出场景的频率就不会过高。

    所以首先是要确定约束的阈值,也就是多高频率的高斯球是不好的。对于每个高斯球,我们遍历作为输入数据的N个相机

    这里f_n是相机的焦距,d_n是高斯球在该相机空间的深度,l_n表示高斯球在该相机空间的可见性(0,1),为了方便只用高斯球中心p_k是否在相机视锥内来判断。这样就能对每个高斯球找到一个频率的上界。这个操作每100次迭代进行一次。

    有了这个频率后通过对高斯球原始的3d高斯分布叠加一个低通滤波来约束高斯分布的频率,

    叠加的这个低通滤波是一个3d高斯分布,这就使得叠加操作很容易

    这里的s是一个超参数,它的选取我们下文再说。而我们最后完成场景重建优化后得到的高斯球,应该是最终叠加了这个低通滤波的高斯分布。

  2. 2d mip filter

    单单限制高斯球的最大频率是不够的,所以在渲染时,当高斯球投影到屏幕空间后,还需要做一次预滤波。理论上来讲,理想的方式应该是使用2d box filter,但是考虑到优化效率,本文就使用了2d gaussian filter来近似了

    这里的s也是一个超参数,它的选取是为了让高斯球投影后能够覆盖一个像素。它和3d filter中的s是不同的,但是有关联。2d filter的s选取的是0.1(这块我也不清楚是怎么确定的,我对滤波这块儿完全不熟,我猜是因为为了近似2d box filter,约等于1/9?)。至于3d filter中的s,由奈奎斯特-香农采样定理,信号频率不能超过采样率的一半,所以这里s取0.2。

综上来看,文章的实现应该主要就三部分,一是每100次迭代计算一次高斯球的频率阈值,二是修改高斯分布表达,将其改为带低通滤波器的高斯分布,三是修改投影到2d后的高斯分布,叠加一个2d高斯滤波器。对于3dgs pipeline框架应该不需要做太大的改动。

附录:

一、环境配置

  1. 下载项目工程

    git clone https://github.com/autonomousvision/mip-splatting.git

    现在发现github白天能上,晚上就上不去了,很诡异

  2. 配置pytorch环境

    为了方便以后运行3dgs系列的代码,这次就先搞个pytorch的虚拟环境,后续直接克隆然后再装对应的库。

    遗憾的是按照上上篇blog中的流程装pytorch的时候(下载压缩包conda install offline),Pytorch又会出问题,找不到shm相关依赖项(我后面分析是因为我在配置3dgs环境时尝试了各种奇奇怪怪的方法,然后pytorch相关的一些依赖库都在尝试的过程中装好了,所以直接安装pytorch的压缩包就能成功,但是如果在新的虚拟环境直接安装压缩包就会出问题),所以就又尝试了直接pip安装whl的方式,走清华镜像,命令如下:

    pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu118 -i https://pypi.tuna.tsinghua.edu.cn/simple

    这样很快就能安装好,但是在测试pytorch是否安装成功是,进入python环境,输入import torch,会出现warning“A module that was compiled using NumPy 1.x cannot be run in NumPy 2.0.1 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0.Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.”而且好像gpu不可用。

    回退numpy ,pip install -U numpy==1.26.4 -i https://pypi.tuna.tsinghua.edu.cn/simple

    这样就安装好pytorch了。

    然后新建一个mip-splatting虚拟环境

    conda create -n mipsplatting --clone torchbase

    激活新环境后开始后续的依赖库安装

  3. 下载依赖库

    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

    里面包括了open3d,plyfile,ninja,GPUtil,opencv-python,lpips

    我这边需要用清华镜像,不然无法正常安装

  4. 安装子模块

    pip install submodules/diff-gaussian-rasterization

    pip install submodules/simple-knn

二、代码运行

  1. 数据下载
    1. blender

      https://drive.google.com/drive/folders/128yBriW1IG_3NJ5Rp7APSTZsJqdJdfc1

      没有科学上网没法下载

      下载后需要预处理

      python convert_blender_data.py --blender_dir nerf_synthetic/ --out_dir multi-scale

    2. mipnerf

      https://jonbarron.info/mipnerf360/

      这个不需要科学上网,数据很大,十多个G,不过不需要预处理数据,解压即可

  2. 训练
    1. 直接跑脚本

      # single-scale training and single-scale testing on NeRF-synthetic dataset

      python scripts/run_nerf_synthetic_stmt.py

      # multi-scale training and multi-scale testing on NeRF-synthetic dataset

      python scripts/run_nerf_synthetic_mtmt.py

      # single-scale training and single-scale testing on the mip-nerf 360 dataset

      python scripts/run_mipnerf360.py

      # single-scale training and multi-scale testing on the mip-nerf 360 dataset

      python scripts/run_mipnerf360_stmt.py

      这是四个脚本,能跑全量的数据,不过需要提前处理一下数据的路径之类的,而且不确定是否方便调参,我更倾向与自行运行命令

    2. 手动运行命令
      训练

      python train.py -s "D:\Computer Graphics\3dgs\mipnerf_data\bicycle" -m data/bicycle --eval -r 8 --port 6009 --kernel_size 0.1 

      -s 指定图像数据路径

      -m 指定输出路径

      -r 指定分辨率,8代表原图1/8分辨率

      --eval 应该是代表过程中计算什么东西

      --port 指定使用的gpu,默认6009表示gpu0

      只用默认程序的话显卡显存迭代3k次左右就炸掉了

      --densify_grad_threshold 0.0005 --densification_interval 200

      沿用了3dgs工程运行时的参数,至少把30k次迭代跑完了,而且是1/8分辨率情况下,破本子吃不消啊

      渲染

      python render.py -m data/bicycle --data_device cpu --skip_train -r 2

      -m 指定训练结果路径

      --data_device 指定渲染设备

      -r 指定渲染分辨率 缺省的时候可能是用训练分辨率作为默认值的,因为我最早尝试的时候没有加这个属性出来的结果是1/8分辨率

      指标量化

      python metrics.py -m {output_dir}/{scene} -r {factor}

  3. 显示

    python create_fused_ply.py -m {model_dir}/{scene} --output_ply fused/{scene}_fused.ply

    然后将生成的ply文件上传到   https://niujinshuchong.github.io/mip-splatting-demo   即可

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值