Bundle Adjustment与图优化
在只有观测方程的情况下,这个问题称为BA,并可利用非线性优化方法求解。
所谓的Bundle Adjustment,是指从视觉重建中提炼出最优的3D模型和相机参数(内参数和外参数)。从每一个特征点反射出来的几束光线(bundles of light rays),在我们把相机姿态和特征点空间位置做出最优的调整(adjustment)之后,最后收束到相机光心的这个过程,简称为BA。BA算法不仅具有很高的精度,也开始具备良好的实时性。
1. 投影模型和BA代价函数
回顾一下一个世界坐标系的点 P P P出发,把相机的内外参数和畸变都考虑进来,最优投影成像素坐标,需要以下步骤:
这个过程就是观测方程,之前我们把它抽象地记成:
z
=
h
(
x
,
y
)
z=h(x,y)
z=h(x,y)
现在,我们给出了它的详细参数化过程。具体地说,这里的
x
x
x指代此时相机的位姿,即外参
R
,
t
R,t
R,t,它对应的李代数为
ϵ
\epsilon
ϵ。路标
y
y
y即这里的三维点
p
p
p,而观测数据则是像素坐标
z
≜
[
u
s
,
v
s
]
T
z\triangleq[u_s,v_s]^T
z≜[us,vs]T。以最小二乘的角度来考虑,那么可以列写关于此次观测的误差:
e
=
z
−
h
(
ϵ
,
p
)
e = z - h(\epsilon, p)
e=z−h(ϵ,p)
然后,把其他时刻的观测量也考虑进来,我们可以给误差添加一个下标。设
z
i
j
z_{ij}
zij为在位姿
ϵ
i
\epsilon_i
ϵi处观察路标
p
j
p_j
pj产生的数据,那么整体的代价函数(cost function)为:
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
e
i
j
∣
∣
2
=
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
z
i
j
−
h
(
ϵ
i
,
p
j
)
∣
∣
2
\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^n||e_{ij}||^2 = \frac{1}{2}\sum_{i=1}^m\sum_{j=1}^n||z_{ij} - h(\epsilon_i, p_j)||^2
21i=1∑mj=1∑n∣∣eij∣∣2=21i=1∑mj=1∑n∣∣zij−h(ϵi,pj)∣∣2
对这个最小二乘进行求解,相当于对位姿和路标同时作了调整,也就是所谓的BA。
2. BA的求解
观测模型
h
(
ϵ
,
p
)
h(\epsilon, p)
h(ϵ,p)是非线性函数,所以使用一些非线性手段来优化。据非线性优化的思想,我们应该从某个的初始值开始,不断地寻找下降方向
△
x
\triangle x
△x来找到目标函数的最优解,即不断地求解增量方程中的增量
△
x
\triangle x
△x。尽管误差项都是针对单个位姿和路标点的,但在整体的BA目标函数上,我们必须把自变量定义成所有待优化的变量:
x
=
[
ϵ
1
,
.
.
,
ϵ
m
,
p
1
,
.
.
.
,
p
n
]
T
x= [\epsilon_1,..,\epsilon_m,p_1,...,p_n]^T
x=[ϵ1,..,ϵm,p1,...,pn]T
相应的,增量方程中的
△
x
\triangle x
△x则是对整体自变量的增量。在这个意义下,当我们给自变量一个增量时,目标函数变为:
1
2
∣
∣
f
(
x
+
△
x
)
∣
∣
2
≈
1
2
∑
i
=
1
m
∑
j
=
1
n
∣
∣
e
i
j
+
F
i
j
△
ϵ
i
+
E
i
j
△
p
j
∣
∣
2
\frac{1}{2}||f(x+\triangle x)||^2 \approx \frac{1}{2}\sum_{i=1}^m\sum_{j=1}^n||e_{ij}+F_{ij}\triangle \epsilon_i + E_{ij}\triangle p_j||^2
21∣∣f(x+△x)∣∣2≈21i=1∑mj=1∑n∣∣eij+Fij△ϵi+Eij△pj∣∣2
其中 F i j F_{ij} Fij表示整个代价函数在当前状态下对相机姿态的偏导数,而 E i j E_{ij} Eij表示该函数对路标点位置的偏导。
现在,把相机位姿变量放在一起:
x
c
=
[
ϵ
1
,
ϵ
2
,
.
.
.
,
ϵ
m
]
T
∈
R
6
m
x_c = [\epsilon_1, \epsilon_2,...,\epsilon_m]^T \in \R^{6m}
xc=[ϵ1,ϵ2,...,ϵm]T∈R6m
并把空间点的变量也放在一起:
x
p
=
[
p
1
,
p
2
,
.
.
.
,
p
n
]
T
∈
R
3
n
x_p = [p_1, p_2,...,p_n]^T \in \R^{3n}
xp=[p1,p2,...,pn]T∈R3n
那么目标函数可以简化为:
1
2
∣
∣
f
(
x
+
△
x
)
∣
∣
2
=
1
2
∣
∣
e
+
F
△
x
c
+
E
△
x
p
∣
∣
2
\frac{1}{2}||f(x+\triangle x)||^2 = \frac{1}{2}||e + F\triangle x_c + E\triangle x_p||^2
21∣∣f(x+△x)∣∣2=21∣∣e+F△xc+E△xp∣∣2
这里的雅可比矩阵
E
E
E和
F
F
F必须是整体目标函数对整体变量的导数。最后,无论使用G-N还是L-M方法,最后都將面对增量线性方程:
H
△
x
=
g
H \triangle x = g
H△x=g
我们知道G-N和L-M的主要差别在于,这里的
H
H
H是取
J
T
J
J^TJ
JTJ还是
J
T
J
+
λ
I
J^TJ+λI
JTJ+λI的形式。由于我们把变量归类成了位姿和空间点两种,所以雅可比矩阵可以分块为:
J
=
[
F
E
]
J = [F E]
J=[FE]
那么,以G-N为例,则
H
H
H矩阵为:
H
=
J
T
J
=
[
F
T
F
F
T
E
E
T
F
E
T
E
]
H = J^TJ = \biggl [\begin{matrix} F^TF \quad F^TE\\ E^TF \quad E^TE \end{matrix}\biggl ]
H=JTJ=[FTFFTEETFETE]
不难发现,因为考虑了所有的优化变量,这个线性方程的维度将非常大,包含了所有的相机位姿和路标点。
3. 稀疏性和边缘化
H
H
H矩阵的稀疏性是由雅可比
J
(
x
)
J(x)
J(x)引起的。。考虑这些代价函数当中的其中一个
e
i
j
e_{ij}
eij。注意到,这个误差项只描述了在
ϵ
i
\epsilon_i
ϵi看到
p
j
p_j
pj这件事,只涉及到第
i
i
i个相机位姿和第
j
j
j个路标点,对其余部分的变量的导数都为0。所以该误差项对应的雅可比矩阵有下面的形式:
这个误差项的雅可比矩阵,除了这两处为非零块之外,其余地方都为零。这体现了该误差项与其他路标和轨迹无关的特性。
我们设
J
i
j
J_{ij}
Jij只在
i
,
j
i,j
i,j处有非零块,那么它对
H
H
H的贡献为
J
i
j
T
J
i
j
J^T_{ij}J_{ij}
JijTJij,具有下面示意图所画的稀疏形式。
这个
J
i
j
T
J
i
j
J^T_{ij}J_{ij}
JijTJij矩阵也仅有四个非零块,位于
(
i
,
i
)
,
(
i
,
j
)
,
(
j
,
i
)
,
(
j
,
j
)
(i,i),(i,j),(j,i),(j,j)
(i,i),(i,j),(j,i),(j,j)。对于整体的
H
H
H,由于:
H
=
∑
i
,
j
J
i
j
T
J
i
j
H = \sum_{i,j} J^T_{ij}J_{ij}
H=i,j∑JijTJij
我们把
H
H
H进行分块:
H
=
[
H
11
H
12
H
21
H
22
]
H = \biggl [\begin{matrix} H_{11} \quad H_{12}\\ H_{21} \quad H_{22} \end{matrix}\biggl ]
H=[H11H12H21H22]
这里 H 11 H_{11} H11只和相机位姿有关,而 H 22 H_{22} H22只和路标点有关。当我们遍历 i , j i,j i,j时,以下事实总是成立的:
- 不管 i , j i,j i,j怎么变, H 11 H_{11} H11都是对角阵,只在 H i , i H_{i,i} Hi,i处有非零块。
- 同理, H 22 H_{22} H22也是对角阵,只在 H j , j H_{j,j} Hj,j处有非零块。
- 对于 H 12 H_{12} H12和 H 21 H_{21} H21,它们可能是稀疏的,也可能是稠密的,视具体的观测数据而定。
这显示了 H H H的稀疏结构。
对于具有这种稀疏结构的 H H H,线性方程 $H\triangle x = g 的 求 解 会 有 什 么 不 同 呢 ? 现 实 当 中 存 在 着 若 干 种 利 用 的求解会有什么不同呢?现实当中存在着若干种利用 的求解会有什么不同呢?现实当中存在着若干种利用H$的稀疏性加速计算的方法,最常用的手段如:Schur消元(Schur trick)。在SLAM研究中亦称为Marginalization(边缘化)。
我们转化一下, H H H矩阵可以划分为下面矩阵:
于是,对应的线性方程组也可以由
H
△
x
=
g
H\triangle x = g
H△x=g变为如下形式:
[
B
E
E
T
C
]
[
△
x
c
△
x
p
]
=
[
v
w
]
\biggl [\begin{matrix} B \quad E\\ E^T \quad C \end{matrix}\biggl ] \biggl [\begin{matrix} \triangle x_c\\ \triangle x_p \end{matrix}\biggl ] = \biggl [\begin{matrix} v\\ w \end{matrix}\biggl ]
[BEETC][△xc△xp]=[vw]
其中
B
B
B是对角块矩阵,每个对角块的维度和相机参数的维度相同,对角块的个数是相机变量的个数。由于路标数量会远远大于相机变量个数,所以
C
C
C往往也远大于
B
B
B。三维空间中每个路标点为三维,于是
C
C
C矩阵为对角块矩阵,每个块为3 × 3维矩阵。对角块矩阵逆的难度远小于对一般矩阵的求逆难度,因为我们只需要对那些对角线矩阵块分别求逆即可。考虑到这个特性,我们线性方程组进行高斯消元,目标是消去右上角的非对角部分
E
E
E,得
[
I
−
E
C
−
1
0
I
]
[
B
E
E
T
C
]
[
△
X
c
△
X
p
]
=
[
I
−
E
C
−
1
0
I
]
[
v
w
小
结
本
讲
比
较
深
入
地
探
讨
了
状
态
估
计
问
题
与
图
优
化
的
求
解
。
我
们
看
到
在
经
典
模
型
中
,
S
L
A
M
可
以
看
成
状
态
估
计
问
题
。
如
果
我
们
假
设
马
尔
可
夫
性
,
只
考
虑
当
前
状
态
的
话
,
则
得
到
以
E
K
F
为
代
表
的
滤
波
器
模
型
。
如
若
不
然
,
我
们
也
可
以
选
择
考
虑
所
有
的
运
动
和
观
测
,
它
们
构
成
一
个
最
小
二
乘
问
题
。
在
只
有
观
测
方
]
\biggl [\begin{matrix} I \quad -EC^{-1}\\ 0 \quad I \end{matrix}\biggl ] \biggl [\begin{matrix} B \quad E\\ E^T \quad C \end{matrix}\biggl ] \biggl [\begin{matrix} \triangle X_c\\ \triangle X_p \end{matrix}\biggl ]= \biggl [\begin{matrix} I \quad -EC^{-1}\\ 0 \quad I \end{matrix}\biggl ]\biggl [\begin{matrix} v\\ w 小结 本讲比较深入地探讨了状态估计问题与图优化的求解。我们看到在经典模型中, SLAM 可以看成状态估计问题。如果我们假设马尔可夫性,只考虑当前状态的话,则得到以 EKF 为代表的滤波器模型。 如若不然, 我们也可以选择考虑所有的运动和观测, 它们构成一个 最小二乘问题。 在只有观测方 \end{matrix}\biggl ]
[I−EC−10I][BEETC][△Xc△Xp]=[I−EC−10I][vw小结本讲比较深入地探讨了状态估计问题与图优化的求解。我们看到在经典模型中,SLAM可以看成状态估计问题。如果我们假设马尔可夫性,只考虑当前状态的话,则得到以EKF为代表的滤波器模型。如若不然,我们也可以选择考虑所有的运动和观测,它们构成一个最小二乘问题。在只有观测方]
整理可得:
[
B
−
E
C
−
1
E
T
0
E
T
C
]
[
△
X
c
△
X
p
]
=
[
v
−
E
C
−
1
w
w
]
\biggl [\begin{matrix} B -EC^{-1}E^T \quad 0\\ \quad E^T \quad \quad \quad \quad \quad C \end{matrix}\biggl ] \biggl [\begin{matrix} \triangle X_c\\ \triangle X_p \end{matrix}\biggl ]= \biggl [\begin{matrix} v-EC^{-1}w\\ w \end{matrix}\biggl ]
[B−EC−1ET0ETC][△Xc△Xp]=[v−EC−1ww]
经过消元之后,第一行方程组变成和
△
x
p
\triangle x_p
△xp无关的项。单独把它拿出来,得到关于位姿部分的增量方程:
[
B
−
E
C
−
1
E
T
]
△
X
c
=
v
−
E
C
−
1
w
[B -EC^{-1}E^T]\triangle X_c = v-EC^{-1}w
[B−EC−1ET]△Xc=v−EC−1w
这个线性方程组的维度和 B B B矩阵一样。我们的做法是先求解这个方程,然后把解得的 △ x c \triangle x_c △xc代入到原方程,然后求解 △ x p \triangle x_p △xp。 这个过程称为Marginalization,或者Schur消元(Schur Elimination)。相比于直接解线性方程的做法,它的优势在于:
- 在消元过程中,由于 C C C为对角块,所以 C − 1 C^{-1} C−1容易解得。
- 求解了 △ x c \triangle x_c △xc之后,路标部分的增量方程由 △ x p = C − 1 ( w − E T △ x c ) \triangle x_p = C^{-1}(w-E^T\triangle x_c) △xp=C−1(w−ET△xc)给出。这依然用到了 C − 1 C^{-1} C−1易于求解的特性。
4. 鲁棒核函数
在前面的BA问题中,我们最小化误差项的二范数平方和,作为目标函数。这种做法虽然很直观,但存在一个严重的问题:如果出于误匹配等原因,某个误差项给的数据是错误的,会发生什么呢?我们把一条原本不应该加到图中的边给加进去了,然而优化算法并不能辨别出这是个错误数据,它会把所有的数据都当作误差来处理。这时,算法会看到一条误差很大的边,它的梯度也很大,意味着调整与它相关的变量会使目标函数下降更多。
出现这种问题的原因是,当误差很大时,二范数增长得太快了。于是就有了核函数的存在。核函数保证每条边的误差不会大的没边,掩盖掉其他的边。 具体的方式是,把原先误差的二范数度量,替换成一个增长没有那么快的函数,同时保证自己的光滑性质。因为它们使得整个优化结果更为鲁棒,所以又叫它们为鲁棒核函数(Robust Kernel)。
鲁棒核函数有许多种,例如最常用的Huber核:
H
(
e
)
=
{
1
2
e
2
if
∣
e
∣
≤
δ
,
δ
(
∣
e
∣
−
1
2
δ
)
otherwise
H(e) = \biggl \{ \begin{aligned} &\frac{1}{2} e^2 \quad \quad \quad \quad \quad \text{if} |e| \leq \delta, \\ &\delta (|e|-\frac{1}{2}\delta) \quad \quad \text{otherwise} \end{aligned}
H(e)={21e2if∣e∣≤δ,δ(∣e∣−21δ)otherwise
我们看到,当误差 e e e大于某个阈值 δ \delta δ后,函数增长由二次形式变成了一次形式,相当于限制了梯度的最大值。同时,Huber核函数又是光滑的,可以很方便地求导