★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

1. TensoRF简介

  • 近来,NeRF模型和各种衍生方法兴起,它们在对3D场景渲染的任务中有着突出的效果,但原始的NeRF需要的训练时间比较长,渲染时间也比较长,100张800×800大小的图耗费接近50分钟。陈等人在ECCV2022的工作TensoRF提出了张量辐射场,如下动图所示,一种能够快速训练并且不需要占据大量存储空间的方法,在渲染质量上比肩SOTA






  • 与其他NeRF方法对比的结果如下图所示,可以看到张量辐射场可以达到:

    • 更好的渲染效果
    • 更快的训练速度
    • 更小的内存占用

2. 原理介绍

2.1 中心思想

  • 相比于基于坐标的NeRF方法,TensoRF将辐射场表示为voxel grid feature。之前也有不少方法采用了voxel grid,但他们需要很多GPU显存来存储这些voxel,而且voxel的大小会随着场景的大小增加以3次方的速度增加;并且有些方法需要提前计算MLP的输出来进行蒸馏,导致训练时间过长

  • TensoRF针对之前方法在中没有高效地利用voxel grid,提出了可以将一个feature grid看做1个4D张量(tensor)的形式,也就是前3维表示空间坐标XYZ,第四维表示特征通道维度。这样就可以在辐射场建模中采用传统的张量分解算法了。而张量分解算法可以帮助对高维数据降维,并压缩数据,从而减少建模时的空间占用。这就是TensoRF所采用的方法,由此大大地降低了额外建模voxel带来的内存占用。同时,TensoRF的方法具备泛用性,可以采用各种张量分解算法进行创新

2.2 张量分解

  • TensoRF首先尝试了CP(Candecomp Parafac)分解,它可以很好地将NeRF模型进行压缩,并生成逼真的渲染图片。但是,在复杂场景应用中,我们需要使用的更多的成分张量,导致训练时间变长。因此作者提出了一种VM(Vector-Matrix)分解算法,相比于CP算法,它可以使用更少的成分张量表示一个场景,并且可以更快更好地渲染图片。对于张量分解的原理,可以参考B站UP主的讲解:https://www.bilibili.com/video/BV1GR4y1o7eT/?share_source=copy_web&vd_source=a88212425f8af23972332896a133274d

  • 有了CP/VM分解,TensoRF可以紧凑地将场景编码为voxel grid feature;在渲染的时候,从feature中解码得到体积密度和颜色,进行体积渲染。因为Voxel grid feature是离散的,所以TensoRF使用了三线性插值将模型变得连续。除此之外,TensoRF的feature支持多种解码函数,包括神经特征(使用MLP计算颜色)和球面谐波(Spherical Harmonics, SH)特征(根据固定的SH函数计算颜色)

  • 相比于之前基于voxel的方法,TensoRF将空间占用减少从O(n3)减少到O(n)或者O(n2)。前者使用CP分解,后者使用VM分解。实验证明TensoRF的效果优于SOTA,更重要的是,TensoRF可以在30分钟内重建场景,比原生NeRF快100倍;且比其他基于voxel的方法需要更少的内存占用

:本部分参考知乎文章【论文阅读】TensoRF: Tensorial Radiance Fields,由于涉及很多数学公式,而网上已经有挺多文章介绍相关原理,本项目还是注重让大家在AI Studio把TensoRF玩起来

3. 环境配置

!git clone https://github.com/kongdebug/TensoRF-Paddle
正克隆到 'TensoRF-Paddle'...
remote: Enumerating objects: 23, done.[K
remote: Counting objects: 100% (23/23), done.[K
remote: Compressing objects: 100% (20/20), done.[K
remote: Total 23 (delta 0), reused 20 (delta 0), pack-reused 0[K
展开对象中: 100% (23/23), 完成.
检查连接... 完成。

… 完成。

# 若git clone的速度太慢,也可以使用压缩包获取代码
# !unzip -qo TensoRF-Paddle.zip -d .
# 配置环境
%cd TensoRF-Paddle
!pip install -r requirements.txt

4. 数据集准备

  • 目前Paddle版本的TensoRF仅支持Blender数据格式,后续会增加其他数据格式,包括your own data(狗头
  • 本项目使用的数据集是Synthetic-NeRF,已挂载至本项目,通过以下命令解压数据集
!unzip -qo ../data/data136816/nerf_synthetic.zip -d ./data/

5. 快速开始

5.1 训练

  • 训练的脚本为train.py,执行以下命令训练一个Lego场景的TensoRF
!python train.py --config configs/lego.txt
  • configs文件夹下提供训练的配置文件, 本项目以Lego为例:

    • dataset_name,选择 = [‘blender’],目前仅提供;

    • shadingMode, 可选择 = [‘MLP_Fea’, ‘SH’];

    • model_name, 可选择 = [‘TensorVMSplit’, ‘TensorCP’], 对应CP张量分解和VM张量分解;

    • n_lamb_sigman_lamb_sh 对应的是沿着XYZ维度的密度和颜色外观的基本组件数,对应论文的 R σ R_\sigma Rσ R c R_c Rc

    • N_voxel_initN_voxel_final 代表矩阵和向量的分辨率的立方;

    • N_visvis_every 决定是否在训练得过程中对渲染结果进行可视化;

    • 如果你需要在训练结束后,使用训练得到的权重渲染,需要设置--render_test 1/--render_path 1

  • 更多的选项参考opt.py文件

5.2 渲染成图

  • 可以使用已经训练好的权重进行渲染,训练好的权重在work/tensorf_lego_VM文件夹下
  • 渲染成图的结果默认保存在权重所在的文件夹下,会根据权重名称新建文件夹,保存成图结果、评价指标以及输出的视频,视频由于帧数比较大,电脑不支持的话会是全黑的
!python train.py --config configs/lego.txt --ckpt ../work/tensorf_lego_VM/tensorf_lego_VM.pdparams --render_only 1 --render_test 1 
  • 渲染的结果如下图所示:
RGBDepth

5.3 导出mesh

  • 本项目可以将训练好的神经辐射场导出为mesh,执行以下命令即可,可以修改ckpt参数为自己训练的权重的路径
  • 生成的mesh文件保存在权重所在的文件夹下,命名为tensorf_lego_VM.pdpar.ply,AI Studio暂未提供可视化ply文件的功能,在本地用cloud compare工具打开,结果如下图所示:

!python train.py --config configs/lego.txt --ckpt ../work/tensorf_lego_VM/tensorf_lego_VM.pdparams --export_mesh 1 --render_only 1 --render_test 1 

6. 项目后续工作

  • 本项目后续会提供用户使用自己的数据集使用TensoRF进行快速的渲染,如果能给TensoRF-Paddle点点star,我会尽快更新的!
  • 同时,本项目导出的mesh仅具有XYZ坐标信息,下一版本会导出包括RGB信息一块

7. 参考文献

@INPROCEEDINGS{Chen2022ECCV,
  author = {Anpei Chen and Zexiang Xu and Andreas Geiger and Jingyi Yu and Hao Su},
  title = {TensoRF: Tensorial Radiance Fields},
  booktitle = {European Conference on Computer Vision (ECCV)},
  year = {2022}
}

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