论文阅读《Recalibrating the KITTI Dataset Camera Setup for Improved Odometry Accuracy》

2021-10-13

这个是kitti官网指向soft2方法的论文,不过这篇论文里并没有描述soft2方法,但是引用了soft2方法的一个正在投稿tro2021的论文(论文内容尚未公开)。

论文52图片1

《Recalibrating the KITTI Dataset Camera Setup for Improved Odometry Accuracy》(ECMR 2021 )

Motivation

虽然kitti数据集提供了传感器的参数,但是作者认为那不够精确,如果能够提升那个矫正参数,那么就会进一步的提升里程计的性能,所以这篇文章的出发点在于矫正双目相机的参数。

Contribution

  1. 提出了一个新的KITTI相机单次矫正方法。和传统的直接检测角点的校正方法不同,本文提出的矫正方法是通过RANSAC检测线段,然后通过线段的交点以亚像素精度计算精确的角点位置。

  2. 基于这个校正方法的SOFT2和ORB2都提升了性能,并且基于这个矫正方法的SOFT2达到了KITTI榜单第一名,超过了基于激光的LOAM。

  3. 尽管这个方法目前仅在kitti的双目相机参数上进行了实验,但是作者认为这个适用于任何数据集,包括三维雷达的数据集。

Content

  1. 默认的KITTI矫正过程

    KITTI采用的是多板单图像的矫正方法,这个方法虽然很实用方便每天矫正,但是他有几个缺点,一是在单个图像中出现的板的数量由于信噪比的原因是受到限制的,二是所有板的棋盘格都相对较小,导致相对于位置更高的角点有不确定性,并且板方向有偏差(所有板都向图像中心倾斜);三是图像的大部分没有被棋盘格覆盖,利用率比较低。

    KITTI的矫正模型是默认的径向切变模型,KITTI的矫正非常依赖于精确的角点位置,对于角点的优化函数定义如下:

\[\mathbf{c}=\underset{\mathbf{c}^{\prime}} \sum_{\mathbf{p} \in \mathcal{N}_{\mathbf{I}}\left(\mathbf{c}^{\prime}\right)}\left(\mathbf{g}_{\mathbf{p}}^{T}\left(\mathbf{p}-\mathbf{c}^{\prime}\right)\right)^{2} \text {. }\\ \mathbf{c}=\left(\sum_{\mathbf{p} \in \mathcal{N}_{\mathbf{I}}} \mathbf{g}_{\mathbf{p}} \mathbf{g}_{\mathbf{p}}^{T}\right)^{-1} \sum_{\mathbf{p} \in \mathcal{N}_{\mathbf{I}}}\left(\mathbf{g}_{\mathbf{p}} \mathbf{g}_{\mathbf{p}}^{T}\right) \mathbf{p}(闭式解形式)\]

KITTI直接调用的是libcbdetect和opencv来求解这个优化问题,但是在实际矫正过程中,很难达到最佳的效果,原因可能有几个,一是因为光线的非漫反射性质,导致某些板存在过曝(白色的格子显的比黑色格子大),二是因为所有板子都离相机比较远,导致格子很小,边长只有6-20个像素,这会导致邻域的信噪比降低。

  1. 提出的KITTI双目矫正方法

    主要分成三步,一是检测并且优化角点位置,二是匹配并且优化棋盘位置,三是优化矫正参数。

    A. 角点检测及优化

    角点的检测通过两条边的交点定义,边通过Canny检测,图像转成浮点数来最大程度减小信息的损失,然后通过5x5的高斯滤波器进行平滑,平滑后的图像通过Sobel滤波器进行卷积,产生水平方向和垂直方向的两个导数(Gx,Gy),然后边的梯度和方向被定义为:

\[\begin{array}{c} G=\sqrt{G_{x}^{2}+G_{y}^{2}} \\ \Theta={atan} 2\left(G_{y}, G_{x}\right) \end{array}\]

梯度图像首先通过绝对值抑制和非极大值抑制进行过滤,然后根据方向划分边像素的类别: 水平正、水平负、垂直正和垂直负, 正负指的是对应边的黑白顺序,生成的结果如下图:

论文52图片2

所以,寻找角点的人物转换成了寻找末端非常接近的四类不同线段的任务,为了减少异常值的数量,只连接具有相似长度的段,并在创建与相邻段的连接图后重建棋盘。第一个角点总是恰好有两个连接的角点:一个向右,一个向下,具体的搜索过程是:

首先,开始向右移动,添加新的角点直到一个尚未正确连接的角点。此时,如果存在向下连接,则向下移动然后向左移动,遵循蛇形图案,直到到达没有向下连接的结束角点。在每一行的末尾,我们将角点的数量与前一行进行比较,如果这些数字不匹配,则放弃当前的匹配。这个简单的检查过滤掉了来自棋盘格以外的其他来源的信息。

最后,角点位置按照如下过程优化: 首先为每个角点找到该线的两个方程,一个通过两个水平相邻的线段,另一个通过两个垂直相邻的线段;对于每条线,使用 RANSAC 程序来抑制异常值,如果到线的距离低于阈值且点梯度方向在某个角度公差内垂直于线,则接受为内点;计算线方程后,精确的角点位置被计算为这两条线的交点。

下图展示了本文提出的方法和libcbdetect检测的方法的重投影误差向量的具体可视化区别:绿色的是这篇文章的方法,黄色的是libcbdectect的方法。表格是文章中的方法和opencv,libcbdectect的量化比较,可以看出这个方法的准确性是三种方法中最高的。

论文52图片3

论文52图片4

B. 棋盘匹配和优化

这个环节的目的是确定KITTI数据集是否存在另一组校准参数. 主要就是大致在KITTI数据集矫正过程。文章中写的比较简短,所以不作仔细描述。

C. 矫正参数优化

这个主要是对上面计算出的矫正参数进行灵敏度分析并且优化,优化的过程大致如下图(详细的调试步骤建议跳转原文阅读,这里不作仔细描述):

论文52图片5

论文52图片6

论文52图片7

  1. 实验结果

论文52图片8

Conclusion

这篇文章主要讲的是矫正,和SOFT2关系不大,期待SOFT2的论文,不过就实验效果来看,矫正效果很不错,能在soft2的基础上再提升一个等级的精度。