社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

85. 三维重建20-立体匹配16,端到端立体匹配深度学习网络之视差计算

计算摄影学 • 1 年前 • 227 次点击  

在我的上一篇文章84. 三维重建19-立体匹配15,端到端立体匹配深度学习网络之代价体的计算和正则化中,我们学习到了端到端立体匹配网络的代价体计算及正则化的过程,我看到了3D和4D两类代价立方体、以及混合使用两者的方案。正如下图所示,

当进行了代价立方体的正则化后,下一个步骤就是视差估计了。

那么,今天我就来简要的讲一讲通过正则化后的代价立方体进行视差估计。今天的文章大量参考引用了参考文献[1],再次对作者表示敬意!

本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源,觉得有用的话顺手点个赞哦 也欢迎你加入我的计算摄影知识星球和广大的计算摄影爱好者进行讨论交流。

在开始之前,还是让我们再看看我们目前的位置(怎么还没有完 ):

那么我们就开始吧~

一. 视差计算之Winner Take All

让我们回到Stefano教授的经典讲义(70. 三维重建5-立体匹配1,立体匹配算法总体理解),经典的视差计算方法采用的是赢者通吃策略(及所谓的Winner Take All, WTA),在这里对某个像素,我们会选取匹配代价最低的那个视差值作为计算出的视差值,如下图所示:

如果用公式表示的话,就是:

当然,如果我们的代价立方体里面做了变换,使得其编码了匹配似然度,那么公式就会变成使用argmax,因为似然值是越匹配越大。

如果我们采用的是分离式的方案,那么这样当然不错。但对于我们现在所讲的端到端的立体匹配来说,这种计算方法则存在下面两个不足之处:

  1. 它是离散的,只能得到整数型的视差值,而不能进行亚像素级别的视差估计

  2. 它是不可导的,很显然这种性质使得它无法参与到深度学习的反向传播过程,从而阻碍了在端到端网络中的应用

很多学者都在想办法解决这两个问题,我们进行首先要看的就是所谓的soft argmin/argmax操作。

二. Soft argmin/argmax

我首次看到在立体匹配网络中引入soft argmin/argmax是在下面这篇论文中

作者们首先将代价立方体中的代价值取其相反数,然后进行soft max归一化然后得到归一化的概率值。然后取每个视差的总和d,通过其归一化概率进行加权

这个式子具体展开就是下面这样:

我们从这个式子可以看出,这里求出的视差d*不再是一个整数值,而是一个浮点数的、亚像素级别的视差值,而且这个式子明显是可导的,这样就可以使得这种“软”操作可以接入到端到端的立体匹配网络中了。

不过,作者明确在论文中指出了这种方法的缺点:与argmin操作相比,它的输出受到所有代价值的影响。这使得它容易受到多模态分布的影响,也就是代价曲线有多个可能的峰值的情况。这种情况下,soft argmin/argmax操作估计所有视差的加权平均值,这使得最终求出的视差值d*明显偏离真值。为了克服这一限制,作者实际上依靠网络的正则化来产生主要是单峰的视差概率分布(我觉得这明显不靠谱,特别是在物体的边缘等视差跳变的地方)。作者还提到网络可以预先缩放匹配代价,以控制归一化后softmax概率的峰值。

论文中的图我给大家解读一下,这里有三张图,分别对应单峰情况(a)、多峰情况(b),以及进行了预先缩放匹配代价后的多峰情况(c)。

每一张图,从上到下分别是原始匹配代价,匹配代价求负值后的概率值,soft max归一化后的匹配概率,视差值,以及匹配概率与对应视差值的乘积。同时,图中还标出了实际argmin操作及soft argmin操作得到的视差值。我们可以看到,对于单峰匹配代价曲线,soft argmin的结果非常接近真实的argmin操作结果 ,而对于多峰情况,加权平均后的视差值则大大偏离了真值。从第三图看到,如果网络学会了对代曲线做缩放,那么就能使得最后算出的视差值接近argmin计算得到的视差值了,因为此时整个曲线变得更加极端,接近单峰模式。

三. 在有限范围内进行加权平均

寄希望于网络对每个像素点都学到单峰形态的代价曲线,显然是不靠谱的——特别是对应物体边缘、遮挡区域的像素等,这些地方的代价曲线显然是多峰模式的。一些学者提出了更好的解决方案,我们现在看看下面这篇由中山大学和大疆的几位学者共创的论文:

作者也观察到了第二节所讲述的方法得到的视差图,在物体的边缘区域有过于平滑的现象(Over-Smoothing,看论文标题)。在双峰情况下,下图中真值是红色块对应的视差值,而加权平均后得到的是蓝色三角形对应的视差值,这显然不对。

不仅如此,当我们在更小的空间分辨率上进行代价计算时,就更难以判断某个边界像素到底是位于前景还是背景了。作者认为,这种情况下,视差值像差很大的的归一化代价值之间的关联很少,本来就不应该加权平均到一起。比如下图的代价立方体,它已经经过了下采样,空间上同一个像素的两种匹配代价(两个红色块)之间关联很少,它们的影响只在其局部,所以就不应该把它们混在一起。

所以作者们提出的方案是并不在整个视差范围上使用加权平均操作,而是只在最大概率的视差值附近应用加权平均操作。作者首先找到最大概率的索引,然后从这个索引向左和向右扩展,直到它不再单调递减,于是公式变成了下面这样:

其中:

作者将这种方法与采用普通soft argmin的PSMNet的视差计算结果做了对比,从下图中我们明显看到PSMNet的边缘有一些过平滑的视差值,从外观上来讲就是物体显得胖了一圈,而作者的方案中边缘则更加接近Ground Truth。

四. 总结

视差计算看起来是一个简单的过程,完成这一步后我们就得到了最终的视差图。但从今天的文章你应该看到,当应用到端到端立体匹配时,视差计算也是有不少讲究的。对于我的读者来说,我觉得掌握带范围约束的soft argmin加权平均视差计算就足够了,视差图的进一步提升可以通过网络的其他组成部分去完成。我会在下一篇文章重点谈谈几个端到端立体匹配网络要解决的关键挑战,和对应的论文,敬请期待!

最后看看我们的路标:

本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源,觉得有用的话顺手点个赞哦 也欢迎你加入我的计算摄影知识星球和广大的计算摄影爱好者进行讨论交流。

五. 参考资料

  1. Hamid Laga, Laurent Valentin Jospin, Farid Boussaid, and Mohammed Bennamoun. (2020). A Survey on Deep Learning Techniques for Stereo-based Depth Estimation. arXiv preprint arXiv:2006.02535. Retrieved from https://arxiv.org/abs/2006.02535

  2. 84. 三维重建19-立体匹配15,端到端立体匹配深度学习网络之代价体的计算和正则化

  3. 70. 三维重建5-立体匹配1,立体匹配算法总体理解

  4. A. Kendall, H. Martirosyan, S. Dasgupta, P. Henry, R. Kennedy, A. Bachrach, and A. Bry, “End-to-end learning of geometry and context for deep stereo regression,” IEEE ICCV, pp. 66–75, 2017

  5. C. Chen, X. Chen, and H. Cheng, “On the Over-Smoothing Problem of CNN Based Disparity Estimation,” in IEEE ICCV, 2019, pp. 8997–9005


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/160896
 
227 次点击