Я бы предложил сначала понять медленное сопоставление объектов, без 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 вне цикла.)
A Kdtree
это просто способ быстро найти соседние векторы;
это не имеет ничего общего с , с чем сопоставляется
(векторы чисел, представляющих ...), или как (евклидово расстояние).
Теперь kdtrees очень быстрые для 2d, 3d ... вплоть до 20d,
но может быть не быстрее, чем линейное сканирование всех данных выше 20d.
Так как же работает kdtree для функций в 128d?
Основная хитрость - рано закончить поиск.
Бумага Муджи и Лоу,
Быстрые приблизительные ближайшие соседи с автоматической настройкой алгоритма ,
2009, 10p, описывает несколько рандомизированных kdtrees для сопоставления 128d SIFT-функций.
(Лоу является изобретателем SIFT.)
Чтобы сравнить два изображения I и Q, нужно найти набор векторов признаков -
от нескольких сотен до нескольких тысяч SIFT-векторов - для каждого,
и ищет близкие совпадения этих наборов.
(Можно представить изображения как молекулы, особенности как атомы;
почти совпадающие молекулы на намного тверже, чем почти совпадающие атомы
но это помогает быстро сопоставлять атомы.)
Надеюсь, это поможет.