Как организовать быстрый поиск по картинкам, как в гугле например?
Имеется прога, которой можно скормить картинку и она должна найти похожую из базы.
Прога эта (нейросеть) перерабатывает картинку в массив данных из 100 чисел. Далее через евклидово пространство она сравнивает 2 массива и говорит похожа эта картинка или нет на загруженную - с этим проблем нет.
Проблема в том, что сравнение 2 массивов занимает много времени. 1 млн массивов - 35 секунд. Даже если взять мощный проц, то время сократится не значительно 10 секунд тоже критично, нужно максимум 1, а лучше 0.1 секунду
Соответственно нужно менять алгоритм. Придумало ли человечество функцию, которой можно описать массив несколькими цифрами, чтобы потом просто в базу сделать запрос, типа SELECT * FROM table WHERE value1 > x AND value1 < y или типа такого, чтобы из 1 млн записей выбрать хотя бы 1000 более менее похожих и дальше уже работать с ними?
>>1301437 Ты хочешь сказать, что надо искать сначала по каким то общим признакам и потом уже в полученном результате полный анализ делать? Не выйдет, нельзя отделить какие то части картинок, чтобы например евклидово расстояние считать между 10 точками для увеличения скорости, к тому же обоссаный питон обсирается считать даже в 10 точках - очень долго делает это. Надо как то сократить весь массив, описав его 1 числом например или типа того, короче массиву индекс какой-то, не обязательно уникальный, просто чтобы сократить поиск в 1000 раз например
>>1301446 То есть допустим у меня есть массив [1, 3, 4, 1, 6, ... ]
Есть массив принадлежащий этой же картинке, но немного отличающийся (другие цвета, ракурс и тд) [1, 4, 5, 1, 6, ... ]
Есть куча массивов совершенно других [10, 321, 1, 111, 228, ...]
И вот надо как то сократить каждый массив до 1 числа, чтобы я сделал запрос УСЛОВНЫЙ SELECT FROM TABLE WHERE idx < 100 AND idx > 20 и получил в результате 1 и 2 массивы
>>1301394 (OP) ОП, а ты знаешь про pHash? Не подойдёт? > «Выглядит похоже». Как работает перцептивный хэш > https://habr.com/post/120562/ Вроде даже грозились в SQL завести функцию сравнения расстояния Хэмминга.
>>1301589 >Сравнение хешей не прокатит, тоже медленно будет Хотя может и не будет, но погрешность будет большая мне кажется, может вообще вычеркнет того, кого не надо
>>1301446 Это и есть кластеризация, у тебя каждая картинка характеризуется одним числом - номером кластера, когда приходит запрос, определяешь, к какому кластеру определяется картинка, потом сравниваешь с картинками из кластера.
>>1302093 Типа объединить бюлижайшие точки т разбить 100 точек на 10 групп например? Ну можно попробовать. Пока попробовал тупо в мускуле запрос сделать, по первым 30 точкам + накинул индексы на них, вроде быстро считает, но этот вариант тоже можно попробовать будет. Если всё равно будет медленно, то этот вариант на апаче попробовать, тогда уж точно должно будет летать
>>1301394 (OP) Хэшируй в числа, раскидывай в бакеты. Сначала ищешь бакет по хэшу, потом линейно проверяешь схожесть своей картики с теми, что имеют одинаковый хэш (т.е. находящиеся в одном бакете).
>>1303212 Да, но походу не выйдет. Если с игровой пеки запускаю сканирование фоток, то 1 млн аккаунтов в день. С ноутбука 250к аккаунтов в день. Запускать сайт стал бы только со 100млн аккаунтами и больше, свой комп не хочу 3 месяца держать включенным и не пользоваться им
>>1303577 Хеширование картинок и прочая хуйня вообще не прокатит, тут нейросеть чекает лицо на фотографии и записывает какие то СВОИ параметры лица в 128 точках. Что эти 128 точек означают - нигде не написано, но если искать схожие лица по первым точкам (по первым 30 например), то вполне себе ищет, не так же точно как по всем, но можно второй раз прогонять просто по полученному результату и норм будет.
Пока сайт доделаю короче, потом наверное спарсю только россию (или только ДС и ДС2), потом прочий СНГ (там на все страны как на ДС еле наберется).
Учитывая что в вк у каждого третьего (или даже меньше) норм фотка стоит, то база на 30-50кк получится, думаю мускул даже справится более менее
>>1303582 Типа схожесть лица? Ну так по ней же и высчитывается. Если взять 2 разные фотки 1 человека, то результаты будут РАЗНЫЕ, но очень близкие если мереть евклидово расстояние
Имеется прога, которой можно скормить картинку и она должна найти похожую из базы.
Прога эта (нейросеть) перерабатывает картинку в массив данных из 100 чисел. Далее через евклидово пространство она сравнивает 2 массива и говорит похожа эта картинка или нет на загруженную - с этим проблем нет.
Проблема в том, что сравнение 2 массивов занимает много времени. 1 млн массивов - 35 секунд. Даже если взять мощный проц, то время сократится не значительно 10 секунд тоже критично, нужно максимум 1, а лучше 0.1 секунду
Соответственно нужно менять алгоритм. Придумало ли человечество функцию, которой можно описать массив несколькими цифрами, чтобы потом просто в базу сделать запрос, типа SELECT * FROM table WHERE value1 > x AND value1 < y или типа такого, чтобы из 1 млн записей выбрать хотя бы 1000 более менее похожих и дальше уже работать с ними?