stereodemo:小型Python工具,用于比较和可视化各种立体深度估计算法的输出。

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×240640×4801280×720
OpenCV-BM3511
OpenCV-SGBM6613
RealtimeStereo51856
RAFT-Stereo (fast)114172450
CREStereo (all)1264581309
RAFT-Stereo (accurate)1795301512
Hitnet (fast)1828562516
Hitnet (accurate)78521796973

总的来说,传统的方法具有较低的占用率(注意,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×240640×4801280×720
OpenCV-BM不适用的不适用的不适用的
OpenCV-SGBM不适用的不适用的不适用的
RealtimeStereo7毫秒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×240640×4801280×720
OpenCV-BM2.5毫秒9毫秒20毫秒
OpenCV-SGBM (1 core)12毫秒70毫秒230毫秒
RealtimeStereo15毫秒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×240640×4801280×720
OpenCV-BM4毫秒22毫秒70毫秒
OpenCV-SGBM12毫秒70毫秒230毫秒
RealtimeStereo27毫秒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)