论文阅读——《Online Photometric Calibration of Auto Exposure Video for Realtime Visual Odometry and SLAM》

孤街浪徒 提交于 2020-02-29 01:52:55

论文阅读——《Online Photometric Calibration of Auto Exposure Video for Realtime Visual Odometry and SLAM》

《Online Photometric Calibration of Auto Exposure Video for Realtime Visual Odometry and SLAM》

前几天读了很多篇和自动曝光控制相关的paper,那些paper讲主要是如何定义曝光程度的评价标准以及如何根据评价标准实现自动曝光控制;
图像传感器与信号处理——自动曝光算法
论文阅读——《Exposure Control using Bayesian Optimization based on Entropy Weighted Image Gradient》
对于SLAM来讲,尤其是直接法,通常需要满足光度不变性这个条件。而自动曝光虽然能够使得输入图像信息最大化,但是却破坏了光度不变形这个条件,因此,对于SLAM系统来说,对自动曝光的信息流进行光度标定是非常必要,本文就是关于这个问题的一篇paper,发表于2018年的ICRA,如下所示,上图是未经过光度标定的图像序列,下图是经过光度标定并进行恢复后的图像序列。
在这里插入图片描述

1. 成像过程建模

对于一个场景点,反射的光量称为辐射度LL。本文假定所有场景点都满足朗伯反射特性,即移动的传感器接收到的辐射与传感器的视角无关。传感器上位置xx接收到该场景点的辐射总量为辐照度I(x)I(x)。在相机中,由于镜头对光线造成遮挡等原因,传感器对辐射的接收程度从中心到边缘呈现由强到弱的趋势,这种现象成为渐晕效应,用公式表示如下:I(x)=V(x)L I(x)=V(x) L 其中V:Ω[0,1]V: \Omega \rightarrow[0,1]渐晕效应因子,其大小取决于传感器上的空间位置。经过曝光时间ee后,我们就可以获得累计辐照值:Iacc(x)=eI(x) I_{a c c}(x)=e I(x) 最后累计辐照值通过相机响应函数f:R[0,255]f: \mathbb{R} \rightarrow[0,255]就可以将累计辐照值转化为图片光照强度OOO=f(eV(x)L) O=f(e V(x) L) 以上就是整个成像过程的建模,那么我们对光度进行标定,主要标定的对象就是:

(1)渐晕效应因子V(x)V(x)
本文中,渐晕效应因子建模为六阶多项式函数:V(x)=1+v1R(x)2+v2R(x)4+v3R(x)6 V(x)=1+v_{1} R(x)^{2}+v_{2} R(x)^{4}+v_{3} R(x)^{6} 其中,R(x)R(x)为图像点xx相对图像中心的归一化距离,v1v_1,v2v_2v3v_3为我们需要标定的函数。

(2)曝光时间ee
曝光时间就直接建模为一个标量。

(3)相机响应函数f(x)f(x)
本文中,相机响应函数f(x)f(x)由平均响应函数f0(x)f_0(x)和基函数hk(x)h_k(x)组成:fG(x)=f0(x)+k=1nckhk(x) f_{G}(x)=f_{0}(x)+\sum_{k=1}^{n} c_{k} h_{k}(x) 其中,ckc_k为我们需要标定的参数,本文中kk取4。

下面就就介绍这三个对象的标定过程。

2. 光度标定原理

这篇文章光度标定的原理其实非常直接,就是通过KLT光流法对图像中进行关键点追踪,然后利用追踪到的关键点构建光度误差的代价函数,然后对代价函数进行非线性优化就可以获得各个标定对象的标定结果。其实如果了解SLAM的同学对上面这个原理应该是非常清楚的,因为Bundle Adjustment或者直接法也都是这么做的,不同的是优化的变量不同。对KLT光流法最后做塔伦,下面直接讨论代价函数及优化过程进行分析:E=pPiFpwipOipf(eiV(xip)Lp)r(f,V,ei,Lp)h E=\sum_{p \in P} \sum_{i \in F_{p}} w_{i}^{p}\|\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)}\|_{h} 其中PP为被多帧追踪到的场景点集,pp是场景点被图像帧集FpF_p观察到的图像点,OipO_{i}^{p}是第ii帧上图像点pp的光度。wipw_{i}^{p}为每个光度误差rr定义了权重,代价函数使用Hube范数h\|\cdot\|_{h}作为鲁棒估计。

