1. 最大团匹配方法
最大团匹配方法区别于其它其它匹配方法的有点就是可以得到整体最优。缺点是随着语义增多,算法复杂度增长很快。可以利用最大团匹配方法进行初始化。主要参考下面的论文。
CLIPPER: A Graph-Theoretic Framework for Robust Data Association
链接:clipper 论文
作者:Parker C. Lusk*, Kaveh Fathian*, Jonathan P. How
2.clipper匹配代码
链接:clipper 代码库
3. 最大团匹配原理详细解读
最大团匹配的过程就是找到两个点集{a_i},{b_i}的最佳匹配点对。
第一步:求出所有潜在的匹配对,如上图所示,a_i->b_j的匹配可能几何。 本实例按照全量的匹配求出潜在匹配对{a_i,b_j},size 等于16。
p
o
t
e
n
t
i
a
l
_
m
a
t
c
h
_
p
a
i
r
=
A
=
{
(
a
1
,
b
1
)
,
(
a
1
,
b
2
)
,
(
a
1
,
b
3
)
,
(
a
1
,
b
4
)
,
(
a
2
,
b
1
)
,
(
a
2
,
b
2
)
,
(
a
2
,
b
3
)
,
(
a
2
,
b
4
)
,
(
a
3
,
b
1
)
,
(
a
3
,
b
2
)
,
(
a
3
,
b
3
)
,
(
a
3
,
b
4
)
,
(
a
4
,
b
1
)
,
(
a
4
,
b
2
)
,
(
a
4
,
b
3
)
,
(
a
4
,
b
4
)
}
potential\_match\_pair=A= \left\{(a_1,b_1), (a_1,b_2), (a_1,b_3), (a_1,b_4), (a_2,b_1), (a_2,b_2), (a_2,b_3),(a_2,b_4), \\ (a_3,b_1), (a_3,b_2), (a_3,b_3), (a_3,b_4), (a_4,b_1), (a_4,b_2), (a_4,b_3), (a_4,b_4)\right\}
potential_match_pair=A={(a1,b1),(a1,b2),(a1,b3),(a1,b4),(a2,b1),(a2,b2),(a2,b3),(a2,b4),(a3,b1),(a3,b2),(a3,b3),(a3,b4),(a4,b1),(a4,b2),(a4,b3),(a4,b4)}
第二步:确定潜在匹配对的亲近矩阵,当一对匹配关系存在不会排斥到另外一对匹配关系,则称为一对匹配关系亲近。
计算下列匹配关系是否亲近
{
(
a
1
,
b
1
)
}
,
{
(
a
2
,
b
2
)
}
∣
∥
a
1
−
a
2
∥
−
∥
b
1
−
b
2
∥
∣
<
E
?
t
r
u
e
:
f
a
l
s
e
\left\{(a_1,b_1)\right\}, \left\{(a_2,b_2)\right\} \\ \lvert \lVert a_1 - a_2\rVert - \lVert b_1 - b_2 \rVert \rvert< \Epsilon \quad? true:false
{(a1,b1)},{(a2,b2)}∣∥a1−a2∥−∥b1−b2∥∣<E?true:false
E 为判断是否亲近的门限。由上式可以计算出每一对匹配关系是否亲近,组成size*size的一个矩阵affinity_matrix=M.
第三步:数学建模求解。
变量u是长度size的bool型向量。 为1时代表匹配关系成立,为0时代表匹配关系不成立。匹配关系的最优解可以表达成如下带条件的目标函数,为最大亲近密度形式 。
m
a
x
i
m
i
z
e
u
∈
{
0
,
1
}
n
=
u
T
M
u
u
T
u
s
u
b
j
e
c
t
t
o
u
i
∗
u
j
=
0
i
f
(
M
(
i
,
j
)
=
0
)
,
∀
i
,
j
\underset{u\in\{0,1\}^n}{maximize} = \frac{u^TMu}{u^Tu} \\ subject\quad to \quad u_i*u_j=0 \quad if(M(i,j)=0), \forall i,j
u∈{0,1}nmaximize=uTuuTMusubjecttoui∗uj=0if(M(i,j)=0),∀i,j
此处M也可以浮点形式,为权重矩阵,权重表示两组匹配的亲近程度。
如果M仅为bool形式时,目标函数可以表达如下,为最大团匹配的整数形式。
m
a
x
i
m
i
z
e
u
∈
{
0
,
1
}
n
=
Σ
i
=
1
n
s
u
b
j
e
c
t
t
o
u
i
∗
u
j
=
0
i
f
(
M
(
i
,
j
)
=
0
)
,
∀
i
,
j
\underset{u\in\{0,1\}^n}{maximize} = \Sigma_{i=1}^{n} \\ subject\quad to \quad u_i*u_j=0 \quad if(M(i,j)=0), \forall i,j
u∈{0,1}nmaximize=Σi=1nsubjecttoui∗uj=0if(M(i,j)=0),∀i,j
第四步:求解,参见论文。
4. clipper匹配代码详细解读
代码中矩阵M:表示为亲近矩阵,
代码中矩阵C: 表示为约束矩阵,为M中的值取bool量。C(i,j)=1,表示a_i, b_j存在亲近关系。
clipper.scorePairwiseConsistency(model, data); 传入两个点集数据
clipper::Affinity M = clipper.getAffinityMatrix(); 自动生成的M矩阵
clipper::Constraint C = clipper.getConstraintMatrix(); 自动生成的C矩阵
clipper.solve();
clipper.solve(a); 按照最大团匹配的整数形式求解,a为初始解。
clipper::Association Ainliers = clipper.getSelectedAssociations(); 整数形式求解可以直接获得亲近的求解。
clipper2.setMatrixData(M, C); 设置自己设计的M矩阵和C矩阵。
clipper2.solveAsMSRCSDR(); 当M为浮点矩阵时,按照最大亲近密度求解。
clipper::Association Ainliers2 = clipper::utils::selectInlierAssociations(
clipper2.getSolution(),
clipper.getInitialAssociations()); 根据u的解和初始匹配关系,选择高于亲近门限的解。
clipper_params.tol_u = 1e-7; 梯度下降结束的步进门限
clipper_params.tol_F = 1e-8; 梯度下降结束的目标函数残差门限