摘要
RANSAC(RAndom SAmple Consensus,随机采样一致)
ransac algorithm,在可能存在无匹配的情况下,我们更倾向于使用ransac(random sample concensus, RANSAC)来求解,而不是最小二乘法。RANSAC 算法是一种通用的做法,适用于很多带错误数据的情况,可以处理带来错误匹配的数据。
《视觉slam十四讲》–7.4节。
简介
RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Proble)问题的 。
算法思路
RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
- 有一个模型适用于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
- 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
- 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
- 然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
- 最后,通过估计局内点与模型的错误率来评估模型。
1.1 举例, 使用RANSAC——拟合直线
opencv 中的ransac 算法
关于OpenCV中使用到RANSAC的相关函数
1 | 1. solvePnPRansac |
迭代次数推导
已知一组数据点中既包含内点又包含外点,其中内点占的比例为 p,且计算模型参数至少需要k kk个数据点,要求经过RANSAC算法之后有概率q qq的把握以上排除所有外点,那么迭代次数n nn至少应该设定为多少?
解答:
随机选取k个点,这k个点都为内点的概率为 ,那么这k个点中至少有一个为外点的概率为 。
n 次迭代,每次选择到的数据点都存在外点的概率为 。
,则至少有一次选择到的都是内点的概率为 ,依据题意,此概率要大于等于q,有,
两边取对数有,
两边同时除以 可得(注意两边除以一个负数,不等式要变号),
n向上取整数即为迭代次数。
code demo
1 | from typing import Sized |