KAZE论文研读「建议收藏」

KAZE论文研读「建议收藏」KAZE是发表在ECCV2012的一种特征点检测算法,相比于SIFT和SURF,KAZE建立的高斯金字塔是非线性的尺度空间,采用加性算子分裂算法(AdditiveOperatorSplitting,AOS)来进行非线性扩散滤波。一个很显著的特点是在模糊图像的同时还能保留边缘细节。邹宇华在CSDN中有一系列文章进行了讲解。AKAZE是加速版KAZE特征,即AcceleratedKAZE…

大家好,又见面了,我是你们的朋友全栈君。

KAZE是发表在ECCV2012的一种特征点检测算法,相比于SIFT和SURF,KAZE建立的高斯金字塔是非线性的尺度空间,采用加性算子分裂算法(Additive Operator Splitting, AOS)来进行非线性扩散滤波。一个很显著的特点是在模糊图像的同时还能保留边缘细节。邹宇华在CSDN中有一系列文章进行了讲解。

AKAZE 是加速版KAZE特征,即Accelerated KAZE Features。由KAZE原作者在2013年在KAZE基础上进行改进。ORB与AKAZE应该算是state of the art。关于ORB与AKAZE的详细对比可以看2015年的论文small_munich在博客中提到:与SIFT、SURF算法相比,AKAZE算法更快同时与ORB、BRISK算法相比,可重复性与鲁棒性提升很大,实验结果表明akaze算法从匹配性能与算法耗时都优于orb算法。其实我认为在一定范围内没有绝对的优劣,还是要看自己的应用场景,在之前看ORB的论文中作者也通过引用文献提到SIFT在涂鸦图像有更好的性能。ORB通常应用在移动设备中,在ORB论文中作者就在安卓手机上进行了测试,流行的SLAM中也有很多采样的是ORB-SLAM算法。small_munich在博文中给出了OpenCV版AKAZE匹配代码的百度网盘链接和ORB-LDB描述子代码。

在百度学术上可以很容易找到KAZE论文,引用已经有100多,但是却很难找到AKZE。最后从博文中找到了作者的个人主页。OpenCV官方https://docs.opencv.org/trunk/d8/d30/classcv_1_1AKAZE.html文档。CUDA版本的AKAZE的github主页https://github.com/donlk/cuda_akaze 。OpenCV还对AKAZE和ORB进行了对比

1 Introduction

Multiscale image processing多尺度图像处理的重要性。对于每一个检测到的特征detected features会产生对应的局部描述子local description。

多尺度方法的思想很简单,就是通过对原图滤波,进而构建尺度空间。滤波是对于尺度或者时间变化的近似。对于高斯尺度空间,滤波是通过原图与高斯核进行卷积得到的。高斯核的标准差越大,得到的图像表示也更简单。但是,高斯尺度空间是一种简单的尺度空间表示方法,并不是唯一的线性空间。高斯尺度空间通过选择一些粗糙的尺度coarser scales来减少噪声,并且增强突出的结构,代价是损失了局部精度localization accuracy,这是因为高斯模糊Gaussian blurring对所有尺度上的细节和噪声都进行了平滑,而没有考虑目标objects的边界。

所以,我们希望模糊的时候可以根据图像内容自适应地调整,保留细节和边缘。庆幸的是非线性尺度空间已经被人提出来了,更庆幸的是本文作者是第一个将其运用在特征检测和描述中的。然后作者分析了一下为什么放着现成的非线性尺度空间没人用,主要是因为非线性空间方法中的forward Euler scheme需要很小的步长才能达到收敛,所以计算量大导致效率不高,所幸有人对此做出了改进,主要是使用了AOS(Additive Operator Splitting)方法。AOS还可以解决线性方程的对三角系统,具体方法是托马斯算法,高斯提纯算法的一个特殊变形。

使用AOS方法和可变传导扩散建立了非线性空间,从图像的不同变形中提取出重复性高和独特性强的特征点。特征点命名为KAZE,在日语中是风的意思,为了纪念尺度空间分析之父,日本学者Iijima。同时风在自然界中也是由于非线性流动造成的,与图像中的非线性扩散很像。

2 Related Work

