outlier、外点、野值会严重影响SLAM的精度,因此必须把它们剔除。常用的做法是,计算一个误差,当这个误差大于设定阈值的时候就认为其为外点。那么,问题来了,误差怎么算?阈值怎么选?
误差
就特征点法的视觉SLAM而言,一般会计算重投影误差。具体而言,记u为特征点的2D位置, v为由地图点投影到图像上的2D位置。重投影误差为
重投影误差服从高斯分布
其中,协方差 公式1一般根据特征点提取的金字塔层级确定。具体的,记提取ORB特征时,图像金字塔的每层缩小尺度为 s (ORB-SLAM中为1.2)。在ORB-SLAM中假设第0层的标准差为p 个pixel (ORB-SLAM中设为了1个pixel);那么,一个在金字塔第 n 层提取的特征的重投影误差的协方差为
回头再看一下式(1)中的误差是一个2维向量,阈值也不好设置吧。那就把它变成一个标量,计算向量的内积 r (向量元素的平方和)。但是,这又有一个问题,不同金字塔层的特征点都用同一个阈值,是不是不合理呢。于是,在计算内积的时候,利用协方差进行加权(协方差表达了不确定度)。那么就有了
利用协方差加权,起到了归一化的作用。具体的(4)式,可以变为
而
为多维标准正太分布。也就是说不同金字塔层提取的特征,计算的重投影误差都被归一化了,或者说去量纲化了,白化了。。。那么,我们只用一个阈值就可以了。(注意这里的 r>0 )
阈值
误差的问题已经解决了,下面的问题是如何选择阈值。式(5)可以看做两个独立的服从标准正太分布随机变量的平方和,它服从2个自由度的Chi-squared distribution卡方分布。以下是WIKI对卡方分布的解释。
In probability theory and statistics, the chi-squared distribution (also chi-square or χ2-distribution) with k degrees of freedom is the distribution of a sum of the squares of k independent standard normal random variables.
卡方分布的自由度即为向量的维度。不同的自由度卡方分布的概率密度函数和概率
几种自由度的卡方分布概率密度,摘自https://en.wikipedia.org/wiki/Chi-squared_distribution
几种自由度的卡方分布的概率分布 摘自https://en.wikipedia.org/wiki/Chi-squared_distribution
记概率分布(累积分布函数)为 。给定一个 可以确定一个区间 。可以认为, 落在这个区间内,则为内点,落在这个区间外则为外点。 就是我们要找的阈值 。
一般取 为95%,一个内点只有5%的可能被错误的认为是外点。关于 ,前人已经搞了一个表。
累积分布函数的逆函数表
ORB-SLAM2取 ,对应的单目投影为2自由度,因此阈值为5.99;对应的双目投影为3个自由度,因此阈值为7.81。下图为ORB-SLAM2中源码截图。
ORB-SLAM2, Optimizer.cc文件中,优化时,阈值的设置
ORB-SLAM2,LocalMapping.cc文件中,三角化点时,阈值设置
转载:
2.https://www.zhihu.com/people/DongShengYang/posts
3.https://zhuanlan.zhihu.com/p/58556978