【笔记】VolTeMorph

VolTeMorph

Introduction

和NeRF-Editing类似,采用弯曲光线的方式,完成对模型的编辑,不同点有四个

  • 扩展到更多区域,例如嘴内部
  • 利用显卡的光追单元,做到了实时(单张3090)
  • 对view direction做了校正
  • 不使用编辑mesh再传播的方法,而是直接对四面体几何进行操作,可以结合物理模拟

另外,加入了一些tricks,比如对嘴部的特殊优化,Sparsity Loss和NeRF采样策略的改进等

Method

Closed Triangular Primitives

使用四面体作为基本元素,可以使用GPU的光追加速,同时能重建出锐利的边界,并易于编辑

定义一个四面体为

\[X = \{x_1,x_2,x_3,x_4\} \]

变形后的四面体为

\[\hat X = \{\hat x_1,\hat x_2,\hat x_3,\hat x_4\} \]

对于落在四面体内的点,可以得到它的坐标

\[\mathbf{p} = \sum_{i=1}^{4} \lambda _i * x_i \]

记作 barycentric coordinates \((\lambda_1,\lambda_2,\lambda_3,\lambda_4)\)

image-20220809170849650

Changes in View Direction

每个点的color和density不仅和position有关,还和view direction有关

现在的做法,只移动了position,如果view direction不变的话,光线会出错

因此,对view direction进行对应的旋转,从而弥补这个问题

\[\hat{\mathbf{\upsilon}} = R \mathbf{\upsilon} \]

其中\(R\)是旋转矩阵,来自

\[R = UV^T \]

U和V来自视角变化的奇异值分解(即旋转分量)

\[U,E,V = SVD((X - \mathbf{c}_x)^T(\hat{X}-\mathbf{c}_{\hat{x}})) \]

这样便修正了view direction,变形也会影响光照效果,结果更加逼真

但在实践中,对每个变形的四面体计算SVD,非常缓慢,作者采用了随机化的方法

即随机计算5%四面体的旋转矩阵,然后用最近邻插值扩展到所有四面体上

Learning from a Single Frame

作者指出,由于真实物体的变形参数是估计得来的,有误差

用更多帧训练,会导致错误更多,且光照也会有改变,导致图像模糊

作者根据经验,选择仅使用一帧图像(同一时刻,多个相机)进行训练,结果更锐利

Tetrahedral Point Lookups

算法中需要大量计算“一个点是否在某个四面体内”的问题,传统算法太慢

首先给出一个假设(也将成为模型的一个limitation):模型不会自相交

作者借鉴前人思想,从这个点随机射出一条射线,找碰到的第一个三角形,以及在哪一面

这就足以确定在哪个四面体了,因为此时一个三角形最多属于2个四面体,且正好有2面区分

在硬件加速的帮助下,这样的查询非常迅速

作者进一步拓展了这个算法,一方面,添加了对三角形面片的支持(不一定非要四面体)

另一方面,考虑到查询往往是连续进行的,一条射线上许多点都会落在同一个四面体内

如果知道了前一个和后一个交点,便可以通过线性插值算中间所有点的坐标

这样的算法能很方便地整合进作者之前的工作,FastNeRF

Applications

Generic Objects

作者将自己的FastNeRF进行修改

先从volumetric geometry中提出mesh,然后在此基础上重建四面体结构

接着就可以用软件对其进行变形、物理模拟等操作

Human Faces

作者将3DMM的blend shapes重建为四面体模型,并人工调整,使其不发生自相交

蓝色的是3DMM的surface,绿色的重建的四面体立体结构,还可以扩展到红色区域(头发,耳机等)

3DMM无法处理嘴内部的信息,在四面体模型上,如果直接对内部填充四面体,会造成失真

因此,作者将嘴内部重建为不规则的三角形mesh,内部的运动根据两片平面进行

两片平面中间认为是空的,落在中间的sample不渲染(因此无法还原舌头)

Implementation

Sparsity Loss

和之前的那篇Neural Parameterization有些类似,采用了Cauchy Loss的形式,减少伪影

\[\mathcal{L}_{s} = \dfrac{\lambda_s}{N}\sum_{i,k}\log \left(1+2\sigma(\mathbf{r}_i(t_k))^2\right) \]

仅应用在头部周围和口腔内部,前者具体来说,是在四面体内部的,和穿过背景射线上的sample

区分背景通过成熟的2D face segmentation算法求解得到

Sampling

作者认为,NeRF的采样方法会丢失边角信息,因此加长了采样区间

image-20220810160342525

Experiments

Synthetic Data

Baseline

由于D-NeRF用了更多数据训练,而这个工作每个角度只用了一帧,所以在interpolation上输了

但是本工作在extrapolation上还能保持相似的水准,D-NeRF就大幅下降了

Generalization

支持更多的变形,甚至包括打碎的效果

Face Data

一致性非常好,三个人的表情几乎一样

达到了新的SOTA

Performance

python和CUDA/C++混合实现,速度很快,达到了实时 (30fps+)

作者指出把python代码改写成CUDA/C++还能更快

Ablation Study

View Direction

对View Direction的修正,带来更好的光线效果

Mouth Interior

通过对嘴部的单独处理,得到了更好的效果

Sparsity Loss

添加sparsity loss后,减少了许多伪影

Improved Sampling

改进后的sampling策略,改善了一些细节效果

posted @ 2022-08-10 17:52  GhostCai  阅读(104)  评论(0编辑  收藏  举报