主要讲了SIFT和SURF算法。SIFT是在DoG中寻找极值。SURF受SIFT的启发,使用了积分图,从而可以使用盒子滤波对对高斯derivatives进行近似,而不是在整个尺度空间进行计算。在计算描述子时,在邻域使用Haar小波。还提到了两种SURF的改进,CenSurE和M-SURF。KAZE相比于SURF适当牺牲了一点计算量,但在特征点检测和描述上取得了很大的进步。

Nonlinear Diffusion Filtering

非线性扩散方法图像亮度L的在不同尺度的演变描述为流动方程flow function的散度divergence。这个过程由非线性偏导方程来表示:

\frac{​{\partial L}}{​{\partial t}} = div(c(x,y,t) \cdot \nabla L)

这个方程中包括了散度divergence和梯度gradient。方程中除了图像的坐标x,y,还有一个参数是t,它表示了尺度,t越大,图像表示也越简单。

其中传导函数是很重要的,也是文章的关键。传导函数应该根据图像内容做自适应。Perona和Malik提出了一种传导函数,根据图像的梯度大小减小在边缘处的扩散,增强在区域内部的平滑。

$c(x,y,t) = g\left( {\left| {\nabla {L_\sigma }(x,y,t)} \right|} \right)$

其中$\nabla {L_\sigma }$  是对高斯平滑后的图像的梯度。传导函数c又引出了一个新的传导函数g

{g_1} = \exp \left( { - \frac{​{​{​{\left| {\nabla {L_o}} \right|}^2}}}{​{​{k^2}}}} \right){g_2} = \frac{1}{​{1 + \frac{​{​{​{\left| {\nabla {L_o}} \right|}^2}}}{​{​{k^2}}}}}

K是对比度因子contrast factor,控制了扩散的水平。g1提升了高对比度的边缘,g2提升了宽区域部分。还有一种g3,在边缘周围平滑的强度远大于穿过边缘的平滑。KAZE中默认使用g2.

3.2 AOS Schemes

对于非线性扩散滤波中的非线性偏微分方程,没有解析解analytical solution。因此,需要使用数值分析方法numerical methods来求取近似解。一个可能的离散化方法是linear-implicit和semi-implicit。离散差分方程的矩阵形式:

\frac{​{​{L^{i + 1}} - {L^i}}}{\tau } = \sum\limits_{l = 1}^m {​{A_l}} \left( {​{L^i}} \right){L^{i + 1}}

 是每一个维度的图像传导的矩阵形式。在semi-implicit中,为了计算解 ,需要求解方程的线性系统。可以得到解${L^{i + 1}}$

${L^{i + 1}} = {\left( {I - \tau \sum\limits_{l = 1}^m {​{A_l}\left( {​{L^i}} \right)} } \right)^{ - 1}}{L^i}$

Semi-implicit在任意步长是稳定的。此外,它创造了离散非线性扩散尺度空间。而且必须要求解方程的线性系统,这个系统的矩阵是对三角并且对角占优的(Tridiagonal and diagonally dominant)。这样系统就可以使用高效的托马斯方法(传统系统中熟知的高斯elimination方法)。

4 KAZE Features

介绍一下KAZE特征点的检测和描述方法。首先,使用AOS方法和可变的传导扩散构建非线性尺度空间,尺度空间的大小由进化时间决定。 2D的特征点features of interest是在尺度空间上的尺度归一化的(scale-normalized determinant)Hessian矩阵响应的局部最大值。最后,计算特征点的主方向,考虑图像的一阶微分first order image derivatives实现尺度和旋转不变性。

4.1 非线性尺度空间的构建

和SIFT类似,离散后的尺度空间包含O个octaves和S个sub-levels,但是和SIFT不同的是,KAZE的尺度空间始终是基于原图的操作,而不是在每一层进行下采样。每一个子层的尺度因子可用下式表示:

${\sigma _i}\left( {\sigma ,s} \right) = {\sigma _0}{2^{o + s/S}},o \in \left[ {0...O - 1} \right],s \in \left[ {0...S - 1} \right],i \in \left[ {0...N} \right]$

这里的尺度因子其实是以像素为单位的,即高斯模板的大小以像素为单位,我们需要将单位由像素转换到以时间为单位,因为非线性扩散滤波器是根据时间定义的。二者的关系是 $t = {\sigma ^2}$。这样就可以得到每一个子层以时间为单位的表达式。

{t_i} = \frac{1}{2}{\sigma _i}^2,i = \left\{ {0...N} \right\}

需要注意的是,t与 的关系只是在构建尺度空间时两种参数之间的对应关系,二者对应得到的图像之间没有对应关系。不过,当我们选择的扩散函数g是常数1的话,可以得到等效于高斯尺度空间的结果。事实上,在非线性尺度空间中,随着进化的进行,在大部分像素部分,传导函数会趋于常数,例外就是图像的边缘部分。

对于输入图像,首先要进行高斯卷积减少噪声和其他人为因素artefacts的影响。计算图像的梯度直方图,按照3.1小节得到对比度因子(contrast parameter) k,然后使用AOS通过迭代就可以得到非线性尺度空间。

${L^{i + 1}} = {\left( {I - \left( {​{t_{i + 1}} - {t_i}} \right) \cdot \sum\limits_{l = 1}^m {​{A_l}\left( {​{L^i}} \right)} } \right)^{ - 1}}{L^i}$

KAZE论文研读「建议收藏」

第一行是高斯线性尺度空间得到的图像。第二行是使用传导函数g3得到的非线性扩散尺度空间。

4.2 Feature Detection

特征点的检测首先要计算尺度归一化的Hessian在不同尺度下的响应值。为了实现尺度不变性,差分算子需要根据尺度大小归一化,因为空间导数的幅度随着尺度而下降。(For multiscale feature detection, the set of differential operators needs to be normalized with respect to scale, since in general the amplitude of spatial derivatives decrease with scale [5])

我的理解是这样的:因为极值和SIFT中一样,是空域和相邻尺度空间上的极值。但是在计算Hessian响应的时候要计算二阶偏导,而导数大小会与尺度有关,所以要归一化,然后再比较寻找最大值。找到最大值之后再和SIFT一样,利用泰勒展开对真正的极值点进行拟合逼近。

作者在计算一阶和二阶导数时使用的滤波器是3×3大小的Scharr,因为这种滤波器可以更好地近似旋转不变性。虽然需要对每一个像素点计算多尺度下的导数,但是我们把计算结果保存下来,在计算描述子的步骤就可以重复使用从而降低计算量。

4.3 Feature Description

寻找主方向。和SURF方法一样,利用特征点的邻域找到主方向。邻域是一个半径为$6{\sigma _i}$ 的范围,${\sigma _i}$ 是特征点所在的尺度大小。 对邻域内的点计算x和y方向的梯度,并且使用高斯进行加权(Gaussian centered at the interest point),这样越是靠近特征点的采样点的重要性就越高。在圆形的邻域内以60度的扇形为滑窗进行转动扫描,计算扇形内的矢量之和,挑选最长的矢量最为主方向。

建立描述子。使用M-SURF描述子来适应非线性空间。对于尺度大小为 的特征点,在其 $24{\sigma _i} \times 24{\sigma _i}$的矩形邻域内计算x和y方向的偏导。这个领域又被分成4×4个子区域,每一个区域大小为$9{\sigma _i} \times 9{\sigma _i}$  ,每两个子区域之间重叠$2{\sigma _i}$ 。对于每一个子区域,对其高斯加权之后可以得到一个描述向量${d_v} = \left( {\sum {​{L_x},\sum {​{L_y},} \sum {\left| {​{L_x}} \right|,} \sum {\left| {​{L_y}} \right|} } } \right)$  ,这个向量是4维的,那么4×4个子区域我们一共可以得到64维的描述子。但是在得到64维描述子之前还要对每一个子区域的向量再进行一次以特征点为中心的高斯加权。考虑到主方向,矩形区域内的点都转到了主方向,此外,梯度的计算也根据了主方向。所以我们得到的64维描述子是旋转不变的。邹的博客中写到,作者的代码提供了SURF、M-SURF和G-SURF三种描述向量,其中G-SURF是作者在2013年发表的论文[7]中提出的新的特征描述算法。另外,作者还提供了这三种向量的简化计算版本,即将主方向固定为右上方up-right,然后再计算描述向量。

 

