NeRF 的改进方向
这里只列出论文的名字或者模型简称,以及一些概括,没看的先留白,这里写的会很随意,当作备忘录了。
适合作为学习索引或者备忘录,忘了就来这里找找。(更新中)
1. 泛化性
1) 减少输入图像类
1.Pixel-nerf
Pixel-nerf对输入图像使用卷积进行特征提取再执行 nerf,若有多个输入,对每个视角都执行 CNN,在计算光线时,取每一个已有视角下该坐标的特征,经过 mlp 后算平均。可以在少量视角下重建视图,需要进行预训练才能使用,有一定自动补全能力(有限)
2.IBRnet
IBRnet是 pixel-nerf 的改进版,取消了 CNN,并且在 mlp 后接入了 transformer 结构处理体密度(不透明度),对这条光线上所有的采样点进行一个 transformer。同时,在获取某个体素的颜色和密度时,作者用了本视角相邻的两个视角,获取对应体素在这两张图片中的像素,以图片像素颜色,视角,图片特征作为 mlp 的输入。
3.MVSnerf
MVSnerf它用 MVS 的方法构建代价体然后在后面接了一个 nerf,MVS 是使用多视角立体匹配构建一个代价体,用 3D 卷积网络进行优化,这里对代价体进行 nerf 采样,可以得到可泛化网络。它需要 15min 的微调才能在新数据上使用。多视角立体匹配是一种传统算法,通过光线,几何等信息计算图像中小块的相似度,得出两个相机视角之间的位置关系。这个算法也被广泛使用在得到我们自己采样的数据的相机变换矩阵上(我就是这么干的)
此处涉及较多图形学,使用了平面扫描算法,其中有单应性变换这个角度变换算法,推导与讲解如下:
MVSNet 单应性变换推导_朽一的博客 - CSDN 博客_可微单应性变换
简单来说就是把 A 视角下的图像转换到 B 视角
平面扫描就是把 A 视角中的某一像素点(如图中红色区域)的相邻的几个像素提取出来,用单应性变换转换到 B 视角中,这时候用的深度是假设的深度,遍历所有假设的深度,计算通过每一个假设深度经过单应性变换得到的像素小块和 B 视角中对应位置的差值(loss),取最小的 loss 处的深度作为该像素的深度。
构建代价体:
构建三维代价体的主要步骤: 1) 假设离散的深度平面。 2) 将每个视图提取的特征图变换到假设平面上,构造特征体; 3) 将不同视角的特征体融合在一起,形成三维代价体。
2) 可以 zero-shot 或者 fine-tune 类
MVSnerf,上面已经说了。
2. 速度提升
1.instan-ngp
使用了哈希表结构的instant-ngp,渲染完美只需要几分钟(采样正常的情况下)这块的速度已经到极致了。
展开说说:其实这也是神经网络发展的一个方向,以前的深层网络倾向于把所有东西用网络参数表示,这样推理速度就会慢,这里使用哈希表的快速查找能力存储一些数据信息,instant-ngp 就是把要表达的模型数据特征按照不同的精细度存在哈希表中,使用时通过哈希表调用或插值调用。
3. 可编辑(指比如人体运动等做修改工作的)
1.Human-nerf
Human-nerf生成可编辑的人体运动视频建模,输入是一段人随便动动的视频。输出的动作可以编辑修改,并且对衣物折叠等有一定优化。使用的模型并非全隐式的,并且对头发和衣物单独使用变换模型。使用了逆线性蒙皮模型提取人物骨骼(可学习的模型),上面那个蓝色的就是姿态矫正模块,这个模块赋予骨骼之间运动关系的权重(因为使用的是插值处理同一运动时不同骨骼的平移旋转矩阵,一块骨骼动会牵动其他骨骼)图中的 Ω 就是权重的集合,它通过 mlp 学习得到。然后得到显式表达的人物骨骼以及传入视频中得到的对应骨骼的 mesh,skeletal motion 就是做游戏人物动作用的编辑器这种,后面残差链接了一个 non-rigid-motion(非刚性动作),这个是专门处理衣物和毛发的,主要通过学习得到,然后粗暴的加起来就能得到模型,再经过传统的 nerf 渲染出图像。
2.Neural Body
Neural Body 通过下面这种单视角视频或稀疏视角照片来生成人体建模。
因为生成的是人体建模,作者使用了他们以前的工作 EasyMocap 得到SMPL 模型(就是人体的结构)然后在 SMPL 表面生成一些 latent code(包含颜色,不透明度和位置),也就是下左中的那些点。
EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作,演示视频右下。
这是 EasyMocap 的演示。
这里作者对 nerf 进行了修改,让 nerf 通过 latent code 渲染图片。流程是先用 latent code 构建三维网格,在这个网络中用空间插值得到具体某个点的值。这一步通过 3D 卷积实现,把原先存在空间中的离散的点整合到一个 latent code volume 中,在这个空间中进行 nerf 的渲染。省掉了 mlp,把整个建模储存在 3D 网格中而非 MLP 中,加快计算速度。
作者把每一帧提取到的骨架用 latent codes 进行蒙皮,使得人体变成对应的姿势,就可以进行逐帧渲染。
个人感觉这个模型不能很好处理光影效果,还有待改进。
是个预训练模型,训练的模块就是这个 3D 卷积神经网络。
3.wild-nerf
wild-nerf 思路很简单,就是加入了新的输入参数来调整白天黑夜等等一些简单的变化,并且把行人车辆之类的在采样过程中不固定的物品作为随机项,在渲染时按照概率加入。
4.D-nerf
D-nerf 是一种动态编辑的 nerf,输入为:x,y,z, 相机位置,相机角度,时间 t。
把整个网络分为两块,一块是正常的 nerf 渲染,另一块是下面这个,输入时间与现在的位置坐标,输出这个位置坐标中的物体现在的位置与 t=0 时的位置的差。再用 t=0 时物体的点信息进行渲染。
在此网络的单个输出上貌似是不监督的,因为没办法进行人为标注。这点我不是很确定,以后如果发现了会来修改的。
渲染经过形变的物体时,光线其实是在 t=0 时刻进行渲染的,因为推土机的铲子放下去了,所以光线是弯曲的。
4. 用于辅助传统图像处理
还没涉猎,待补全
5. 与对比学习结合
1.clip-nerf
clip-nerf 太贵了玩不起,没仔细研究,应该是文本跟 3D 建模关联,跟 clip 一样。
6. 生成类(指加入新物体或者额外生成新场景)
1.GRAF
GRAF把 GAN 与 nerf 结合,增加了两个输入,分别是外观 / 形状编码 z和2D 采样编码 v,z 用来改变渲染出来东西的特征,比如把生成的车变色或者变牌子,suv 变老爷车之类的。v (s,u) 用来改变下图 2 中训练时选择光线的标准。这里训练时不是拿 G 生成的整张图扔进 D 网络,而是根据 v 的参数选择一些光线组成的 batch 扔进 D 进行辨别
2.GIRAFFE
GIRAFFE 是 GRAF 的改进工作,可以把图片中的物品,背景一个个解耦出来单独进行改变或者移动和旋转,也可以增加新的物品或者减少物品,下图中蓝色是不可训练的模块,橙色可训练。以我的理解好像要设置你要解耦多少个 (N) 物品再训练,网络根据类似 k 近邻法的方法在特征空间上对物品进行分割解耦,然后分为 N 个渲染 mlp 进行训练,训练前加入外观 / 形状编码 z。最后还是要扔进 D 训练。
3.OSF
OSFObject-Centric Neural Scene Rendering,可以给移动的物体生成合理的阴影和光照效果。加入了新的坐标信息:光源位置,与相机坐标等一起输入。对每个小物件构建一个单独的小 nerf,计算这个小 nerf 的体素时要先经过光源照射处理(训练出来的)然后在每个小物件之间也要计算反射这样的光线影响,最后进行正常的渲染。这篇文章没人写 review,有点冷门,这些都是我自己读完感觉的,不一定对。
4.Hyper-nerf-gan
使用了超网络与 nerf-gan 结合,这篇比较新没有 review,是我自己理解的,可能有出入。
作者用了几个我比较陌生的技术,比如超网络 hypernet,还有超网络与 gan 结合的 INR-Gan。
hypernet:把随机初始化和直接梯度回传更新的网络参数用另一个神经网络来更新,就是我们要同时训练两个网络,一个是本体,一个是调整参数用的超网络。
INR-Gan:把超网络技术与 Gan 结合,并且用了 INR 技术,这个技术类似 nerf,不过是处理图片用到的,是构建一个坐标 (x,y)->RGB 的网络,可以让图片达到更高分辨率,也就是把离散的像素变成连续的。
左边是常规卷积网络生成图像,右边是用 INR 生成图像。
这种方法存在两个问题:
1. 因为 INR 其实是一种超网络,也就是说我们要训练两个网络,但是只存在一个监督。使得网络训练更难。
2. 因为使用神经网路去表示图片,占用内存更大。
因此,作者设计了FMM去应对这两个问题,这也是 Hyper-nerf-gan 借鉴的主要部分。
FMM 主要是把要学习的矩阵转化为两个低秩矩阵,去先生成他们俩再相乘,减少网络计算量。
现在开始讲 Hyper-nerf-gan 本身,它看上去其实就是 nerf 接在 gan 上。不过有一些变化,比如输入不再包含视角信息,我很怀疑它不能很好表达反光效果。而且抛弃了粗网络细网络的设计,只使用粗网络减少计算量。这里的 generator 完全就是 INR-Gan 的形状,生成权重,然后再经过 nerf 的 mlp 层生成,没啥别的了,就这样吧。