基于depth anything模型理解深度估计运行机理
文章目录
-
前言
-
一、概念说明
-
- 1、深度概念
- 2、绝对深度概念
- 3、相对深度概念
- 4、深度估计表示方法
-
二、相对深度估计与绝对(即度量)深度估计
-
- 1、模型预测绝对深度劣势与应用优势
- 2、模型预测相对深度必然性
- 3、小结
-
三、深度估计模型loss方法
-
四、深度估计模型评估方法
-
- 1、绝对相对误差
- 2、阈值精度
-
五、刚性运动原理
-
- 1、双目相机示意图
- 2、视差图
- 3、视差图与深度图换算
-
六、kitti数据探索深度与相机坐标集空间坐标关系
-
- 1、世界坐标转像素坐标公式
- 2、深度图对应值
- 3、深度值与空间坐标转换
-
七、深度估计模型运行机理
-
- 1、深度估计模型预测
- 2、深度估计模型训练
-
八、模型预测
-
九、深度值坐标转相机坐标与实现代码
-
- 1、模型预测结果加工
- 2、目标坐标中心点
- 3、深度值转相机坐标
-
十、深度值转相机坐标原理公式推理
-
- 1、相机坐标转像素坐标原理
- 2、像素坐标转相机坐标原理
前言
深度估计是一个很有效方法来预测目标距离或其它场景应用。特别地,近期相关深度估计大模型出现,使其目标深度估计更具有工程应用价值。本文将介绍一个通用的深度估计模型depth anything来实现现实世界目标的深度估计,而模型运行较为简单,关键在于如何将预测深度图转为真实深度估计图。介于此,本文从工程角度做出剖析与分享。当然,有错误之处请指出。
一、概念说明
讲到深度估计前,先给出深度估计概念。
1、深度概念
深度:每个像素代表从相机或传感器到对应空间点的距离,也就是相机坐标系下Z轴的深度,也就是绝对深度。
2、绝对深度概念
绝对深度:每个像素值直接对应一个物理距离(例如,以米或厘米为单位)。
3、相对深度概念
相对深度:像素值指示哪些点更近或更远,而不参考现实世界的测量单位。通常相对深度是反的,即数字越小,点越远。
我们将在稍后更详细地探讨这些概念。
4、深度估计表示方法
正如你所见,将一个3D空间投影到2D平面上会因为透视关系而产生歧义。为了解决这个问题,有多图像深度估计的精确数学方法,比如立体视觉(Stereo Vision)、运动结构(Structure from Motion),以及更广泛的领域如摄影测量学(Photogrammetry)。此外,像激光扫描仪(例如LiDAR)这样的技术也可以用于深度测量。

二、相对深度估计与绝对(即度量)深度估计
查看midas与zoedepth论文一起来解读。
1、模型预测绝对深度劣势与应用优势
预测绝对深度的优势在于它对于计算机视觉和机器人学中的许多下游应用具有实际的效用,比如制图、规划、导航、物体识别、三维重建以及图像编辑等。然而,在多个数据集上训练单一的绝对深度估计模型通常会降低性能,尤其是在包含深度尺度差异巨大的图像(例如室内和室外图像)的数据集中。因此,现有的绝对深度估计模型往往会在特定的数据集上过拟合,并且无法很好地泛化到其他数据集上。
通常,这种图像到图像任务的架构是一个编码器-解码器模型,如U-Net,并带有各种修改。形式上,这是一个像素级回归问题。想象一下,对于一个神经网络来说,准确地预测每个像素的距离,范围从几米到几百米,是多么具有挑战性。
2、模型预测相对深度必然性
这促使我们转向一种不试图在所有场景中预测精确距离的通用模型。相反,我们开发一个大约(相对地)预测深度的模型,通过指示哪些物体更远,哪些更近来捕捉场景的形状和结构。如果需要精确的距离,我们可以在特定的数据集上对此相对模型进行微调,利用其对任务已有的理解。
3、小结
不同环境(如相机)绝对深度数据存在尺度与位移多样,无法统一,训练一个绝对深度模型泛化性非常差,因此设置一个相对距离用来判断物体远近。
三、深度估计模型loss方法
这段文字描述了一种用于深度学习任务中的深度损失函数的标准化方法。这种方法的目标是在各种具有不同尺度和位移的深度图之间进行比较时消除环境scale或位移的影响。

实际上,还有许多其他方法和函数可以帮助消除缩放和平移。损失函数也有不同的添加项,如梯度损失,它关注的不是像素值本身,而是它们的变化速度(因此得名“梯度”)。可以在MiDaS论文中了解更多关于这方面的知识,在文章末尾会列出有用的文献资料。在进入最令人兴奋的部分——使用自定义数据集微调绝对深度之前,让我们简要讨论一下指标。
四、深度估计模型评估方法
在深度估计中,有几种标准的度量被用来评估性能,包括平均绝对误差(MAE)和均方根误差(RMSE),以及它们的对数变化形式以平滑距离中的大差距。除此之外,还有以下两个重要的度量:
1、绝对相对误差
绝对相对误差(AbsRel):这个度量类似于MAE,但是以百分比的形式表达,用于衡量预测的距离与真实距离的平均差异程度。

