stereodemo:小型Python工具,用于比较和可视化各种立体深度估计算法的输出。
从立体图像中估计深度,目前已经取得了大量的进展。但是现在最先进的方法都是基于深度学习的,能达到难以置信的准确度,甚至是在无纹理的光滑表面也能有不错的深度效果。不过这些算法到底有什么差别呢?今天分享的这个工具,就能让你清晰地对比出差别。
这个工具由Nicolas Burrus制作并开源分享给所有OAK用户,他将一些产生立体图像和点云的开源方案都汇总了,方便对比不同算法输出的效果,项目地址可在此处查看。(注:也可以在开源项目页面查看,序号【49】)
包含的算法
- OpenCV StereoBM和StereoSGBM:这些 “传统的 “非深度学习方法是基于区块匹配,旨在作为一个基线。它们的内存占用量很小,速度很快,但在无纹理区域会很吃力,而且往往很稀疏,噪点也多。使用OpenCV 4.5.5的实现。
- CREStereo (CVPR 2022): “通过具有自适应相关性的级联递归网络进行实用的立体匹配”。他们的目标是提供一种鲁棒的算法,能够处理近似校准和消费级相机。他们还试图通过使用局部搜索窗口而不是全局搜索来提高内存效率。它们共享在SceneFlow、Sintel、Middlebury、ETH3D、KITTI、Falling Things、InStereo2K和HR-VS上预训练的模型。我们使用两个变量转换为ONNXPINTO0309:
CREStereo-Accurate
:5次迭代,更平衡的速度/精度权衡。CREStereo-Fast
:2次迭代,以速度为目标。
- RAFT-Stereo (3DV 2021): “用于立体匹配的多级递归场变换”。受RAFT在光流估计方面的成功启发,作者将其适用于立体。它是一种迭代方法,通过多尺度门控递归单元不断完善深度。它只用二维卷积和一个较轻的三维成本量来实现,他们提出了一个实时设置。包括两个预训练的变体(详情请参考论文):
RAFT-Accurate
:在sceneflow + middlebury上训练的高精度设置。RAFT-Fast
:实时设置,在sceneflow上训练。
- Hitnet (CVPR 2021): “用于实时立体匹配的分层迭代瓦片细化网络”。他们还关注性能,避免了全成本量,并采用由粗到细的小平面瓦片传播。这里还考虑了两种预训练的变体(由PINTO0309转换为ONNX):
Hitnet-Accurate
:在sceneflow上训练的高精度设置。Hitnet-Fast
:快速设置,在KITTI + Middlebury + ETH3D图像上训练。
- RealtimeStereo (ACCV 2020): “边缘设备上实时立体匹配的注意力感知特征聚合”。本文的目标是嵌入式硬件上的实时性能,如NVidia Jetson TX2。首先以非常粗略的分辨率计算视差,并逐步向上采样。在数据集上的准确性不如其他方法,但Nicolas Burrus还是提到了它,因为它非常快,内存占用少。该模型由作者在Sceneflow + KITTI上进行预训练。
定性结果
为了进行定性比较,Nicolas Burrus用他的OAK-D Lite相机,相机使用工厂校准和设备本身计算的校正。将其配置为输出VGA图像(640×480)。
可视化是通过stereodemo完成的,这是一个Nicolas Burrus开发的小工具,用来比较立体算法。很容易在新数据上用pip install stereodemo
这是一个手+桌子场景的视频:
客厅场景:
卧室场景:
Nicolas Burrus认为CREStereo和RAFT-Stereo总是能给出最好的效果,在使用快速设置时比RAFT-Stereo有一点点优势。Hitnet也很不错,但它可能需要在更多的室内场景中进行训练,以防止空白墙壁变形。Chang等人的RealtimeStereo在最初训练和评估的KITTI数据集之外并没有很好的推广。
性能
内存使用峰值
让我们先来看看内存使用的峰值,从低到高排序。对于OpenCV-BM、SGBM、CREStereo和Hitnet,通过查看使用CPU推理时的峰值内存使用量来粗略估计/usr/bin/time -v
以及当推理未被调用时减去内存使用量。对于RAFT-Stereo和RealtimeStereo,峰值是通过以下方式为GPU推断测量的torch.cuda.max_memory_allocated()
.
峰值内存使用量(MB) | 320×240 | 640×480 | 1280×720 |
---|---|---|---|
OpenCV-BM | 3 | 5 | 11 |
OpenCV-SGBM | 6 | 6 | 13 |
RealtimeStereo | 5 | 18 | 56 |
RAFT-Stereo (fast) | 114 | 172 | 450 |
CREStereo (all) | 126 | 458 | 1309 |
RAFT-Stereo (accurate) | 179 | 530 | 1512 |
Hitnet (fast) | 182 | 856 | 2516 |
Hitnet (accurate) | 785 | 2179 | 6973 |
总的来说,传统的方法具有较低的占用率(注意,OpenCV默认的半全局匹配使用了一个内存效率高的变体)。RealtimeStereo的内存效率也很高,它只在非常粗糙的分辨率下计算成本量,然后只用微小的视差范围搜索来进行小的修正。RAFT-Stereo在其快速设置中更积极地对输入进行降样,导致了合理的占用空间。CREStereo在快速和精确设置之间没有内存使用差异,而Hitnet往往是相当耗费内存的。
推理速度
首先让我们来看看在高端游戏GPU(英伟达RTX 3090)上的推理性能,按照VGA分辨率下的速度进行排名。对于RAFT-Stereo和RealtimeStereo,使用了作者最初的Pytorch实现。对于CREStereo和Hitnet,则使用了由PINTO0309转换的ONNX模型和onnxruntime。
请注意,应该对这些结果持保留态度,因为ONNX转换可能不是最佳的,而且有些方法的优化没有包括在内。特别地,RAFT-Stereo具有更快的相关采样器(可用代码),而Hitnet声称通过定制的CUDA操作可快3倍(代码不可用)。
GPU推理 (RTX 3090) | 320×240 | 640×480 | 1280×720 |
---|---|---|---|
OpenCV-BM | 不适用的 | 不适用的 | 不适用的 |
OpenCV-SGBM | 不适用的 | 不适用的 | 不适用的 |
RealtimeStereo | 7毫秒 | 8毫秒 | 15毫秒 |
RAFT-Stereo (fast) | 30毫秒 | 35毫秒 | 60毫秒 |
Hitnet (fast) | 14毫秒 | 40毫秒 | 80毫秒 |
CREStereo (fast) | 21毫秒 | 56毫秒 | 175毫秒 |
RAFT-Stereo (accurate) | 30毫秒 | 90毫秒 | 280毫秒 |
Hitnet (fast) | 34毫秒 | 100毫秒 | 280毫秒 |
RAFT-Stereo (accurate) | 110毫秒 | 190毫秒 | 430毫秒 |
所有的方法在强大的GPU上都非常快,尤其是在快速设置中。正如预期的那样,CPU推理要慢得多,即使是8核。
CPU推理(8核,i9-9900K @ 3.6 GHz) | 320×240 | 640×480 | 1280×720 |
---|---|---|---|
OpenCV-BM | 2.5毫秒 | 9毫秒 | 20毫秒 |
OpenCV-SGBM (1 core) | 12毫秒 | 70毫秒 | 230毫秒 |
RealtimeStereo | 15毫秒 | 70毫秒 | 180毫秒 |
RAFT-Stereo (fast) | 157毫秒 | 550毫秒 | 1800毫秒 |
Hitnet (fast) | 160毫秒 | 720毫秒 | 2340毫秒 |
CREStereo (fast) | 300毫秒 | 1440毫秒 | 5580毫秒 |
CREStereo (accurate) | 500毫秒 | 2130毫秒 | 8900毫秒 |
Hitnet (fast) | 620毫秒 | 2240毫秒 | 6960毫秒 |
RAFT-Stereo (accurate) | 1720毫秒 | 6800毫秒 | 22200毫秒 |
最后,这里是CPU推断和只有一核的结果。
CPU推理(1核,i9-9900K @ 3.6 GHz) | 320×240 | 640×480 | 1280×720 |
---|---|---|---|
OpenCV-BM | 4毫秒 | 22毫秒 | 70毫秒 |
OpenCV-SGBM | 12毫秒 | 70毫秒 | 230毫秒 |
RealtimeStereo | 27毫秒 | 130毫秒 | 420毫秒 |
RAFT-Stereo (fast) | 680毫秒 | 2600毫秒 | 8300毫秒 |
Hitnet(fast) | 320毫秒 | 1370毫秒 | 4180毫秒 |
CREStereo (fast) | 980毫秒 | 4240毫秒 | 13450毫秒 |
Hitnet (accurate) | 1.1秒 | 4.1秒 | 12.2秒 |
Hitnet (fast) | 1.9秒 | 7.8秒 | 24岁 |
RAFT-Stereo (accurate) | 8.5秒 | 32.5秒 | 102.5秒 |
结论
与传统方法相比,最近的深度学习方法在硬场景下令人印象深刻。缺点是,它们有时会创建大面积的好看但不准确的几何图形(如扭曲的墙壁),而块状匹配方法会返回更稀疏、更嘈杂的深度,但不会产生错误的几何图形。
RAFT-Stereo以其快速设置和良好的通用性,在速度/内存/精度权衡方面似乎是一个可靠的选择。CREStereo和Hitnet也很有竞争力,CREStereo经常在其精确的设置中给出最好的结果。他们的模型也在更多的公共数据集上进行了训练,这可能会有所帮助。此外,这些方法很容易调整以达到不同的速度折衷,并且在训练期间添加一些房间/室内数据集可能会提高它们的准确性。
RealtimeStereo非常快,但KITTI训练的模型不能很好地推广到室内场景。
想自己尝试一下这些吗?在预先拍摄的图像上或者直接从OAK-D相机上?只需pip install stereodemo
(https://github.com/nburrus/stereodemo)