介绍
在openMVG中,其剔除误匹配使用的是ACRANSAC,而不是RANSAC。咋一看让人十分困惑,因此仔细阅读了两篇相关的论文,现在把我对于ACRANSAC的理解阐述一下。
参考资料
http://www.ipol.im/pub/art/2012/mmm-oh/(包含论文和代码)
[1] Automatic Homographic Registration of a Pair of Images, with A Contrario Elimination of Outliers
[2] A Probabilistic Criterion to Detect Rigid Point Matches Between Two Images and Estimate the Fundamental Matrix
ACRANSAC
下边将会分为三部分进行讲解,
- RANSAC原理及缺陷
- ACRANSAC原理及其与RANSAC的区别
- ACRANSAC示例
RANSAC原理及缺陷
RANSAC是目前使用最为广泛的误匹配剔除算法,其核心思路非常简单,大致可以分为三步:
- 随机从数据集中抽取
组数据用于计算模型
- 通过阈值
寻找内点
- 如果迭代次数小于
且内点数目超出
,则终止迭代;反之从第一部开始迭代
纵观上述流程,可以发现RANSAC的合理使用,有三个值至关重要,分别是阈值、迭代次数和内点数目。阈值是判断一个数据是否是内点的关键,迭代次数是保证最优模型被找到的关键,内点数据是判断模型是否最优的关键。
如何合理选取上述三个值是使用RANSAC的关键。阈值过低和内点数目过高都有可能导致RANSAC无法找到合理的模型,而迭代次数过少又可能导致无法寻找到最优模型。因此在实际使用是通常都要针对特定问题,根据经验设置这三个值,加大了RANSAC的使用难度。
ACRANSAC原理及其与RANSAC的区别
注意的是,此处以求解基本矩阵
为基础介绍。
在介绍ACRANSAC之前,首先要介绍一些概念和定义,以便后续的理解。首先
和
是一组对应数据,则记
。
定义1:模型 的评价标准如下:
其中 是对应的核线,dist是 和核线之间的欧式距离。 是图片的面积, 是对角线长度,因此 是一个归一化参数。
关于上式还有另外一种理解模式,即从概率的角度。假设 是随机均匀分布在图片上,那么其到核线的距离也是一个随机值,其概率值也可以用面积的方式来表达,如下图所示。绿色部分的面积就小于等于对角线面积乘以其到核线的距离,而白色部分就是图片的面积。
定义2:模型 的残差为 的前提是:
定义2的意思其实是利用 的一个子集( 对应的就是7个点)计算一个模型,然后求解出其对应的评价标准(定义1),然后这个值就是评价模型合理的依据。对比RANSAC,其实此处对应的就是阈值,一个模型计算出的残差越小,其模型的可信度自然越高。但是此处同时也引出了一个问题,对于一个 要穷举计算其最小残差实际上是一个不可能完成的任务。因此此处借助了RANSAC的思路,利用随机选点来计算其残差值,后续使用ACRANSAC会再加以说明。
定义3: -meaningful事件:记 为升序排列的随机变量,那么满足:
的事件就被称为 -meaningful事件。
从概率论的角度, -meaningful可以当做是某件事发生的期望值。由于在ACRANSAC中,期望对应的残差和残差发生的概率,因此这个期望值越小那么模型合理的概率也就越大。后文中的推论1和推论2都是在此基础上进行的。
注意的是,此处以求解基本矩阵 为基础介绍。
推理1:假设 中全是正确的匹配值,那么残差为 的模型对应的 -meaningful事件为:
解释一下上述公式,首先由于 中一共有 个点,且每 个点可以算出 个模型,因此总共有 个模型。其次要保证所有的点都满足残差为 ,则除用于计算模型的点之外 点的残差都应该小于 ;根据前文提到,每一个点都是随机分布,因此每一个点符合条件的概率为 ,故所有点符合的概率为 。
由于前文已经提到, 期望是刻画残差大小的值,因此其值越小表面模型越合理,其精度也越高。同时不难发现,针对两个不同的模型 和 ,我们可以利用上述点对其分别进行评价,比较那一个模型的精度更高,相比RANSAC,这是ACRANSAC的最大的优势之一。
推理2.1:假设 中存在错误的匹配值,其子集 ( 个数据)的 -meaningful事件为:
其中 是子集的大小和子集的可能组合数的乘积,表明可能存在的子集的数目。
上式就是ACRANSAC的核心,针对不同的模型只需要计算其对应的 即可,并通过比较不同模型之间的 来选择最优的模型。
推理2.2:推理2.1中的公式可以进一步抽象成一下形式:
其中 表示一组数据能输出几个模型, 表明计算一个模型需要的最少数据量。
ACRANSAC的用法
前文已经非常仔细的介绍了ACRANSAC的核心思想,即通过比较
来选择最优的模型,其计算思路利用伪代码的方式可以表示成如下形式:
为方便理解,此处对其再进行一次解释:
- 首先确定 ,通常取1;如果要更高精度,可以取0.001。对于 ,考虑可接收的最小距离为 ,则
- 随机抽取子集 用于计算对应的模型,并计算 中点对应的残差,并将其按照升序进行排列;
- 将其余点按照残差从大到小的排序逐步加入到 中,并逐个计算 ,最后只保留 最小的模型;注意残差大于 的点不予考虑
- 判断模型是否合理,如果合理保存;判断循环是否结束,如果没有结束返回第一步;如果结束则退出循环,并输出最佳模型。
除此之外,ACRANSAC还有两个trick需要进行解释:
- 为方便计算,通常使用 代替 ,这样可以简化计算。
- 每次保留10%的迭代次数 。如果当前模型的 小于阈值,则仅仅迭代 次;或者迭代次数达到90%后还没有找到最佳模型,则不再继续进行迭代,直接保存当前最优即可。
区别和优点
解释到次数,已经不难发现相比RANSAC,ACRANSAC使用的参数更少,或者说ACRANSAC基本上不依靠参数设置来获取最优模型。
并且,使用ACRANSAC能够直接客观的比较两个模型的差异,从而获取最佳模型;这在RANSAC是不存在的。
ACRANSAC示例
下文是一个利用ACRANSAC计算单应变换的示例,提供了计算结果和计算过程。
计算结果
计算过程
sift:: 1st image: 536 keypoints
sift:: 2nd image: 632 keypoints
sift:: matches: 159
Remove 25/159 duplicate matches, keeping 134
nfa=-525.208 inliers=124 precision=2.01905 im1 (iter=0,sample=5,9,20,133)
nfa=-573.793 inliers=130 precision=1.78031 im2 (iter=4,sample=40,130,29,112)
nfa=-581.485 inliers=125 precision=1.2473 im1 (iter=13,sample=57,106,110,27)
nfa=-586.776 inliers=127 precision=1.33191 im1 (iter=18,sample=98,90,43,1)
nfa=-600.671 inliers=128 precision=1.23988 im2 (iter=56,sample=90,101,55,16)
nfa=-606.959 inliers=128 precision=1.16957 im1 (iter=320,sample=42,132,23,71)
nfa=-610.796 inliers=127 precision=1.06373 im1 (iter=659,sample=42,126,16,100)
nfa=-611.263 inliers=128 precision=1.12375 im2 (iter=676,sample=55,5,59,127)
Before refinement: Average/max error: 0.537432/1.12375
After refinement: Average/max error: 0.482015/1.1777
H=[ 1.1653 -0.113549 -526.933; 0.175622 1.12019 -62.3101; 0.000219927 -2.69926e-05 1 ]
-- Render Mosaic --
-- Render Mosaic - Image A --
-- Render Mosaic - Image B --
总结
由于刚刚看明白,有错误之处也请大家指出。