根据代价函数的定义和各个优化对象的建模,本文采用LM法进行非线性优化:(JTWJ+λdiag(JTWJ))Δx=JTWr \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} 其中J=(rc,rv,rei) \boldsymbol{J}=\left(\frac{\partial r}{\partial \boldsymbol{c}}, \frac{\partial r}{\partial \boldsymbol{v}}, \frac{\partial r}{\partial e_{i}}\right) 其中c=(c1,c2,c3,c4)\boldsymbol{c}=\left(c_{1}, c_{2}, c_{3}, c_{4}\right)v=(v1,v2,v3)\boldsymbol{v}=\left(v_{1}, v_{2}, v_{3}\right)e\boldsymbol{e}为所有曝光时间组成的向量。权重矩阵W\boldsymbol{W}由两部分组成,第一部分就是由Hube范数引入的权重wr(1)w_{r}^{(1)},第二部分是为了降低高幅值梯度像素误匹配影响的权重wr(2)w_{r}^{(2)},其定义如下:wr=μμ+Fi(xip)22 w_{r}=\frac{\mu}{\mu+\left\|\nabla F_{i}\left(x_{i}^{p}\right)\right\|_{2}^{2}} 其中μR+\mu \in \mathbb{R}^{+}Fi(xip)22\left\|\nabla F_{i}\left(x_{i}^{p}\right)\right\|_{2}^{2}图像点xipx_{i}^{p}处的梯度的L2L2范数。最后的误差权重就是由这两个权重相乘。

以上就完成了对相机的光度的标定,这个标定过程是假设场景点的辐射度不变,在完成标定后我们接着需要对场景点的辐射度进行更新,这就好比SLAM中需要对相机位姿进行调整的同时也需要对空间点进行调整,代价函数对辐射度的雅克比矩阵定义为:Jp=(rLp) \boldsymbol{J}^{p}=\left(\frac{\partial r}{\partial L^{p}}\right) 同样采用LMLM法进行更新,那么更新量为:ΔL=JpTWprp(1+λ)JpTWpJp \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}} 那整个光度标定的流程就是不断进行上述优化过程的迭代。

文中还提到,在实际应用的过程中,算法分为离线模式在线模式
离线模式中,对于大的图像序列比较工程的一个解决方案是可以图像序列划分为多个子序列,分别对子序列进行标定后再进行融合。
在线模式中,由于渐晕效应因子和相机响应函数需要多帧图像才能进行鲁棒标定,而曝光时间可以逐帧标定,因此,在在线模式标定过程中,我们将曝光时间这个变量进行解耦:E=i=1MpPiwip(f1(Oip)V(xip)eiLpr(ei,Lp))2 E=\sum_{i=1}^{M} \sum_{p \in P_{i}} w_{i}^{p}(\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)})^{2} 其中f1f^{-1}VV分别是当前帧相机转换函数的逆函数和渐晕效应因子(已知的),而且上式退化成一个线性方程,可以非常快速的求解。

3. KLT光流法

其实这里我有疑问,光流法的基础也是光度不变形,在没有进行光度标定的时候利用光流法进行追踪,再利用追踪到的关键点进行光度标定,有点类似于先有鸡还是先有蛋的问题。不过实验表明这样做效果是好的。

上述光度标定效果如何很大程度上取决关键点是否追踪成功,因此本文提出的KLT光流法其实就是在基础的KLT上进行了多方面鲁棒性的提升
(1)联合优化跟踪更新和帧间增益比
这种方法可以使用Schur补码有效地完成优化,参考《Joint Radiometric Calibration and Feature Tracking for an Adaptive Stereo System,2010》,效果如下图所示:在这里插入图片描述
上面两张图是在原始的KLT算法下跟踪的效果,下面两张图是添加联合优化后的跟踪效果。

(2)均匀采样关键点
为了能够有效恢复渐晕效应因子,需要实现关键点的均匀分布,采用的方式是将图片划分为网格,每个网格中采样固定数量的关键点。

(3)错误跟踪滤波器
通过前后向跟踪误差对跟踪的关键点进行滤波,具体实现参考《Forward-Backward Error: Automatic Detection of Tracking Failures,2010》,效果如下图所示:在这里插入图片描述
左图是没有进行滤波的,右图是进行过滤波的

(4)提取图像块
在跟踪的关键点周围提取图像块,这样做的好处一方面是可以提供足够多的场景点但不需要增加图像特征,另一方面是获得较小的跟踪误差。

4. 实验结果

下图(a)(b)(c)分别是相机响应函数,渐晕效应因子以及曝光时间的标定和真值对比,这效果也太好了吧…图(d)是优化过程中代价函数的变化趋势。
在这里插入图片描述
下图是分别是没标定和标定后再同一个数据集上运行的效果,牛逼…
在这里插入图片描述最直观的还是看实验视频就好了,那么这篇文章总结就到这儿了,方法很明了,效果很牛逼,或许这就是大佬吧,有问题欢迎交流~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!