待补充
后续介绍不够通俗化,需要再补充介绍一下。
主要是
ε
−
m
e
a
n
i
n
g
f
u
l
\varepsilon-meaningful
ε−meaningful事件到底怎么用的没有说清楚,其实这个只是算正确匹配对。
介绍
在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 s s组数据用于计算模型
- 通过阈值 t t t寻找内点
- 如果迭代次数小于
n
n
n且内点数目超出
m
m
m,则终止迭代;反之从第一部开始迭代
纵观上述流程,可以发现RANSAC的合理使用,有三个值至关重要,分别是阈值、迭代次数和内点数目。阈值是判断一个数据是否是内点的关键,迭代次数是保证最优模型被找到的关键,内点数据是判断模型是否最优的关键。
如何合理选取上述三个值是使用RANSAC的关键。阈值过低和内点数目过高都有可能导致RANSAC无法找到合理的模型,而迭代次数过少又可能导致无法寻找到最优模型。因此在实际使用是通常都要针对特定问题,根据经验设置这三个值,加大了RANSAC的使用难度。
###ACRANSAC原理及其与RANSAC的区别
注意的是,此处以求解基本矩阵
F
F
F为基础介绍。
在介绍ACRANSAC之前,首先要介绍一些概念和定义,以便后续的理解。首先
m
i
m_i
mi和
m
i
′
m^{'}_i
mi′是一组对应数据,则记
S
=
(
m
i
,
m
i
′
)
i
=
1...
n
S={(m_i,m^{'}_i)}_{i=1...n}
S=(mi,mi′)i=1...n。
####定义1:模型
F
F
F的评价标准如下:
α
F
(
S
)
=
2
D
A
m
a
x
(
m
,
m
′
)
∈
S
d
i
s
t
(
m
′
,
F
m
)
\alpha_F(S)=\frac{2D}{A}max_{(m,m^{'})\in S}dist(m^{'},Fm)
αF(S)=A2Dmax(m,m′)∈Sdist(m′,Fm)
其中
F
m
Fm
Fm是对应的核线,dist是
m
′
m^{'}
m′和核线之间的欧式距离。
A
A
A是图片的面积,
D
D
D是对角线长度,因此
2
D
A
\frac{2D}{A}
A2D是一个归一化参数。
关于上式还有另外一种理解模式,即从概率的角度。假设
m
′
m^{'}
m′是随机均匀分布在图片上,那么其到核线的距离也是一个随机值,其概率值也可以用面积的方式来表达,如下图所示。绿色部分的面积就小于等于对角线面积乘以其到核线的距离,而白色部分就是图片的面积。
####定义2:模型
F
F
F的残差为
α
\alpha
α的前提是:
α
F
(
S
)
≤
α
\alpha_F(S)\leq \alpha
αF(S)≤α
定义2的意思其实是利用
S
S
S的一个子集(
F
F
F对应的就是7个点)计算一个模型,然后求解出其对应的评价标准(定义1),然后这个值就是评价模型合理的依据。对比RANSAC,其实此处对应的就是阈值,一个模型计算出的残差越小,其模型的可信度自然越高。但是此处同时也引出了一个问题,对于一个
S
S
S要穷举计算其最小残差实际上是一个不可能完成的任务。因此此处借助了RANSAC的思路,利用随机选点来计算其残差值,后续使用ACRANSAC会再加以说明。
####定义3:
ε
\varepsilon
ε-meaningful事件:记
Λ
\Lambda
Λ为升序排列的随机变量,那么满足:
∣
Λ
∣
⋅
P
[
E
⩽
t
]
≤
ε
\begin{vmatrix} \Lambda \end{vmatrix}\cdot P\begin{bmatrix} E\leqslant t \end{bmatrix}\leq \varepsilon
∣∣Λ∣∣⋅P[E⩽t]≤ε
的事件就被称为
ε
\varepsilon
ε-meaningful事件。
从概率论的角度,
ε
\varepsilon
ε-meaningful可以当做是某件事发生的期望值。由于在ACRANSAC中,期望对应的残差和残差发生的概率,因此这个期望值越小那么模型合理的概率也就越大。后文中的推论1和推论2都是在此基础上进行的。
注意的是,此处以求解基本矩阵
F
F
F为基础介绍。
####推理1:假设
S
S
S中全是正确的匹配值,那么残差为
α
\alpha
α的模型对应的
ε
\varepsilon
ε-meaningful事件为:
ε
1
(
α
,
n
)
=
3
⋅
(
n
7
)
⋅
α
n
−
7
⩽
ε
\varepsilon _1(\alpha,n)=3 \cdot \binom{n}{7} \cdot \alpha ^{n-7} \leqslant \varepsilon
ε1(α,n)=3⋅(7n)⋅αn−7⩽ε
解释一下上述公式,首先由于
S
S
S中一共有
n
n
n个点,且每
7
7
7个点可以算出
3
3
3个模型,因此总共有
3
⋅
(
n
7
)
3\cdot\binom{n}{7}
3⋅(7n)个模型。其次要保证所有的点都满足残差为
α
\alpha
α,则除用于计算模型的点之外
n
−
7
^{n-7}
n−7点的残差都应该小于
α
\alpha
α;根据前文提到,每一个点都是随机分布,因此每一个点符合条件的概率为
α
\alpha
α,故所有点符合的概率为
α
n
−
7
\alpha ^{n-7}
αn−7。
由于前文已经提到,
ε
\varepsilon
ε期望是刻画残差大小的值,因此其值越小表面模型越合理,其精度也越高。同时不难发现,针对两个不同的模型
F
1
F_1
F1和
F
2
F_2
F2,我们可以利用上述点对其分别进行评价,比较那一个模型的精度更高,相比RANSAC,这是ACRANSAC的最大的优势之一。
####推理2.1:假设
S
S
S中存在错误的匹配值,其子集
S
i
S_i
Si(
k
k
k个数据)的
ε
\varepsilon
ε-meaningful事件为:
ε
2
(
α
,
n
,
k
)
=
3
(
n
−
7
)
⋅
(
n
k
)
⋅
(
k
7
)
⋅
α
k
−
7
⩽
ε
\varepsilon _2(\alpha,n,k)=3 (n-7)\cdot \binom{n}{k} \cdot \binom{k}{7} \cdot \alpha ^{k-7} \leqslant \varepsilon
ε2(α,n,k)=3(n−7)⋅(kn)⋅(7k)⋅αk−7⩽ε
其中$(n-7)\cdot \binom{n}{k}
是
子
集
的
大
小
和
子
集
的
可
能
组
合
数
的
乘
积
,
表
明
可
能
存
在
的
子
集
的
数
目
。
上
式
就
是
A
C
R
A
N
S
A
C
的
核
心
,
针
对
不
同
的
模
型
只
需
要
计
算
其
对
应
的
是子集的大小和子集的可能组合数的乘积,表明可能存在的子集的数目。 上式就是ACRANSAC的核心,针对不同的模型只需要计算其对应的
是子集的大小和子集的可能组合数的乘积,表明可能存在的子集的数目。上式就是ACRANSAC的核心,针对不同的模型只需要计算其对应的\varepsilon
即
可
,
并
通
过
比
较
不
同
模
型
之
间
的
即可,并通过比较不同模型之间的
即可,并通过比较不同模型之间的\varepsilon $来选择最优的模型。
####推理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
⩽
ε
\varepsilon _2(\alpha,n,k)=N_{outcome} (N-N_{sample})\cdot \binom{N}{k} \cdot \binom{k}{N_{sample}} \cdot \alpha ^{k-N_{sample}} \leqslant \varepsilon
ε2(α,n,k)=Noutcome(N−Nsample)⋅(kN)⋅(Nsamplek)⋅αk−Nsample⩽ε
其中
N
o
u
t
c
o
m
e
N_{outcome}
Noutcome表示一组数据能输出几个模型,
N
s
a
m
p
l
e
N_{sample}
Nsample表明计算一个模型需要的最少数据量。
####ACRANSAC的用法
前文已经非常仔细的介绍了ACRANSAC的核心思想,即通过比较
ε
\varepsilon
ε来选择最优的模型,其计算思路利用伪代码的方式可以表示成如下形式:
为方便理解,此处对其再进行一次解释:
- 首先确定 ε \varepsilon ε,通常取1;如果要更高精度,可以取0.001。对于 α \alpha α,考虑可接收的最小距离为 d d d,则 α = 2 d D A \alpha=\frac{2dD}{A} α=A2dD
- 随机抽取子集 S i S_i Si用于计算对应的模型,并计算 S − S i S-S_i S−Si中点对应的残差,并将其按照升序进行排列;
- 将其余点按照残差从大到小的排序逐步加入到 S i S_i Si中,并逐个计算 N F A NFA NFA,最后只保留 N F A NFA NFA最小的模型;注意残差大于 d d d的点不予考虑
- 判断模型是否合理,如果合理保存;判断循环是否结束,如果没有结束返回第一步;如果结束则退出循环,并输出最佳模型。
除此之外,ACRANSAC还有两个trick需要进行解释:
- 为方便计算,通常使用 l o g ( N F A ) log(NFA) log(NFA)代替 N F A NFA NFA,这样可以简化计算。
- 每次保留10%的迭代次数 I t e r Iter Iter。如果当前模型的 N F A NFA NFA小于阈值,则仅仅迭代 0.1 ⋅ I t e r 0.1 \cdot Iter 0.1⋅Iter次;或者迭代次数达到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 --
总结
由于刚刚看明白,有错误之处也请大家指出。