Text Features
Text feature 参数化
所有的Text features 都被一个框框起来,text feature平面上所有点到相机camera的关系可以利用一个法向量(
n
=
(
n
1
,
n
2
,
n
3
)
n=(n_1,n_2,n_3)
n=(n1,n2,n3))和距离(
d
d
d)来表示,即:
n
T
p
+
d
=
0
n^Tp+d=0
nTp+d=0
那么我们可以直观地将一个平面feature参数化为
(
n
1
,
n
2
,
n
3
,
d
)
(n_1,n_2,n_3,d)
(n1,n2,n3,d),但是这样的参数化是冗余的,于是有了融合逆深度的更加简洁的参数化形式:
(
θ
)
=
(
θ
1
,
θ
2
,
θ
3
)
T
=
n
/
d
\mathrm(\theta) = (\theta_1,\theta_2,\theta_3)^T=n/d
(θ)=(θ1,θ2,θ3)T=n/d
考虑某个点
p
p
p在相机坐标系下投影的归一化坐标为:
m
=
(
u
,
v
)
T
,
以
及
逆
深
度
ρ
=
1
/
h
,
其
中
h
该
点
的
深
度
值
m=(u,v)^T,以及逆深度\rho=1/h, 其中h该点的深度值
m=(u,v)T,以及逆深度ρ=1/h,其中h该点的深度值
那么
p
p
p的坐标,可以这样计算:
p
=
(
u
h
,
v
h
,
h
)
T
=
h
m
~
,
其
中
m
~
表
示
m
的
单
应
性
坐
标
p= (uh,vh,h)^T=h\tilde{m},其中\tilde{m}表示m的单应性坐标
p=(uh,vh,h)T=hm~,其中m~表示m的单应性坐标
将上述式子代入平面方程:
h
⋅
n
T
m
~
+
d
=
0
h·n^T\tilde{m}+d = 0
h⋅nTm~+d=0
然后3d点的逆深度可以通过以下式子计算:
ρ
=
1
/
h
=
−
n
T
/
d
m
~
=
θ
T
m
~
\rho = 1/h = -n^T/d\tilde{m}=\mathrm{\theta}^T\tilde{m}
ρ=1/h=−nT/dm~=θTm~
到此,我们可以通过给定的text 参数化形式,点乘得到每个像素点对应的逆深度值。然后当我们有至少3个落在Text 上的点(例如角点等)时。
θ
\mathrm{\theta}
θ可以通过以下公式计算
[
m
~
1
T
m
~
2
T
.
.
.
m
~
n
T
]
θ
=
[
ρ
1
ρ
2
.
.
.
ρ
n
]
\left[ \begin{matrix} \tilde{m}_1^T\\ \tilde{m}_2^T\\ ...\\ \tilde{m}_n^T \end{matrix} \right] \mathrm{\theta} = \left[\begin{matrix}\rho_1\\ \rho_2 \\...\\ \rho_n\end{matrix}\right]
⎣⎢⎢⎡m~1Tm~2T...m~nT⎦⎥⎥⎤θ=⎣⎢⎢⎡ρ1ρ2...ρn⎦⎥⎥⎤
这样我们可以利用深度值通过三个角点快速初始化出Text 参数。(所以需要RGBD作为输入?文本的bounding box 需要计算量会是多大?)
3D text 投影到目标坐标系
host frame 表示当前坐标系,target frame 表示目标坐标系
令
T
h
,
T
t
∈
S
E
(
3
)
\mathrm{T}_h,\mathrm{T}_t \in \mathrm{SE}(3)
Th,Tt∈SE(3)分别表示host\target 坐标系到世界坐标系的刚体运动。
那么目标坐标系和当前坐标系之间的刚体运动可以写成
T
=
T
t
−
1
T
h
T = T_t^{-1}T_h
T=Tt−1Th,令R,t分别表示该刚体运动的旋转和平移。
给定Text参数,以及某个像素观测值,对应的点p的空间坐标关系如下:
p
=
m
~
/
ρ
=
m
~
/
(
θ
T
m
~
)
p=\tilde{m}/\rho = \tilde{m}/(\mathrm{\theta}^T\tilde{m})
p=m~/ρ=m~/(θTm~)
令target坐标系下与
p
p
p点对应的坐标为
p
′
p^\prime
p′
p
′
∼
R
m
~
+
t
m
~
T
θ
,
u
p
t
o
s
c
a
l
e
p^\prime \sim R\tilde{m}+t\tilde{m}^T\theta , up\ to\ scale
p′∼Rm~+tm~Tθ,up to scale
那么
p
′
p^\prime
p′对应在target坐标系下的投影可以通过以下形式给出:
m
′
=
(
u
′
,
v
′
)
v
′
=
(
r
1
T
m
~
+
t
1
m
~
T
θ
)
/
(
r
3
T
m
~
+
t
3
m
~
T
θ
)
u
′
=
(
r
2
T
m
~
+
t
2
m
~
T
θ
)
/
(
r
3
T
m
~
+
t
3
m
~
T
θ
)
m^\prime = (u^\prime,v^\prime) \\ v^\prime = (r_1^T\tilde{m}+t_1\tilde{m}^T\theta)/(r_3^T\tilde{m}+t_3\tilde{m}^T\theta) \\ u^\prime = (r_2^T\tilde{m}+t_2\tilde{m}^T\theta)/(r_3^T\tilde{m}+t_3\tilde{m}^T\theta)
m′=(u′,v′)v′=(r1Tm~+t1m~Tθ)/(r3Tm~+t3m~Tθ)u′=(r2Tm~+t2m~Tθ)/(r3Tm~+t3m~Tθ)
上述描述的就是单应矩阵:
H
∼
R
+
t
θ
T
\mathrm{H} \sim \mathrm{R} + t\theta^T
H∼R+tθT
然后投影方程:
m
′
=
h
(
m
,
T
h
,
T
t
,
θ
)
m^\prime = h(m,T_h,T_t,\theta)
m′=h(m,Th,Tt,θ)
Text 重投影误差
文中提到由于光度变化,导致重投影误差变大,因为光度的变化会影响到特征提取,从而影响重投影误差。 因此选择了ZNCC(zero mean normalized cross-correlation)作为匹配误差
**注:**ZNCC是利用两个待匹配像素点邻域窗口内的像素,通过零均值归一化相似性度量公式来计算两个待匹配像素之间的相似程度.
但是由于ZNCC无法直接用于SLAM,因此需要做一些调整
再说调整之前,我们讨论以下理论上Text 所表示的像素的ZNCC公式,如下:
Z
N
C
C
(
I
h
,
I
t
)
=
∑
m
∈
Ω
(
I
h
~
(
m
)
I
t
~
(
m
′
)
)
2
ZNCC(I_h,I_t) = \sum_{m\in\Omega}(\tilde{I_h}(m)\tilde{I_t}(m^\prime))^2
ZNCC(Ih,It)=m∈Ω∑(Ih~(m)It~(m′))2其中强度计算公式
I
~
(
m
)
=
(
I
(
m
)
−
I
ˉ
Ω
)
/
σ
Ω
\tilde{I}(m) = (I(m)-\bar{I}_{\Omega})/\sigma_{\Omega}
I~(m)=(I(m)−IˉΩ)/σΩ
I
ˉ
Ω
\bar{I}_\Omega
IˉΩ表示区域范围内的强度均值,
σ
Ω
\sigma_{\Omega}
σΩ表示对应的标准差
由此可以看到ZNCC并不能写成类似于误差函数一样的形式,也就是无法构建最小二成问题,于是本文中修改成
E
(
I
h
,
I
t
)
=
∑
m
∈
Ω
(
I
h
~
(
m
)
−
I
t
~
(
m
′
)
)
2
E(I_h,I_t) = \sum_{m\in\Omega}(\tilde{I_h}(m)-\tilde{I_t}(m^\prime))^2
E(Ih,It)=m∈Ω∑(Ih~(m)−It~(m′))2
展开之后:
E
(
I
h
,
I
t
)
=
∑
m
∈
Ω
(
I
h
~
(
m
)
2
+
I
t
~
(
m
′
)
2
)
−
2
∑
m
∈
Ω
I
h
~
(
m
)
I
t
~
(
m
′
)
E(I_h,I_t) = \sum_{m\in\Omega}(\tilde{I_h}(m)^2+\tilde{I_t}(m^\prime)^2)-2\sum_{m\in\Omega}\tilde{I_h}(m)\tilde{I_t}(m^\prime)
E(Ih,It)=m∈Ω∑(Ih~(m)2+It~(m′)2)−2m∈Ω∑Ih~(m)It~(m′)
那么问题等价于最大化ZNCC误差,考虑text 为
π
\pi
π目标坐标系为k的情况,重投影误差函数最终如下:
E
p
h
o
t
o
π
,
t
=
∑
m
∈
Ω
ϕ
(
(
I
~
h
(
m
)
−
I
~
t
(
h
(
m
,
T
h
,
T
t
,
θ
π
)
)
)
2
)
E^{\pi,t}_{photo} = \sum_{m\in\Omega} \phi((\tilde{I}_h(m)-\tilde{I}_t(h(m,T_h,T_t,\theta^\pi)))^2)
Ephotoπ,t=m∈Ω∑ϕ((I~h(m)−I~t(h(m,Th,Tt,θπ)))2)
ϕ
(
⋅
)
\phi(·)
ϕ(⋅)是huber 核函数,用于降低外点的影响
Text SLAM
该SLAM算法用 EAST 文本检测器
论文:East: an efficient and accurate scene text detector
-
初始化
1.1 East,文本框检测
1.2 在上述步骤 得到的文本框内检测Fast 角点
1.3 下一帧被采样时,KLT跟踪
1.4 利用跟踪特征点,计算上述Text参数 θ \theta θ
1.5 利用Text框的四个角所在的像素坐标,结合单应矩阵预测在下一个关键帧上的投影
1.6后续步骤会保留上述初始化出的Text对象,在至少有5帧观测的情况下才会考虑加入到地图当中 -
利用Text对象进行位姿计算
通过最小化重投影误差 E ( x ) = E p o i n t + λ w E t e x t ( x ) E(x)=E_{point}+\lambda_wE_{text}(x) E(x)=Epoint+λwEtext(x),其中两部分分别是点的重投影误差,以及text 区域的强度误差。因此,需要加入一个权重因子去均衡两部分误差的权重,该权重的计算方式为 λ m = σ r e p / σ p h o t o \lambda_m = \sigma_{rep}/\sigma_{photo} λm=σrep/σphoto,两个 σ \sigma σ分别表示点重投影误差的标准差和强度计算的标准差。 -
结合text obj的BA
局部BA,状态向量主要包含一个局部窗口的状态。BA的时候会选取一小部分Text 以及对应角点进行BA,Text内角点最多只选择15个点。文中提到 E t e x t E_{text} Etext部分是高度非线性化的,因此需要一个比较准确的 T t T_t Tt来避免陷入局部最小。因此利用速度模型来预测相机pose,有了这个基础,我们可以通过迭代上述代价函数来更好的估计相机pose。
最后,TextSLAM和一般SLAM的主要区别在于,误差函数分成点和Text两部分