SLAM在线光度标定总结

Introduction1

直接法依赖于光度恒定假设,但是多帧之间的曝光时间和辐照衰减都会破坏假设。

光度模型

物体通过反射光线从而被看见,一点反射的光量叫辐射(radiance)LL。如果辐射和观测的角度独立,则是朗伯反射(漫反射)。

传感器在xx位置接收的能量值叫辐照(Irradiance)I(x)I(x).

不同的空间点的辐射与辐照应是一一对映的。但是相机都会存在渐晕,它符合cos的四阶关系,因此用V:Ω[0,1]V:\Omega\to[0,1]建模:
I(x)=V(x)L(1) I(x)=V(x) L \tag{1}
传感器在曝光时间ee内对辐照进行积分,假设期间辐照恒定,因此建模为:
Iacc(x)=eI(x)(2) I_{a c c}(x)=e I(x) \tag{2}
经过相机
响应函数(CRF)
f:R[0,255]f:\R\to[0,255]后输出图像强度,CRF限制了动态范围,过曝会设为255,欠曝会设置为0.我们无法得到决对尺度,因此把CRF归一化到单位区间[0,1][0,1]

因此辐射LL映射为图像强度OO
O=f(eV(x)L)(3) O=f(e V(x) L) \tag{3}

跟踪前端

使用金字塔KLT跟踪,在此基础上增加帧间的增益比,使用舒尔补来高效的实现。

为了恢复渐晕需要将特征点覆盖整个图像,因此使用网格来使特征均匀分布,使用长特征跟踪来更好的覆盖径向。

为了改善长期跟踪,使用双向光流剔除误匹配。同时还在特征附近使用小patch来一起加入优化,引入低梯度图像区域,降低对于几何误差的敏感。

优化后端

能量函数:
E=pPiFpwipOipf(eiV(xip)Lp)r(f,V,ei,Lp)h(4) E=\sum_{p \in P} \sum_{i \in F_{p}} w_{i}^{p}\left\|\underbrace{O_{i}^{p}-f\left(e_{i} V\left(x_{i}^{p}\right) L^{p}\right)}_{r\left(f, V, e_{i}, L^{p}\right)}\right\|_{h} \tag{4}
假设点都是在朗伯平面上。

CRF建模:
fG(x)=f0(x)+k=1nckhk(x)(5) f_{G}(x)=f_{0}(x)+\sum_{k=1}^{n} c_{k} h_{k}(x) \tag{5}
选择n=4n=4,它满足fG(0)=0,fG(1)=255f_G(0)=0,f_G(1)= 255

假设衰减因子是中心对称:
V(x)=1+v1R(x)2+v2R(x)4+v3R(x)6(6) V(x)=1+v_{1} R(x)^{2}+v_{2} R(x)^{4}+v_{3} R(x)^{6} \tag{6}
使用LM算法,将辐射的估计与其它参数解耦。

第一步

固定LpL^p,求雅克比
J=(rc,rv,rei)(7) J=\left(\frac{\partial r}{\partial \boldsymbol{c}}, \frac{\partial r}{\partial \boldsymbol{v}}, \frac{\partial r}{\partial e_{i}}\right) \tag{7}
通过求解公式(8)获得:
(JTWJ+λdiag(JTWJ))Δx=JTWr(8) \left(\boldsymbol{J}^{T} \boldsymbol{W} \boldsymbol{J}+\lambda \operatorname{diag}\left(\boldsymbol{J}^{T} \boldsymbol{W} \boldsymbol{J}\right)\right) \Delta \boldsymbol{x}=-\boldsymbol{J}^{T} \boldsymbol{W} \boldsymbol{r} \tag{8}
权重矩阵由两部分的权重因子组成,第一是Huber函数,第二是降低高梯度图像位置的权重,防止小的不准确导致大的错误,即:
wr(2)=μμ+Fi(xip)22(9) w_{r}^{(2)}=\frac{\mu}{\mu+\left\|\nabla F_{i}\left(x_{i}^{p}\right)\right\|_{2}^{2}} \tag{9}
公式(9)会降低图像块中心的权重,增加附近残差的权重。

第二步

固定其他的参数,每个点都是独立更新:
Jp=(rLp)(10) \boldsymbol{J}^{p}=\left(\frac{\partial r}{\partial L^{p}}\right) \tag{10}

ΔL=JpTWprp(1+λ)JpTWpJp(11) \Delta L=\frac{-\boldsymbol{J}_{p}^{T} \boldsymbol{W}_{p} \boldsymbol{r}_{p}}{(1+\lambda) \boldsymbol{J}_{p}^{T} \boldsymbol{W}_{p} \boldsymbol{J}_{p}} \tag{11}

