решение для поиска похожих изображений - PullRequest
3 голосов
/ 10 марта 2011

У меня действительно большая проблема с моим сервером хранения изображений.

На нем около 2 000 000 изображений товаров, и они продолжают увеличиваться, но многие из них очень похожи. Например: фотография iPad со многими похожими размерами 120 * 120, 118 * 120, 131 * 125 ... и т. Д. Они заняли много ненужного дискового пространства и плохой пользовательский опыт на моем веб-сайте (похожие изображения в галерее).

Эти изображения проиндексированы в базе данных, я могу найти их с некоторыми условиями, например, по продукту, категории и т. Д. Мне нужно найти способ пометить эти похожие изображения в базе данных и удалить их.

Что я сделал: нашел библиотеку под названием pHash, которая может вычислить сходство двух изображений, я могу использовать ее для вычисления изображений одно за другим. Но, таким образом, поиск этих изображений займет много времени. Теперь я не знаю, как сделать этот процесс более быстрым.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Вы правы, наивный алгоритм будет O(n^2), потому что вы делаете попарное сравнение по всему вашему набору данных n-размера.

Существует методика, называемая blocking , реализация которой - кластеризация навеса , которая может обойти парные сравнения путем разбиения размера окна сравнения на набор «блоков». которые потенциально похожи.

Вы можете кластеризовать свои изображения, извлекая и сортируя по вектору объектов (что я не знаю, как делать с изображениями).

Затем определите окно сравнения w, такое, что w

Затем примените технику, называемую методом отсортированной окрестности , которая последовательно перемещает окно фиксированного размера w по отсортированным записям. Каждое изображение в окне затем соединяется со своим «соседом» и включается в список пар записей кандидатов.

Это в основном уменьшает сложность сравнения до O(w * n), в результате чего получается линейный алгоритм с постоянной w.

После того, как вы выполнили сравнения, вы должны взять транзитивное замыкание для совпадающих пар.

Ваши получившиеся пары - это то, что будет считаться similar изображениями.

Обратите внимание, этот алгоритм смущающе параллелен .

3 голосов
/ 10 марта 2011
  • Используйте pHash для вычисления воспринимаемого хэша всех ваших изображений (а не перекрестного продукта каждой комбинации),
  • затем сортируйте этот хеш (сохраняя ссылку на изображения),
  • затем определите критическое значение этого перцептивного хэша, который вы определяете как "картинки эквивалентны",
  • затем замените ссылки на эквивалентные изображения ссылкой на одно изображение, которое вы хотите сохранить.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...