zl程序教程

您现在的位置是:首页 >  其他

当前栏目

精华文稿|在非理想输入下NeRF的重建

2023-02-19 12:23:55 时间

转载自深蓝AI;分享嘉宾 | 马力;文稿整理 | 侯维广

00  内容简介

神经辐射场(NeRF)作为一种通用的场景表达,已经得到越来越多研究者的注意。给定几张不同视角下的图片,我们就能重建出一个非常精细的NeRF。然而在实际应用中,我们经常会遇到不同种输入图像的退化,比如镜头畸变、噪声和模糊。如果在这些非理想状态下重建精细的NeRF是一个值得研究的问题。本次分享中,我们会梳理已有的一些在非理想输入状况下的NeRF重建的相关工作,然后介绍我们的工作:Deblur-NeRF,即如何在输入图像有运动模糊或者失焦时依然能够重建一个清晰的NeRF。

01  NeRF的基本原理

首先简单介绍一下NeRF的基本原理。会讲几个关键的点,首先NeRF跟mesh、点云、multiplane图等一样是一种3维的场景表示。它通过将3维场景参数化成以位置和方向映射到颜色密度的方程,建模一个连续的3D场景函数。

非常重要的一点是场景表示的渲染过程是自然的可微分的,这也是为什么它能起到它能重建出高保真的一个结果。我想来再分享一下NeRF为什么现在这样有这么大影响力,首先它的结果重建效果十分高保真。

它的渲染过程是自动可微分的,所以通过它的渲染结果可以将它的渲染结果跟真实拍摄到的误差直接给反向传递给这个场景表示,这种简单的框架也使得它可复线性非常强。但是它也是有一些不足的地方,首先它的渲染和它的训练速度是非常缓慢。如果你的应用是实时的话,这是绝对不被允许的。其次它是仅建模的单个场景。下一个就是它基本不可编辑。然而这几个点,已经有非常多的work去解决尝试去解决这些不足。

02  非理想情况下NeRF重建的相关工作

我总结了一下NeRF想要重建出一个非常不错的效果,它对输入图片的要求。首先,每张图片的曝光相同。其次这个图片需要比较清晰并且没有噪声也没有模糊,以及它的输入图片一般来说需要比较大于15张,同时需要在同一个尺度上,以及它需要正确的相机标定数据。接下来,我会对针对某一个每一个点,列举一些现在已有的工作。

首先当输入图片有不同曝光的时候,有CVPR的HDR-NeRF。其次当输入的图片有噪声时,主要目前针对输入图片有噪声的这个work,其实据我所知就只有NeRF in the Dark这一篇。

如果针对输入图片数量非常少的情况,基本上在3、4张这样,其实是有非常多的工作,首先这个开山之作PixelNeRF,想要在极少数输入图片下也能呈现出比较好的效果,我们就需要有比较强的先验。这一系列的work引入的先验一般有以下几种,首先一些学习到的先验,通过一个相对来说比较大的数据集下,先对输入图片进行一个encoding,得到这些feature map之后,进行一个volume rendering。

另一篇Putting NeRF,它引入先验的过程是通过了一个预训练的clip网络,它能将任意一张图片encode成一个具有丰富语义信息的feature,通过在一些虚拟的场景下去渲染一些没有机器的view。还有一系列work通过这些depth,比如说点云或说我通过学习的方法得到了一些depth map,通过depth来作为一个先验,因为我们知道NeRF可以渲染出depth map。所以通过depth map的这个监督,也使得能在少量的输入图片下获得一个比较好的重建。

一种非理想状态也说我们很难知道标定的相机位置不准确。或者说很难通过一些structure promotion的方法去得到相机的位置。

其实这一系列工作的想法也非常简单,因为我们刚刚说了NeRF的渲染过程是完全可微分的,所以,对于我们的渲染结果,我们其实也可以把这些渲染结果的误查给回传到相机的位置参数,其实前面两篇文章也验证了可以直接通过这个误差去训练这个相机的位置。还有一篇比较有意思的work就是它考虑了相机的畸变,它也是通过建模各种比较奇奇怪怪的相机参数。

