NERF+人体重建学习记录

MLP 通常由多层的参数矩阵组成,在计算即前传的过程中,还存在着大量的非线性激活,这使得 MLP 具有非常良好的插值性质,能够输出足够平滑的结果,但这也意味着 MLP 难以捕获到变化剧烈的区域的特征(即高频特征)。

 Positional Encoding:让原本相似的输入别那么相似。回到最开始的输入:3维坐标,2维视角方向,一共5维。所谓不相似就是距离远一些,五维空间是满秩的,一共这么大点地方怎么更远呢,Positional Encoding:映射到更高维的空间不就好了。既然目标是尽可能远一点,那么新空间分布应该尽量满秩,不然就浪费维度了,另外为了方便,映射出的新向量分量正好是正交基就好了。NeRF的Positional Encoding将原始输入映射为傅里叶特征,正好满足上面的需求。

准确来讲:位置编码就是升维,以提高输入数据的频率,

高频信息:指图片的一些轮廓,像素变化比较距离的地方;

低频信息:图片中颜色统一,变化不大的地方,在这些位置梯度变化很小


上图就是Nerf的MLP图,输入为PE后的x,在中途第五层又输入了一遍防止网络忘记,第9层输出体密度sigma(说明体密度的值只与输入光线位置有关),同时在第九层加入了PE升维到24的视角信息,最终生成RGB值(因为不同视角会看到的颜色不同)。


多视角合成人体360°图像评价指标:

(即有真实参照的图像质量的客观评估指标SSIM、PSNR和LPIPS)

结构相似性指数(structural similarity index,SSIM):

结构相似性指数(structural similarity index,SSIM)是一种用于量化两幅图像间的结构相似性的指标。与L2损失函数不同,SSIM仿照人类的视觉系统(Human Visual System,HVS)实现了结构相似性的有关理论,对图像的局部结构变化的感知敏感。SSIM从亮度、对比度以及结构量化图像的属性,用均值估计亮度,方差估计对比度,协方差估计结构相似程度。SSIM值的范围为0至1,越大代表图像越相似。如果两张图片完全一样时,SSIM值为1。

峰值信噪比(Peak Signal to Noise Ratio, PSNR):

峰值信噪比(Peak Signal to Noise Ratio, PSNR)是一种评价图像质量的度量标准。因为PSNR值具有局限性,所以它只是衡量最大值信号和背景噪音之间的图像质量参考值。PSNR的单位为dB,其值越大,图像失真越少。一般来说,PSNR高于40dB说明图像质量几乎与原图一样好;在30-40dB之间通常表示图像质量的失真损失在可接受范围内;在20-30dB之间说明图像质量比较差;PSNR低于20dB说明图像失真严重。

学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS):

学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS)也称为“感知损失”(perceptual loss),用于度量两张图像之间的差别。来源于CVPR2018的一篇论文《The Unreasonable Effectiveness of Deep Features as a Perceptual Metric》,该度量标准学习生成图像到Ground Truth的反向映射强制生成器学习从假图像中重构真实图像的反向映射,并优先处理它们之间的感知相似度。LPIPS 比传统方法(比如L2/PSNR, SSIM, FSIM)更符合人类的感知情况。LPIPS的值越低表示两张图像越相似,反之,则差异越大。


observation space 与canonical space:

observation space:observation space:这是一个用于描述智能体所能观察到的环境信息的集合。观察空间可以是连续的也可以是离散的,通常用于表示环境的状态。比如,在一个迷宫问题中,观察空间可能就是智能体当前的位置