5 Experimental Results and Discussion

实验图像来自mikolajczyk的数据集。他在牛津大学工作过,所以这个数据集其实就是牛津大学的那个数据集。Mikolajczyk的主要研究内容就是图像和视频的识别和匹配,而且这个大牛正在招博士生http://www.imperial.ac.uk/people/k.mikolajczyk。还是说这个数据集,数据集里面包含了图像模糊、亮度变化、视角变化、尺度变化、缩放、旋转和JPEG压缩等图像序列。此外,每组图像序列与其第一幅图像的真实变换关系是已知的。但是这个数据集没有考虑噪声的因素,于是KAZE的作者自己建立了一个数据集,使用递增的方差来模糊图像。Blur不算是对噪声的模拟吗?

作者比较了SURF、SIFT和CenSurE。SURF通过一个闭源closed-source的库实现,SIFT使用Vedaldi的库http://www.vlfeat.org/实现。CenSurE算法使用OpenCV的STAR检测器实现,使用M-SURF作为描述子。几种方法的金字塔层数都设置为相同的,特征点检测时候的阈值也设置为一个合适的值,使得对一幅图像可以得到的特征点数目近似相同。

5.1 KAZE Detector Repeatability

两幅图像之间的检测器的重复度Repeatability的定义出现在文献13中,它描述了可以匹配的点的数目和两幅图中出现的可见特征点数目的最小值之间的比值。至于什么叫特征点可以匹配,作者提出了一个新的指标overlap error:${\varepsilon _s} = 1 - \left( {A \cap {H^t}BH} \right)/\left( {A \cup {H^t}BH} \right)$  ,A和B是两个区域,H是单应矩阵homography。如果overlap error小于50%,就认为两个特征点可以匹配。

KAZE论文研读「建议收藏」

上图展示了不同图像变换下不同算法的重复度表现。可以看到不同的变换关系下表现最好的都是KAZE,在模拟高斯噪声情况下,KAZE的重复度比SURF和STAR高出20%,比SIFT高出40%。其中又以传导函数g2表现最好。 更适合宽大区域如被Hessian检测出的blob-like features。  适用于高对比度的边缘如角点检测corner detection。

 实验还对检测,描述和匹配进行了综合评估。描述子使用文献14中的方法进行评估,使用了precision和recall图。

