更好!更快!更小!TensoRF-Paddle:张量辐射场的Paddle复现
比其他NeRF方法更好的渲染效果!更快的训练速度!更小的内存占用!TensoRF-Paddle:张量辐射场的Paddle版本复现,让你在AI Studio将其玩起来!
★★★ 本文源自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_sigma
和n_lamb_sh
对应的是沿着XYZ维度的密度和颜色外观的基本组件数,对应论文的 R σ R_\sigma Rσ 和 R c R_c Rc; -
N_voxel_init
和N_voxel_final
代表矩阵和向量的分辨率的立方; -
N_vis
和vis_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
- 渲染的结果如下图所示:
RGB | Depth |
---|---|
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}
}
此文章为搬运
原项目链接
更多推荐
所有评论(0)