侵权投诉

OpenCV新增描述子BEBLID

新机器视觉 2021-09-22 14:16 次阅读

在前不久发布的OpenCV4.5中更新了很多新特性:

  • 从4.5版本开始,OpenCV将正式使用Apache2协议,从而避免专利算法带来的潜在纠纷
  • SIFT专利到期,代码被移到主库
  • 对RANSAC算法进行了改进
  • 新增了实时单目标跟踪算法SiamRPN++

还有其他重要更新,这里就不再叙述。值得一提的是,BELID描述子也被添加进去了。

BEBLID全称是Boosted Efficient Binary Local Image Descriptor,多项实验证明能够提高图像匹配精度,同时减少执行时间。

#CommentoruncommenttouseORBorBEBLID
descriptor=cv.xfeatures2d.BEBLID_create(0.75)
#descriptor=cv.ORB_create()
kpts1,desc1=descriptor.compute(img1,kpts1)
kpts2,desc2=descriptor.compute(img2,kpts2)

更多细节可以参考:

https://towardsdatascience.com/improving-your-image-matching-results-by-14-with-one-line-of-code-b72ae9ca2b73
https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynb

CODE:https://github.com/iago-suarez/BEBLID.git

PDF:http://www.dia.fi.upm.es/~pcr/publications/PRL_2020_web_BEBLID.pdf

这里说一下结论吧,经过这个作者测试将ORB描述符替换为BEBLID,就可以将这两个图像的匹配结果提高14%.

下面详细介绍一下这个BEBLID描述子.

作者提出了一种有效的图像描述符BELID。其有效性的关键是对一组图像特征进行有区别的选择,且计算量要求非常低。实验是在电脑和智能手机上进行,BELID的精确度与SIFT相似,执行时间与最快的算法ORB相当。

介绍

局部图像是用于匹配存在强烈外观变化的图像,如光照变化或几何变换。它们是许多计算机视觉任务的基本组成部分,如3D重建、SLAM、图像检索、位姿估计等。它们是最流行的图像表示方法,因为局部特征是独特的,视点不变的。

为了产生一个局部图像表示,我们必须检测一组显著的图像结构,并为每个结构提供描述。对于各种如角、线和区域,有大量非常有效的检测器,它们可以用实数或二进制描述符来描述。目前SIFT描述子仍然被认为是“黄金标准”技术。

本文给出了一种有效的描述子。特征使用积分图像来有效地计算一对图像正方形区域的平均灰度值之间的差。作者使用一个增强算法来区分地选择一组特征,并将它们组合起来产生强描述。实验结果表明,该方法提高了计算速度,执行时间接近ORB,精度与SIFT相似,它能够为手头的任务选择最佳的特征。

BELID

在本节中,作者提出了一种描述图像局部区域的有效算法,其速度和SIFT一样快。其速度的关键是使用少量、快速和选择性的特征。描述子使用一组使用BoostedSCC算法选择的K个特征,该算法是对AdaBoost的改进。

设是由一对对图像patches组成的训练集,标记{−1,1}。其中= 1表示两个patch对应相同的显著性图像结构,=−1表示不同的显著性图像结构.

训练过程将损失降到最低

fd1680f8-0b47-11ec-8fb8-12bb97331649.png

其中,它依赖于特征提取函数f: X→R和一个阈值T.给定f和T,通过含T的f(x)来定义weak learner,

fd284446-0b47-11ec-8fb8-12bb97331649.png

1. 阈值平均盒弱学习者

效率的关键是选择一个f(x),它既具有判别性,又能快速计算。我们定义特征提取函数f(x)

fd32fcc4-0b47-11ec-8fb8-12bb97331649.png

I(t)是像素的灰度值t和R (p, s)是大小的正方形盒子集中在带有尺寸s的像素p。因此,f计算像素的平均灰度值之间的差异(, s)和R(,s)。图2中的红色和蓝色方块代表,分别(, s)和R (, s)。加快f的计算,作者使用积分图像的输入图像。一旦S可用,方框中的灰度和可以通过4次内存访问和4次算术运算来计算。

fd414afe-0b47-11ec-8fb8-12bb97331649.png

检测器通常计算局部结构的方位和尺度。为了BEBLID描述符不受欧几里得变换的影响,作者用底层的局部结构来定位和缩放我们的测量值。

2. 优化弱学习者权值

BoostedSCC算法选择K个弱学习者及其相应的权值。等式1中BoostedSCC优化的损耗函数可以看作是一种度量学习方法,其中度量矩阵a是对角的

fd6b9642-0b47-11ec-8fb8-12bb97331649.png

其中h(w)是K个弱学习者对图像patch的w响应向量。在这种情况下,不考虑不同弱学习者响应之间的依赖关系。此时,给定图像patch w的BELID-U(未优化)描述符计算为,其中使=

进一步,通过对特征之间的相关性进行建模,估计整个矩阵A可以改善相似函数。FP-Boost估计最小值

fd75fccc-0b47-11ec-8fb8-12bb97331649.png

采用随机梯度下降法估计对称的a和是一项困难的工作。因此,该算法从K个弱学习器和由BoostedSCC找到的α开始。第二个学习步骤非常快,因为所有弱学习者的反应都可以预先计算出来

在未优化的描述符的情况下,必须分解相似函数s(x,y)来计算x和y的独立描述子。假设A是一个对称矩阵,可以使用它的特征分解来选择特征值最大的D个特征向量

fd7ee29c-0b47-11ec-8fb8-12bb97331649.png

实验

不同的场景:巴黎圣母院,约塞米蒂国家公园和纽约的自由女神像。在SIFT检测到的局部结构周围裁剪PATCH。

作者用三种方法来比较性能:

  • FPR-95.: 这是一个PATCH验证问题中95%的召回误报率。当开发BEBILD描述符时,作者希望能够匹配大部分的局部结构,比如说95%的召回率,但是有尽可能少的误报。因此,在PATCH验证问题中,描述符的FPR-95越低越好。
  • AUC: PATCH验证问题中ROC曲线下的面积。它提供了一个良好的整体测量,因为它考虑了曲线上的所有操作点,而不是像FPR-95案例中只有一个。
  • mAP.: 在PATCH验证、图像匹配和PATCH检索这三个任务中,每个任务的平均精度,在HPatches基准中定义。

作者已经在Python中实现了BoostedSCC、FP-Boost和阈值平均盒弱学习者的学习和测试部分。为了优化A矩阵,使用了固定学习率为10 - 8和批量2000个样本的随机梯度下降算法。同时也在c++++中实现了使用OpenCV处理输入图像。作者使用这个实现来测量BELID在不同平台上的执行时间。

1. PATCH验证实验

在这里,首先探索维度数的影响。在图3中,显示了AUC和FPR-95值作为维数(“N维”)的函数。在BELID的例子中,使用K = 512,并计算B从512维减少到图中给出的一个。

fd875b66-0b47-11ec-8fb8-12bb97331649.png

首先运行BoostedSSC来选择512个弱学习者。通过从这个初始集合中移除最后的弱学习者,作者改变了图3中BELID- u曲线的维数。对于BELID,丢弃了B的最后一列,它们对应于与最小特征值相关的缩放特征向量

fd94d91c-0b47-11ec-8fb8-12bb97331649.png

从图3可以看出,boosting过程选择的特征最多只在一点上对最终判别有贡献。在128个弱学习者之后,每个新特征提供的改进非常小。在256之后,没有得到任何改进,这意味着最后一个是多余的。优化后的BELID性能优于BELIDU,BELID得分最低FPR-95有128个尺寸。

2. Hpatches数据集实验

fdb796d2-0b47-11ec-8fb8-12bb97331649.png

图5显示了用HPathces工具获得的各种BELID配置和其他竞争方法的结果。作者得到了与之前实验相同的情况,所有的BELID配置都比SIFT好,69.57 vs 63.35,比ORB好得多。

然而,在另外两个任务中,BEBILD描述子落后于SIFT。这是一个预期的结果,因为作者没有为这些任务优化描述子。总之,BELID在所有任务中提供的结果接近SIFT,并优于ORB。

3. 不同平台的执行时间

在最后的实验中,作者测试了c++实现的BELID处理图像的时间,呈现了由来自8个不同场景的48张800×640图像组成的Mikolajczyk数据集的执行时间。

作者将执行时间与OpenCV库中的其他相关描述子进行比较。为此运行ORB ,、SIFT 、 LBGM和BinBoost。结果在表1中。

fdcd0666-0b47-11ec-8fb8-12bb97331649.png

就速度而言,BELID-U与ORB相当。事实上,BELID-U在桌面环境下和ORB一样快(0.41 ms vs 0.44 ms),在有限的CPU环境下更快(2.54 ms vs 6.49 ms)。这是意料之中的,因为两者都使用一组灰度值差异作为特征。LBGM使用与BELID相同的特征选择算法,但具有较慢的特征。因此,这个描述符需要与桌面设置中的SIFT相同的处理时间(19.77 ms vs 22.22 ms),但FPR-95稍好。

在桌面CPU上,BELID-128只需要3.08毫秒,大约是BELID-U和ORB的7倍。在智能手机CPU中,BELID128的时间也比BELID-U慢7倍左右。

结论本文提出了一种有效的图像描述符BELID。在实验中,作者证明了它有非常低的计算要求,在准确度方面,BELID优于ORB,接近SIFT。

编辑:jq

原文标题:OpenCV新增描述子BEBLID:提高图像匹配精度,减少执行时间

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

如何用Java几行代码从图片提取文字

近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方....
的头像 Android编程精选 发表于 10-28 14:05 96次 阅读
如何用Java几行代码从图片提取文字

重演自己如何掉入Lombok的戏法陷阱

  https://www.ramostear.com/blog/2020/04/28/uk1860....
的头像 Android编程精选 发表于 10-28 11:29 151次 阅读

如何在Windows上应用Docker开展动态代码测试

随着软件项目复杂度的提升和不可控的团队资源变更,研发组织对DevOps部署的灵活性、可快速迁移和适配....
的头像 Vector维克多 发表于 10-28 11:08 123次 阅读

怎样去搭建一个基于kaldi的嵌入式在线语音识别系统

怎样去搭建一个基于kaldi的嵌入式在线语音识别系统?分为哪几个阶段呢?...
发表于 10-28 08:37 0次 阅读

如何去实现发光二极管LED的代码呢

LED的原理是什么? 如何去实现发光二极管LED的代码呢? ...
发表于 10-28 08:26 0次 阅读

51单片机是如何实现播放生日快乐歌的

51单片机是如何实现播放生日快乐歌的?其电路及代码该如何去实现?...
发表于 10-28 06:22 0次 阅读

什么是嵌入式linux

一、什么是嵌入式linux?Linux从1991年问世到现在,短短的十几年时间已经发展成为功能强大、设计完善的操作系统之一,不仅可以与...
发表于 10-27 09:47 0次 阅读

嵌入式架构有多重要

嵌入式架构有多重要?要做到嵌入式应用的代码逻辑清晰,且避免重复的造轮子,没有好的应用架构怎么行?如果没有好的架构,移植将会...
发表于 10-27 08:15 0次 阅读

嵌入式开发与非嵌入式开发的区别

通过初步的学习,了解到嵌入式是在已有的硬件上移植操作系统,在操作系统之上做上层应用开发,在操作系统之下做底层开发。嵌入式...
发表于 10-27 06:26 0次 阅读

微软最新写代码神器代码之旅

【导语】:CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演....
的头像 Linux爱好者 发表于 10-26 10:00 165次 阅读

Go语言创始人反对在Go 1.18的标准库中引入泛型支持

近日,Go 语言创始人之一 Rob Pike 在 Github 上发表评论引发关注。据悉,他已在 G....
的头像 马哥Linux运维 发表于 10-26 09:45 236次 阅读
Go语言创始人反对在Go 1.18的标准库中引入泛型支持

Pyecharts制作可视化大屏详解

前两天发了一篇《用Python制作可视化大屏,特简单!》,留言区非常火爆,发现大家都对可视化部分非常....
的头像 Linux爱好者 发表于 10-26 09:42 148次 阅读
Pyecharts制作可视化大屏详解

有关轻应用的基本知识总结

什么是轻应用?轻应用的框架是由哪些部分组成的?轻应用有哪些特点?...
发表于 10-26 08:12 0次 阅读

潘多拉开发板的使用感受

怎样去使用潘多拉开发板呢?
发表于 10-26 07:39 0次 阅读

STM32是怎样去模拟IIC完整代码的

STM32是怎样去模拟IIC完整代码的?其代码程序是怎样的?...
发表于 10-26 06:52 0次 阅读

中游的风力发电设备论述

风电作为一种清洁能源,备受各国关注,近年来,在降低碳排放、能源结构转型的背景下,风电行业实现了快速的....
的头像 MATLAB 发表于 10-25 16:54 320次 阅读

怎样开启或者关闭STM32F4的外部中断呢

怎样开启或者关闭STM32F4的外部中断呢?如何去优化其代码呢?...
发表于 10-25 08:27 0次 阅读

华为开发者HarmonyOS零基础入门:完善功能逻辑

华为开发者HarmonyOS零基础入门:逻辑代码相应调试,导入系统能力包,引用UI资源,调用系统能力....
的头像 lhl545545 发表于 10-23 10:38 202次 阅读
华为开发者HarmonyOS零基础入门:完善功能逻辑

HDC华为开发者大会2021:harmony OS提供全力技术支持

HDC华为开发者大会2021:鸿蒙零基础入门满足harmonyOS开发者各类学习需求,逐步丰富的示例....
的头像 lhl545545 发表于 10-23 09:35 209次 阅读
HDC华为开发者大会2021:harmony OS提供全力技术支持

微软官方开发的VS Code扩展介绍

【导语】:CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演....
的头像 数据分析与开发 发表于 10-22 17:13 293次 阅读

2021华为开发者大会:鸿蒙智联设备开发效率倍增

2021华为开发者大会:分布式应用服务开发环境,以用户为中心的自然智慧交互,突破跨端开发调试困难,丰....
的头像 lhl545545 发表于 10-22 15:57 368次 阅读
2021华为开发者大会:鸿蒙智联设备开发效率倍增

C语言堆栈程序内存的分配

    程序内存的分配       一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(s....
的头像 嵌入式ARM 发表于 10-21 14:51 142次 阅读

ML规模复杂的相关基础架构

  Waze 是世界上最大的基于社区的交通和导航应用。该应用借助实时数据来帮助用户避开路上的障碍,享....
的头像 TensorFlow 发表于 10-21 14:07 210次 阅读

探究IntelliJ IDEA 中JAVA代码的任务标记

【任务标记是以注释的方式定义】 一、作用:1、可以大大的提高开发效率。代码量非常大的项目,在某一行中....
的头像 Android编程精选 发表于 10-20 17:10 290次 阅读
探究IntelliJ IDEA 中JAVA代码的任务标记

详细介绍go语言中的闭包的实现

什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关....
的头像 马哥Linux运维 发表于 10-20 16:18 296次 阅读

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 1108次 阅读

Python协程与JavaScript协程的对比及经验技巧

前言以前没怎么接触前端,对 JavaScript 的异步操作不了解,现在有了点了解。一查发现 Pyt....
的头像 马哥Linux运维 发表于 10-20 14:30 244次 阅读

设置I帧的QP的示例代码

  介绍 在有些应用中,发现I帧不够大。MPSoC VCU CtrlSW可以设置每一帧的QP大小。因....
的头像 FPGA开发圈 发表于 10-20 11:35 287次 阅读

IAP编程page0返回失败的问题总结

最近在支持客户的时候遇到这样一个问题:客户在做自己的二级boot loader,并且在使用LPC54....
的头像 恩智浦MCU加油站 发表于 10-20 10:59 265次 阅读
IAP编程page0返回失败的问题总结

pyBGAPI蓝牙代码库的软件结构

新的Python代码库-pyBGAPI可帮助开发人员通过Silicon Labs(亦称“芯科科技”)....
的头像 SiliconLabs 发表于 10-20 09:57 213次 阅读

无接口驱动程序基于ATEasy代码功能

作为一款新型的自动化测试软件,ATEasy 驱动程序为 ATEasy 应用程序提供了一种与设备或仪器....
的头像 广州虹科电子科技有限公司 发表于 10-20 09:29 184次 阅读

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 243次 阅读
深入探讨 Hilt的工作原理

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 290次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 169次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 317次 阅读
动态内存分配的注意事项及本质是什么

基于边缘的模板匹配适用部分遮挡和光照变化情形(附源码)

介绍 模板匹配是一个图像处理问题,当其姿态(X,Y,θ)未知时,使用另一张搜索图像中的模板图像找到对....
的头像 新机器视觉 发表于 10-13 15:20 438次 阅读
基于边缘的模板匹配适用部分遮挡和光照变化情形(附源码)

Halcon和Opencv这两大图像处理库哪个更好

转自 | 小白学视觉   OpenCV Halcon 开发语言 C++、C#(emgu)、Pytho....
的头像 新机器视觉 发表于 10-13 15:11 328次 阅读

浅析机器人认路的技术SLAM

SLAM (simultaneous localization and mapping),也称为CM....
的头像 新机器视觉 发表于 10-13 10:38 301次 阅读

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 238次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 308次 阅读
关于Python对交通路口的红绿灯进行颜色检测

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 247次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 194次 阅读
 xv6的文件系统是如何实现的

Linux中匿名页的访问分析

Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 208次 阅读

处理器中异常和中断解决

异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 355次 阅读

RUST的真实驱动案例

我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 146次 阅读
RUST的真实驱动案例

那些有着巨大影响力的代码盘点

2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 236次 阅读
那些有着巨大影响力的代码盘点

那些书本上都没有提到的C语言volatile用法

许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 1215次 阅读
那些书本上都没有提到的C语言volatile用法

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 327次 阅读

PO VO DTO转换神器的思路

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 250次 阅读

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 241次 阅读
如何在Colab中使用SQL

命令行工具Kubectl的别样用法

  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 204次 阅读

一本教你怎么写出让同事无法维护的代码

‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 222次 阅读

优秀的 Verilog/FPGA开源项目介绍(一)

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 407次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)

鸿蒙的网络管理功能你们知道有多厉害吗

  本示例演示了如何使用网络管理模块相关接口,演示了以下功能: 功能 1: 使用默认网络,打开连接,....
的头像 HarmonyOS技术社区 发表于 10-11 14:26 345次 阅读
鸿蒙的网络管理功能你们知道有多厉害吗

开发一个鸿蒙版仿苹果计算器教程.附代码

众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现....
的头像 HarmonyOS技术社区 发表于 10-11 14:17 307次 阅读
开发一个鸿蒙版仿苹果计算器教程.附代码

剖析verilog2005的骚操作之对数函数

小技巧分享: verilog下取对数其实可用$clog2这个系统函数,和自己找代码里面写入funct....
的头像 玩儿转FPGA 发表于 10-09 15:29 346次 阅读
剖析verilog2005的骚操作之对数函数

Floyd如何求图的最短路径

前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常....
的头像 算法与数据结构 发表于 10-09 14:38 172次 阅读
Floyd如何求图的最短路径

Python版test1实战说明

上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 de....
的头像 NVIDIA英伟达企业解决方案 发表于 10-09 14:28 191次 阅读

教你们如何用 Python 快速制作海报级地图附代码

 1 简介 基于 Python 中诸如 matplotlib 等功能丰富、自由度极高的绘图库,我们可....
的头像 Linux爱好者 发表于 10-09 11:36 316次 阅读

如何用10行代码轻松在ZYNQ MP上实现图像识别

本文来自赛灵思高级产品应用工程师,张超。如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型....
的头像 XILINX开发者社区 发表于 10-09 10:47 1956次 阅读
如何用10行代码轻松在ZYNQ MP上实现图像识别