周末创客| ORB-SLAM算法加速

本文转载自:PYNQ开源社区微信公众号 

ORB特征是一种图像识别、追踪和匹配中常用的特征,大名鼎鼎的ORB-SLAM就是使用的这一特征。它提取FAST特征点,并通过特征点附近的窗口矩计算特征点的方向,含方向的FAST特征也被称为oFAST特征。对提取到的oFAST特征,进一步计算BRIEF描述子。ORB特征包含了两部分,一是特征点位置,二是它的BRIEF 256位描述子。

ORB特征计算的流程

本项目实现了ORB_FPGA单层图像金字塔的ORB特征提取,利用FPGA的并行计算能力,使这一过程比起纯CPU执行加速了5.6倍。

加速器结构,输入输出都是AXI-Stream接口

上图为图像加速部分的工程示意图。这里同样使用了HLS编写的加速IP采用AXI-Stream数据接口,数据接口与DMA首尾相连,只要控制DMA就可以驱动它。

总体工程

本项目的例子输入是SD卡中保存好的图片,当然也可以自己从摄像头读取图片。

快速开始

运行下面这条命令即可快速安装:

sudo pip3 install git+https://github.com/Siudya/ORB_FPGA.git

项目演示

安装好以后打开ORB_FPGA/ORB_FPGA..ipynb

首先是初始化软硬件,并且读取图片。注意读取进来的图片要拷贝到xlnk分配的内存才可以使用DMA传输。

将图片从两个输入DMA写到加速器中再从输出DMA读回。统计收到的字节数可以得知1914个特征点被检测到了。

这里可以打印前两个特征点的内容。可以看到前8个32位数是描述子,后两个是坐标。

把特征点画在原来的图像上,可以看到检测出的特征点大部分是角点和边缘点。这实际上和FAST特征是一致的,但是FAST特征不包含描述子。

接下来读取更多图片来看看吞吐量如何。这里读取了20张图片,统统送入加速器加速,可以看到帧数可以达到56帧。

项目中也提供了纯软件测试的可执行程序,可以直接运行。

可以看到在O2优化的条件下,PS端运行相同算法仅仅只有10.2帧,使用硬件加速器加速达到了5.6倍之多。

更多有关本项目的内容可以参阅 https://github.com/Siudya/ORB_FPGA

推荐阅读