埃塞克斯大学,单目视觉里程计
VGG + 伪孪生FC网络是位姿预测网络的常用结构(undeepVO,deepPCO)
这是一篇单目视觉里程计的工作, 其贡献以及特点主要有:
- 使用无监督学习进行训练, 不受数据集真值的限制
- 相比以往的单目里程计,可以恢复出绝对尺度
- 同时完成了视觉里程计和深度估计两个任务
- 训练阶段使用双目图像作为输入,测试时使用单目输入。
方法概述:
以双目相机k时刻和k+1时刻的左右图像作为输入,因此有4个图。
网络由深度估计网络、相对位姿估计网络两个部分组成,分别生成深度图和相对位姿。
位姿估计网络:
基于VGG网络。
由于相对位姿中的平移量是线性的,而旋转角(欧拉角)是非线性的,两个在一起预测效果不好。因此作者使用两个独立的FC网络分别对旋转和平移进行预测。
深度估计网络:
基于编解码结构。直接预测深度而不是常见的预测视差(更容易收敛)。
无监督损失函数
所谓的“时空损失函数”,包括:
* 空间损失函数(k时刻的左右图像之间构造损失)
* 时间损失函数(k、k+1时刻的右图像之间构造损失)
空间损失函数
在K时刻的左右视图之间构造损失函数,包括三项:光度一致、视差一致、位姿一致
-
光度一致
首先根据预测的深度图D_dep可以得到左右视图之间的水平距离图D_p:
D p = B f / D d e p D_{p}=B f / D_{d e p} Dp=Bf/Ddep
其中Bf分别是双目相机的baseline和焦距。
根据得到的D_p和空间约束,通过“spatial transformer”将左右视图对齐,然后计算损失:
L p h o l = λ s L S S I M ( I l , I l ′ ) + ( 1 − λ s ) L l 1 ( I l , I l ′ ) L p h o r = λ s L S S I M ( I r , I r ′ ) + ( 1 − λ s ) L l 1 ( I r , I r ′ ) \begin{aligned} L_{p h o}^{l} &=\lambda_{s} L^{S S I M}\left(I_{l}, I_{l}^{\prime}\right)+\left(1-\lambda_{s}\right) L^{l_{1}}\left(I_{l}, I_{l}^{\prime}\right) \\ L_{p h o}^{r} &=\lambda_{s} L^{S S I M}\left(I_{r}, I_{r}^{\prime}\right)+\left(1-\lambda_{s}\right) L^{l_{1}}\left(I_{r}, I_{r}^{\prime}\right) \end{aligned} LpholLphor=λsLSSIM(Il,Il′)+(1−λs)Ll1(Il,Il′)=λsLSSIM(Ir,Ir′)+(1−λs)Ll1(Ir,Ir′)
这里使用了L1损失和SSIM损失(结构相似性指标) -
视差一致
这里还是使用水平距离图D_p, 转换成视差图:
D d i s = D p × I W D_{d i s}=D_{p} \times I_{W} Ddis=Dp×IW
I_w是图像的水平宽度。
通过D_p将左右视图对齐然后计算L1损失:
L d i s l = L l 1 ( D d i s l , D d i s l ′ ) L d i s r = L l 1 ( D d i s r , D d i s r ′ ) \begin{aligned} L_{d i s}^{l} &=L^{l_{1}}\left(D_{d i s}^{l}, D_{d i s}^{l^{\prime}}\right) \\ L_{d i s}^{r} &=L^{l_{1}}\left(D_{d i s}^{r}, D_{d i s}^{r^{\prime}}\right) \end{aligned} LdislLdisr=Ll1(Ddisl,Ddisl′)=Ll1(Ddisr,Ddisr′)
- 位姿一致
由于是在左右视图之间构造位姿损失,因此只能利用左右视图的预测位姿应该相同这一约束,对左右视图预测的位姿之间的差别进行惩罚:
L p o s = λ p L l 1 ( x l ′ , x r ′ ) + λ o L l 1 ( φ l ′ , φ r ′ ) L_{p o s}=\lambda_{p} L^{l_{1}}\left(\mathbf{x}_{l}^{\prime}, \mathbf{x}_{r}^{\prime}\right)+\lambda_{o} L^{l_{1}}\left(\varphi_{l}^{\prime}, \varphi_{r}^{\prime}\right) Lpos=λpLl1(xl′,xr′)+λoLl1(φl′,φr′)
时间损失函数
在右视图的前后帧之间构造损失:
- 光度一致
根据预测的前后帧的相对位姿、相机内参、以及预测的深度图,将前后帧对齐:
p k + 1 = K T k , k + 1 D d e p K − 1 p k p_{k+1}=K T_{k, k+1} D_{d e p} K^{-1} p_{k} pk+1=KTk,k+1DdepK−1pk
pk是第k帧中的一个像素,pk+1是对应的在k+1帧的像素。 - 三维几何配准一致
类似于点云里面ICP的做法,将两个点云根据相对位姿进行配准后计算损失:
L g e o k = L l 1 ( P k , P k ′ ) L g e o k + 1 = L l 1 ( P k + 1 , P k + 1 ′ ) \begin{array}{c} L_{g e o}^{k}=L^{l_{1}}\left(P_{k}, P_{k}^{\prime}\right) \\ L_{g e o}^{k+1}=L^{l_{1}}\left(P_{k+1}, P_{k+1}^{\prime}\right) \end{array} Lgeok=Ll1(Pk,Pk′)Lgeok+1=Ll1(Pk+1,Pk+1′)
实验内容
测试阶段:位姿估计网络< 400M, 速度40Hz(GTX980M)
轨迹追踪评估:
效果优于orb-slam(没有闭环检测和局部mapping)
在其他序列上的结果:(没有真值,所以使用VISO2-S作为参考)
优于VISO2-M(undeepVO 的方法 输入分辨率更低,精度更高)
深度图效果评估:
可以正确生成比例深度图:
精度仅次于MonoDepth:
作者给出的原因分析:
- unDeepVO使用了部分kitti序列进行训练,而MonoDepth使用了全部序列
- MonoDepth使用了 higher resolution (512×256) input
- MonoDepth使用了 ResNet-based architecture
- unDeepVO使用的序列输入可能会引入噪声(动态物体)