03  传统图像和视频去模糊的相关工作

先介绍一下模糊的形成原理以及已有的这些在图像或者video上去模糊的相关工作。要想解释模糊的成因,首先我们需要先解释一下图像从场景变成一张image的过程。一般相机成像的原理,我们可以把它分成大致分成3部分。

首先光线经过透镜之后,打到感光芯片,感光芯片在经过一定时间的曝光之后,会将打到上面的光信号转化成电信号,后面的ISP处理将每个像素上的电信号变成最后的一张显示在电脑或者手机上的一张图像。那么模糊的成因其实就处在感光元件经过一系列曝光的这一个步骤上,也就是说当其中感元件中的其中的一个像素,它在曝光的一段时间中接收到了不止同一条光线的光,那么模糊就会产生。

模糊可以大致分为物体模糊、相机运动模糊、失焦模糊(出现的原因是因为将相机光圈孔径调大之后就会在背胶平面的地方产生一个模糊)和不常见的大气川流模糊和镜头像差模糊。接下来介绍一下已有的work是怎么样在数学上对这个模糊进行建模的。

一般来讲,我们要建模这个模糊用卷积模型,它的数学公式可以简化成y \approx f(x*h)+nx我们想要的清晰的图像,中间这个信号是一个卷积,h是一个模糊核,f是一个非线性的模块,一般代指了crf 方式,也对真实场景的建模转化为image上像素的值。n就是一个噪声。y是最后观测到的模糊图像,在讲解已有的一些去模糊的算法过程之前,我们先介绍一些有关于使用机器学来做去模糊的一些work。

这里主要就给大家一个大致的分类,具体,如果大家感兴趣的话,可以去看一些。但是这里大致给大家讲一下单张图的去模糊,一般是通过一些深度神经网络在一些大的数据集上训练,从而去学习一些数据的分布,从而使得对只有单张模糊的图像去恢复shape的一个过程。

下面讲讲video的去模糊,因为它有多帧输入,所以使得这个问题的解空间会变小一点,没有像单张图那么困难。其实基于视频的去模糊其实也有非常多类,这里也不详细做介绍。但是我总结了一点,基于视频的去模糊是如何利用多帧的信息来达到去模糊效果。

首先,最简单的一种方式是把连续几帧连接到一起送入到网络中。另外一种方式是用recurrent network的结构,比如用LSTM网络结构,让它利用前后几帧的feature融合到当前帧的过程中来。还有一种是利用光流,也就是前后两帧的pixel wise correspondence,有了这个对应关系就可以非常极大程度的利用前后帧的关系从而去模糊。

但是,有一个难点是你的输入是只有模糊视频,所以如何通过模糊的视频,去估计一个非常准确的光流,这是一个非常困难的问题。所以之后也有工作用了隐式的光流(cost volume)。cost volume是对于每一个pixel而言,它和上一帧的curse bonus有很多的可能性,比如说它可能左移了一个pixel或者右移了一个pixel,那么它在那么多可能性下,对于每一种可能性,它的可能性有多少。还有一类用的比较少,利用学习的方法将muti-view stereo用在去模糊上。

接下来讲讲一下基于传统优化方法去模糊,因为我们的方法其实更接近于传统优化的方法,而不是学习的方法。于传统优化去模糊它一般是怎么做?再次回到y \approx f(x*h)+n 数学模型上,就是清晰图像和模糊核的一个卷积再加上非线性模块,最后可能再加一点噪声,得到了一个模糊图像的过程。一般优化的方法跟现在学习的方法差不多,它也会设一些loss, 为了minimize这些loss,会通过改变我们的优化目标,从而来minimize这个loss,当这些loss取得最小的时候,我们就能得到想要的清晰图像和模糊核。

