TensoRF是ECCV2022一个非常有特色的工作。作者在三维场景表示中引入张量分解的技术,将4D张量分解成多个低秩的张量分量,实现更好的重建质量、更快的重建速度、更小的模型体积。
TensoRF并没有采用像原始NeRF一样纯粹的隐式表示方法,更像是一种显示+隐式结合表示的方法,将场景建模为一个四维的张量,张量中的每一项代表一个体素,体素内包含了体积密度和多维的特征信息。
论文的中心思想是,使用张量分解技术,将4D张量分解成多个低秩的张量分量,实际处理时不用建模出这个4D张量,而用一系列1D向量、2D矩阵表示,从而降低显存消耗,提高运算速度。
外积(outer product)是线性代数中的一类重要运算,对于n维和m维的两个向量,其外积定义为一个n × m的矩阵。即,由u中的每个元素和v中的每个元素相乘得到的m × n阶矩阵A:
例如,当m=4, n=3时,有:
如果一个张量可以写成N个向量的外积,这个张量就是秩一张量。
其中张量中的每一个元素为:
张量分解中的一种最简洁的形式,张量CP分解,就是将任意某个张量,近似分解成一系列秩一张量的求和形式。
针对三维张量的CP分解,可用三维空间中X轴、Y轴、Z轴的外积,来可视化辅助理解:
CP分解的优点:计算速度快、显存占用低,由O(n3)降低到了O(n)级别。CP分解的缺点:紧凑性太高,可能需要许多组件(a1、a2、…、aR的数量)来对复杂场景进行建模,计算成本很高。为了折衷组件的数量和矩阵分解的效率,作者新提出了一种VM分解。
VM分解与CP分解相似, VM的含义是Vector-Matric,向量和矩阵的意思。相比于CP分解,这里有三项内容的加和,每一项有各自的组件数量R1,R2,R3,这三个值可以不同。相比原先,VM分解的显存占用也有所降低,O(n3)降低到了O(n2)级别。
针对三维张量的VM分解,可用三维空间中X、Y、Z轴分别与Y-Z、X-Z、X-Y平面的外积,来可视化辅助理解:
TensoRF:预先定义好,一组体密度特征相关的向量Vσ和矩阵Mσ,一组颜色特征相关的向量Vc和矩阵Mc。其中,density_plane代表体密度特征相关的矩阵,分别率为(128, 128),共有16个,(0)(1)(2)分别代表X-Y平面、Y-Z平面、X-Z平面。density_line代表体密度特征相关的向量,长度为128,共有16个,(0)(1)(2)分别代表Z平面、X平面、Y平面。同理,app_plane代表颜色特征相关的矩阵,app_line代表颜色特征相关的向量。
NeRF的本质:输入坐标位置x、观测方向d,预测体密度σ、颜色c。
TensoRF将空间体密度张量视为三维张量。在预测体密度σ时,输入坐标位置x,取出对应索引下体密度特征相关的向量、矩阵中的值,利用VM公式计算得到该点的体密度特征(标量) ,直接求和作为体密度σ 。
TensoRF将空间颜色特征张量视为四维张量。在预测颜色c时,输入坐标位置x,取出对应索引下颜色特征相关的向量、矩阵中的值,利用VM公式concatenate得到该点的颜色特征(144维的向量) ,用线性层转化成27维。定义MLP解码器,输入计算出的该点的颜色特征向量(27维)、观测方向d(3维),采用傅里叶编码并concatenate,利用线性层回归出该点位置的颜色c。
此处的MLP网络只负责解码,不负责提取特征(因为前面已经利用VM分解提取到了颜色特征),因此比原始NeRF的MLP还要简单很多,只有几个线性层。
在整个处理过程中,计算体密度特征、颜色特征向量时,采用的是离散建模,再插值采样的方式,因此认为是显式的;而计算颜色时,采用了MLP网络回归的方式,因此认为是隐式的。
和NeRF一样,TensoRF本质也是输入坐标位置x、观测方向d,预测体密度σ、颜色c。只不过在建模拟合函数时,引入了张量分解的技巧,利用张量分解先提取体密度σ、颜色c的特征,再对提取到的特征回归体密度σ、颜色c。
这里x表示坐标位置,d表示观测方向,Gσ表示插值采样得到的体密度特征, Gc表示插值采样得到的颜色特征向量,S表示MLP解码函数。
以Lego数据集为例,采用TensoRF进行隐式三维重建。
训练集采用100张RGB图像,每张图像尺寸(800, 800, 3)。
整个建模的空间场景定义为一个长方体,XYZ三个分量坐标都是[-1.5, 1.5],建模的初始体素为[-1.5, 1.5] × [-1.5, 1.5] × [-1.5, 1.5]。 初始分辨率固定为128 × 128 × 128,即每个voxel的长宽高均为3/128=0.0234,后续会随着alpha Mask和上采样不断细化更新。
输入一个batch的三维坐标x、观测方向d。x: (bs, 3)、d: (bs, 3),整体流程可分为6步:
TensoRF是第一个从张量的角度来看待辐射场建模,并提出了辐射场重建作为一个低秩张量重建的问题,整体思路非常巧妙,而且数学原理丰富,理论扎实。美中不足在于代码里的工程trick较多,特别是涉及到alpha mask的更新和体素上采样,细节非常复杂,还是不够简洁优美。
从实验效果来看,TensoRF的渲染效果其实并不算特别惊艳,但确实是大幅减少了NeRF的训练时间,并且降低了渲染所需要的显存,总体而言是令人眼前一亮的工作。