转载自:https://zhuanlan.zhihu.com/p/31160700
这几个月以来,一直在看立体匹配相关的论文,在接下来的几篇文章中,主要是来说一说,对论文的一些见解。
我阅读的第一篇有关立体匹配的论文是《Cross Scale Cost Aggregation for Stereo Matching》,这里简称为CSCA,这是一篇2014年的CVPR的文章(在这里不得不感叹一下呀,这篇文章的一作是清华大学的,差距还是很明显的啊 (。•ˇ‸ˇ•。)),而且,更令人惊讶的是,作者竟然提供了详细的源代码。跟着作者提供的文档,在VS2010上可以完美运行,而且运行的效果还挺不错的,而且在2014年时,它的运算速度还是可以的。(在这里吐个槽,在KITTI测试平台上,CSCA算法居然用了140s!这与我在实际运行的时间完全不是一个数量级,在这里笔者猜想,可能是我的选用方法与测试平台的方法不一样导致的)
在这里给出这篇论文提供的源代码地址:https://github.com/rookiepig/CrossScaleStereo
说了这么多了,现在开始分享这篇论文的读后感。
首先说一说这篇论文的主要贡献:
- 将单一尺度的代价聚合方法扩展到多尺度的代价聚合,也就是CSCA。并且将这种模型扩展成一种通用的有效的框架。
- 考虑到尺度之间的联系关系,在代价聚合公式后面加入一个正则化项
- 定义了一种通用的代价聚合模型,可以将现有的代价聚合方法看成其特例,例如:NL,ST,BF等等
在这里罗列出后文可能会用到的一些英文缩写:
Minimum Spanning Tree(MST:最小生成树)
Segment Tree(ST)
Cross Scale Cost Aggregation(CSCA:多尺度的代价聚合)
Weight Least Square(WLS)
Non-local(NL)、Bilateral filter(BF)、Guided filter method(GF)
Coarse To Fine(CTF)
与我后面所看的立体匹配的论文的不同之处在于:这篇文章通过了解到人的双眼的立体匹配机理,即通过不同尺度的图片来完成匹配,因此,贯串这篇文章的一个核心思想就是多尺度。在这篇文章中,多尺度就是对左右原始图像均进行高斯下采样,这样在每一个尺度空间下都有一对图像可以进行匹配操作,这样同样也就完成了从精细到粗糙的过程(CTF)。
PS:这篇文章还是对每一个像素分别进行计算视差图,并没有采用图像分割的预处理手段,所以说,这也降低了运算量。
下面给出我对于CSCA算法的流程理解:
下面我将根据算法流程图,来进行说明,并且对其中很重要的公式进行着重解释。
1.流程图的最开始获得左右两幅图像,并分别对其进行高斯下采样,这样就得到了成对的多尺度图像。
2.匹配代价的计算,这一步都是对于像素点进行代价计算的,这一步通常的方法有:CEN,CG,GRD(代价计算可以参考我上篇文章)。这里作者给出了GRD(颜色强度+梯度进行计算)的(公式1):
这个公式将颜色信息和梯度信息都考虑到了。 表示视差等级, 和 表示两个阈值,需要注意的是这里的 是一个标量
3.在匹配代价计算完了之后,按照立体视觉基本步骤,下一步需要执行的就是代价聚合。这篇论文提出了一个一般化的代价聚合的模型,这也是我上文所提到过的贡献的第三点。这个模型的数学表现形式如下(公式2):
表示像素 相邻像素的集合, 定义为 的相邻像素, 是一个相似度判决函数,这个相似度可以是颜色强度、梯度等等,不同的核函数 就表示了不同的代价聚合方式。 ,是一个常数。这里说一下个人对于 的理解,首先,如果左右图越相似,那么就匹配的越好,进一步得到的整体的匹配代价就很小,另外一个方面,在一个领域内,往往像素的深度值往往都是很接近的。
对上式进行求解很简单,直接对 进行求偏导即可(公式3):
在这里给出论文中使用的 ,BF方法采用的是两个像素之间的空间和光度距离来度量相似度;GF采用了引导滤波器中定义的内核,其计算复杂度与内核大小无关。NL方法是基于一个树结构上的两个像素之间geodesic距离来定义核函数的。
为什么说这是这篇论文的一大贡献呢?
因为这个模型的巧妙之处在于,它可以将state-of-art的NL,ST,GF等全部融合进去,但是看完这篇文章有点美中不足的地方就在于,论文只是用语言进行了叙述说这个公式是可以适用于目前流行的代价聚合方法的,但是没有实际的证明和推导过程。
4.在给出了在一个尺度下的代价聚合公式之后,下面给出多尺度情况下的代价聚合,这也是这篇论文的另外一个贡献,即我提到的贡献的第一点。首先我先将这个框架给出一个图来说明。
通常我们的立体匹配都是对精细图像进行匹配的,这也就导致了算法对高纹理区域的处理会非常好,但是对于低纹理区域和纹理相近的区域,处理结果就会变得非常糟糕。为了解决这些问题,论文的作者们想到了CTF的方法,对图像进行高斯下采样,那么就可以将精细的图片变成粗糙的图片,这样就可以利用尺度间的信息,来提高匹配效果。
首先来定义所需要的符号:定义 表示在尺度 上的匹配代价, 表示在原始图像(也就是最上层)上的匹配代价值。每一层之间缩放因子是 ,根据公式2,我们可以衍生出多尺度条件下的代价聚合公式(公式4):
相邻两层之间像素坐标和视差的比值为 ,也就是 ,使用 来表示像素点 ,视差 在每一个尺度上的代价聚合。求解公式4就等价于在每一个尺度下分别求解,给出结果(公式5):
上面就是在多尺度下的代价聚合公式,但是还没有完,作为一篇CVPR的文章,不可能只做了这么一点事情,下面要将的也就是这篇论文的最后一个贡献。
5.论文一直在强调利用多尺度之间的信息,前面只是构建了一个多尺度的模型,光有模型没有尺度之间的联系也是不行的。于是,作者通过在多尺度匹配代价聚合公式后面加入正则项来约束尺度之间的联系,也完美的考虑了尺度之间的关系。我认为,这才是这篇论文最大的贡献点。
在公式4后面加入一个正则化项,就得到了最终的公式(公式5):
是控制正则化项的常数,我们重新定义:
表示像素 ,视差 在每一个尺度上的代价聚合。通过找到优化目标的稳定点,我们可以求出对应解。
正则化项的意义在于:保持不同尺度下的,同一像素的代价一致,如果正则化因子越大,说明同一像素不同尺度之间的一致性约束越强,这会加强对低纹理区域的视差估计(低纹理区域视差难以估计,需要加强约束才行),但是副作用是使得其他区域的视差值估计不够精确。不同尺度之间最小代价用减法来体现,L2范式正则化相比较于L1正则化而言,对变量的平滑性约束更加明显。
这里用 来表示公式5,对 求偏导得到(公式6):
令(公式6)=0,我们可以得到:
那么在这里,我们就可以很容易的得到 到 的相似度,进一步,可以通过一个矩阵 ,得到 和重新定义的\tilde{v}的之间的关系:
6.遍历图像的每一个像素点,应用WTA策略,对每一个像素点选出最佳的视差,得到视差图,然后对得到的视差图进行亚像素处理和均值滤波等后续操作。
下面给出这篇论文的实际效果:
总结:
总的来说,这篇文章作为一篇CVPR的文章还是有很高的可读价值的,再者,这篇文章将多尺度的图片应用到了立体匹配上,可以说是一个很大的创新点,并且对于尺度之间的图像的联系提出了使用正则化项进行约束的想法,经过验证是可行的,文章中所提出的框架也值得我们后续去学习和扩展。