该算法可以在离线和在线两种模式下工作:

  • 离线

所有参数一起优化,大的序列会分块。剔除外点后再进行优化一次。

  • 在线

新来一帧先根据当前值,去除渐晕和响应函数的影响:
E=i=1MpPiwip(f1(Oip)V(xip)eiLpr(ei,Lp))2(12) E=\sum_{i=1}^{M} \sum_{p \in P_{i}} w_{i}^{p}\left(\underbrace{\frac{f^{-1}\left(O_{i}^{p}\right)}{V\left(x_{i}^{p}\right)}-e_{i} L^{p}}_{r\left(e_{i}, L^{p}\right)}\right)^{2} \tag{12}

然后优化曝光时间,初始化辐射强度为跟踪点的平均强度。

在后台对渐晕和响应函数进行优化。

SLAM在线光度标定总结


Introduction2

光圈焦距的变化会影响标定的参数,长时间使用也会变化。和上面的不同,这里没有假设渐晕是中心对称的。

SLAM在线光度标定总结

本文2的亮点

  • ORB特征附近取patch
  • CRF使用薄板样条插值(TPS, Thin Plate Splines)和Gamma曲线建模
  • 六阶多项式和TPS建模渐晕
  • 通过插值(TPS)稀疏变成稠密估计
  • 联合优化辐照度,渐晕和CRF
  • CPU实时
  • 自然环境和部分动态环境下运行

Method

假设(Assumptions)

  • 朗伯反射
  • 场景光照不随时间变化
  • 衰减矫正系数为[0,1]之间
  • 相邻的像素具有相似的衰减

衰减因子估计(Attenuation Factor Estimate)

二维薄板多项式样条为:
h(u)=p(u)+i=1Nciϕ(udi)(13) h(\mathbf{u})=p(\mathbf{u})+\sum_{i=1}^{N} c_{i} \cdot \phi\left(\left\|\mathbf{u}-\mathbf{d}_{i}\right\|\right) \tag{13}
径向基函数(RBF)
ϕ(r)=r2ln(r)(14) \phi(r)=r^{2} \cdot \ln (r) \tag{14}
多项式为:
p(u)=v(1u)(15) p(\mathbf{u})=\mathbf{v}^{\top} \cdot \left( \begin{array}{l}{1} \\ {\mathbf{u}}\end{array}\right) \tag{15}
其中u\bf u是数据点,di{\bf d}_i是控制点,已知坐标位置u\bf u和矫正因子sus_{\rm u}.

在插值的情况下是计算:
si=h(ui),1iM(16) s_{i}=h\left(\mathbf{u}_{i}\right), 1 \leq i \leq M \tag{16}
插值需要N=MN=M,这是TPS要求的,一个当控制点其他的带入进行拟合,这会无法实现高效在线求解。因此代替方法是,使用包含固定数目N=PH×PVN=P^H\times P^V控制点的网格。
argminc,viMh(ui)si2(17) \underset{\mathbf{c}, \mathbf{v}}{\operatorname{argmin}} \sum_{i}^{M}\left\|h\left(\mathbf{u}_{i}\right)-s_{i}\right\|^{2} \tag{17}
每个控制点,RBF固定,选择PH,PV{3,4,5,6,7}P^H,P^V \in \{3,4,5,6,7 \},并且需要满足:
iNci=0,iNcidi,x=0,iNcidi,y=0(18) \sum_{i}^{N} c_{i}=0, \sum_{i}^{N} c_{i} \cdot d_{i, x}=0, \sum_{i}^{N} c_{i} \cdot d_{i, y}=0 \tag{18}
在渐晕矫正中,使用的是下面的公式:
p(r)=1+i=13vir2i(19) p(r)=1+\sum_{i=1}^{3} v_{i} \cdot r^{2 i} \tag{19}

h(u)=p(2udm)+i=1Nciϕ(udi)(20) h(\mathbf{u})=p\left(\sqrt{2}\left\|\mathbf{u}-\mathbf{d}_{m}\right\|\right)+\sum_{i=1}^{N} c_{i} \cdot \phi\left(\left\|\mathbf{u}-\mathbf{d}_{i}\right\|\right) \tag{20}

这里没太看懂,是怎样计算的插值,应该是TPS插值不懂

目前的理解是使用已知点,利用公式(17)(19)(20)来计算它的参数。

NOTE:为了减小计算量,原本应该每个已知点轮流作为控制点,这里控制点选择是均匀分布在图像的网格中。

