Как реализовать поиск похожих фото на сервере?

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

С высокой вероятностью должны находиться дубликаты изображений с легкими изменениями: ресайз, наклон, изменения цвета, добавление/удаление небольших элементов.

Известно про библиотеку https://github.com/jedisct1/libpuzzle не понятно, можно ли и как с ее помощью создать индекс и осуществлять поиск. Разыскиваются и другие библиотеки/готовые инструменты, не обязательно на/для php. Главное, нужна сама методика индексации и последующего поиска по базе.
  • Вопрос задан
  • 3391 просмотр
Пригласить эксперта
Ответы на вопрос 4
@SharuPoNemnogu
не язык плохой, программисты такие...
вот из этой статьи писал класс на основе дискретных косинусных преобразований, который высчитывал хэш, его хранил в базе и высчитывал расстояние Хемминга, на основе которого определялась степень похожести. Алгоритм не быстрый правда, зато изменение цвета, ресайз и небольшой наклон в принципе не помеха. Для пыха вроде есть расширение pHash
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Поиск делается с помощью уникальных частей (искривление прямой с углом: 15-165 градусов внутри одной такой части, не нашли - расширяем радиус, нашли - отрезаем эту зону из дальнейшего поиска) на общем изображении и их расположении относительно друг друга.
Все контурные кусочки поворачиваются по одному алгоритму: например, максимальное кол-во точек по линии-радиусу (от центра до края) - всегда вниз. Если они повторяются - максимальный угол между такими повторами - всегда слева.
Каждый такой кусок - это отдельный хэш. Связка таких кусков - "дерево" хешей.
При поиске - сравниваем хэши искомого и куска из базы с другим через расстояние Хэмминга и ищем зависимости по дереву наиболее совпавшей их последовательности.
Ответ написан
Комментировать
un1t
@un1t
blog.iconfinder.com/detecting-duplicate-images-usi...

Есть готовые алгоритмы для любых языков такие как dhash, например.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
phash - просто, но, увы, не канает при обрезке

там рулят сети , обученные в т.ч. ImageNet, но оно затратнее в разы, сервер уж точно не один, или один, но ядер на 40
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы