ORB特征均匀提取策略对性能的提升有多大?

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:计算机视觉life

在ORB-SLAM(2)的论文中,作者提到了一种使图像中提取的ORB特征分布更加均匀的方法。这种策略是否有助于提高SLAM的性能?为什么作者不使用OpenCV中的ORB特征提取的实现?本文将通过实验,比较这两种ORB特征提取方法对ORB-SLAM2性能的影响。


两种ORB特征器效果对比

随便从TUM数据集中取出一张照片,分别使用OpenCV的实现和ORB-SLAM2的实现提取1000个ORB特征,效果如下图。很明显,OpenCV提取的特征点比较集中,出现了扎推现象。而ORB-SLAM2提取的特征点,分布比较均匀。

直观上想象,特征点分布比较集中,极端情况就是所有特征都集中到了一点,那么相机的位姿就无法解算。特征点分布太过集中,SLAM系统的精度可能会有所下降。下面,通过实验验证这一想象。

实验条件:

数据集: TUM RGB-D数据集中的6个序列 (严谨的说,以下结论目前只适用于RGB-D相机,没有测试单目和双目的效果)
系统:Ubuntu 16.04
CPU: Intel® Core™ i7-8700 CPU @ 3.20GHz × 12
OpenCV: 3.3.1
ORB-SLAM2参数配置:使用ORB-SLAM2原版配置

轨迹精度对比

采用的评测标准是absolute trajectory error(ATE) RMSE, 结果见下图。大部分序列下,ORB-SLAM2版本的精度更高。fr1_xyz序列,OpenCV版本的精度稍高,但是和ORB-SLAM2的精度也差不太多。而OpenCV的版本在fr2_3h序列中出现了跟丢现象,直到最后也没有找回,所以测试轨迹精度的数据只占了整个序列开始很小一部分,在轨迹精度上稍显高一些。实际上,fr2_3h的序列中,相机运动的较快,场景中也距离相机较远,光线也不好。ORB-SLAM版本在所有序列上都没有跟丢,因此鲁棒性更高。总之,ORB-SLAM2的均匀化特征提取的策略提高了系统的精度和鲁棒性。

轨迹误差对比, ATE, RMSE (m). 
备注:freiburg1_xyz(fr1_xyz),  freiburg1_desk(fr1_desk), freiburg2_360_hemisphere(fr2_3h), freiburg2_desk(fr2_desk), freiburg3_long_office_household (fr3_loh), freiburg3_sitting_halfsphere(fr3_sh)
轨 迹 误差


地图对比

就ORB-SLAM2的版本而言,地图点比较均匀和稀疏,关键帧之间的边相对较少。这似乎表明ORB-SLAM2的均匀提取策略降低了特征的重复性,不利于保证同一个特征在多帧之间都提取到

而OpenCV版本的地图点比较集中,这是由于OpenCV选择响应最高的点所导致的。关键帧之间的边也更加密集,这似乎说明响应高的那些ORB特征点具有更好的复现性,可以在连续的更多帧重复提取、跟踪。但是,需要注意的是,这些特征点都集中在一起,即便形成了更强大的网络,获得的估计精度还是没有ORB-SLAM2版本的高。也就是说,特征点均匀分布是可以提高系统精度的。

序列fr2_desk的地图

下面再看一下,在fr2_desk序列中,每个frame追踪到的地图点的个数。ORB-SLAM2版本相对于OpenCV版本追踪的地图点数量要少,这也与上图中OpenCV版本的关键帧网络更加稠密相互印证。但是,这并不能表明ORB-SLAM2追踪的质量差,因为有可能是ORB-SLAM2的地图点的数量本来就少呢?所以我又统计了以下地图中关键帧的数量和地图点的数量。ORB-SLAM2版本的关键帧数量比OpenCV版本的还多,但是地图点的数量没有OpenCV版本的多。ORB-SLAM2版本中,地图点少,关键帧多,原因可能是1. ORB特征的复现性不好,不能在较多帧之间追踪,构造更多的地图点。2. 均匀化的提取策略提取的特征点数量没有OpenCV原版实现中提取特点数多。(这两点目前没有验证。)

值得注意的是,虽然ORB-SLAM2版本每一帧跟踪的特征点数少,但是最终的轨迹精度却很高。这就体现出ORB-SLAM2特征提取方法的优越性了,可能是特征点分布比较均匀的功劳。OpenCV版本跟踪的点数虽多,但是这些点比较集中。

序列fr2_desk中每帧追踪到的地图点个数——直方图
每个序列的地图中关键帧的数量
每个序列的地图中地图点的数量

地图点存活率对比

提取ORB特征,一是为了构造地图点,二是为了实现数据关联。一个ORB特征点对应的地图点被越多的帧观测到,那么就能形成越强大的Graph,从而也能保证系统的精度。也就是说,多帧之间的ORB特征应具有很好的重复性,这样才能保证形成强大的网络。一个地图点能够被越多的帧观测到越好。于是,我统计了每个特征点相连的关键帧数量。从这幅图似乎感觉两种特征提取方法差别不大,可能对数据影响最大的是实验环境和运动轨迹吧?

单个地图点观测到的关键帧数量

特征提取时间

ORB-SLAM2的特征提取时间为10.24±2.64 ms,OpenCV的特征提取时间为9.11±2.82 ms。两者差别不大。

总结

ORB-SLAM2中的ORB特征提取方法相对于OpenCV中的方法,提高了ORB-SLAM2的轨迹精度和鲁棒性。增加特征提取的均匀性可以提高系统精度,但是似乎会降低特征提取的重复性。

我只用了TUM RGB-D数据集的6个序列来测试,因此相关结论仅供参考。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代理智能提取模块v5.3 设计者:鱼刺 功能强大 通用 易上手 你所想到的我都做到了 免责声明:莫要将本模块用于违法或商业用途,否则照成的一切后果自负。与作者(鱼刺)无关。 -------------------------------------------- 更新说明: v5.3(2020-11-26) *增加新函数 置代理过滤重复回调() 用于扩展支持过滤重复代理 *新增了两个例程`扩展例程_过滤重复代理_初级.e`,`扩展例程_过滤重复代理_高级.e` *略微提升提取和验证速度(优化了一下解析和链接零件的参数) *修改了版权说明文本(比如移除了QQ) v5.2.3(2020-07-09) *修正了使用函数修改配置项时 一些留空参数失效的问题 v5.2(2020-06-19) *修正了因修改了代理提取阀值而导致二次创建代理提取架构后无法正常提取的问题 *创建代理提取架构时多了一个参数 可控制创建后是否立即进行提取(详细说明请看参数注释) v5.1(2020-06-09) *换了一批零件 降低了内存占用 *支持了设置最多5个提取地址 *优化了代理提取触发判定 v5.0(2019-08-21) *解决了多次频繁创建销毁代理提取模块后 出现一直卡在销毁上的问题 *增加了两个新的函数`测试提取()` `测试验证()`  '//详情请查看`例程_测试代理提取验证.e` *新增了一个例程`例程_测试代理提取验证.e` *修正了部分情况下使用函数`置代理提取参数` `置代理验证参数` 调整配置无效的问题 v4.8(2019-08-03) *新增配置参数`验证自定义请求方法`用于控制验证时用GET还是POST方式或者其他方式 *新增配置参数`验证最大并发线程数`用于控制验证代理时的最大并发线程数(默认=200 可设置为5-400之间) *没有什么其他改进和BUG修正 -------------------------------------------- 简单使用流程: 1.  (编辑配置) 1.1 编辑运行目录下的`Config_Proxy.ini`填写提取和验证参数并保存 1.2 如果程序目录下没有`Config_Proxy.ini`这个文件 请调用一次`代理智能提取_创建()`会自动生成在运行目录下 1.3 你也可以用代码来配置这些信息 直接调用 `代理智能提取_置代理提取参数()` `代理智能提取_置代理验证参数()` `代理智能提取_置代理生命值()` `代理智能提取_置代理最长存活时间()` 2.  (创建和获取状态) 2.1 在执行工作前调用一次 `代理智能提取_创建()`  (比如: `启动按钮_被单击`) 2.2 你可以搞个时钟/定时器来刷新代理智能提取模块的工作状态 2.3 当你打算结束工作/工作完毕时记得执行 `代理智能提取_销毁()` 3.  (提取代理) 3.1 当你需要用代理时 直接调用`代理智能提取_获取代理()`即可得到一条代理 3.2 没错 你可以在任意环境下调用`代理智能提取_获取代理()` (比如:在并发线程中调用) 4.  (总结) 如果你已修改好了提取配置 你其实可以很轻松的使用它 只要先创建 然后只管在任意线程获取代理即可 代理快不够了会自动提取补充 就像下面这样 创建() 获取代理()'//线程A 获取代理()'//线程B 获取代理()'//线程C ... 销毁() -------------------------------------------- Config_Proxy.ini 配置说明: 触发补充阀值          : 当前剩余代理小于这个数值会触发自动提取并验证补充代理(0=自动(本次提取数量\5+5且>=5)) 提取地址1             : 用于提取代理的API地址 提取地址2             : 支持多个代理提取地址 提取地址3             : 留空为不启用 提取地址4             : 如果设置了多个提取地址 内部是轮流调用 提取地址5             : 目前最多可同时设置5个提取地址 提取分隔符            :  提取后用这个分隔符来分割成多条 默认=\\r\\n(换行符) (本参数也支持正则匹配) 提取是否正则分割      : 是否使用正则匹配 1=使用正则匹配(正则必须包含两个子匹配项 1为地址 2为端口) 0=使用分割文本匹配 提取是否UTF8解码      : 提取代理返回的网页内容是否进行UTF8解码 1=解码 0=不解码(默认) 提取是否禁止重定向    : 是否禁止网页302/301重定向 1=禁止重定向 0=允许重定向(默认) 提取自定义附加协议头  : 提取代理时附加的HTTP协议头

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值