Рустам Салаватов: Алгоритм pHash находит различия в изображения, между которыми небольшие отличия в цвете, когда объект немного сдвигается с места, изображение перевёрнуто по вертикали. Отличия выражаются в расстоянии Хэмминга между двумя хэшами, которое можно подобрать экспериментально, в зависимости от нужд, или использовать в запросах каждый раз как пользовательский параметр.
В SQL запросе выше определяются любые дубликаты в коллекции изображений.
Для определения дубликатов у заданного изображения нужен другой запрос:
SELECT hamming_distance('e00e2f5e780fe7c0', phash) as dist, name FROM images
WHERE dist between 1 and 8
Проект мой экспериментальный, он едва начат и ещё не производил замеров скорости отклика. Пока использовал лишь SQLite. Нужно произвести замеры и постараюсь позже написать результаты.
В целом согласен, но стоит пояснить что подразумевается под фразами "несложными махинациями определить количество пикселей" и "другим тривиальным алгоритмом разбрасываем их по заданной Вами площади".
Поиск насколько медленный? Хотел бы понять на примерах какие картинки считаются практически идентичными, близко похожими, а какие несхожими. Скажем на одном изображении тарелку на столе сдвинули с места на 5 см. Это будет считаться схожими или разными?
Мне также как и Roman Kitaev интересно почему узким местом производительности назван язык. Почему не взаимодействие с СУБД, например?
Сколько запросов в секунду обслуживает сервис на данное время?
Eduard: Даже если это так сильно влияет, ActiveRecord через адаптер сам компилирует выражение на Ruby в инструкцию на SQL, поэтому у меня нет над этим контроля через прикладной код. Но я сомневаюсь что это может замедлить запросы на порядок.