SLAM在线光度标定总结

相机CRF

使用一维的薄板样条,控制点均匀分布在0和1之间,取5~20个点,是GCCM(Generalized Gamma Curve Model),要增加约束强迫f(0)=0,f(1)=1f(0)=0,f(1)=1
pf(x)=i=0nvixi(21) p_{f}(x)=\sum_{i=0}^{n} v_{i} \cdot x^{i} \tag{21}

fGGCM(L)=Lpf(L)(22) f_{G G C M}(L)=L^{p_{f}(L)} \tag{22}

gGGCM(I)=I1/pf(I)(23) g_{G G C M}(I)=I^{1 / p_{f}(I)} \tag{23}

使用公式(21)代替公式(15)是GGCM+TPSGGCM+TPS,使用公式(22)代替公式(15)是GGCMTPSGGCM^{TPS}

值得注意的是,公式(22)和公式(23)并不是真正意义上的逆,是分别对两个函数进行估计。

图像矫正

使用公式(17)求解,使用公式(20)插值估计。矫正图像公式为:
Ic,u=f1(Iu)/[V(u)k](24) I_{c, \mathbf{u}}=f^{-1}\left(I_{\mathbf{u}}\right) /[V(\mathbf{u}) \cdot k] \tag{24}

关键帧光度标定

和上一篇相似,不同的是联合优化了所有的参数,公式如下:
argminc,v,k,Lpi,j,o=1N,M,Oρh(wj[Iujf(kiV(uj)Lpo)]2)(25) \underset{\mathbf{c}, \mathbf{v}, \mathbf{k}, \mathbf{L}_{\mathbf{p}}}{\operatorname{argmin}} \sum_{i, j, o=1}^{N, M, O} \rho_{h}\left(\left\|w_{j}\left[I_{\mathbf{u}_{j}}-f\left(k_{i} V\left(\mathbf{u}_{j}\right) L_{\mathbf{p}_{o}}\right)\right]\right\|^{2}\right) \tag{25}
其中NN是关键帧数目,MM是观测数,OO是地图点数目

Huber函数的α=0.2/255\alpha = 0.2/255,同样使用公式(9)来降低高梯度权重。使用5×55\times 5的patch,255和0的像素直接丢弃。

单帧的曝光时间估计使用已经估计地图点的辐照(radiance)值:
argminki=1Nρh(wi[f1(Iui)V(ui)kLpi]2)(26) \underset{k}{\operatorname{argmin}} \sum_{i=1}^{N} \rho_{h}\left(\left\|w_{i} \cdot\left[\frac{f^{-1}\left(I_{\mathbf{u}_{i}}\right)}{V\left(\mathbf{u}_{i}\right)}-k \cdot L_{\mathbf{p}_{i}}\right]\right\|^{2}\right)\tag{26}
SLAM在线光度标定总结

整体过程:

  • 每一帧会根据当前跟踪的点,和当前的光度参数,来计算曝光时间;
  • 关键帧创建时,会refine跟踪地图点和新创建地图点的辐照度(radiance)估计,以及帧的曝光时间。
  • 一定数目关键帧后,会进行global对所有的光度参数进行优化。
  • 稀疏分布的特征使用样条插值来计算,用于后面的跟踪。

光照变化的应对

本文3主要针对外部光照变化导致的鲁棒性,与上面两篇不同。

代价函数

W(x,d,M)=πI1(MπI21(x,d))(27) W(\mathbf{x}, d, \mathbf{M})=\pi_{I_{1}}\left(\mathbf{M} \cdot \pi_{I_{2}}^{-1}(\mathbf{x}, d)\right) \tag{27}

C(M)=1ΩDxΩDρ(I(xM)T(x))(28) C(\mathbf{M})=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} \rho\left(I\left(\mathbf{x}_{\mathbf{M}}\right)-T(\mathbf{x})\right) \tag{28}

这里xM:=W(x,D(x),M)\mathbf{x}_{\mathbf{M}} :=W(\mathbf{x}, D(\mathbf{x}), \mathbf{M})

使用了鲁棒核函数来过滤外点:
ρk(r)={r22, if rkk(rk2), otherwise (29) \rho_{k}(r)=\left\{\begin{array}{ll}{\frac{r^{2}}{2},} & {\text { if }|r| \leq k} \\ {k\left(|r|-\frac{k}{2}\right),} & {\text { otherwise }}\end{array}\right. \tag{29}
使用逆向组合来计算
C(ΔM)=1ΩDxΩDρ(I(xM)T(xΔM))(30) C(\Delta \mathrm{M})=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathrm{x} \in \Omega_{D}} \rho\left(I\left(\mathrm{x}_{\mathrm{M}}\right)-T\left(\mathrm{x}_{\Delta \mathrm{M}}\right)\right) \tag{30}
SLAM在线光度标定总结

描述子

实际就是特征附近取的Patch

第一种如上图中间所示,没有考虑warp
C(ΔM)=1ΩDxΩDρ(DI(xM)DT(xΔM)2)(31) C(\Delta \mathbf{M})=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} \rho\left(\left\|\mathbf{D}_{I}\left(\mathbf{x}_{\mathbf{M}}\right)-\mathbf{D}_{T}\left(\mathbf{x}_{\Delta \mathbf{M}}\right)\right\|_{2}\right) \tag{31}
这种通常是对应不上的。

第二种上图最右侧的
C(ΔM)=1ΩDxΩDρ(d(I,N(x)M)d(T,N(x)ΔM)2)(32) C(\Delta \mathbf{M})=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} \rho\left( \left\| \mathbf{d}\left(I, N(\mathbf{x})_{\mathbf{M}}\right)- \mathbf{d}\left(T, N(\mathbf{x})_{\Delta \mathbf{M}}\right)\right\|_{2}\right) \tag{32}
这种计算方法会比较慢,可以使用描述子图像梯度来近似,可以参考4
ϵd(T,N(x)ΔM)DTϵxΔM(33) \frac{\partial}{\partial \epsilon} \mathbf{d}\left(T, N(\mathbf{x})_{\Delta \mathbf{M}}\right) \approx \nabla \mathbf{D}_{T} \frac{\partial}{\partial \epsilon} \mathbf{x}_{\Delta \mathbf{M}} \tag{33}

光照变化鲁棒方程

上面介绍的是基于光度不变假设的(BCA)

全局模型

A. Global median bias normalization (GMedian)

提前计算一个全局光度偏移
β=medianx(I(xM)T(xΔM))(34) \beta=\operatorname{median}_{\mathbf{x}}\left(I\left(\mathbf{x}_{\mathbf{M}}\right)-T\left(\mathbf{x}_{\Delta \mathbf{M}}\right)\right) \tag{34}
带入到公式(30)中得到:
C(ΔM)=1ΩDxΩDρ(I(xM)T(xΔM)β)(35) C(\Delta \mathbf{M})=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} \rho\left(I\left(\mathbf{x}_{\mathbf{M}}\right)-T\left(\mathbf{x}_{\Delta \mathbf{M}}\right)-\beta\right) \tag{35}
B. Global affine model (GAffine)

使用光度仿射变换模型
C(ΔM,δα,δβ)=1ΩDxΩDρ((1+α)I(xM)+β(1+δα)T(xΔM)δβ)(36) C(\Delta \mathbf{M}, \delta \alpha, \delta \beta)=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} \rho\left((1+\alpha) I\left(\mathbf{x}_{\mathbf{M}}\right)+\beta- (1+\delta \alpha) T\left(\mathbf{x}_{\Delta \mathbf{M}}\right)-\delta \beta \right) \tag{36}
仿射参数和位姿一起更新:
α:=αδα1+δαβ:=βδβ1+δα(37) \alpha :=\frac{\alpha-\delta \alpha}{1+\delta \alpha} \quad \beta :=\frac{\beta-\delta \beta}{1+\delta \alpha} \tag{37}
C. Zero-mean normalized cross correlation (ZNCC)
ZNCC(ΔM)=xΩDixtxxΩDix2xΩDtx2(38) \mathrm{ZNCC}(\Delta \mathbf{M})=\frac{\sum_{\mathbf{x} \in \Omega_{D}} i_{\mathbf{x}} t_{\mathbf{x}}}{\sqrt{\sum_{\mathbf{x} \in \Omega_{D}} i_{\mathbf{x}}^{2}} \sqrt{\sum_{\mathbf{x} \in \Omega_{D}} t_{\mathbf{x}}^{2}}} \tag{38}
其中ix=(I(xM)I)i_{\mathbf{x}}=\left(I\left(\mathbf{x}_{\mathbf{M}}\right)-\overline{I}\right)tx=(T(xΔM)T)t_{\mathbf{x}}=\left(T\left(\mathbf{x}_{\Delta M}\right)-\overline{T}\right)I=1ΩDxΩDI(x)\overline{I}=\frac{1}{\left|\Omega_{D}\right|} \sum_{\mathbf{x} \in \Omega_{D}} I(\mathbf{x}),最大化公式(39)即可。

D. Mutual information (MI)

互信息
MI(ΔM)=r,tΩIpIT(r,t,ΔM)log(pIT(r,t,ΔM)pI(r)pT(t,ΔM))(39) \operatorname{MI}(\Delta \mathbf{M})=\sum_{r, t \in \Omega_{I}} p_{I T}(r, t, \Delta \mathbf{M}) \log \left(\frac{p_{I T}(r, t, \Delta \mathbf{M})}{p_{I}(r) p_{T}(t, \Delta \mathbf{M})}\right) \tag{39}
计算直方图,然后计算每个像素值的概率,最大化公式(39)

有需要,具体优化过程看论文中的参考文献。

局部偏差

E. Gradient magnitude (GradM)

使用梯度大小来作为描述子。

使用公式(40)代替公式(32)中的值
d(I,N(x))=(I,N(x))2(40) \mathbf{d}(I, N(\mathbf{x}))=\|\nabla(I, N(\mathbf{x}))\|_{2} \tag{40}
F. Gradient (Grad)

直接使用梯度向量来进行匹配
d(I,N(x))=(I,N(x))(41) \mathbf{d}(I, N(\mathbf{x}))=\nabla(I, N(\mathbf{x})) \tag{41}
G. Local mean bias normalization (LMean)

减去局部均值
d(I,N(x))=I(x)1N(x)yN(x)I(y)(42) d(I, N(\mathbf{x}))=I(\mathbf{x})-\frac{1}{|N(\mathbf{x})|} \sum_{\mathbf{y} \in N(\mathbf{x})} I(\mathbf{y}) \tag{42}

类似特征描述子

H. Descriptor fields (DF)

计算描述子
d(I,N(x))=[[(f1I)(x)]+,[(f1I)(x)],[(fnI)(x)]+,[(fnI)(x)]T(43) \begin{aligned} \mathbf{d}(I, N(\mathbf{x}))=&\left[\left[\left(\mathbf{f}_{1} * I\right)(\mathbf{x})\right]^{+},\left[\left(\mathbf{f}_{1} * I\right)(\mathbf{x})\right]^{-}, \ldots\right.\left[\left(\mathbf{f}_{n} * I\right)(\mathbf{x})\right]^{+},\left[\left(\mathbf{f}_{n} * I\right)(\mathbf{x})\right]^{T} \end{aligned} \tag{43}
其中fi{\mathbf f}_i表示卷积核,使用标准差为1的高斯核,符号[]+[][\cdot]^+[\cdot]^-意义如下
[x]+={x, if x00, otherwise , and [x]=[x]+(44) [x]^{+}=\left\{\begin{array}{ll}{x,} & {\text { if } x \geq 0} \\ {0,} & {\text { otherwise }}\end{array}\right. \quad, \text { and } \quad[x]^{-}=[-x]^{+} \tag{44}
I. Census transform (Census)

在双目深度估计中常用,顺序不变的仿射变化都不变。但是精度较低。方法是和周围的像素比较,每次比较就占一位,例如定义如下,大小定义可变
d(I,N(x))i={1, if I(x)<I(xi)0, otherwise (45) \mathbf{d}(I, N(\mathbf{x}))_{i}=\left\{\begin{array}{ll}{1,} & {\text { if } I(\mathbf{x})<I\left(\mathbf{x}_{i}\right)} \\ {0,} & {\text { otherwise }}\end{array}\right. \tag{45}
但是这种方法无法使用基于梯度的优化方法,具体解决办法看论文。

下面是几种方法的对比:

SLAM在线光度标定总结

实验结果

实验结果表明,VO数据集中 GradM 方法更好,实际数据集中 Census 效果更好。闭环中SIFT特征效果更好,建议先使用feature进行匹配,然后使用直接法来求精位姿。

Reference

TPS: https://blog.****.net/VictoriaW/article/details/70161180


  1. Bergmann P, Wang R, Cremers D. Online photometric calibration of auto exposure video for realtime visual odometry and SLAM[J]. IEEE Robotics and Automation Letters, 2018, 3(2): 627-634. ↩︎

  2. Quenzel, Jan et al. “Keyframe-Based Photometric Online Calibration and Color Correction.” 2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) (2018): 1-8. ↩︎ ↩︎

  3. Park S , Thomas Schöps, Pollefeys M . Illumination change robustness in direct visual SLAM[C]// 2017 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2017. ↩︎

  4. E. Antonakos, J. Alabort-i Medina, G. Tzimiropoulos, and S. P.Zafeiriou, “Feature-based Lucas-Kanade and active appearance models,” ITIP, vol. 24, no. 9, pp. 2617–2632, 2015. ↩︎