DSO
作为一个稀疏直接法,其中一个核心内容就是对图像上的部分点进行跟踪和逆深度估计,既然是对图像上的某些点进行跟踪估计操作,那么肯定会涉及到如何在图像上选择点的操作,在整个DSO
的算法逻辑中,点选策略主要使用在两个阶段,一个是算法初始化阶段,还有一个是创建关键帧阶段。
1. 初始化阶段的点选策略
在DSO
的初始化过程中,需要确定一个初始化参考帧,当然为了初始化的稳定和准确性,需要构建图像金字塔来完成初始化参考帧的构建。当然初始化部分我会单独出一个文章来进行讲解,这里主要是对初始化过程中的点选策略进行分析,大家只需要记住在初始化过程中需要对初始化关键帧进行金字塔多层级的点选操作,以供后续的初始化操作使用即可,至于为什么使用金字塔?或者为什么使用这样的点选策略,我会在后续的DSO
初始化文章中进行阐述。
1.1 金字塔第零层点选
第0层的金字塔点的选择的要求主要有以下三点:
- 数量要求:第0层上选择的点的数量要满足要求,这因该是最基本的选点要求;
- 特殊性要求:第0层上选择的点要具有一定的特殊性,能够对模型提供比较大信息,在Advantages-of-DSO文章里面提到,直接法往往和像素梯度直接相关,因此大梯度点,往往能对模型优化提供一个相对多的信息;
- 均匀性要求:第0层上选择的点要求具有一定的均匀性,保证位姿估计的稳定性,因为大梯度点,往往在图像的极个别区域内集中分布,选择均匀分布的大梯度点,往往能规避集中分布的像素点导致位姿估计的不稳定性问题;
DSO
首先使用块阈值计算策略,将输入图像(经过光度畸变矫正和像素畸变矫正)划分为32px * 32px
的n
多个小像素块,对每个块内独立的统计像素梯度的均方根,找到0.5
分位数对应的均方根梯度值,然后加上一个超参数bias
的方式,作为大梯度阈值,除此之外,为了保证整张图像的块梯度平滑性,使用一个3 * 3
的均值滤波来对块梯度阈值进行操作。使用上述的块阈值计算策略,可以为后续提供不同区域下的梯度阈值,满足了点选要求的特殊性和均匀性,整个块阈值计算策略如下图所示。

DSO
使用定pot
选点策略,首先使用给定的pot
,依次从4pot * 4pot
到2pot * 2pot
再到pot * pot
的区域内,进行遍历,试图找到满足阈值条件的像素点。
- 首先,针对最内层的
pot * pot
区域内,进行逐像素的遍历,找到pot * pot
区域内的最大梯度像素点,并且要满足最大像素梯度值要大于块阈值计算策略中计算的平滑阈值。 - 当完成了
2pot * 2pot
内的pot * pot
的遍历后,如果区域内的4个pot * pot
区域没有找到一个满足阈值条件的像素点(在DSO
中,会将这部分像素点从0层投影到1层,使用1层的梯度进行阈值条件判断),那么这里将阈值要求降低0.75
倍,然后重新遍历2pot * 2pot
区域内的所有像素试图找到一个满足阈值条件的像素点(这里的阈值条件已经降低了0.75倍数)。 - 当完成了
4pot * 4pot
内的2pot * 2pot
的遍历后,如果区域内的4个2pot * 2pot
区域内没有找到一个满足阈值条件的像素点,那么这里将阈值要求再次降低0.75
倍,然后重新遍历4pot * 4pot
区域内的所有像素点(在DSO
中,会将这部分像素点从0层投影到2层,使用2层的梯度进行阈值条件判断),试图找到一个满足阈值条件的像素点(这里的阈值条件已经降低了0.75 * 0.75
)倍。 - 使用这种定
pot
选点策略,可以保证选点要求的均匀性和特殊性,除了可以保证均匀性外,该策略还可以在图像梯度值比较低的条件下完成特征的提取,因为这里涉及到梯度阈值的降低,该策略的示意图如下所示。

定pot
选点策略的加速
DSO
中的定pot
选点策略的思路就是我在上面描述的那样,但是反映在代码逻辑上,存在着一些可以加速的策略,比如说在DSO
的源码部分,当小区域pot * pot
对应的像素点任何点达到梯度阈值要求的时候,会同步判断2pot * 2pot
和4pot * 4pot
大区域是否满足阈值条件的要求,只有当小区域出现满足阈值条件要求的像素点时,才放弃对大区域内像素点的梯度判断,从而避免了小区域内没选到点而再次遍历的尴尬逻辑。
当然,除此之外,还可以使用多线程加速的策略,即每个区域的所有像素点对应一个线程,三个线程同时进行遍历和判断,然后对最后得到的结果进行统计,取小区域中满足阈值要求的点。当cpu
的性能足够时,这也不失为一种加速策略。
DSO
使用递归pot
随动策略,来保证选点要求的数量要求。
- 通过分析,不难发现,调整
pot
的大小可以间接的提点数量进行控制。 DSO
中,使用pot=3
作为初始的pot
大小,通过定pot
选点策略来选择均匀且带有特殊性的像素点。- 当选择到的点比期望的点多时,说明当前的
pot
比较小,得到的pot * pot
的区域比较多,因此需要递增pot
的大小。 - 当选择到的点比期望的点少时,说明当前的
pot
比较大,得到的pot * pot
的区域比较少,因此需要递减pot
的大小。
与期望数目之间差多少才算多?
DSO
在源码中,规定了一个尺度范围ratio
为\([0.25,1.25]\),注意这个尺度范围ratio
指的是 期望值 / 提取值,当ratio < 0.25
时,认定此时提取的点比较多,需要递增pot
的大小,当ratio > 1.25
时,认定此时提取的点比较少,需要递减pot
的大小。
1.2 金字塔其他层点选
在初始化过程中,金字塔的其他层选择相对简单,也存在一些定pot
选点策略和递归pot
随动策略来保证特征点的均匀性要求和数量一致性要求。但是这两种策略与第0层选点使用的定pot
选点策略和递归pot
随动策略不太一样,这里仅单独的进行一些说明。
- 首先,在阈值方面,金字塔其它层的提取使用定阈值
10
和阈值缩放因子scaleTH
一起决定,即阈值的大小与缩放因子相关。 - 定
pot
选点策略,不像第0层那样,由4pot * 4pot
到2pot * 2pot
再到pot * pot
那样以此降低阈值来提点了,而是仅pot * pot
区域的遍历,试图找到最多4个像素点,该像素点要求阈值大于给定的10 * scaleTH
,并且其x轴梯度最大,或y轴梯度最大,或x轴 - y轴梯度最大,或x轴 + y轴梯度最大。 - 递归
pot
随动策略,同样不像第0层那样,它考虑了一个模型,认定可以提取的点与pot
的大小成反比,即\(pot^2*num=K\),也就是说,首先使用一个默认pot
进行点选,然后根据点选的数量和默认pot
的大小,确定\(K\)值,然后使用\(K\)值计算期望的pot
大小,然后递归的调用即可,其原理可以由下面的公式解释。
其中,\(pot_d\)为期望的pot
大小,\(pot\)为当前提取的pot
大小,\(n_{have}\)为使用\(pot\)提取到的点的数量,\(n_{desir}\)为期望提取的点的数量。
递归停止条件
由于pot
总是一个整数,因此使用整型的pot
可能永远得到不期望的提取数量,因此这里需要设置一个递归的停止条件。
接下来,需要确定一个比例范围ratio
,来定义比期望值多或者比期望值少,DSO
的源码中定义这个比例范围为\([0.8,1.2]\),这个比例是提取值 / 期望值(注意与第0层的比例意义不同)。
首先考虑,pot=1
时,提取到的点仍然远少于期望提取的点,那么需要考虑减小scaleTH
来放宽梯度阈值条件。
当使用的 (提取\(pot-pot_{d}=0\)) || (\(n_{have}/n_{desir}\in[0.8,1.2]\)) || (达到最大要求递归次数),则退出递归。
2. 创建关键帧阶段的点选策略
DSO
的点选策略除了用在初始化阶段外,还会用在新关键帧的创建阶段。当新关键帧被创建时,DSO
会使用初始化过程中,金字塔第零层点选策略来进行像素点的选取,并初始化为未成熟点,以供后续跟踪过程的逆深度优化。
Comments
有什么问题吗,有任何问题欢迎你在下面评论留言或者邮件联系我!