canonical space(标准空间):简单来说,就是一个标准的体积空间或范围,数据落在这个空间里面才能被神经网络所处理,否则,数据被认为无意义、无效的。具体来讲,大多数的三维重建,都会把物体“normalize”到一个单位立方体中(空间),比如[-0.5,0.5]^3,并且把它的旋转姿态给矫正过来。比方说,在自由空间中,一把椅子可能是任意摆放的,但是神经网络处理不了,我们需要把这把椅子给位移到坐标系原点,尺寸给归一化(无论实际尺寸),并且统一把椅子朝着前面摆放。很多神经网络都需要在"canonical space"中处理。常见的比如pointnet,vit,transformer等等。根本原因是他们加了绝对位置编码,依赖于绝对坐标信息。也有不需要在"canonical space"中处理的。比如sub-manifold sparse cnn,graph convolution,spherical cnn,tensor field network。他们只依赖于相对关系,不依赖于绝对坐标(请不要把绝对坐标作为输入)。但是需要严格遵守等变(equivariance)条件。


什么是(逆)线性蒙皮:

线性蒙皮:我们把骨骼点想象为一个基准点,基准点的运动会带动周围一片皮肤的顶点随之运动,而每个基准点都会有一个自己的变换矩阵,可以应用到所有与他相连的顶点。但顶点与基准点之间的关联性也是有区别的(有的强、有的弱),而且有的顶点可能与多个基准点(骨骼)相连,因此在应用变换矩阵的时候会再加一个顶点权重。由此就可以构建出一个基于骨骼的线性模型,用于表示所有动作状况下的顶点位移了。FLAME的论文中,就是定义了三套blendshape,一套是基于下颚,脖子,眼球和姿势的,一套是基于表情的,一套是基于形状的。其中就将第一套称之为pose-dependent corrective blendshape,即基于姿势的蒙皮修正器,意思就是用于修正其他blendshape中无法表达的情况。因为比如眼球的运动,面部其他地方肯定是表达不了的。

逆线性蒙皮:


什么是解耦?

解耦表示学习旨在对影响数据形态的关键因素(factor)进行建模,使得某一关键因素的变化仅仅引起数据在某项特征上的变化,而其他的特征不受影响。在重建中,对身体各部分解耦,可以各个部分分开optim,防止optim一个部分使,影响到另一部分的optim。

一个解耦优化trick:

当网络中有两个相邻(相关)模块都需要优化时,一个模块的优化过程可能会影响到下一模块的优化(前一模块的内容加到后一模块了),这很大程度上会导致后一模块过拟合,最终影响全局优化的效果。这就是因为在优化的过程中这两个相关模块并没有做到很好的解耦,为了解决这个问题,我们可以采用这个技巧:在前一模块的MLP部分,将截断的Hann window应用到位置编码的频带上,防止数据过拟合,随着优化进程增大window值。


NERF重建的流程:

整体pipline包括两部分,三维重建(图a、b)和渲染(图c)。

三维重建:本质上是一个2D到3D的建模过程,利用3D点的位置(x,y,z)及方位视角(θ,φ)作为输入,通过多层感知机(MLP)建模该点对应的颜色color(c)及体素密度volume density(σ),形成了3D场景的”隐式表示“。

渲染:本质上是一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值。

如何训练:利用渲染部分得到的2D图像,通过与GT做L2损失函数(L2 Loss)进行网络优化(图d)。

具体代码流程:参考[NeRF]代码+逻辑详细分析_nerf代码解读 csdn-CSDN博客

(a) 使用raysampler生成光线rays (包含输入的光线方向, 起点, 位置).

(b) 对生成的sampled rays, 调用volumetric函数(即NeuralRadianceField-nerf/nerf/implicit_function.py), 得到rays_densities σ \sigmaσ和rays_features c \mathbf{c}c.

(c)最后, 沿着光线积分颜色。


为什么Nerf重建不叫三维重建而叫新视角合成?

因为NeRF重建的结果并不是三角面片的mesh网格、点云或体素这种显式场景,而是将建模好的三维场景编码在神经模型里。那么如何对这个模型进行交互,最直接的方法就是,给定一个看向场景的摄像机位置和朝向,向场景中发出光线,沿着光线选取采样点,将采样点输入神经模型得到该点处的几何密度和颜色,叠加光线上的颜色实现单个像素的渲染,对所有像素进行类似操作就绘制了一帧图片,而这就是所谓的新视角生成

猜你喜欢

转载自blog.csdn.net/qq_52686989/article/details/133611092
今日推荐