首页 » 刷脸背后:人脸检测 人脸识别 人脸检索 » 刷脸背后:人脸检测 人脸识别 人脸检索全文在线阅读

《刷脸背后:人脸检测 人脸识别 人脸检索》7.9 用于图像快速检索的KD-Tree索引

关灯直达底部

在图像和视频处理领域中,数据通常是高维的,此时,最相似K近邻的查找非常费时。图像处理领域的研究人员经常使用KD-Tree查找与输入图像的特征相似的图像。KD-Tree能够大大节省K近邻查找的运行时间,是高维度特征相似性检索不可或缺的利器。本书中使用FLANN库,它是最完整的近邻查询算法的开源库,包含KD-Tree的实现。在本章中,我们仅使用了flann::Index_::radiusSearch,其根据给定的查询数据,执行基于半径的最近邻检索。

7.9.1 FLANN算法的使用

该算法的运行环境是在Linux下的Ubuntu系统,使用命令行来运行。从https://github.com/jlblancoc/nanoflann中下载FLANN算法的源码[9],按照下载文档中的readme.txt文档编译.cpp文件。其中pointcloud_kdd_radius.cpp是关键,我们已经将所想实现功能的代码放入pointcloud_kdd_radius.cpp中。打开命令窗口,进入“/nanoflann-master/nanoflann-master/build/bin”路径,运行pointcloud_kdd_ radius.cpp文件即可。

7.9.2 KD-Tree的创建与查询处理

KD-Tree的创建:找出数据集中方差最高的维度ki,在ki维度上选择中值并将本维度上的数据划分为两部分,此时我们得到两个子集合,同时创建了一个树节点,接着再对两个子集重复上述过程,直到所有子集合都不能再划分为止,此时子集中的数据保存在叶子节点。

但是我们为什么会选中数据集中方差最大的维度呢?我们举个简单的例子。现在要切一根躺着的木条,按照“轮着来”的方法先竖着切一刀,木条一分为二,接下来就是横着切一刀,这时候就有点考验刀法了,如果木条的直径(横截面)较大,还可以轻松下手;如果木条的直径很小,就没有办法切了。因此,如果k维数据的分布像一块正方体的豆腐一样,“轮着来”的切分法可能还是奏效的,但是如果k维度的数据分布像木条一样,“轮着来”就不好用了。我们想象一下,k维数据集合的分布像木条一样,也就是说这些数据在木条较长方向上的维度比较大,在该方向维度上的方差比较大,数据分散得比较开,因此我们就更容易在这个数据维度上将它们划分开。于是,这就引出了我们选择维度的另一种方法——最大方差法,即每次我们选择方差最大的维度进行划分。

在OpenCV中,KeyPoint Matching的方法有Brute-force matcher(简单粗暴匹配),用暴力方法找到点集中每一个descriptor(描述符)与已知点距离最近的descriptor(描述符);而Flann-based matcher 使用快速近似最近邻检索方法查询。

KD-Tree的查询基于深度检索。首先从根开始,进行深度检索并不断记录、更新当前最近节点,并将错过的节点置于优先队列中,直到遍历到叶子节点,此时再从队列中取出目前ki维度上距离最小的节点,然后重复上述过程,遍历至叶子节点,直到优先队列为空,或迭代次数超过200遍时停止。

7.9.3 FLANN中KD-Tree的算法实现

下面给出了FLANN中实现的KD-Tree算法。确定K近邻的个数时,它主要依据的是查询半径参数,即radiusSearch函数。

7.9.4 FLANN算法的实验数据、实验结果及分析

image图像集的说明:以其中一些图像的名称为例,“s001-001.jpg”就代表第一个人的第一幅图像,“s001-002.jpg”就表示第一个人的第二幅图像,“s002-001.jpg”代表第二个人的第一幅图像,以此类推。

1.实验数据

图像集image文件中的497幅图像经过深度学习提取得到的图像特征(保存在.txt文件中,其中每一行代表一幅图像的特征)。

2.实验结果

下面的图片是我们所做实验的截图(见图7-9、图7-10)和代码运行结果显示(见图7-11)。其中运行结果显示中,每一行的三个参数分别代表索引号、图像文件名、与检索图像之间的距离。

查询图像如图7-9所示。

图7-9 查询图像(5)

检索出的部分相似图像如图7-10所示。

图7-10 检索出的部分相似图像(5)

图7-11 代码运行结果显示

3.实验分析

我们可以从实验结果的截图中看到,我们使用的radius(半径)的阈值为77.6,匹配到38幅图像,其中匹配到的图像中有35幅是我们想要查找到的,有3幅不是我们想要的,另外还有7幅图像没有匹配出来。因此,查准率为35/38×100%=92.1%,查全率为35/42×100%=83.3%。