ACRANSAC之我见

介绍

在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是目前使用最为广泛的误匹配剔除算法,其核心思路非常简单,大致可以分为三步:
- 随机从数据集中抽取 s 组数据用于计算模型
- 通过阈值 t 寻找内点
- 如果迭代次数小于 n 且内点数目超出 m ,则终止迭代;反之从第一部开始迭代
纵观上述流程,可以发现RANSAC的合理使用,有三个值至关重要,分别是阈值、迭代次数和内点数目。阈值是判断一个数据是否是内点的关键,迭代次数是保证最优模型被找到的关键,内点数据是判断模型是否最优的关键。
如何合理选取上述三个值是使用RANSAC的关键。阈值过低和内点数目过高都有可能导致RANSAC无法找到合理的模型,而迭代次数过少又可能导致无法寻找到最优模型。因此在实际使用是通常都要针对特定问题,根据经验设置这三个值,加大了RANSAC的使用难度。

ACRANSAC原理及其与RANSAC的区别

注意的是,此处以求解基本矩阵 F 为基础介绍。
在介绍ACRANSAC之前,首先要介绍一些概念和定义,以便后续的理解。首先 m i m i 是一组对应数据,则记 S = ( m i , m i ) i = 1... n

定义1:模型 F 的评价标准如下:

α F ( S ) = 2 D A m a x ( m , m ) S d i s t ( m , F m )

其中 F m 是对应的核线,dist是 m 和核线之间的欧式距离。 A 是图片的面积, D 是对角线长度,因此 2 D A 是一个归一化参数。
关于上式还有另外一种理解模式,即从概率的角度。假设 m 是随机均匀分布在图片上,那么其到核线的距离也是一个随机值,其概率值也可以用面积的方式来表达,如下图所示。绿色部分的面积就小于等于对角线面积乘以其到核线的距离,而白色部分就是图片的面积。


这里写图片描述

定义2:模型 F 的残差为 α 的前提是:

α F ( S ) α

定义2的意思其实是利用 S 的一个子集( F 对应的就是7个点)计算一个模型,然后求解出其对应的评价标准(定义1),然后这个值就是评价模型合理的依据。对比RANSAC,其实此处对应的就是阈值,一个模型计算出的残差越小,其模型的可信度自然越高。但是此处同时也引出了一个问题,对于一个 S 要穷举计算其最小残差实际上是一个不可能完成的任务。因此此处借助了RANSAC的思路,利用随机选点来计算其残差值,后续使用ACRANSAC会再加以说明。

定义3: ε -meaningful事件:记 Λ 为升序排列的随机变量,那么满足:

| Λ | P [ E t ] ε

的事件就被称为 ε -meaningful事件。
从概率论的角度, ε -meaningful可以当做是某件事发生的期望值。由于在ACRANSAC中,期望对应的残差和残差发生的概率,因此这个期望值越小那么模型合理的概率也就越大。后文中的推论1和推论2都是在此基础上进行的。


注意的是,此处以求解基本矩阵 F 为基础介绍。

推理1:假设 S 中全是正确的匹配值,那么残差为 α 的模型对应的 ε -meaningful事件为:

ε 1 ( α , n ) = 3 ( n 7 ) α n 7 ε

解释一下上述公式,首先由于 S 中一共有 n 个点,且每 7 个点可以算出 3 个模型,因此总共有 3 ( n 7 ) 个模型。其次要保证所有的点都满足残差为 α ,则除用于计算模型的点之外 n 7 点的残差都应该小于 α ;根据前文提到,每一个点都是随机分布,因此每一个点符合条件的概率为 α ,故所有点符合的概率为 α n 7
由于前文已经提到, ε 期望是刻画残差大小的值,因此其值越小表面模型越合理,其精度也越高。同时不难发现,针对两个不同的模型 F 1 F 2 ,我们可以利用上述点对其分别进行评价,比较那一个模型的精度更高,相比RANSAC,这是ACRANSAC的最大的优势之一。

推理2.1:假设 S 中存在错误的匹配值,其子集 S i ( k 个数据)的 ε -meaningful事件为:

ε 2 ( α , n , k ) = 3 ( n 7 ) ( n k ) ( k 7 ) α k 7 ε

其中 ( n 7 ) ( n k ) 是子集的大小和子集的可能组合数的乘积,表明可能存在的子集的数目。
上式就是ACRANSAC的核心,针对不同的模型只需要计算其对应的 ε 即可,并通过比较不同模型之间的 ε 来选择最优的模型。

推理2.2:推理2.1中的公式可以进一步抽象成一下形式:

ε 2 ( α , n , k ) = N o u t c o m e ( N N s a m p l e ) ( N k ) ( k N s a m p l e ) α k N s a m p l e ε

其中 N o u t c o m e 表示一组数据能输出几个模型, N s a m p l e 表明计算一个模型需要的最少数据量。


ACRANSAC的用法

前文已经非常仔细的介绍了ACRANSAC的核心思想,即通过比较 ε 来选择最优的模型,其计算思路利用伪代码的方式可以表示成如下形式:
这里写图片描述
为方便理解,此处对其再进行一次解释:

  • 首先确定 ε ,通常取1;如果要更高精度,可以取0.001。对于 α ,考虑可接收的最小距离为 d ,则 α = 2 d D A
  • 随机抽取子集 S i 用于计算对应的模型,并计算 S S i 中点对应的残差,并将其按照升序进行排列;
  • 将其余点按照残差从大到小的排序逐步加入到 S i 中,并逐个计算 N F A ,最后只保留 N F A 最小的模型;注意残差大于 d 的点不予考虑
  • 判断模型是否合理,如果合理保存;判断循环是否结束,如果没有结束返回第一步;如果结束则退出循环,并输出最佳模型。

除此之外,ACRANSAC还有两个trick需要进行解释:

  • 为方便计算,通常使用 l o g ( N F A ) 代替 N F A ,这样可以简化计算。
  • 每次保留10%的迭代次数 I t e r 。如果当前模型的 N F A 小于阈值,则仅仅迭代 0.1 I t e r 次;或者迭代次数达到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 -- 

总结

由于刚刚看明白,有错误之处也请大家指出。

猜你喜欢

转载自blog.csdn.net/u012348774/article/details/79802957