在上一篇文章90. 三维重建25-立体匹配21,训练端到端的立体匹配模型的不同监督强度中,我们描述了训练端到端立体匹配网络的不同监督程度的方法,包括有监督学习、自监督学习,以及弱监督学习。我提到:
端到端立体方法的训练过程旨在找到网络参数 W, 以最小化损失函数L(W,D,Theta), 其中D是估计的视差, 而Theta是监督线索。这里的损失函数定义为数据项和正则化项之和,其中
上一篇文章对于这里的正则项没有深入探讨,实际上,根据本文所列的参考资料,在正则项中我们可以进行约束的信息有:
本文将对这些约束信息和一些参考资料详细介绍,希望对你有所启发。
如之前好几篇文章一样,今天的文章也大量参考引用了参考文献[1],再次对作者表示敬意!
本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源,如果你觉得有用的话,真诚的希望你顺手点个赞,并推荐给你的朋友们!也欢迎你加入我的计算摄影知识星球和广大的计算摄影爱好者进行讨论交流。
这一点其实在我很多文章中已经多次强调过。它也与我们代价聚合的底层思想是一致的,早期文章71. 三维重建6-立体匹配2,立体匹配中的代价聚合就提到过代价聚合就是基于这个思想
为了在正则项中加入这种对局部平滑性的约束,我们可以加入:
这里,x是一个位置,y位于x的一个事先定义好的邻域里,N是总的像素数量。
一阶梯度约束的作用是减少视差图在空间上的急剧变化,促使相邻像素的视差值趋于平滑。这对于减少图像中的噪声和消除视差估计中的尖锐变化非常有效
二阶梯度约束适用于进一步平滑视差图,使得视差值不仅在相邻像素间连续,而且在更大的区域内平滑过渡。特别是在处理较大平坦区域时,二阶梯度约束可以有效避免“楼梯效应”
这种方法通过对视差图的二阶梯度进行约束,并结合图像的二阶梯度进行加权,从而在保证视差图整体平滑的同时,保留了边缘细节。这里面加权项是有用的,因为在图像的边缘区域,二阶梯度较大,负指数函数的值较小,对应的视差梯度约束较弱,有助于保留边缘细节。而在平坦区域,二阶梯度较小,负指数函数的值较大,对应的视差梯度约束较强,保证了视差图的平滑性。
2017年Yiran Zhong等人的下面这篇文章[2]就是一个典型的例子,
它的损失函数中由多项组成,其中一项L_s^l + L_s^r是所谓的正则项
这里对左右两张图的视差图都进行了二阶梯度的计算,并且用图像的二阶梯度加权,
左右视差一致性也是我提过多次的,之前一般是在后处理中用于检测匹配错误的像素。我们也可以把这种约束直接加入损失函数的正则项中,直接惩罚左右不一致的匹配。
这三张在左图空间的视差图就构成了两个约束关系,即
接下来,就可以计算一致项了,基于左图空间的一致项表示如下,右图同理:
当然,这种方法比较复杂,所以也有仅采用上述第一个约束的,即, 例如文章[3]
在真实世界中,可能存在多个变换函数能够实现相似的变换损失,特别是在无纹理区域。无纹理区域的像素强度变化较小,导致变换函数在这些区域的效果差异不明显,难以区分优劣。为了解决无纹理区域的问题,有一些作者提出在模型中利用最大深度启发式(MDH),提供更强的正则化。它最大化所有深度的和或最小化所有视差的和,例如在上面的文章[2]中,作者还加入了一项,其计算方法如下:
之所以有这样的假设,是因为在无纹理区域,通常认为这些区域是远处的平坦表面,如天空、墙壁等。因此,认为这些区域的视差较小,或深度较大,是比较合理的假设。
接下来要说的是尺度不变梯度损失,典型的算法来自文章[4]。这个损失项惩罚相邻像素之间的相对深度误差。通过在每个像素的局部邻域内比较深度值,这种损失项刺激网络在同质区域内增加平滑性,同时强调深度的不连续性,并促进锐边的对齐。,其公式如下:
它通过在多个尺度上计算损失(A={1,2,4,8,16}),这种方法能够捕捉不同尺度下的深度特征,从而提高模型的鲁棒性和精度。这里gh[f](i,j) 表示在不同尺度上的相对梯度计算,通过归一化处理,确保在不同尺度上的梯度计算具有一致性和可比性。由于通过多尺度处理和相对梯度计算,这种方法在处理不同类型的图像和场景时具有更高的鲁棒性。
该文章有一幅截图如下,其中(c)是使用了这种损失后得到的视差图,很明显它比不使用这种多尺度的梯度损失时得到的结果(a)(b)好得多,更接近GT (d)。
还有很多文章采用了额外的语义信息,来帮助提升视差图估计的准确性。例如利用法向量[5]、分割信息[6]、边缘信息[7]等。这些方法要么通过一个外部的算法来计算这些语义信息,要么是把它们和视差图的估计整合到一个框架中,作为一个多任务的算法与视差图的估计相互促进。
我们先来看看文章[5],其中作者提出了一种机制,通过使用深度图来细化法向量估计的质量,同时利用法向量图来提高深度估计的精度。虽然这篇文章讲的是单目深度估计,但是其中思想对我们双目立体匹配估计深度依然是适用的
这个机制是通过双流网络实现的,包括两个部分:一是使用初始深度估计来细化法向量图的“深度到法线”网络,即下图的下半部分,二是利用估计的法向量图来细化深度估计的“法线到深度”网络,即下图的上半部分。
下面是这个网络的完整结构。作者首先使用双流CNN预测初始深度图和表面法向量图,其中采用了VGG-16和ResNet-50作为基本结构。接着,基于预测的初始深度图,应用深度到法向量网络进行法向量的细化;同样,基于表面法向量估计,使用法向量到深度网络进行深度细化。这一过程通过预训练深度到法向量网络并使用真实深度作为输入进行优化。而法向量到深度网络不需要学习任何权重。
损失函数也需要同时考虑到深度损失和法向量损失。对于像素i, 初始、细化和真实深度分别表示为
同样,初始、细化和真实表面法向量分别表示为
总像素数为 M。
整体损失函数是两个部分的和,即:
深度损失的定义如下:
其中:
通过同时考虑深度损失和法向量损失,作者提出的损失函数可以在端到端训练过程中优化深度和表面法向量估计。这种方法能够确保模型输出的深度图和法向量图在几何上是一致的,并且具有高精度。
有一些算法结合分割信息,来优化双目立体匹配的视差图。比如我们之前讲过的这一篇[6],看名字就简单粗暴:利用语义信息来估计视差图
我们直接看看作者给出的示意图
作者把所提出的网络结构命名为SegStereo,上图展示了SegStereo的框架。作者从立体输入图像中提取中间特征F_l和F_r, 通过相关运算符计算代价体积F_c, 左侧分割特征图F_s^l被聚合到视差分支中作为语义特征嵌入。右侧分割特征图F_s^r被变形到左视图,用于每个像素的语义预测,并使用softmax损失正则化。两个步骤都结合了语义信息来改进视差估计。SegStereo框架支持无监督和监督学习,使用光度损失L_p或视差回归损失L_r。
这个过程,可以用伪代码示意如下:
文章[7]进一步在边缘感知平滑损失中加入了边缘线索,以惩罚在平坦区域内的剧烈深度变化。此外,为了在物体边界处允许深度不连续性,边缘感知平滑损失是基于从边缘检测子网络获得的梯度图来定义的,这比原始像素强度的变化在语义上更有意义。
作者提出的网络叫做EdgeStereo,该框架由一个视差网络和一个边缘子网络组成。作者为了提高计算效率,共享了骨干网络的浅层部分。下面是这个框架的示意图
其整体过程如下面所描述。
作者通过EdgeStereo框架,巧妙地将视差估计与边缘检测相结合,利用边缘信息来改进视差图的精度和细节表现。通过共享骨干网络的浅层部分,提高了计算效率,并且通过多尺度上下文和残差金字塔结构,实现了视差估计的高效和高精度。
今天我为你介绍了在立体匹配的过程中使用额外的信息来提示匹配准确度的知识,我们可以使用的这些额外的信息包括了
在这些信息里面,我认为平滑性、一致性是基本的必须加入的,而语义信息虽然增加了网络的复杂度,但在实践中已证明非常有用,建议你在构建自己的匹配框架时也好好的利用。但最大深度启发和尺度不变的梯度损失则可以根据你自己的实验结果来判断,它们在你的数据集上不一定能够带来好的效果。
总之,希望这篇文章对你有帮助!
本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源,如果你觉得有用的话,真诚的希望你顺手点个赞,并推荐给你的朋友们!也欢迎你加入我的计算摄影知识星球和广大的计算摄影爱好者进行讨论交流。