深度滤波器详细解读git
极品巧克力github
空间定位是VR\AR中的一项关键技术,计算机建立出来的虚拟图像必需要依赖空间定位技术才能与现实(Reality)联结在一块儿,因此它直接决定了用户体验的好坏。高精度的空间定位可让VR用户体验到彻底的沉浸感,AR中的虚拟物体更加逼真;而若是空间定位的精度比较差的话,则VR用户会头晕想吐,AR中的虚拟物体会漂移。 算法
空间定位技术又能够分为两类,outside-in和inside-out。outside-in方案,须要在环境中架设定位基站,对用户进行定位跟踪,好比如今市面上的HTC Vive和Oculus Rift。 数组
而inside-out方案,不须要在环境中架设基站,它只经过自身携带的传感器来进行定位,好比微软的HoloLens、WindowsMR头盔系列、HTC Vive Focus、苹果的ARKit、谷歌的ARCore和Project Tango,还有预计将在2018年发售的Oculus Santa Cruz、Magic Leap One。(固然,还有室内机器人、无人机、无人车)。 dom
outside-in方案要架设定位基站,而且对用户的活动范围有限制,至关于"PC互联网时代",只适合PCVR。 koa
而insiede-out方案更加轻便天然,就像人用眼睛观察,就能知道本身在环境中的位置同样。用户只须要戴着头盔,就能随意走动,没有运动范围限制,至关于"移动互联网时代"。从目前的发展趋势来看,inside-out方案正在逐渐走向成熟,被应用在愈来愈多的VR一体机和AR眼镜上。ide
而我接下来要探讨的是,如何让创建的地图点更加准确。由于不管哪一种算法,准确跟踪定位的前提都是,要有准确的地图点。可是,因为传感器噪声和环境噪声的存在,老是会不可避免地建立出一些偏差大的甚至假的地图点,这些错误的地图点会对跟踪定位的准确性形成很大的影响。 函数
因此,我接下来就介绍一种可让地图点更加准确的方法——深度滤波,它能够经过屡次观测,计算出一个地图点是假的地图点仍是真实地图点的几率,而且计算出其做为真实地图点的最有可能的位置。它最初是用在三维重建中的(http://george-vogiatzis.org/),后来被用在SVO(Semi-Direct Monocular Visual Odometry,https://github.com/uzh-rpg/rpg_svo)中,都取得了很好的效果。优化
本文主要是参考《Video-based, Real-Time Multi View Stereo》,按照我本身的理解,从最基础的贝叶斯公式开始推导,一步步推导出最后的迭代公式,用最通俗易懂的方式,把深度滤波方法的前因后果讲清楚。 spa
首先,是之前的基于投票的获取深度的方法。要有一个特征点,而后在其它帧找匹配。
左图是该特征点在一幅图像上面的匹配,随着Z的变化,对应在极线上的不一样投影点位置。该特征点图块通过仿射变化以后,与不一样的投影点位置的图块进行NCC匹配,获取不一样的匹配分数,而后记录极大值点,落在哪一个Z值区间。从Zmin到Zmax分了50段区间。右图是把60幅图像这样的数组累加,把极大值点累加,记录在每一个Z值区间出现的极大值的频数。
最后,会获得这样的结果,最后会收敛。分别对应五、十、20、100张图的时候的样子。
这种方法比较准确,可是须要记录大量的数据。好比上面(a),单是一幅图上,从Zmin到Zmax就分了50段,因而要用50个元素的数组来记录每段有无极大值。而后把60幅图像的数组都合并起来,获得(b)。
并且,即使能知道累加后最高的那个直方图对应的深度值,但不能知道,根据全部的测量结果所推算出来的深度值,也不知道,那个特征点对应的外点(假地图点)的几率。
因此,要想出其它的办法,既能够综合全部的测量结果推算出深度值,也能够推算出这个特征点对应的外点的几率。
那么,就用另一种方法,再也不记录单幅图像上的全部极大值,而是只记录单幅图像上的最大值。一样地,也把全部的数组累加起来。积累了150幅图像的测量值以后,能够获得下图。
那么,在这样的测量数据的状况下,从这些测量数据中,能够反映出这个点的真正的深度值应该是多少呢?是外点的几率又是多少呢?
用表示该特征点真正的深度值,用
表示内点的几率。
因此,能够用几率方法表示以下,也就是后验几率。
要求出一组和
,使得上面的
最大。可是,直接算,算不出来。用贝叶斯公式来转换。
又由于和
的区间分布的先验值,就是每处都相同。
这里的都是指几率密度,就像是把1千克的质量分散在这么大的体积里,每一个地方的密度。要变成几率,还须要乘以一个微分段
,但由于在等式两边都乘以一样的微分段,因此能够约掉了。贝叶斯公式也就能够一样适用于几率密度的推算了。几率密度与实际几率的关系,参考《从贝叶斯到beta分布》。
因此,
又由于之间互相独立,因此,
也就是,找出一组和
,使得
这个累乘结果最大。
而对其中的每个元素,能够认为是,内点的高斯分布几率,加上,外点的几率,表示成以下公式。其中,
是匹配点在极线上的一个像素的扰动,形成的对应点在深度上的变化。参考《视觉SLAM十四讲》13.2.3的《高斯分布的深度滤波器》。这里的
都是指几率密度。
在
上,随着
和
的调节,会变成以下不一样的几率曲线,
因此,如今已知有这样的肯定的测量值。
每一个测量值都对应一个,全部的累乘。目标是,经过调节
和
,调节曲线的形状,使得
这个累乘结果最大。其实,即使
和
相同,
所在的区间相同,
也是不一样的,由于
里面的
是由两帧相机的相对位置以及特征点的像素位置决定的,因此每一个测量值的
都不相同。由于在该帧上面,假设在极线上测到的极大值点
,知足方差为1个像素的高斯分布,即真实的极大值点与测量点
间知足这样的高斯分布。则计算出来的深度点
也会知足高斯分布,方差用
表示,参考《视觉SLAM十四讲》的《深度滤波器》。
但因为实际上差异不大,为了思考上的方便,这里就先忽略掉
的差异。但实际计算上,仍是会根据公式计算,考虑公式中
的差异。
将展开,获得,
经过思考,会发现,测量值都是已知的固定的,就是上面的灰色的直方图,为了使得累乘结果最大,须要调节曲线,使得直方图高的地方几率高,就是曲线的形状接近于直方图的形状的时候,全部测量值对应的几率的累乘结果会是最大的。
仍是直接用穷举的方法来找,怎么样的和
可让累乘结果最大。经过穷举全部的
和
,获得每一个组合对应的累乘结果
的值,画成三维图表示以下。分别对应五、十、20、100张图的时候的样子。
最后,能够收敛。根据穷举的结果,能够找到让累乘结果最大时的和
,也就是最终想获得的
和
。
其实,上面的方法的本质是基于这样的一个假设,若是那个特征点是内点的话,最后造成的直方图会是中间很是凸起的形状。若是那个特征点是外点的话,则最后造成的直方图会是很是平坦的长方形的形状。因此,上面的方法也能够近似理解为,看最后造成的直方图的形状,分布与凸起形状和平坦的长方形形状的类似度。
可是,对一张直方图都要进行这样的穷举,计算量太大(分50段,
分100段,要算5000种组合),并且还只是对应单个特征点。并且,每新来一张图片,新来一个测量值
,调整直方图后,针对这个新的测量值
,再穷举出一幅三维图
,而后以前算出来的三维图
再乘以新的这幅三维图
,也就是每种组合的计算结果对应相乘,获得新的累乘三维图
,再在上面找峰值。公式以下。
问:上面的这种已知全部的测量值(直方图),而后穷举全部的,求几率最大的地方,与卡尔曼滤波的用测量值更新获得真值的方法,有什么不一样呢?首先,卡尔曼滤波只针对高斯分布成立,因此只对
有效。那么就把
都当成零,认为全是内点的状况下,二者的区别呢?
答:本质上是同样的,结果上也会是同样的,只是使用场景不一样。这种方法的特色是,知道每个测量值各自对应的方差,而后穷举全部的
,使得累乘结果最大,就认为获得最大后验几率。这种穷举的方法,适合离线方法。而卡尔曼滤波,一步步迭代的,经过第一个测量值获得,预测值和对应的协方差。认为真值是不动的。而后用后面的测量值和各自对应的协方差,来更新。最后获得一个较准确的值。卡尔曼滤波的方法,适合在线的迭代的方法。在只有一个测量值的状况下,二者是几乎相同的。
若是在只有第一个测量值的状况下,上面的穷举方法,穷举的结果会发现,当,
等于测量值的状况下,后验几率会是最大的。也就是说,在只有一个测量值的状况下,就直接认为它是内点。因此,须要多一些测量值才比较好。
可是,每新来一个测量值都要针对新的测量值穷举,而后再两幅三维图相乘,计算量仍是蛮大的,还有没有更方便计算的方法呢?
首先,对于这种穷举找最大值的方法,如今通常都是用凸优化方法来代替了。若是能计算出优雅的雅克比解析式的话,就能够用梯度降低法,高斯牛顿法或LM方法来快速找到极大值点(能够转换成极小值点来算,好比被1减)。可是,从展开的公式上看,也没有方便地计算雅克比的方法。若是不能方便地计算雅克比,那么就用数值扰动的方法来求雅克比,这就接近于穷举法了,但只是用数值扰动来算雅克比,沿着梯度变化找到极大值点,计算量应该仍是比穷举法要小的。这就是通常的穷举法,凸优化法(有雅克比解析式,和,无雅克比解析式用数值扰动算雅克比)的关系。(http://www.cnblogs.com/ilekoaiq)但这些凸优化方法的前提都是,三维曲面上,只有一个极大值点。
经过对展开,
发现并无什么方便计算的方法。主要是,其中的每一个大括号里,都是由两项加在一块儿的,这样子,整个公式拆开来算的话,会很是庞大,并且找不出规律(虽然有点像快速傅里叶变换的蝶形乘法)。那么,有没有办法,把其中的加法消除掉呢?经过观察发现,其中的加法,是由于不知道这个点是内点仍是外点,因而就两种状况都算。可是,若是经过其它方法,已经能够知道对应的这个点是真实点高斯分布产生的,仍是外点均匀分布产生的。那样子,就能够把大括号里面的加法消除掉,只保留对应的一项。要么是真实点高斯分布产生的,要么是外点均匀分布产生的。为了方便理解,能够先想象一种状况,就是它们全都是真实点高斯分布产生的。在论文中,是在极线上搜索,在必定搜索范围内可否找到极大值,若是能找到极大值,就把极大值测量点转换成的
认为是真实点高斯分布产生的;若是不能找到极大值,就把最大值测量点转换成的
认为是外点均匀分布产生的,其实这时候,也无所谓选取的最大值测量点的位置和转换后的
的位置,由于产生它们的都是外点的均匀分布
。
再回到原来的公式。
设表示这个测量点转换成的
是不是真实点高斯分布产生的。
,表示是真实点高斯分布产生的。
,表示是外点的均匀分布产生的。则其中的每一项,能够表示以下,这也是最根本的推导。其中,
,来自于
。单个字母
表示某个取值的时候,
表示全部取值的几率累加,且
。要思考清楚各个变量之间的关系,参考《贝叶斯与维恩图》。
(其中,(或者
),也能够先看右边的这项
(或者
),再看左边的这项
(
),会更好理解。)
那么,如今,咱们已经经过了以前的那种策略,知道了当前点是否内点,记为,相比只知道
,又增长了信息。则在已知
、
的状况下,
的几率如如下公式所示。由于最根本的贝叶斯公式就是,
。
上式中,有些是内点,有些是外点,根据来决定,各项的实际表达式会不一样。为了数学形式上的简洁与统一,上式中的各项能够用如下公式来表示,同时表示了内点和外点的状况。
因此,上上式能够简洁地表示成,
咱们要算的公式中,自变量是,其它的量都是已知的。
是已知的,用
表示累加结果,
。
都是已知的常数,就算
会随着
的变化而变化,那也不要紧,变量
的变化不通过它们影响因变量结果,因此它们的累乘结果能够认为是一个已知的常数。参考《从贝叶斯到Beta分布》,其实最后要算的是各个(
组合)几率之间的比例,也能够理解为实际上是要归一化的。因此,上式还能够写成更简洁的形式。(《Video-based, Real-Time Multi View Stereo》的附加材料的第一部分讲的就是这样的推导,可是它转成了
,又转回来,反而有些麻烦)。
是一个
分布。
是高斯分布的累乘,根据高斯分布的性质(以及2中的那个"隐含"高斯分布几率的推导),仍然仍是高斯分布。因此,就用
的形式来表示。
而后,就能够很方便地迭代计算了。其中,比较好算,
能够根据高斯分布乘法的性质,从
开始,一步步迭代计算出来。
当时,上式中
展开相乘,结合高斯分布乘法,能够获得,
由高斯分布乘法可得,参考《高斯分布的加减乘除法》《直观理解高斯函数相乘》《卡尔曼滤波基础》。
若是,则
,
。
因此,迭代一下后,获得的新的表达式为,
其中,,
。这样子,每新来一个测量值,只须要迭代一下就能够,不用再两幅三维图相乘。
(而另外一方面,若是不知道的话,是没办法明确推导出上面的这样的Beta和高斯分离出来的公式的,只能用近似的方法。经过观察最后的收敛的三维图像,思考发现。当
必定时,累乘结果峰值的位置主要是由
来决定的。也就是
决定了曲线凸出来的地方,当曲线凸出来的地方的位置与直方图的高值地方接近的时候,累乘结果就能取到较大的值。当
值必定时,
的分布也是一个中间凸的曲线。
的分布和
的分布是分别穷举的,但不是独立的,由于在
不一样的地方,
的分布会发生变化,
的顶点位置会发生变化。可是,为了简化计算,能够认为
和
是独立的,因此分别用曲线去近似
的分布和
的分布。)
由于根据咱们的策略,咱们能够知道这个测量点对应的是内点仍是外点。可是,咱们以前的策略只能断定明显的外点,若是不是明显的外点的话,就认为是内点,可是,真实的状况是,这时候认为的内点,其实仍是有多是外点的。那么,就要考虑这种更真实的状况。
当用以前的策略断定当前测量点为外点产生的时候,就认为它是由外点产生的。直接使用第3部分中的迭代方法,更新这个外点。可是,当断定不是外点的时候,就仍然仍是要用第2部分中的方法。
设以前的部分已经知足的形式,用公式表示以下。
则,若是新来一个测量点,没有被判断为外点。则公式更新以下。
根据高斯分布乘法的性质,处理上式中的,参考《高斯分布的加减乘除法》。
用表示
,用
表示
。(注意,这里与《Video-based, Real-Time Multi View Stereo》的附加材料里的公式不同,由于我认为《Video-based, Real-Time Multi View Stereo》的附加材料里的
的表达式写错了。)则上上式能够表示为。
这时候,结果是,两个形式的相加。至关于两幅三维图叠加(想象两个高斯分布在几率轴方向上叠加在一块儿,造成了两个山峰)。相加以后的结果,不会再是
的形式,或者其它的单一模型的形式。在这里,只能近似地认为,相加后的结果接近于
的形式,这要依赖于上式中的,(1)
和
很接近使得
接近于1;(2)
和
,
和
很接近,使得
和
很接近;(3)
和
两个数都很大,使得
接近于
;(4)
很小,使得左边项能够忽略。
因此,若是近似地认为,相加后的结果接近于的形式的话,则用公式表示以下。
用一阶矩和二阶矩近似的方法,把新的参数估计出来。
就是用新的单一模型的几率密度三维图去近似旧的多模型叠加的几率密度的三维图。让二者的自变量轴(x、y轴)的一阶矩和二阶矩近似。用表示旧的多模型叠加的几率密度的三维图,用
表示新的单一模型的几率密度三维图。其实这个三维图的
轴,就是表示
的那一个轴,是无穷大的,只是最后显示的时候,取了中间的
部分。
参考《高斯分布的各阶矩》,图上的
的一阶矩为
,
图上的
的二阶矩为
,
参考《经常使用分布函数及特征函数》,图上的
的一阶矩为
,
图上的
的二阶矩为
,
图上的
的一阶矩为,
图上的
的二阶矩为,
图上的
的一阶矩为,
图上的
的二阶矩为,
因此,联立方程,让图的矩去等于
图的矩,也就是
图上的参数所要知足的约束。
通过计算,最后获得迭代公式,
至关因而用一个Beta分布来近似的分布,用一个高斯分布来近似
的分布。
因而,最终就推导出了这么一种简洁的迭代公式。每新来一个测量值,迭代一下能快速计算出新的峰值点。相比第二部分,不用再针对新的测量值穷举全部的组合后再两幅三维图相乘;相比第三部分,更加接近真实的状况。
深度滤波方法,理论推导很是优美,所有都由最简洁的贝叶斯公式推导而来,它尽量地把全部的观测信息都利用上;还能进行快速迭代,实际运行的效果也很棒。应用在三维重建中,可让三维重建出来的模型更加真实;应用在VR\AR空间定位中,可让跟踪定位更加准确。相信它还能够被应用在更多的跟踪、建图算法中。
您以为,本文值多少?