recall = \frac{​{\# {\rm{correct matches}}}}{​{\# correspondences}},1 - precision = \frac{​{\# false{\rm{ matches}}}}{​{\# all{\rm{ mathes}}}}

对于没有视角和旋转变换的几组图像,使用的描述子是upright版本的,这种版本没有添加主方向。可以加快速度,且性能良好。

KAZE论文研读「建议收藏」

上图就是precision-recall图,使用的匹配策略是最近邻匹配。除了Boat和Graffti图像组,其他图像组中KAZE都明显高于其他算法。即便在Boat和Graffti中,KAZE的correspondences的数目也大约是SURF和SIFT的两倍(算法示例的括号里面就是correspondences的数目)。

5.3 Image Matching for Deformable Surfaces

除了在基准数据集benchmark datasets上进行评估,还测试得到了表面变形deformable surfaces情况下的匹配结果。文献23中提出了一种变形表面上的检测方法,可以从匹配对中剔除外点discard outliers。在检测与重建中,在模板图像和目标图像中找出尽可能多的对应点correspondences是很重要的

图6就是在paper dataset上的实验结果。检测出两幅图像的特征点后,实验最近邻比率法NNDR(nearest neighbor distance ratio)得到假定的匹配对putative correspondences,然后使用文献23中的方法剔除外点。

KAZE论文研读「建议收藏」

a是paper dataset中的帧号为262的图像(b)的帧号为315(c)是不同NNDR比率下的内点inliers数量。可以看出在表面变形的例子中,KAZE得到的内点数目更多。

5.4 Timing Evaluation

测试了以g2为传导函数的KAZE的各个步骤的耗时,并和SURF,SIFT,STAR进行了对比。

与SURF和STAR相比,KAZE计算量更大,最耗时的步骤是建立非线性尺度空间的过程。KAZE的耗时与SIFT相当。KAZE以计算机增加为代价,得到了性能的提升。在改进中,度图像的每一个尺度,并行化AOS的计算,业务AOS将整个扩散滤波分离成一维的独立的进程。

6 Conclusions and Future Work

作者使用AOS和可变传导扩散构建了非线性空间,与之前的最优算法state-of-the-art methods如SIFT,SURF,CenSurE比较,适度增加了计算量,得到了检测和描述上的提升。

作者的下一步工作重心仍然放在非线性扩散滤波上,一方面致力于更高质量的如文献21中的增强相干性的扩散滤波,另一方面致力于通过简化或者硬件编程实现KAZE的加速。KAZE还可以用于大尺度目标的识别和3D重建。

邹宇华在博客中针对KAZE代码进行了优化,可以接近SURF的速度。还对KAZE和SIFT做了详细的比较,SIFT的代码可以自适应改变金字塔层数。KAZE使用KNNMatch不需要过滤误匹配对,若使用BFmatch或者FlannMatch大部分需要过滤才能找到正确的Homography,而有时又会因为过滤使得匹配对过少。博客中还将KAZE特征点检测方法和常规的描述方法做了组合,使用表明传统基于线性空间的描述方法不适用于KAZE。

Reference:

1.邹宇华https://blog.csdn.net/chenyusiyuan/article/details/8710462

2.akaze_tracking:https://blog.csdn.net/Small_Munich/article/details/79418389

3.KAZE作者http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149100.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • outputstream的子类_java里input

    outputstream的子类_java里inputJavaInputStream类在本教程中,我们将通过一个示例来学习JavaInputStream类及其方法。java.io包的InputStream类是一个抽象超类,它表示字节的输入流。由于InputStream是抽象类,因此它本身没有用。但是,其子类可用于读取数据。InputStream的子类为了使用的InputStream功能,我们可以使用其子类。它的子类有:在下一个教程中,我们将学习…

  • Ubuntu安装dos2unix命令

    Ubuntu安装dos2unix命令Ubuntu系统打开Windows下生成的文本文件,会在每行的末尾出现’^M’原因就是Windows和Linux的回车符是不同的在Windows下回车符是\r\n回车换行在Linux下回车符是\n最简单、最常用的解决方法是使用dos2unix命令转换:dos2unixfilenameUbuntu下dos2unix和unix2dos命令在tofrodos包中安装:apt-g

  • 解决keil注册机在win10无法打开问题[通俗易懂]

    解决keil注册机在win10无法打开问题[通俗易懂]解决keil注册机在win10无法打开问题刚开始笔者先以管理员模式打开,无效,弹出一个弹窗说为病毒文件以下提供一种解决办法,亲测有效就是安全模式里打开注册机详细做法如下:首先在设置——》恢复——》高级启动——》立即重新启动重启后,选择疑难解答——》高级选项——》启动设置——》重启——》选择4启动安全模式启动后在此模式就可以打开注册机,然后操作注册机后…

  • verilog cpu流水线_设计一个非常简单的CPU

    verilog cpu流水线_设计一个非常简单的CPU快把这一篇给更了

  • 谷歌域名大全_www.google.vcom

    谷歌域名大全_www.google.vcom谷歌域名大全google各国网址  美国www.google.com  加拿大www.google.ca  墨西哥www.google.com.mx  巴西www.google.com.br  智利www.google.cl  阿根廷www.google.com.ar  秘鲁www.google.com.pe  哥伦比亚www.google.com.c

  • Mac OS 如何卸载干净Pycharm

    Mac OS 如何卸载干净Pycharm由于Pycharm新版本的某些原因想更换低版本的朋友,可以按照以下步骤清除干净pycharm残留数据(本人卸载过程记录,如有错误请指正):1、打开访达,找到PyCharm应用,右键移到废纸篓;2、清理缓存,参数,日志相关配置文件:(注意:使用lsPyCharm关键字进行搜索,PyCharm2020.1是我的文件名称)a、cd~/Library/Preferences/rm-rfPyCharm2020.1/…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号