上一篇文章85. 三维重建20-立体匹配16,端到端立体匹配深度学习网络之视差计算我们讲了端到端深度学习网络中视差计算的方法,我们看到应用到端到端立体匹配时,视差计算也是有不少讲究的。我还提到,要想进一步提升视差图的准确度,应该通过网络的其他模块配合完成。那么今天我们就来讲一讲,如何来获得高分辨率的视差图,这个问题对我自己也非常重要,因为我最近也正在处理高帧率高分辨率视频立体匹配的问题。
如之前好几篇文章一样,今天的文章也大量参考引用了参考文献[1],再次对作者表示敬意!
在开始之前,还是让我们再看看我们目前的位置(我们没有前进多少 )
那么我们就开始吧~
在传统立体匹配算法中,视差图的大小与代价立方体的大小高度相关,如下图所示:
而我们端到端立体匹配网络中,道理也是一样的,在上一篇文章中我们列出了soft argmin操作的公式如下:
所以,似乎我们要想获得高分辨率的视差图,就只能从构造高分辨率的代价立方体着手了哦?
然而,这很显然就需要增加更多的网络层来提升代价体的尺寸,这意味着更多的网络参数,导致网络难以训练,并且计算量也大大增加。
因为我们同时受限于内存和计算速度,所以获得高分辨率的视差图是如此的困难。人们想到了两种方案来突破这个挑战:
我们现在就来描述这两类方案。
这种方案的思路很直接——把原始图像分成很多块,这样每个块的面积就很小了。然后针对每个块估计其视差图,然后把每个小块的视差图再整合到一起,这个整合的动作也是通过一个子网络来完成的。通过这种方法,确实可以获得高分辨率的视差图,然而也有两个缺点。第一就是每个块都需要进行一次视差图的估计,这样非常不利于实时处理。第二就是由于图像被分为了小块,那么一个小块内的匹配就无法利用到其他块的信息了,这使得它丢失了对图像全局信息的理解,因此这种方法的效果也就受限了。
2018年CVPR上Jae-Han Lee等人发表的下面这篇文章[2]就是自底向上获得高分辨率视差图的代表之一。
作者的基本想法是按下图一样将图像分块,并在每一块进行立体匹配获得视差图,再将视差图上采样融合为一整张视差图。当裁剪的比例很小时,每一块很小,这样就可以捕捉图像中的细节。而裁剪比例大的时候,则又可以很可靠的恢复整个图像的视差。所以作者还用不同的裁剪比例得到多张融合后的视差图。接下来,这些融合后的视差图(尺寸和目标尺寸一致,但各自的细节程度不一致),又在傅里叶域中进行进一步融合,最终变为我们需要的最终高分辨率视差图。
我们可以看到,这个方法涉及多次裁剪、多次深度估计和在傅里叶域中的组合过程。这会导致增加的计算复杂性,尤其是对于高分辨率的图像。另外,虽然裁剪策略可以从不同的视角估计深度,但它可能会忽略某些区域的重要信息。这种局限性可能会导致最终的深度图在某些区域缺乏精确性。而在傅里叶域中进行深度图的融合是一种有创意的方法,但它也可能了入频率伪影或其他不期望的效果。此外,低频和高频内容的确切分界线可能不总是明确的这可能会导致一些信息的丢失。
对于我现在想要解决的视频立体匹配问题(指标至少要到960x540@120fps),这类方法显然是不适用的,因此我们继续来看看自顶向下的方法吧。
自顶向下算法的思想是先估计低分辨率的视差图,然后将其上采样到所需的分辨率,例如使用双线性上采样,并进一步使用残差学习处理它们以恢复小细节和细结构。也可以通过级联许多这样的细化块来逐步运行,每个块都细化前一个块的估计结果。
相比粗暴的获取高分辨率的代价立方体,再进行视差计算的想法,直接细化上采样视差图就会高效很多。因为代价立方体是3D或4D的,对它的细化上采样非常低效。而视差图是2D的,因此对它的细化就高效很多。
我可以用一幅图来总结其中的关键思想,你将会看到各类算法的关键区别就在于附加的信息是什么。
最基本的方式是把初始视差图和原始图像连接在一起然后用卷积层去提取特征,这样做的目的是为了在细化过程中利用原始图像的细节和纹理信息。比如我们提到过的2018年Google发表的StereoNet[3]:
作者在代价立方体的正则化后得到了初始视差图,然后经过一个所谓的级联优化的过程,得到最终的视差图。级联优化的过程如下图所示
这里我们看到,级联优化的输入是彩色图像和视差图,然后通过 一系列基本的卷积网络层,最终得到了一个视差残差图,而原始视差图加上这个残差图就是最终优化后的视差图。
除了将彩色图像和视差图直接合并到一起提取特征,还可以从它们分别提取特征后再合并到一起。比如2018年另外一篇文章ActiveStereoNet[4]就是这样的。
你可以从下面的示意图中观察到,这里有一个Two-SteamRefinement的过程,就是分别从初始视差图和IR图中提取特征,然后再合并到一起。
上面是直接附加彩色图像,其中的特征没有经过提取。下面这篇2018年的文章[5]则是首先将匹配代价立方体和重建误差附加到初始的视差图上。这里面,重建误差被定义为左图像和利用视差信息warp后的右图像之间的差异,这种方法的目的是利用代价立方体和重建误差的信息来更准确地细化视差图,我认为比直接使用彩色图像更好一些:
从下面的图中,我们可以看到视差的逐步细化的过程,第一行是彩色图,第二行是初始视差图,接下来的第3、4行是经过了1次和2次迭代细化的视差图,而最后一行则是GT。可以看到,随着迭代的进行,视差图越来越接近GT。
论文中的下面这个表格也说明了,经过3次细化后,视差图误差达到了最低,当然每一次细化都会消耗时间。
附加代价立方体的问题是参数量和计算量较大,所以也有学者提出更好的利用重建误差和几何误差。刚刚说过,
重建误差被定义为左图像和利用视差信息warp后的右图像之间的差异,而几何误差则是估计的左视差和经过warp的右视差之间的差异(就是左右视差图的差异)。比如下面这篇2019年CVPR的文章[6]将重建误差和几何误差分别附加到初始视差图上形成两个流,它们独立地使用一个卷积层进行过滤,然后进行批量归一化。这两个流的结果被连接起来,然后使用一系列的卷积层进一步处理,以产生细化的视差图。
这个方法还同时学习了一个遮挡图,这个方法进一步提了视差的准确性。
下面是关于细化网络的架构
前面讲的方法都可以得到空间分辨率高的视差图,但视差本身的解析力并未提升。为了同时提升视差图的空间分辨率和视差解析力,2019年CVPR上的下面这篇文章[7]提出了一种解决方法,这种方法在由小到大的几个空间尺度上逐步的进行立体匹配。
具体来说该方法构建了一个由四个4D代价立方体组成的金字塔,每个代价立方体的空间和深度分辨率都在增加。接下来,对每个代价立方体都进行3D卷积,并进一步使用所谓的Volumetric Pyramid Pooling块进行处理。这个块是Spatial Pyramid Pooling的扩展,可以进行3D的处理。这样的操作使得它可以生成捕获高分辨率输入的全局上下文的特征图——注意是每个原始代价立方体都可以得到对应的特征图。
现在,每一个特征图都可以直接进行进一步的3D卷积,从中直接回归视差。这使得可以按需获取不同尺度的视差图。
另外,如果想要得到精细的视差图,则可以将上一层的视差图进行三线性上采样到下一层的空间和视差分辨率,以便与金字塔中的下一个代价立方体融合,融合后的信息可以回归得到下一层的视差图,这个操作迭代进行,直到最底层的视差图。该网络使用多尺度损失进行端到端的训练,这种分层设计还允许通过截断中间的粗糙结果随时按需报告视差,从而允许对近距离结构进行低延迟的准确预测。
论文题图展示了这种迭代式获取精细视差图的过程:
作者还指出,他们的算法比当时的SOTA算法速度更快,而且在一些细节方面甚至还超过了这些SOTA算法。
今天我们学习了“如何获得高分辨率的视差图”这个问题,我为你绘制了思维导图来总结,希望能为你带来启发。
最后看看我们的路标: