网上对于双目立体匹配算法的学习资料有很多,本文旨在汇总网上优质的资源,并总结学习路线,从传统的SGM、PatchMatch、AD-Census,到近年来的各种深度学习双目立体匹配网络,双目立体匹配算法不断升级,并且一直是学术界研究的热门,值得探索!
1、基础理论
双目立体匹配有以下几个关键问题:
- 一是如何对双目设备进行标定,只要标定后进行图像极线矫正,才能成为一个理想的双目系统;
- 二是立体匹配算法,经典的传统立体匹配算法有SGM、PatchMatch和AD-Census,深度学习目前比较火的网络是RAFT-Stereo及其升级版本(例如CREStereo、IGEV等);
- 三是如何计算深度、如何生成点云,如果你看懂了前两步,那么这一步的公式应当手到擒来,当然,也会有一些特殊的情况,例如鱼眼双目,其公式的推导会很不一样。
如果你刚开始接触双目立体匹配算法,那么一定要看看李迎松博士的文章,你将会非常有收获,李博的csdn主页:link
- =====================================
- 博主文章导航(分门别类,实时更新,永久置顶)
- 双目立体匹配步骤详解
- 立体视觉入门指南(1):坐标系与相机参数
- 立体视觉入门指南(2):关键矩阵(本质矩阵,基础矩阵,单应矩阵)
- 立体视觉入门指南(3):相机标定之张式标定法
- 立体视觉入门指南(4):相机标定之DLT直接线性变换
- 立体视觉入门指南(5):双相机标定
- 立体视觉入门指南(6):对级约束与Fusiello法极线校正
- 立体视觉入门指南(7):立体匹配
- 立体匹配入门指南(8):视差图、深度图、点云
- =====================================
另一个非常经典的资料是Stefano教授的经典讲义 Stereo Vision: Algorithms and Applications
- =====================================
- 教授的个人主页:link
- Stereo Vision: Algorithms and Applications
- =====================================
还有一位csdn博主,火柴的初心,也写了非常多好文章:link
- =====================================
- (一)双目视觉系统
- (二)双目匹配的困难和评判标准
- (三)立体匹配算法
- (四)匹配代价
- (五)立体匹配算法之动态规划全局匹配
- (六)U-V视差
- 【项目实战】利用U-V视差进行地面检测
- 【项目实践】U-V视差路面检测之动态规划
- =====================================
还有旷视大佬HawkWang写的一系列《计算摄影学》博客,每篇都写的很好,并且还在保持更新,这里仅列出双目立体视觉的部分:
- =====================================
- 计算摄影学
- 计算摄影学专栏总目录
- 66. 三维重建1:相机几何模型和投影矩阵
- 67. 三维重建2:相机几何参数标定
- 68. 三维重建3:两视图几何
- 69. 三维重建4:立体校正(Recitification)
- 70. 三维重建5-立体匹配1:立体匹配原理
- 71. 三维重建6-立体匹配2:代价聚合
- 72. 三维重建7-立体匹配3:视差计算和优化
- 73. 三维重建8-立体匹配4:视差后处理
- 74. 三维重建9-立体匹配5:解析MiddleBurry立体匹配数据集
- 75. 三维重建10-立体匹配6:解析KITTI立体匹配数据集
- 76. 三维重建11-立体匹配7:解析合成数据集和工具
- 77. 三维重建12-立体匹配8,经典算法ADCensus
- 78. 三维重建13-立体匹配9,经典算法PatchMatchStereo
- 79. 三维重建14-立体匹配10,经典视差优化算法Fast Bilateral-Space Stereo
- 80. 三维重建15-立体匹配11,经典算法Fast Bilateral Solver
- 81. 三维重建16-立体匹配12,深度学习立体匹配之 MC-CNN
- 82. 三维重建17-立体匹配13,深度学习立体匹配的基本网络结构和变种
- 83. 三维重建18-立体匹配14,端到端立体匹配深度学习网络之特征计算
- 84. 三维重建19-立体匹配15,端到端立体匹配深度学习网络之代价体的计算和正则化
- 85. 三维重建20-立体匹配16,端到端立体匹配深度学习网络之视差计算
- 86. 三维重建21-立体匹配17,端到端立体匹配深度学习网络之如何获得高分辨率的视差图
- =====================================
其它一些博客
- =====================================
- 立体匹配算法的四个步骤中的代价聚合该如何理解?
- =====================================
- Stereo Matching文献笔记之(九):经典算法Semi-Global Matching(SGM)之神奇的HMI代价计算
- Stereo Matching文献笔记之(十):经典算法Semi-Global Matching(SGM)之碉堡的动态规划
- =====================================
- 一文读懂经典双目稠密匹配算法SGM
- =====================================
- 双目立体匹配算法:SGM
- =====================================
2、SGM(Semi-Global Matching)算法
SGM算法绝对是双目立体匹配算法中最流行的算法,没有之一。非常推荐看李博的文章及其代码实现:
- =====================================
- 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
- 【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
- 【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
- 【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化
- 【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
- 【码上实战】【立体匹配系列】经典SGM:(2)代价计算
- 【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
- 【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2
- 【码上实战】【立体匹配系列】经典SGM:(5)视差优化
- 【码上实战】【立体匹配系列】经典SGM:(6)视差填充
- 【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化
- =====================================
另一个你需要看的是OpenCV实现的SGBM(Semi-Global Block Matching),李博实现的SGM代价空间的构建方式采用了Census,OpenCV则是采用了BT+SAD,并且除了使用输入图像的像素值计算代价,还使用了梯度计算代价,其中每一个参数都值得了解,在此放两篇源码分析。
- =====================================
- 【算法】OpenCV-SGBM算法及源码的简明分析
- OpenCV源代码分析——SGBM
- =====================================
还有值得一提的是,可能大家很好奇SGM和SGBM是一个意思吗?曾经我也很好奇,基于我目前的理解,这不是一个意思。SGM看论文就知道,其构建代价空间的方法采用的是互信息,但这个方法在目前实现的算法中已经鲜有使用了,SGBM可以看成是SGM的改进,改进的方式就是将代价空间的构建方式改成了块匹配,块匹配的方式有很多,比如上面提到的Census、SAD、BT等等,这样做的好处在于简化了算法,并且能让算法真正的落地,目前商业化的消费级双目产品基本都是算力有限的,需要能够高度并行的算法。
3、PatchMatch理论
PatchMatch算法是另一个非常优秀的传统算法,这个算法我的理解,全靠猜,首先来个随机初始化,然后空间传播、视图传播、平面优化,都是猜测支持窗更新后,代价有没有降低,如果有,那么就更新支持窗,否则不更新,最后通过多次迭代,计算出视差。算法很大的创新就是提出来倾斜支持窗模型,不使用构建代价空间、代价聚合、视差计算、视差优化这套框架,在平面倾斜非常大的图片上(例如贴近地面拍摄)有很好的效果,但一般的场景还是SGM效果更好,而且PatchMatch的计算量非常大,导致原版实现非常慢,所以商业化的消费级双目产品基本都没有采用。较好的方案,是使用cuda进行加速。
这里同样推荐李博的博客:
- =====================================
- 【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
- 【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计
- 【理论恒叨】【立体匹配系列】经典PatchMatch: (3)后处理(一致性检查与视差填充)
- 【码上实战】【立体匹配系列】经典PatchMatch: (1)框架
- 【码上实战】【立体匹配系列】经典PatchMatch: (2)主类
- 【码上实战】【立体匹配系列】经典PatchMatch: (3)随机初始化
- 【码上实战】【立体匹配系列】经典PatchMatch: (4)代价计算
- 【码上实战】【立体匹配系列】经典PatchMatch: (5)迭代传播
- 【码上实战】【立体匹配系列】经典PatchMatch: (6)后处理
- =====================================
- 另外一些实现
- https://github.com/ibergonzani/patch-match-stereo
- Patch Match Stereo文献+代码
- =====================================
4、AD-Census算法
AD-Census算法可以说是SGM的改进,而且是中国学者提出的,从名字可以看出,相比于SGM,构建代价空间的方式采用了AD+Census,并且比SGM增加了十字臂的代价聚合方式,Intel RealSense系列双目相机引用了该论文,应该有参考其实现
这里同样推荐李博的博客:
- =====================================
- 【理论恒叨】【立体匹配系列】经典AD-Census: (1)代价计算_匹配代价计算-CSDN博客
- 【理论恒叨】【立体匹配系列】经典AD-Census: (2)十字交叉域代价聚合(Cross-based Cost Aggregation)-CSDN博客
- 【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)-CSDN博客
- 【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化_立体匹配数据集怎么判断哪些是遮挡区域-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (1)框架-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (2)主类_adcensus算法matlab代码-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (3)代价计算-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (4)十字交叉域代价聚合-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (5)扫描线优化_李迎松 gpu 线扫描-CSDN博客
- 【码上实战】【立体匹配系列】经典AD-Census: (6)多步骤视差优化_视差图优化-CSDN博客
- =====================================
5、其他传统算法
ELAS算法在MiddleBurry数据集有提到,但学习资料很少
- =====================================
- 双目立体匹配算法:ELAS
- =====================================
6、深度学习算法
深度学习是目前双目立体匹配算法的发展方向,也是目前学术界热门,但目前商业化落地的产品很少,主要原因是算力限制,能真正在芯片上运行的网络非常少,虽然深度学习在各种数据集的指标上远胜于传统算法,但实际应用还是有很多挑战。
其实深度学习并不复杂,自2016年DispNet诞生,端到端的立体匹配网络正式提出,很多网络都是将传统的立体匹配算法的四部分:构建代价空间、代价聚合、视差计算、视差优化改变成网络的方式实现,只不过每个网络都有作者的创新点进行改进。到2019年,RAFT提出,带来了颠覆性的突破,通过引入GRU和Convex-Upsample等模块,以及迭代优化的思想,取得了非常好的效果,目前RAFT和基于RAFT的改版,例如CREStereo、IGEV在MiddleBurry都是名列前茅的,但这种多次迭代的结构在芯片端运行确实是个灾难。
下面也推荐一些深度学习方面的学习资料:
- =====================================
- 首先,最推荐的是2023年底开源的OpenStereo,这个项目并没有提出新网络,而是整合了12个非常经典的双目网络,每一个都值得学习
- https://github.com/XiandaGuo/OpenStereo
- https://zhuanlan.zhihu.com/p/673803996
- =====================================
- 其次,推荐的是AANet和UniMatch,这两个网络虽然不是目前的SOTA,但作者写的代码非常非常优秀,AANet也整合了很多框架,b站还有作者的分享,我自己在实现双目网络的过程中也经常会查看作者的代码
- https://github.com/haofeixu/aanet
- https://github.com/autonomousvision/unimatch
- https://www.bilibili.com/video/BV1uG4y1y7ms/?spm_id_from=333.337.search-card.all.click&vd_source=155fbadf1d1c2c3435ad2f8747f48d24
- =====================================
- 还有就是paperswithcode这个神奇的网站,最新的研究成果都能找到,每个网络对应的论文和GitHub代码都有,非常方便
- https://paperswithcode.com/task/stereo-matching-1/latest
- =====================================
7、数据集网站
- =====================================
- SenceFlow:第一个大规模的虚拟数据集,也是现在深度学习论文必用的数据集
- https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html
- =====================================
- MiddleBurry:真实数据集,采用结构光制作真值,每张都非常经典,网站有算法的排名,论文常用
- https://vision.middlebury.edu/stereo
- =====================================
- KITTI:真实数据集,采用车载激光雷达制作真值,所以是稀疏的,网站有算法的排名,论文常用
- http://www.cvlibs.net/datasets/kitti/index.php
- =====================================
- ETH3D:真实数据集,除了有双目数据,还有多视角数据,论文常用
- https://www.eth3d.net/
- =====================================
- DrivingStereo:真实数据集,为自动驾驶打造,论文常用
- https://drivingstereo-dataset.github.io/
- =====================================
- CREStereo:虚拟数据集,旷视团队制作
- https://github.com/megvii-research/CREStereo
- =====================================
- InStereo2K:真实数据集,采用结构光制作真值,室内场景数据
- https://github.com/YuhuaXu/StereoDataset
- =====================================
- Holopix50k:超级大的数据集,各种场景的双目数据都有,但没有真值
- https://leiainc.github.io/holopix50k/
- =====================================
- SintelStereo:虚拟数据集,开源动画短片,光流数据集
- http://sintel.is.tue.mpg.de/stereo
- =====================================
- syntim:虚拟数据集,无真值
- http://perso.lcpc.fr/tarel.jean-philippe/syntim/paires.html
- =====================================
- Stereo Vision and Applications:
- http://vision.deis.unibo.it/~smatt/stereo.htm
- http://vision.deis.unibo.it/~smatt/stereo_smp.html
- =====================================
- 慕尼黑工业大学数据:
- https://vision.in.tum.de/data/datasets
- =====================================
写在最后:网上关于双目立体匹配算法的文章非常多,本文总结的只是冰山一角,我只是大自然的搬运工,希望对大家有所帮助,我会保持更新的~