Сравнение возможностей SIFT, хранящихся в базе данных mysql - PullRequest
17 голосов
/ 17 августа 2010

В настоящее время я расширяю библиотеку изображений, используемую для классификации изображений, и хочу найти дубликаты изображений, преобразованные изображения и изображения, которые содержат или содержатся в других изображениях.
Я протестировал реализацию SIFT из OpenCV, и она работает очень хорошо, но будет довольно медленной для нескольких изображений. Слишком быстро, я думал, что смогу извлечь функции и сохранить их в базе данных, поскольку многие другие метаданные, связанные с изображениями, уже хранятся там.

Какой самый быстрый способ сравнить функции новых изображений с функциями в базе данных?
Обычно сравнение выполняется для вычисления евклидова расстояния с использованием kd-деревьев, FLANN или с помощью Pyramid Match Kernel , который я нашел в другом потоке на SO, но пока не слишком изучил.

Поскольку я не знаю способа эффективного сохранения и поиска дерева kd в базе данных, в настоящее время я вижу только три варианта:
* Пусть MySQL вычислит евклидово расстояние до каждой функции в базе данных, хотя я уверен, что это займет неоправданное время для более чем нескольких изображений.
* Загрузите весь набор данных в память в начале и постройте kd-tree (s). Это, вероятно, будет быстро, но очень много памяти. Кроме того, все данные должны быть перенесены из базы данных.
* Сохранение сгенерированных деревьев в базу данных и загрузка всех из них будет самым быстрым способом, но также генерирует большие объемы трафика, так как с новыми изображениями kd-деревья придется перестраивать и отправлять на сервер.

Я использую SIFT-реализацию OpenCV, но я не настроен на это. Если есть средство извлечения функций, более подходящее для этой задачи (и примерно одинаково надежное), я рад, если кто-то может предложить его.

Ответы [ 4 ]

14 голосов
/ 19 августа 2010

Итак, я сделал нечто очень похожее на это несколько лет назад. Алгоритм, который вы хотите изучить, был предложен несколько лет назад Дэвидом Нистером, статья: «Масштабируемое распознавание с древовидным деревом».Они в значительной степени имеют точное решение вашей проблемы, которое может масштабироваться до миллионов изображений.

Вот ссылка на реферат, вы можете найти ссылку на скачивание, переместившись в заголовок.http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1641018

Основная идея состоит в том, чтобы построить дерево с иерархическим алгоритмом k-средних для моделирования объектов, а затем использовать разреженное распределение объектов в этом дереве, чтобы быстро найти ближайших соседей ... или что-то в этом роде.Вот так прошло несколько лет с тех пор, как я работал над этим.Вы можете найти презентацию PowerPoint на веб-странице авторов здесь: http://www.vis.uky.edu/~dnister/Publications/publications.html

Несколько других заметок:

  • Я бы не стал беспокоиться о ядре совпадения пирамид, этодействительно больше для улучшения распознавания объектов, чем для обнаружения дублированных / преобразованных изображений.

  • Я бы не стал хранить ни одну из этих функций в базе данных SQL.В зависимости от вашего приложения иногда более эффективно вычислять ваши функции на лету, поскольку их размер может превышать исходный размер изображения при плотном вычислении.Гистограммы объектов или указатели на узлы в дереве словаря гораздо более эффективны.

  • Базы данных SQL не предназначены для выполнения масштабных векторных вычислений с плавающей запятой. Вы можете хранить вещи в своей базе данных, но не использовать их в качестве инструмента для вычислений. Я пробовал это один раз с SQLite, и это очень плохо закончилось.

  • Если вы решите реализовать это, внимательно прочитайте статью и держите ее под рукой при ее реализации, поскольку есть много мелких деталей, которые очень важны для эффективной работы алгоритма.

2 голосов
/ 18 августа 2010

Ключ, я думаю, в том, что это не SIFT вопрос.Речь идет о приблизительном поиске ближайшего соседа.Как и в случае с подбором изображений, это тоже проблема открытых исследований.Вы можете попробовать поискать «приблизительный поиск ближайшего соседа» и посмотреть, какие методы доступны.Если вам нужны точные результаты, попробуйте: «Точный поиск ближайшего соседа».

Производительность всех этих геометрических структур данных (таких как kd-деревья) ухудшается с увеличением числа измерений, поэтому я считаю,что вам может потребоваться представить ваши дескрипторы SIFT в меньшем количестве измерений (скажем, 10-30 вместо 256-1024), чтобы иметь действительно эффективный поиск ближайших соседей (например, используйте PCA).Я думаю, что это станет вторичным, если данные хранятся в MySQL или нет.

1 голос
/ 20 декабря 2011

У меня есть некоторые инструменты на python, с которыми можно играть здесь . В основном это пакет, который использует SIFT-преобразованные векторы, а затем вычисляет ближайшую решеточную хеш-функцию каждого 128-го вектора просеивания. Хеширование является важной частью, так как оно чувствительно к локальности, просто означает, что векторы вблизи в пространстве R ^ n приводят к эквивалентным вероятностям столкновения хеша. Работа, которую я предоставляю, является расширением Andoni , которое обеспечивает адаптивную эвристику запроса для сокращения списков точного поиска LSH, а также оптимизированную реализацию CUDA функции хеширования. У меня также есть небольшое приложение, которое выполняет поиск в базе данных изображений с приятной визуальной обратной связью, все под bsd (за исключением SIFT, который имеет некоторые дополнительные ограничения).

1 голос
/ 18 августа 2010

Я думаю, что скорость не является главной проблемой здесь. Основная проблема заключается в том, как использовать функции для получения желаемых результатов.

Если вы хотите классифицировать изображения (например, человек, машина, дом, кошка), то ядро ​​Pyramid Match определенно стоит посмотреть. На самом деле это гистограмма дескрипторов локальных объектов, поэтому нет необходимости сравнивать отдельные объекты друг с другом. Существует также класс алгоритмов, известных как «пакет слов», которые пытаются объединить локальные элементы в «визуальный словарь». Опять же, в этом случае, когда у вас есть «визуальные слова», вам не нужно вычислять расстояния между всеми парами дескрипторов SIFT, а вместо этого определять, к какому кластеру принадлежит каждый объект. С другой стороны, если вы хотите получить точечные соответствия между парами изображений, например, чтобы решить, содержится ли одно изображение в другом, или вычислить преобразование между изображениями, то вам нужно найти точных ближайших соседей.

Кроме того, существуют местные функции, отличные от SIFT. Например, SURF - это функции, аналогичные SIFT, но они быстрее извлекаются, и было показано, что они работают лучше для определенных задач.

Если все, что вам нужно, это найти дубликаты, вы можете значительно ускорить поиск, используя глобальный дескриптор изображения, такой как цветная гистограмма, для удаления изображений, которые явно отличаются. Сравнение двух цветовых гистограмм на несколько порядков быстрее, чем сравнение двух наборов, каждый из которых содержит сотни функций SIFT. Вы можете создать короткий список кандидатов, используя цветные гистограммы, а затем уточнить поиск с помощью SIFT.

...