Как сохранить иерархическое дерево K-Means для большого количества изображений, используя Opencv? - PullRequest
4 голосов
/ 02 апреля 2011

Я пытаюсь создать программу, которая найдет похожие изображения из набора изображений. Шаги

  • извлекать дескрипторы SURF для всех изображений
  • хранить дескрипторы
  • Применить knn к сохраненным дескрипторам
  • Сопоставьте сохраненные дескрипторы с дескриптором изображения запроса, используя kNN

Теперь каждый SURF-дескриптор изображений будет храниться в виде Иерархического дерева k-средних, теперь я должен хранить каждое дерево в отдельном файле или возможно построить какое-то отдельное дерево со всеми дескрипторами изображений и обновлять по мере добавления изображений к набору данных.

Это статья, на которой я основываю программу.

Ответы [ 2 ]

7 голосов
/ 06 апреля 2012

Вы уверены, что хотите сделать это с дескрипторами SURF? Я просто работаю над подобным приложением, и оно основано на этой бумаге (Нистер, Стивениус), и они клянутся SIFT дескрипторы - путь. Но, думаю, вы могли бы сделать это и с любыми другими дескрипторами.

Глядя на статью, на которую вы ссылались, новее, чем работа, на которую я ссылался, но в ней не упоминается ни бумага Нистера , ни эта работа (Сивик, Циссерман), которые, насколько мне известно, база работает для всех проблем поиска изображений на основе контента.

Для лучшего понимания проблемы, прежде чем я начал ее реализовывать, я сначала прочитал Сивик, Циссерман , чтобы получить общее представление о системе. Они применяют простую кластеризацию только после извлечения всех дескрипторов SIFT из всех функций. Для большей точности они используют два разных типа объектов: Shape Adapted (центрирован на элементах, похожих на углы) и Maximally Stable (соответствует каплям с высокой контрастностью - вы можете посмотреть их на этой бумаге (Matas et. Al. .)). Масштабируемость их системы не так уж хороша из-за непосредственного хранения каждой функции, но они представили концепцию инвертированных файлов, метод из Text Analytics (вы можете прочитать об его основах здесь ), который упрощает процесс поиска значительно.

После завершения этой работы я рекомендую перейти к Нистеру, Стивениусу , где они вводят концепцию иерархической кластеризации k-средних в L-уровнях для хранения функций, а также для последующего поиска база данных изображений. Теперь, если я не очень сильно ошибаюсь, вы не храните каждый дескриптор как отдельное дерево. Вместо этого вы создаете дерево на основе существующих объектов (где центры кластеров на каждом уровне фактически являются репрезентативными, «центральными» функциями для каждого кластера). Как только дерево построено до необходимой глубины (они рекомендуют 10 кластеров на 6 уровнях), центры кластеров на последнем уровне являются репрезентативными для очень небольшого числа функций - и, таким образом, вы можете фактически забыть все оригинальные функции! (или, по крайней мере, их дескрипторы). Каждый исходный объект может быть представлен соответствующим центром кластера, и вместо дескрипторов для каждого изображения вам нужно только хранить информацию о том, какие центры кластера - объекты - он содержит. Это намного проще, так как вам нужно хранить одно или два целых числа для каждого объекта - кодирование его пути через дерево. Самый простой способ увидеть это, если вы просто кодируете номер кластера, которому принадлежит функция на каждом уровне - их 10 (4 бита) - для каждого уровня (6 из них, 4 * 6 <32 бита, поэтому вписывается в целое число). Конечно, вы можете реализовать реальное кодирование любым удобным для вас способом. О, и они также используют дескрипторы SIFT в регионах MSER. </p>

Кроме того, если изображения, которые вы используете для построения словарного дерева, являются репрезентативными (например, вы работаете над набором данных изображений открытого пространства и строите дерево только из репрезентативной части изображений, но вы знаете, что нет фотографии рабочих мест промышленного предприятия в остальной части набора данных), вы можете добавлять новые изображения очень и очень быстро. Единственное, что вам нужно сделать для добавления любого нового изображения в набор данных, это определить, какой из вычисленных центров кластеров представляет объекты изображения наилучшим образом (как упоминалось ранее, последний уровень центров кластеров является довольно точным) и сохранить информацию о кластерные центры (упомянутые выше целые числа). Поиск центров кластеров должен быть очень быстрым - на каждом из 6 уровней есть только 10 сравнений.

Надеюсь, это когда-нибудь кому-нибудь пригодится, поскольку этому вопросу чуть больше года. :)

2 голосов
/ 06 апреля 2012

Используйте взамен KD-Tree . Вы сможете построить иерархическое K-мерное дерево, вам просто нужно выяснить, какая информация передается по дереву для хранения. Вы можете сохранять векторы / дескрипторы изображений на диск, загружать KD-Tree при каждом запуске вашей программы. Новые компьютерные векторы / дескрипторы могут быть отправлены как на дерево, так и на диск

Подвести итог

  • Создание дескрипторов
  • Подайте новые дескрипторы в KD-Tree
  • Сохранить те же дескрипторы на диск \
  • При каждом перезапуске загружать все дескрипторы в дерево
  • Запросите дерево, чтобы получить наилучшее совпадение

Надеюсь, это поможет

...