SNE方法为什么要计算逆深度,然后计算梯度,而不是直接拿深度图计算梯度
Surface Normal Estimation(表面法向量估计) 实现的任务是从深度图估计表面法向量。
因为逆深度 D=1/Z 在相机空间是“线性”的,对其求梯度数值稳定、几何意义清晰;直接对 Z 求梯度会随距离放大误差、且不满足平面约束。
数学推导:为什么梯度和逆深度呈线性
相机坐标系下一点
P = (X, Y, Z) = ((u−cx)/fx · Z, (v−cy)/fy · Z, Z)
对像素坐标求导得到切向量:
∂P/∂u = ( ∂X/∂u , ∂Y/∂u , ∂Z/∂u )
= ( Z/fx + (u−cx)/fx ·∂Z/∂u , (v−cy)/fy ·∂Z/∂u , ∂Z/∂u )
用 ∂Z/∂u = −Z² ∂D/∂u 代入并提取公因子 Z:
∂P/∂u = Z · [ 1/fx − (u−cx)/fx ·Z ∂D/∂u ,
−(v−cy)/fy ·Z ∂D/∂u ,
−Z ∂D/∂u ]
= Z/fx · [ 1 − (u−cx)Z ∂D/∂u ,
−(v−cy)Z fx/fy ∂D/∂u ,
−fx Z ∂D/∂u ]
同理对 v 求导:
∂P/∂v = Z/fy · [ −(u−cx)Z fy/fx ∂D/∂v ,
1 − (v−cy)Z ∂D/∂v ,
−fy Z ∂D/∂v ]
叉乘 ∂P/∂u × ∂P/∂v
把两向量都乘以 fx fy/Z² 归一化后,得到:
n ∝ ( fx ∂D/∂u ,
fy ∂D/∂v ,
1 + (u−cx)∂D/∂u + (v−cy)∂D/∂v )
这就是 SNE 里直接用到的 未归一化法向量 分量形式。
法向量 n ∝ ∂P/∂u × ∂P/∂v 的叉乘里会出现
nx ∝ fx · ∂D/∂u, ny ∝ fy · ∂D/∂v, nz = 1 + (u−cx)∂D/∂u + (v−cy)∂D/∂v
其中 D = 1/Z。只有用 D 才能让梯度与焦距简单相乘就得到法向量分量;
若直接对 Z 求梯度,表达式会变成:
nx ∝ fx · (∂Z/∂u)/Z²
既要除以 Z² 又要再算 ∂Z/∂u,会导致远距离区域 Z 很大 → 梯度接近 0,数值漂移;近距离 Z 很小 → 梯度爆炸。
当表面是平面时,逆深度D是(u,v)的线性函数,而深度Z是(u,v)的有理函数。
对理想平面,相机坐标系下
n·P = d ⟹ n_x X + n_y Y + n_z Z = d
代入 X=(u−cx)/fx·Z, Y=(v−cy)/fy·Z 得
Z(u,v) = d / [n_x(u−cx)/fx + n_y(v−cy)/fy + n_z]
这是 u,v 的有理函数(分母线性,分子常数)。
取逆深度 D=1/Z 后
D(u,v) = (n_x/fx)(u−cx) + (n_y/fy)(v−cy) + n_z/d
变成 u,v 的线性函数(一次多项式)。
几何直观:逆深度 = “视差”,本身就是线性
在计算机视觉和机器人学中,逆深度(inverse depth)通常用于表示深度信息,因为它在数学上具有更好的性质。具体来说:
-
逆深度与视差(disparity)成正比:在立体视觉中,视差与逆深度成正比,这使得逆深度在立体匹配中更常被使用。
对于透视相机模型:
Z = f * B / d (其中f是焦距,B是基线,d是视差)逆深度 D = 1/Z 与视差 d 成正比:
D = 1/Z = d / (f * B) -
数值稳定性:在距离很远时,深度值很大,但变化很小,而逆深度在远处变化更明显,有助于数值计算。
- 当 Z → ∞(远处),∂Z/∂x → 0,但 ∂D/∂x 仍然提供有用信息
- 当 Z → 0(很近),∂Z/∂x 可能很大,但 ∂D/∂x 相对稳定
-
多视图几何中的线性:在多视图几何中,逆深度参数化使得一些方程变为线性,更容易求解。
-
梯度计算:在深度不连续的区域(如物体边缘),深度图会有很大的梯度,而逆深度在这些区域的变化相对平滑,因此计算逆深度的梯度可能更稳定。
数值稳定性
我们考虑深度值Z和逆深度D=1/Z。在距离很远时,Z很大,而D很小。
在场景中,如果两个相邻像素的深度值都很大且接近,那么它们的深度差值会很小(因为深度变化小),
而由于深度值本身很大,这种微小的变化在数值上可能不够显著,尤其是在浮点数精度有限的情况下。
相反,逆深度D在远处虽然很小,但是相邻像素的逆深度差值相对于逆深度本身的比例可能更大。
例如,假设两个相邻像素的深度分别为100和101,那么深度差为1,相对变化为1/100=0.01。
而逆深度分别为0.01和0.00990099,逆深度差约为0.000099,相对变化为0.000099/0.01=0.0099,与深度相对变化相同。
但是,在梯度计算中,我们关心的是变化量,而深度图在远距离处的梯度值很小,可能会被噪声淹没。
然而,这里的关键点在于:在透视投影中,逆深度与视差(disparity)成正比,而视差在立体视觉中与深度成反比,且视差图在远处变化更均匀。
因此,逆深度梯度在远处能够提供更稳定的信号。
但是,注意:在深度值很大的时候,逆深度值很小,其梯度也很小。所以并不是说逆深度在远处的绝对值变化更大,而是说在透视投影下,逆深度与像素的视差直接相关,而视差在场景中的分布更均匀,从而使得逆深度梯度在整体图像上具有更好的数值性质。
实际上,在计算机视觉中,逆深度(或视差)通常用于SLAM和立体匹配,因为它在远处具有更好的线性性质,并且更符合高斯分布。
因此,在SNE方法中,使用逆深度计算梯度是为了利用逆深度在透视投影下的这种线性特性,从而得到更稳定、更准确的表面法线估计。
实现简化
用 D=1/Z 后,法向量初始分量 只需:
nx = fx · ∂D/∂u
ny = fy · ∂D/∂v
无需再除 Z²,一步完成,少一次逐像素除法,GPU/CPU 都更快。
逆深度使用方法
在SNE模型中,计算逆深度的梯度(即Gu和Gv)是为了估计表面法线。表面法线的估计依赖于表面的局部变化,而逆深度的梯度可以更好地反映表面的朝向。
具体到SNE模型,它通过以下步骤计算法线:
- 将深度图转换为3D点云(X, Y, Z)。
- 计算逆深度D = 1/Z。
- 计算逆深度在x和y方向的梯度(Gu, Gv)。
- 然后利用相机内参和梯度值计算切平面法向量(nx_t, ny_t)。
- 接着通过多个方向的差分计算进一步优化法向量。
如果直接使用深度图计算梯度,在深度不连续处梯度会非常大,而且深度图本身可能包含噪声,逆深度梯度在一定程度上可以缓解这些问题。
因此,SNE选择逆深度来计算梯度是为了获得更稳定和准确的表面法线估计。
687

被折叠的 条评论
为什么被折叠?



