立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

时间:2024-03-23 09:46:50

备注:ground truth 关键词解析

ground truth就是参考标准,一般用来做误差量化

1>> 比方说要根据历史数据预测某一时间的温度,ground truth就是那个时间的真实温度。error就是(predicted temperature - real temperature)。

2>> 全监督学习中,数据是有标签(label)的的,以(x, t)的形式出现,其中x是输入数据,t是label。正确的t标签是ground truth, 错误的标签则不是。


3>> 由模型函数的数据则是由(x, y)的形式出现的。其中x为之前的输入数据,y为模型预测的值。

标注会和模型预测的结果作比较。在损耗函数中会将y 和 t 作比较,从而计算损耗(量化预测值与真实值的差别)。 比如在最小方差中:如果预测标签不是ground truth,那么loss的计算将会产生误差,从而影响到模型质量。
 

一:Stereo Matching

1. 立体匹配概念

立体匹配的意思是基于同一场景得到的多张二维图,还原场景的三维信息,一般采用的图像是双目图像,如下所示,第一幅图和第二幅图分别是双目相机得到的左图和右图,第三幅图就是视差图,一看就知道,这就是场景三维图像。

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

目前,立体匹配领域,主要有两个评测网站,一个是KITTI(http://www.cvlibs.net/datasets/kitti/eval_stereo_flow.php?benchmark=stereo),另一个是middlebury(http://vision.middlebury.edu/stereo/),两个网站上的算法都交叉,但是又不完全一样,相对来说,KITTI更好一点,对算法的性能评测更好,虽然时间测算的并不准确(CSCA竟然要140s,太离谱了)。

下面说说立体匹配最基本的步骤:
1)代价计算。计算左图一个像素和右图一个像素之间的代价。
2)代价聚合。一般基于点之间的匹配很容易受噪声的影响,往往真实匹配的像素的代价并不是最低。所以有必要在点的周围建立一个window,让像素块和像素块之间进行比较,这样肯定靠谱些。代价聚合往往是局部算法或者半全局算法才会使用全局算法抛弃了window,采用基于全图信息的方式建立能量函数。
3)深度赋值。这一步可以区*部算法与全局算法,局部算法直接优化代价聚合模型。而全局算法,要建立一个能量函数,能量函数的数据项往往就是代价聚合公式,例如DoubleBP。输出的是一个粗略的视差图。
4)结果优化。对上一步得到的粗估计的视差图进行精确计算,策略有很多,例如plane fitting,BP,动态规划等。

根据我的理解,可以看作为一种全局算法框架,通过融合现有的局部算法,大幅的提高了算法效果。

