万万没想到,把照片变 3D 这件事,离了神经网络也是这般丝滑。
而在此之前,新视角合成这方面的“大牛”,是近两年大火的 NeRF (神经辐射场)。它是一个简单的全连接神经网络,使用 2D 图像的信息作为训练数据,还原拥有体积的 3D 场景。
但最近,来自伯克利大学的研究人员提出了一个叫做 Plenoxels 的方法。不需要神经网络,仅仅通过梯度下降和正则化便实现了同样的效果,而且速度还快了 100 倍!那么他们是如何做到这点的呢?
为了帮助大家理解 Plenoxels,我们先来简单介绍一下 NeRF 模型。
要准备 NeRF 的数据,我们首先需要一部相机。
拍了很多张各个角度的照片后,沿相机射线将每一张 2D 图片的坐标与视图方向构成一个 5D 向量 (x, y, z, θ, φ)作为 mlp (多层全连接神经网络)的输入。
我们从图 (b) 上可以看到,射线上的点有了颜色,每点的颜色 c = (r, g, b)和密度(σ)就是输出向量。接着 NeRF 使用体积渲染技术将得到的颜色与密度进行 3D 渲染。
由于渲染函数是可导的,我们可以最小化合成效果与实际效果的误差,从而进行神经网络参数的优化。其中 mlp 使用的参数多可达到 5MB,实际训练起来就会发现训练时间十分漫长,通常要 1-4 天。这个速度与 Plenoxels 的 11 分钟相比确实是无法接受的。
2D 图片变 3D,听起来不是个小工程,Plenoxels 不用神经网络是如何实现的呢?其实并不复杂。
Plenoxels 发现 NeRF 成功的秘诀其实是它的体积渲染方程,与其最耗时的神经网络关系不大。那么你一定会好奇这个体积渲染方程究竟是何方神圣,我们就先来看一下。
σi 代表不透明度,ci 代表颜色,δi 代表距离。Ti 代表有多少光经过射线上的点 i,是通过密度和距离计算的。这个体积渲染方程其实就是将射线上每个点的颜色,不透明度,光,还有距离进行了一个整合处理。
体积渲染方程介绍过了,那么不需要神经网络的 Plenoxels 是如何表示图片的呢?
Plenoxels 首先重建了一个稀疏的体素表格,每个被占用的体素都带有不透明度和球谐系数。
我们的颜色信息就存储在这些球谐系数中,每个颜色通道需要 9 个系数表示,一共有三个颜色,那么每个体素就需要 27 个球谐系数来表示它的颜色。
相机射线经过的每个点的颜色和不透明度,就是通过其最近处的 8 个体素的三线性插值计算的。接着与 NeRF 一样,使用体积渲染技术将得到的颜色与不透明度进行 3D 渲染。
Plenoxels 通过对渲染的像素的平均平方误差 (MSE)进行最小化,来优化体素的不透明度和球谐系数,并且使用 TV 正则化帮助消除噪声。
我们可以看出,是否使用 TV 正则化的效果区别还是很大的!
我们用最直观的方法对比一下两个模型速度上的差距。
看到了吗,只用几秒 Plenoxels 就可以达到一个比较清晰的效果,而 NeRF 只有一个模糊的影子。
同样是单个场景,NeRF 使用型号为 v100 的单个 GPU 训练需要耗时 1-2 天,而 Plenoxels 使用单个 GPU 通常只需要 11 分钟。
这时有一个问题一定萦绕在你的脑海里,速度提升了这么多,效果真的不会受影响吗?
空口无凭,我们还是要用数据说话。
PSNR (峰值信噪比):是最普遍,最广泛使用的评鉴画质的客观量测法,PSNR 值越大,就代表失真越少。
SSIM (结构相似性):衡量实际图像和合成图像的相似度,当两张图像一模一样时,SSIM 的值等于 1。
LPIPS (学习感知图像块相似度):用于度量实际图像和合成图像之间的差别,值越低代表图片越相似。
可以看到 Plenoxels 对比其他模型的表现不说样样最好,但也绝不落后他人,关键在于它的速度整整快了两个数量级!
正因为 Plenoxels 速度上的大幅提升,使得一些目前处于瓶颈的下游应用变得可能,例如多次反射照明 (multi-bounce lighting)和大型场景的 3D 建模 (3D generative models)。
如果能在相机和体素散列上进行有效优化,模型甚至可以让端到端三维重建成为拥有 pipeline 的实际应用。
相信 Plenoxels 的潜力不仅于此,让我们一起期待它落地后的成果吧!
效果强劲的 Plenoxels 来自 UC 伯克利的学生团队,一作 Alex Yu 还是一名本科生。在大学里,他不仅同时学习计算机和应用数学两门专业,还在伯克利的 BAIR ( Berkeley Artificial Intelligence Research)实验室进行 3D 计算机视觉的相关研究。
Alex 计划在 2022 的秋季开始他的 PhD 旅程,让人不禁感叹 AI 界真是人才辈出。在未来经过 PhD 的学习后,他又会迸发出怎样的能量呢,让我们一起拭目以待吧!
目前,Plenoxels 项目的代码已经在 GitHub 上开源。
小伙伴们要注意的是,拍摄照片的时候要尽可能环绕物体,并且尝试不同的高度哦。
快来试试效果如何吧!
参考链接:
[1]https://alexyu.net/plenoxels/?s=09
[2]https://github.com/sxyu/svox2
[3]https://www.casualganpapers.com/eccv-3d-novel-view-synthesis-differentiable-rendering-implicit-representation/NeRF-explained.html
[4]https://www.casualganpapers.com/nerf-3d-voxels-without-neural-networks/Plenoxels-explained.html
广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。