刚开始看单目深度估计,好多概念都不清楚,下面是我的理解,有不对之处希望大佬指出。
首先是相对深度和绝对深度的概念。绝对深度就是利用激光雷达等设备获取的相机与物体之间的距离,比如KITTI数据集就是利用360度雷达设备获取稀疏的深度图,图1就是雷达获得的原始深度图,很黑,什么都看不清,图2是KITTI数据集提供的标注过的深度图,好一点了,但依然很稀疏,所以很多论文在使用的时候都会对它进行插值(插值方法参考:https://blog.csdn.net/weixin_41423872/article/details/114578403)
图1
图2
用绝对深度作为训练数据得到的模型是可以预测绝对深度的,David E等人一系列的算法都是这一类型的。
但是由于室外场景的真实深度往往很难获取,有人就想到能不能由人工来标注深度估计的数据集,答案是肯定的。但是人工不能准确地标注出物体距摄像机多少米,而只能标注出哪些点离摄像机更近,哪些点离摄像机更远,这样标注出来的深度图就是相对深度图。使用相对深度图中作为训练数据训练出来的模型也就只能预测相对深度(比如这篇论文:Learning Ordinal Relationships for Mid-Level Vision
),其与真实深度之间差了一个基准值,这个值我们是不知道的。因此这种类型的算法在自动驾驶领域的应用是十分受限的。
好了,搞清楚了相对深度图和绝对深度图,再思考一个问题,雷达获得的结果应该是一个个以米为单位的距离,为什么数据集中提供的是黑乎乎的一张深度图,它和真实距离之间的关系是什么?
以KITTI数据集为例,官网提供了这样一个文件:
把它下载下来,readme中有这么一段话:
意思就是,深度图是以uint16的格式存储的,要从深度图中读取真实距离,除以256之后以米为单位就可以了,当然,深度图中为0的点,不是说距离为零,而是这些点的距离没有获取到。下载的文件中有一个python脚本可以帮忙完成这个转化工作。
也就是说,我们以KITTI绝对深度图为训练数据得到的模型,给他输入张单目图片,它可以输出一张真实深度图,给它除以256就得到了真实的距离值。要完成图3这种效果的目标测距功能,只需要将目标框内所有像素点的真实距离求均值就可以了。
图3