传统基于优化的去模糊的方式,首先它最主要的energy,清晰图像和模糊核通过这个数学公式算出来的最后模糊图像,要跟我输入的模糊图像是一致的,那这样会有一个loss。其次这个过程会有无限多清晰图像和模糊核能满足这个模糊图像,所以又会加一些正则项去约束,引入一些先验去约束清晰图像和模糊核。其实,你也可以通过学到的那个去作为这个先验,或是正则项,从而去优化清晰图像。

04  Deblur-NeRF

接下来讲讲Deblur-NeRF,因为NeRF本身自带的一些先验,我们希望能够优化出模糊图像。但实际应用中,我们发现传统的基于卷积的方式去模拟blur kernel,无论是在计算以及内存上,都是一个不可能完成的事。为了解决这个问题,我们就将这个转化成sparse kernel。这样子有两个好处,一个是点可以更少,另外这个点其实它不一定要完全依附在每个像素上。所以最后我们就来看一下这个整体的框架,如图1所示。

图 1 Deblur-NeRF整体框架

首先明确一点,这个框架是指在训练过程中的框架,我们的训练完了之后,有了一个非常shape的NeRF,所以,我们就直接对NeRF进行渲染就可以了。

首先我们为了渲染一个pixel的颜色,我们先将这个pixel的位置以及一些view embedding经过一个Deformation kernel模块,得到一系列的rays(可以把它想象成Blur kernel里面的每一个点),优化到rays之后,我们送入NeRF,每一位我们可以渲染得到一个颜色,然后rendering and blending模块其实是前面数学模块里的卷积操作,最后blending得到的颜色,其实是我们想要的生成的颜色。这个颜色跟我拍摄得到ground truth的颜色进行一个对比,

然后将这个error一路反传给这个kernel。

我会说一下里面的一些细节,就首先核心是kernel deformation模块。这个卷积核有一些特征是需要一些额外的设计,首先这个corner的每个视角以及每个像素的corner都是不同的。

第二个特征,我们发现物理的卷积模型,对于每一个kernel的点来说,相机中心都是同样的。但对于实际上真正的一个模糊来说,它每个pixel上能所接收到光线,它的光学中心其实并不是始终如一。最后非线性的那个处理,是刚刚说的那个数学模型上的f,这个其实有很多解决方法,最常见的是camma矫正,也是我们论文里所采用的这个方法。

还有一种方法是可学习的CRF曲线,去建模这个模糊的过程。最后是一个输入对齐的问题,我们加了一个非常简单的align loss,这个loss非常直观一点阐述说这里优化出来的所有光线,其中一根光线是最接近于这个失误的光线。我们最终的loss是reconstruct loss和align loss损失的一个加权。

05  思考与讨论

为什么可以同时优化出卷积核和清晰场景?

这是因为我们用了不一致的视点,所以使整个模型将那些试点不一致的部分给优化到了那个试点不一致的blur kernel上,所以这样才导致了它可以训练出训练出一个好的效果。再说一下这个work的不足之处,首先它内存占比较高,但是这个点其实有非常多的NeRF加速,我们可以整个pipeline迁移到上面,完全没有问题但是唯一一点有关的这个repentation需要有视点一致性的prior在里面。第二点不足有对于视点一致的模糊,我们的work无法去恢复出一个清晰的背景。

其它的未来工作,首先,对于一些运动的物体,我们其实也可以去建模,只要是点不一致的就行。第二个点是利用更快速3维表示。第三个点是我们可不可以把这个模块给应用到拟合动态场景下,使得我们可以对于一个动态的三维场景进行去模糊。最后一个点是我们可不可以引入一些IMAGE SPACE上的先验,使得我们即使模糊是一致,我们也可以对它进行去模糊。

  1. 视觉3D目标检测,从视觉几何到BEV检测
  2. ECCV2022 | PCLossNet:不进行匹配的点云重建网络
  3. 下载 | 101篇NeRF优质论文推荐(含项目代码)
  4. 详尽 | PyTorch动态图解析
  5. 万字解读首篇「人脸复原」综述!