Реализация словарного запаса в OpenCV - PullRequest
3 голосов
/ 30 апреля 2011

Я пытаюсь реализовать поиск изображений на основе статьи «Масштабируемое распознавание с помощью словарного дерева».Я использую SURF для извлечения функций и ключевых моментов.Например, для изображения я получаю, скажем, 300 ключевых точек, и каждая ключевая точка имеет 128 значений дескриптора.Мой вопрос заключается в том, как применить алгоритм кластеризации K-Means к данным.Я имею в виду, нужно ли применять алгоритм кластеризации ко всем точкам, т. Е. 300 * 128 значений, или мне нужно найти расстояние между последовательными значениями дескриптора, сохранить значения и применить алгоритм кластеризации к этому.Я запутался, и любая помощь будет оценена.

Спасибо, Рокки.

Ответы [ 3 ]

1 голос
/ 26 сентября 2013

От твоего вопроса я бы сказал, что ты совсем сбит с толку.Техника дерева словаря основана на использовании иерархической кластеризации k-средних и весовой схемы TF-IDF для листовых узлов.

В двух словах, алгоритм кластеризации, используемый для построения дерева слов, запускает k-средних один раз.по всем d-dimensional данным (d=128 для случая SIFT), а затем снова запускает k-means для каждого из полученных кластеров до некоторого уровня глубины.Следовательно, два основных параметра для построения словарного дерева - это коэффициент ветвления k и глубина дерева L.Некоторые улучшения учитывают только коэффициент ветвления, в то время как глубина автоматически определяется путем обрезки дерева для выполнения минимального показателя отклонения.

Что касается реализации, cv::BOWTrainer из OpenCV является хорошей отправной точкой, хотя и не очень хорошообобщено для случая иерархической схемы BoW, поскольку она навязывает центры для хранения в простом cv::Mat, в то время как дерево словаря, как правило, не сбалансировано, и отображение его на матрицу по уровням может быть неэффективным с точки зрения использования памятизрения, когда число узлов намного меньше теоретического числа узлов в сбалансированном дереве с глубиной L и коэффициентом ветвления k, то есть:

n << (1-k^L)/(1-k)

0 голосов
/ 11 апреля 2016

Извлеките код в libvot , в src / vocab_tree / clustering. *, Вы можете найти подробную реализацию алгоритма кластеризации.

0 голосов
/ 28 июня 2013

Насколько я знаю, я думаю, что вы должны сохранить все дескрипторы в cv :: Mat, а затем добавить это в «Kmeans Trainer», таким образом, вы, наконец, можете применить алгоритм кластеризации. Вот фрагмент, который может дать вам представление о том, о чем я говорю:

BOWKMeansTrainer bowtrainer(1000); //num clusters
bowtrainer.add(training_descriptors); // we add the descriptors
Mat vocabulary = bowtrainer.cluster(); // apply the clustering algorithm

И это может быть вам интересно: http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

Удачи !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...