我建议首先了解慢速特征匹配,没有 kdtrees。
- 输入:1000 个参考特征,例如人脸或花朵;称这些 F1 .. F1000
- 一个查询特征 Q:哪个脸或花特征最像,最近,Q?
如您所知,
SIFT
将图像特征缩减为 128 个 8 位数字,并按比例缩放以使
相似度(特征 F,特征 Q)= 欧几里德距离(SIFT(F),SIFT(Q))。
找出 F1 .. F1000 中哪一个最像 Q 的最简单方法就是逐个查看 F1、F2 ...:
# find the feature of F1 .. F1000 nearest Q
nearestdistance = infinity
nearestindex = 0
for j in 1 .. 1000:
distance = Euclideandistance( SIFT(Fj), SIFT(Q) ) # 128 numbers vs. 128 numbers
if distance < nearestdistance:
nearestdistance = distance
nearestindex = j
(当然,在循环外计算 SIFT 数。)
Kdtree
只是一种快速查找附近向量的方法;它与匹配的内容(表示...的数字向量)或如何匹配(欧几里得距离)几乎没有关系。现在 kdtrees 对于 2d、3d ... 最多可能 20d 非常快,但可能不会比对 20d 以上所有数据的线性扫描快。那么 kdtree 如何为 128d 中的功能工作?主要技巧是尽早退出搜索。Muja 和 Lowe 的论文,
使用自动算法配置的快速近似最近邻, 2009,10p,描述了用于匹配 128d SIFT 特征的多个随机 kdtree。(Lowe 是 SIFT 的发明者。)
为了比较两个图像 I 和 Q,需要为每个图像找到一组特征向量——几百到几千个 SIFT 向量——并寻找这些集合的近似匹配。(人们可能将图像视为分子,将特征视为原子;近似匹配的分子比近似匹配的原子要困难得多,但它有助于快速匹配原子。)
希望这可以帮助。