2. 论文贡献
文献《Cross-Scale Cost Aggregation for Stereo Matching》(CSCACVPR2014有三大贡献,第一,设计了一种一般化的代价聚合模型,可将现有算法作为其特例。第二,考虑到了多尺度交互(multi-scaleinteraction),形式化为正则化项,应用于代价聚合(costaggregation)。第三,提出一种框架,可以融合现有多种立体匹配算法。(作者提供了详细的源代码,配置运行了一下,效果还真不错,速度也还可以

本文一直强调利用了不同尺度图像“间”的信息,不同于一般的立体匹配算法,只采用了同样尺度下,图像的“内”部结构信息,CSCA利用了多尺度信息,多尺度从何而来?其实说到底,就是简单的对图像进行高斯下采样,得到的多幅成对图像(一般是5副),就代表了多尺度信息。为什么作者会这么提,作者也是从生物学的角度来启发,他说人类就是这么一个由粗到精的观察习惯(coarse-to-line)。生物学好奇妙!

该文献生成的稠密的视差图,基本方法也是逐像素的(pixelwise),分别对每个像素计算视差值,并没有采用惯用的图像分割预处理手段,如此看来运算量还是比较可观的。

3. CSCA中算法流程

算法流程图如下所示:

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

二:代价聚合 Cost Aggregation

由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示。聚合后的新的代价值保存在 与匹配代价空间C同样大小的 聚合代价空间S中,且元素位置一一对应。

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

为了获得较好的匹配效果,SGM算法依旧采用全局立体匹配算法的思路,即全局能量最优化策略,简单来说就是寻找每个像素的最优视差使得整张影像的全局能量函数最小。全局能量函数的定义如公式1所示:

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

其中,Edata为数据项,是反应视差图对应的总体匹配代价的测度;Esmooth是平滑项,为了让视差图满足某些条件假设的约束,如场景表面的连续性假设,平滑项会对相邻像素视差变化超过一定像素的情况进行惩罚(对应的能量函数具有较大的值),而图像边缘处像素例外,因为边缘像素被认为确实是视差非连续区域的概率较大。图2为视差连续区域与非连续区域示意图。

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

由于能量函数是二维函数,所以能量函数最小化是一个二维最优问题,这是一个NP完全问题,有很多近似的较为高效的能量最优策略如图割、置信度传播、合作优化等算法被用来解决这个问题,但是效率上依旧需要进一步改进。为了更高效的解决这个二维最优化问题,SGM算法采用基于类似于扫描线的方法,使用一维路径聚合的方式来近似二维最优,相比其他解决方法效率更高,效果相当。

  首先,SGM提出的更具体化的能量函数如公式2所示:

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

其中,C为匹配代价,公式的第一项是数据项,表示当视差图为D时,所有像素的匹配代价的累加,第二项和第三项是平滑项,表示对像素p的Np邻域内的所有像素q进行惩罚,其中第二项惩罚力度较小(P1较小),对相邻像素视差变化很小的情况(1个像素)进行惩罚;第二项惩罚力度较大(P2> P1),对相邻像素视差变化很大(大于1个像素)的情况进行惩罚。较小的惩罚项可以让算法能够适应视差变化小的情形,如倾斜的平面或者连续的曲面较大的惩罚项可以让算法正确处理视差非连续情况,由于影像灰度边缘处视差非连续的可能性较大,为了保护真实场景中的视差非连续情况,P2往往是根据相邻像素的灰度差来动态调整,如公式3所示

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

P2’为P2的初始值。

  实际上,式2中的能量函数最优化问题依旧是一个NP完全问题,为高效的解决它,SGM提出一种路径代价聚合的思路,即将像素所有视差下的匹配代价进行像素周围所有路径上的一维聚合得到路径下的路径代价值,然后将所有路径代价值相加得到该像素聚合后的匹配代价值。像素p沿着某条路径r的路径代价计算方法如式4所示:
立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

其中,第一项为匹配代价值C,属于数据项;第二项是平滑项,表示的是和式2相同的含义,累加到路径代价上的值,取不做惩罚、做P1惩罚和做P2惩罚,三种情况中代价最小的值;第三项是为了保证新的路径代价值Lr不超过一定数值上限,即

立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation

从图3中可以看到,根据路径数不同,聚合的方向也有所不同,一般来说,有4路径(红色箭头方向)、8路径(红色+黑色箭头方向)和16路径(白色箭头方向)三种聚合方式,路径数越多效果越好,但是耗时也会越长,往往需要平衡利弊,根据应用的实际要求来选择合适的路径数。

  从公式5及6以及路径数不超过16可以很容易推导出S≤16(Cmax+P2)这个不等式很重要,它表明选择合适的P2值可以将聚合代价值S控制在一定数值范围内,减少聚合代价数组对内存的占用。如采用基于5×5窗口的Census变换的方法计算得到的匹配代价值C最高不超过25(因为Census变换后的比特串最大有效长度为25),则匹配代价只需用一个字节来存储,而当P2 ≤ 65535/16-25 时,S可以只用两个字节来存储,因为存储代价的C和S空间大小是W×H×D,当影像尺寸较大时,对内存的占用是巨大的,所以减少元素存储所需要的字节数是必要的。
立体匹配Stereo Matching_Semi-Global Matching之代价聚合Cost Aggregation