上一篇博客中, 我介绍了NID-SLAM中的的Robust Direct NID Tracking的实现。这篇继续记录一下文章中 Multi-resolution NID Tracking的部分。

Multi-resolution NID Tracking

文中提到LSD-SLAM中为提高鲁棒性而使用image-pyramid的方法。LSD-SLAM中是对待匹配的原始图像建立图像金字塔。NID-SLAM中作者发现这种方式并没有很好效果。NID-SLAM中采用的是多分辨率直方图的表达。NID-SLAM中建立了一个n-channel 的直方图图像金字塔,第l层金字塔图像记为H(l), 第0层直方图每一个channel 是从输入图像计算得来的:

H(0)(pi,a)={1a=B(I(pi))0otherwise

其他层都是通过上一层降采样得来:
H(l=1)(pi,a)=14j=14H(l)(N(j)(2pi),a)

N(j)(2pi)表示2x2的临域。
直方图降采样过程如下图所示:
NID-SLAM: Robust Monocular SLAM using Normalised Information Distance - Part2

图中H(0),H(1),H(2)中的n层二值图像对应的是直方图的n个bin。论文中这块的做法是对图像进行直方图统计,会统计出n个bins, 对应n段intensity的取值。然后另每一个bin对应一副二值图像,对原始图像的每一个像素计算对应的直方图的bin。然后再该bin对应的二值图像中的对应像素位置置1, 其余位置置0。因此会生成n幅二值图像。然后构建直方图金字塔时降采样是在生成的二值图像上进行。

基于以上金字塔结构,联合概率分布的更新过程:

pr,c(l)(a,b)pr,c(l)(a,b)+γ(l)(a,b)β(qi,N(j)(qi))kVr(l)(pi)

式中权重函数γ(l)(a,b)定义如下:
γ(l)(a,b)=Hr(l)(pi,a)Hc(l)(N(j)(qi),b)

示意图如下:
NID-SLAM: Robust Monocular SLAM using Normalised Information Distance - Part2

这里与之前Direct NID Tracking中的更新过程不太一样。由于这里直方图中的每一个bin对应一幅图像,所以对于参考帧中的采样点坐标,会在所有bin的二值图像中做匹配。因此会涉及到参考帧的所有bin。所以有可能对pr,c的任意项更新,即上述更新公式可能对pr,c中的n2个元素更新,而不是n个元素。
这种Coarse-to-fine的tracking方法是在pyramid的每一层上做优化。优化方法还是使用BFGS。上一层优化后的pose,作为下一层的初始pose。

NID Depth Map Update
估计出当前相机的pose之后,直接法一般会采用小基线立体测量的方法,从当前帧图像对关键帧的depth进行校正。对于光度误差法可以针对每个像素利用优化的方法进行校正。但是如果长时间之后,光线、场景表面等发生变化。则光度误差法几乎就不可能再进行校正了。但是利用NID匹配方式,对于环境变化,依然能够起作用。
已知图像的poseξ, 计算NID中逆深度的梯度:

Dr(ξ)=δNID(Ir(pi),Ic(N(qi)))δDr(pi)|ξ,piΩD

迭代更新的方法还是使用的BFGS方法,类似之前的更新过程:
Dr^(p)k+1=Dr^(p)kαDkDkDr(ξ)

计算出一个新的逆深度之后即方差之后,将其与之前的逆深度和方差融合得到最终校正后的逆深度和方差:

Dr(p)=Dr^(p)kVr(p)+Dr(p)diag(Dk)Vr(p)+diag(Dk)

Vr(p)=(Vr(p)1+diag(Dk)1)1+diag(δp2I)

其中是Hadamard (element-wise) product, δp2是加入的误差项,防止逆深度的方差过小。

实际中发现,NID 深度更新对深度初始值和采样点数敏感,因此论文中建议,在中间的更新过程中使用NID.光度误差法对较差的初始深度估计比较鲁棒,所以对于新的关键帧深度初始化更有效。然而论文中作者在初始化时还是直接使用的NID, 没有使用光度误差法。

论文中核心的内容主要就是这些。

相关文章: