一种适用于行星表面特征提取的实时SIFT算法 下载: 879次
1 引言
随着航天技术的发展,行星探测任务从地基空基望远镜观测逐渐延伸到航天器的近距离观测[1],例如:美国发射的“勇气号”火星车任务和日本对近地小行星1999 JU3进行的“隼鸟2号”任务等。由于一般的行星与地球距离遥远,难以在地球与探测器之间建立实时有效的通信,因此,探测器需要具备自主导航的能力。这就需要探测器能够实时感知周围的环境,而视觉传感器具有采集信息量大、特征丰富以及成本较低的特点,使其在远距离探测中发挥着越来越重要的作用。在航天器进入低高度观测阶段,可利用视觉传感器所采集的图像信息,对相邻帧图像的重叠部分区域进行特征匹配,进而解算前后移动的相对位置关系,实现探测器自主光学导航的目的。同时,深空小天体距离遥远、表面环境复杂且未知,对于科学价值高的C类小行星,存在表面分化层颗粒细密、反照率低等特点。这不仅需要对图像进行实时在线处理,还对导航算法的精度和鲁棒性提出了较高的要求。
尺度不变特征变换(SIFT)算法,是一种自动检测图像中的关键点信息,并生成描述符的算法[2]。由于其自身对图像具有尺度不变性,而且对于仿射变换、噪声、光照变化等具有一定的鲁棒作用,使其特征提取匹配的精度远高于其他方法,符合行星探测任务中鲁棒性的需要。但是该算法的计算复杂度高,算法耗费时间长,不能满足实时性的要求。针对这一问题,国内外学者进行了很多研究。Zhao等[3]在确定关键点的主方向时,充分考虑了距离关键点较近的像素的贡献,将检测点同尺度邻域内的其他14个点和相邻尺度的邻域进行比较,减少了计算的开销。Li等[4]利用Sobel边缘检测器生成边缘群尺度空间,SIFT检测器在边缘群尺度空间的约束下检测极值点。李鹤宇等[5]通过对灰度图像增强预处理,弥补了生成灰度图时信息丢失的问题,再用DAISY描述子替代SIFT描述子进行图像的特征点提取。Bay等[6]利用积分图像和更小维度的描述子向量来简化算法的计算量,提升算法性能。这些方法虽然有效地降低了运算复杂度,但却损失了特征提取匹配的精度和算法的精确性。
因此,本文提出了一种使用快速高斯模糊的并行化SIFT算法FG-SIFT。利用图形处理器(GPU)在并行计算和浮点计算方面的优势[7-9],优化各计算步骤在GPU和中央处理器(CPU)端的分配、调度及数据传输,在保证一定匹配精度的情况下,提高算法的计算效率,以满足在航天器自主光学导航任务中对特征点匹配结果的准确性和实时性的要求。
2 SIFT算法原理
SIFT算法的实质是在不同尺度空间检测关键点,求取关键点的主方向并生成特征描述子。主要流程包括:尺度空间的构建、定位关键点并确定主方向、生成各个关键点的特征描述向量[2]。
1) 构建高斯差分金字塔
尺度空间的构建由对图像的降采样处理和高斯模糊来实现。首先第0组图像由原图像扩大2倍得到,然后再对图像依次降采样得到一组从下到上依次减小的塔状模型,根据原始图像的大小,可以得到共计o组图像,然后对每一组图像进行不同尺度的高斯模糊。将高斯模糊后的图像记为L(x,y,σ),其中x、y用来标记像素点的位置,σ是高斯函数的标准差。原图像记为I
其中,二维高斯核函数为
改变高斯核σ的值,就可以得到一组不同尺度下的高斯图像,由此生成图像的高斯金字塔。在进行极值点检测的过程中,还需要构建高斯差分金字塔(DOG)。其函数表示为D(x,y,σ),是由高斯金字塔中一组图像的相邻层图像灰度值相减得到,即
2)关键点精确定位
在构建好的DOG差分尺度空间进行局部极值点检测。对当前像素值与其周围像素及相邻上下两层共计26个像素的灰度值进行比较。若该像素的灰度值为极大或极小值,则该像素被确定为一个关键点的候选点。
由于上述方法选择的关键点是在离散空间的极值点,还需要通过线性插值的方法对关键点进行精确定位。获取关键点精确位置的插值函数用DOG函数在尺度空间的二阶泰勒展开来表示
式中:X=(x,y,σ)T。
对(4)式求导数并使方程等于零,可得到极值点的偏移量为
极值点的函数值可表示为
经过有限次的迭代,求得关键点原位置加上极值点的偏移量,即为关键点的精确位置。
3) 关键点方向分配
为了满足关键点的旋转不变性,对关键点局部梯度做直方图统计,确定统计直方图角度的最大值作为关键点的主方向。同时,把大于统计直方图最大值80%的方向作为关键点的辅方向。至此,获得了关键点的精确位置、尺度和主方向。
4) 生成描述符
确定关键点的主方向后,将坐标轴旋转至关键点的主方向上,以确保描述符的旋转不变性。在关键点的4×4邻域内,每个邻域作为一个种子点,统计8个方向的灰度梯度直方图。共计得到4×4×8=128维的特征向量,作为关键点的特征描述子。
3 基于快速高斯模糊的SIFT改进算法
为了增强特征点提取的鲁棒性,SIFT算法需要在构造的多组高斯金字塔中进行特征点检测。而高斯金字塔的构建及高斯模糊的过程,是SIFT算法中耗时最长的一部分。本文算法通过分离二维高斯核及使用两个级联IIR滤波器对分离后的一维高斯函数进行逼近,代替原算法中的二维高斯模糊来构建差分金字塔,并在建立高斯差分金字塔及SIFT特征点检测时,使用统一计算设备架构(CUDA)来加速算法的实现过程。具体算法流程如
3.1 分离二维高斯核函数
根据(1)式,选取半径大小为3σ的窗口进行高斯模糊计算,对于每个像素需要进行36σ2次乘加运算。由此可得,对于大小为m×n的图像,进行一次二维高斯模糊运算所需的时间复杂度为o
则(1)式可以写为
记g
记h
由此,对图像进行二维高斯模糊可以分解为两次一维高斯模糊。由(10)式可知,第一次一维高斯模糊的时间复杂度为o(m×n×σ),第二次高斯模糊的复杂度也为o(m×n×σ)。因此,对于分解为两次一维高斯模糊后的算法,时间复杂度为o(m×n×σ)。
3.2 一维快速高斯模糊
对于分离出的一维高斯函数,可将其近似并分解为两个递归滤波器串联。
式中:a0、a1、a'0、a'1、b1、b2为系数。与σ的关系分别为
式中:α=
一维快速高斯模糊可复用其前后两次输出的结果进行计算,使得算法的计算时间复杂度与窗口半径无关,即运算复杂度与σ取值无关,所以算法的复杂度为o
4 仿真设计及结果分析
4.1 快速高斯模糊的并行化实现方案
由(11)式可知,为实现半径无关的高斯模糊算法,一维高斯模糊中的前向滤波和后向滤波分别依赖于前后两次的输出结果。因此,对于每次一维高斯模糊的计算,图像的每一行或列应当被分配到同一个线程中。由于图像一般是以行主序存储,那么如果进行横向一维高斯模糊,则会导致同一个warp中每个线程所读取的内存不连续。所以,为了保证warp在同一时刻读取连续的内存,本节选择实现纵向一维高斯模糊,之后再转置图像,进行第二次纵向快速高斯模糊。在单个线程内,每次前向滤波的迭代,其取像素地址自增图像宽度;每次后向滤波的迭代,其取像素自减图像宽度。并且对于每个线程id,即blockIdx.x*blockDim.x+threadIdx.x,都代表连续的图像横坐标。高斯核函数实现如
由于每次一维高斯模糊需要进行两次滤波运算,为了减少访存带来的延迟,可使用共享内存存放中间结果。在灰度图中,每个像素需占用一个字节,且需要存储一次中间结果。由此,对于本文所使用的GPU,在使用共享内存存储中间结果时,最大可支持对高度为1536pixel的图像进行处理。由于图像转置之后需要再进行一次一维高斯模糊,所以最大可支持1536pixel×1536pixel、深度为8bit的灰度图进行处理。由(11)式可知,在进行后向模糊时,也可以将中间结果存入输出缓存,避免对图像大小的限制,但是访问全局内存会带来延迟问题。因此,本文采取根据图像大小选取中间结果存放位置的方案。为了避免Bank Conflict,对共享内存中的临时数据采取如
表 1. block内共享内存布局
Table 1. Shared memory layout in block
|
4.2 关键点提取的并行化实现方案
以Group为单位进行关键点提取运算。对于每个Group,分别对每张图像进行关键点初筛。由于需要对每个点周围像素以及上下两层图像对应的像素进行比较,因此需要对全局内存进行随机访问。对于每张图像,仍然采取按照列分配线程的方式进行运算,其流程如
对于每个初筛结果,分配一个线程进行关键点的精确定位和筛选,并同时传入以初筛结果个数为依据分配的显存,用以存储精确筛选的特征点。对于舍弃的特征点,存入坐标(-1,-1)。为每个精确特征点分配一个线程计算主方向和特征向量,并传入合适大小的显存区域,存放结构如下:{(x, y) | 描述子}。最后,将得到的结果拷贝回主机内存,在CPU上进行特征点匹配。
4.3 快速高斯模糊与高斯模糊结果对比
为了保证结果的精确性,本节对比了基于CUDA实现的快速高斯模糊和原高斯模糊算法的计算结果,分别取σ∈{σ
表 2. 不同σ值的误差统计
Table 2. Error statistics of different σ values
|
对于所有图像,本文使用的快速高斯模糊算法与原高斯模糊算法之间的误差分布如
由
4.4 仿真结果及性能分析
目前,比较好的SIFT改进算法有加速稳健特征(SURF)[6]和SiftGPU[10]。区别于SIFT利用高斯差分金字塔进行极值点检测,SURF主要使用Hessian矩阵行列式近似值图像来检测关键点,并采用盒型滤波器和积分图来简化计算,使得计算速度有了3倍的提升。SiftGPU[10]是当前使用最为广泛的SIFT算法的GPU版本,可采用CUDA或OpenGL对SIFT算法进行加速。为了对本文算法的精确性和实时性进行评估,本节将选取四组不同旋转角度及四组不同像素尺寸的模拟小行星实物影像作为测试图像进行仿真实验,并与开源库OpenCv提供的SIFT算法、文献[
6]中的SURF算法、文献[
10]中的SiftGPU算法进行对比。为了保证实验结果的准确性,所有算法的验证过程均使用统一硬件平台,主要配置为AMD Ryzen7 3800X + RTX2070。
图 5. 四种算法的特征点匹配结果。(a) SIFT算法;(b) SiftGPU算法;(c) SURF算法;(d) FG-SIFT算法
Fig. 5. Feature point matching results of four algorithms. (a) SIFT algorithm; (b) SiftGPU algorithm; (c) SURF algorithm; (d) FG-SIFT algorithm
表 3. 四种算法匹配效果
Table 3. Matching effect of four algorithms
|
为了进一步验证本文算法在计算效率上的提升,
图 6. 特征点提取耗时对比。(a)耗时统计;(b)算法加速比
Fig. 6. Time-consuming comparison of feature point extraction. (a) Time-consuming statistics; (b) algorithm speedup ratio
图 7. 构建高斯金字塔耗时对比。(a)耗时统计;(b)算法加速比
Fig. 7. Time-consuming comparison of building Gaussian pyramid. (a) Time-consuming statistics; (b) algorithm speedup ratio
从
总体上,使用本文基于快速高斯模糊的FG-SIFT算法,与原SIFT算法相比平均运算效率有了15倍左右的提升,与没有使用快速高斯模糊的SiftGPU方法相比,运算效率也提高了接近2倍。结合
5 结论
本文针对传统SIFT特征提取算法计算量大、实时性不高、无法满足在深空探测场景中的应用需求的问题,提出了一种基于快速高斯模糊的SIFT改进算法。并利用GPU并行化处理的优势,设计构建高斯金字塔和特征点提取部分的并行化方案,基于CUDA平台进行性能校验。仿真结果表明,改进的SIFT算法在特征提取计算效率上比原算法提高了近15倍,并且仍然保证了合理的精度,相对于未使用快速高斯模糊的SiftGPU算法也有接近2倍的速度提升,可同时满足在行星探测任务中对算法准确性和实时性的需求。
[1] 向永嘉, 黎福海, 刘泽. SIFT在行星表面探测器视觉导航系统中的应用[J]. 传感器与微系统, 2011, 30(2): 129-131.
[3] ZhaoJ, LiuH, FengY, et al. BE-SIFT: a more brief and efficient SIFT image matching algorithm for computer vision[C]// IEEE International Conference on Computer & Information Technology Ubiquitous Computing & Communications Dependable. IEEE, 2015: 568- 574.
[4] LiY, Liu LS, Wang LH, et al.Fast SIFT algorithm based on Sobel edge detector[C]//2012 2nd International Conference on Consumer Electronics, Communications and Networks (CECNet), April 21-23, 2012, Yichang, China.New York: IEEE Press, 2012: 1820- 1823.
[5] 李鹤宇, 王青. 一种具有实时性的SIFT特征提取算法[J]. 宇航学报, 2017, 38(8): 865-871.
Li H Y, Wang Q. A real-time SIFT feature extraction algorithm[J]. Journal of Astronautics, 2017, 38(8): 865-871.
[6] Bay H, Ess A, Tuytelaars T, et al. Speeded-up robust features (SURF)[J]. Computer Vision and Image Understanding, 2008, 110(3): 346-359.
[7] 王蓓蕾, 朱志良, 孟琭. 基于CUDA加速的SIFT特征提取[J]. 东北大学学报(自然科学版), 2013, 34(2): 200-204.
Wang B L, Zhu Z L, Meng L. CUDA-based acceleration algorithm of SIFT feature extraction[J]. Journal of Northeastern University (Natural Science), 2013, 34(2): 200-204.
[8] Du C Y, Yuan J L, Dong J S, et al. GPU based parallel optimization for real time panoramic video stitching[J]. Pattern Recognition Letters, 2018, 133(5): 62-69.
[9] Acharya K A, Venkatesh Babu R, Vadhiyar S S. A real-time implementation of SIFT using GPU[J]. Journal of Real-Time Image Processing, 2018, 14(2): 267-277.
[10] Wu CC. SiftGPU: a GPU implementation of scale invariant feature transform (SIFT)[EB/OL].[2020-05-11].https://github.com/stanley0614/SiftGPU.
Article Outline
单宝彦, 朱振才, 张永合, 邱成波. 一种适用于行星表面特征提取的实时SIFT算法[J]. 激光与光电子学进展, 2021, 58(2): 0210020. Baoyan Shan, Zhencai Zhu, Yonghe Zhang, Chengbo Qiu. A Real-Time SIFT Algorithm for Planetary Surface Feature Extraction[J]. Laser & Optoelectronics Progress, 2021, 58(2): 0210020.