2、阈值精度

这两个度量提供了不同的视角来理解深度估计模型的表现,并且是评估算法在特定任务上性能的重要组成部分。
五、刚性运动原理
1、双目相机示意图

2、视差图
视差图 (disparity map):视差图指存储立体校正后单视图所有像素视差值的二维图像。
- 视差图是一张二维图像,和原图等大小
- 视差图每个位置保存的以像素为单位的该位置像素的视差值
- 以左视图视差图为例,在像素位置p的视差等于该像素在右图上的匹配点的列坐标的减去其在左图上的列坐标
3、视差图与深度图换算
深度图与视差图计算方法:

六、kitti数据探索深度与相机坐标集空间坐标关系

1、世界坐标转像素坐标公式

我已做了转换验证,空间坐标到像素坐标,深度值坐标到空间坐标,使用的是上面公式。和相机内参与外参及畸变系数相关。当然,kitti数据是去了畸变校正后的图像,后期自己图像需要校正。

2、深度图对应值
经查看,深度图1对应的是绝对坐标值,如下:

0表示未测深度。

远处值大,近处值小。
3、深度值与空间坐标转换

使用相机内参与外参对深度值转空间坐标(即世界坐标,这里是点云坐标)进行探索,也与点云坐标进行对比,理论应该是一致的,应该没啥问题的。
4、空间box坐标转换

使用相机内参与外参对空间box坐标(即世界坐标,这里是box坐标)进行探索,理论应该是一致的,应该没啥问题的。
七、深度估计模型运行机理
1、深度估计模型预测
深度估计模型预测都是相对深度距离,这个距离一般是真实距离的逆倒数,需要猜测一个尺度对应给出真实距离。
2、深度估计模型训练
深度估计模型训练也是在相对深度模型基础上进行绝对距离估计方法,我尝试训练发现代码是绝对距离做loss,以为预测应该是绝对距离。摸索许久发现,fitune深度估计模型适合自己数据是再原来模型基础上训练的绝对距离。但我大致训练实验测试了下,效果较差。
八、模型预测
整体来说,这个模型效果还是很好,理论是能给出深度值预测,只要这个值够好,我们利用内参可转到相机坐标,利用旋转平移可转任意参考点坐标系。

九、深度值坐标转相机坐标与实现代码
那么,深度估计模型预测相对深度值该如何转到世界坐标系呢?
我将给出我的转换方法,该方法可参考博客这里。
1、模型预测结果加工
depth anything输出结果逆倒数将其转为绝对深度,而*58是一个尺度因子,每个相机可能不一样,获得最终depth,其代码如下:
def infer_depth(model,raw_img):
if isinstance(raw_img,str):
raw_img = cv2.imread(raw_img)
depth_ori = model.infer_image(raw_img) # HxW raw depth map in numpy
depth = 1/depth_ori
depth = depth*58
return depth_ori, depth
2、目标坐标中心点
我是和目标检测相结合,我粗略采用目标中心点深度作为目标深度,其代码如下:
x,y = int((box[0]+box[2])/2), int((box[1]+box[3])/2)
coord=tuple((x,y))
# h,w = depth.shape
# # y,x=int(h-y),int(w-x)
# value = depth[y,x]
Z = depth[y,x]
特别是获得了深度值Z。
3、深度值转相机坐标
像素值与对应的深度值转为相机坐标系下的坐标值,其代码如下:
def project_image_to_rect(self,pixel_x,pixel_y, z):
# 这个参数是kitti一个临时对应
c_u=609.5593
f_u=721.537
b_x = -0.06216900378
c_v = 172.854
f_v = 721.5377
b_y = -0.000299886062779
x = ((pixel_x - c_u) * z) / f_u + b_x
y = ((pixel_y - c_v) * z) / f_v + b_y
return (x,y,z)
而代码对应的相机相关参数如下示意:

注:bx是通过tx与fu焦距获取,by类似。所以模型代码有些不一样!
十、深度值转相机坐标原理公式推理
1、相机坐标转像素坐标原理
假设我们知道相机坐标系Xc、Yc、Zc值,也知道相关内参,那么将其转为像素坐标u v方法如下矩阵计算,如下:

2、像素坐标转相机坐标原理
当模型预测是相机坐标的深度值,我们以X坐标举例,通过上面1的矩阵可得到如下等式,将其进行化简,即可得到最终像素值与模型深度值得到最终三维相机坐标,其推理如下公式:

