изображений. Стоит задача находить похожие изображения по базе (Image Search Engine). Использую VGG16 на imagenet, заэкстрактил фичи для 500к изображений (файлы *.npy). все в RAM сервера не помещаются. При расчёте эвклидового расстояния между векторами также порой RAM не хватает, что бы в нём поместился результат вычисления. И без того использую пакетную обработку по 1000 фич гружу в оперативную память, но поиск занимает порой по 10 минут. Пытался предварительно фильтровать по перцептивному хешу изображения. Помогло со скоростью, но точность детекта знатно упала. База фоток в основном состоит из товаров одежды (кроссовки, футболки, шорты, куртки и т.д.).
В ML и DL средний новичёк, много чего пробовал, но боевая задача это первая. Возможно стоит провести кластеризацию датасета и сперва находить ближайший центроид, а уже потом среди изображений в этом кластере находить все расстояния?
Если на более мощном ПК делаю (16 GB RAM), то работает быстрее. Точность устраивает в случае, когда я нахожу все 500к эвклидовых расстояний и сортирую их от самого близкого к дальнему и беру первые 10 результатов, к примеру. Но я понимаю, что искать куртки среди кроссовок - как минимум глупо и неэффективно. подскажите, в каком направлении двигаться?
Уточню, что фичи у меня размера (4096, ), открываю их через np.load('file/path', mmap_mode='r'), эвклидово нахожу через np.linalg.norm(features - query, axis=1)
Faiss какой-нибудь
"clustering of dense vectors", скорее всего это оно, спасибо. Сейчас буду пробовать.
Там случаем не тот же самый кластеринг с помощью VQ?
Там больше одного алгоритма и одной имплементации
Из очевидного - можно рассчитывать все 500 к расстояний, но не хранить в памяти все, а просто всегда хранить top-10 ( ключ- значение, где ключ - расстояние). При получении очередного расстояния одной операцией сравнения узнаем, нужно ли что-то добавить. Ещё можно посмотреть в сторону k-means
благодарю, на Faiss почти написал уже, скоро попробую на реальных данных. добавлю и это для экономии памяти
можно сделать так: 1. возьми global avg pool за два слоя до 512х7х7 -> 512 выигрыш по памяти в 4 раза. 2. (если нужно точнее) выберешь так (на основе 512 мерных), например, 10000 кандидатов из 500К изображений потом для этих 10000 кандидатов возьмёшь 4096 мерные вектора вычитаешь в оперативку и отсортируешь по евклидову
спасибо, понял, о чем речь, вектора будут занимать меньше RAM, меньше точность, зато вся выборка. попробую так, если с faiss не получится оптимизировать
как я понял, в аббревиатуре IVFPQ - VQ, как раз то, о чем вы говорили
возможно глупый вопрос. но не имея уже на руках исходников изображений (придётся перекачивать, если необходимо), то из вектора с 4096 признаками никак нельзя сделать сжатый вектор 512-мерный ? может через PCA понизить размерность? или это так не работает?
Как я понял, у Вас уже есть 4096 мерные вектора для каждого изображения. Я так понимаю, что вы их подучили путём прогона изображений через сеть. Для этого множества из 500К Вы можете еще раз прогнать (батчами, чтобы было быстрее) все картинки и на этот раз вытащить не только 4096 мерные вектора, но и выход (пердпердпредпоследнего) слоя размерностью 512х7х7 и применить global avg pooling (на всякий случай, это среднее по всем пространственным размерностям тензора) и получите 512х1х1 другими словами 512-мерные вектора. Они будут вполне себе хорошими для векторной репрезентации признаков и объектов, присущих фото для задачи сравнения. Да, можно и pca, но чтобы его честно сделать, вам надо будет работать с 500000х4096 матрицей. конечно тут тоже можно подразбить.. Но первый вариант кажется более естественным, особенно если потом сделать второй стейдж и на кандидатах выбрать лучших уже на 4096-мерных векторах. Будет у Вас в оперативке 500000х512, что должно влезть и ускорит поиск и 500000х4096 на диске. А потом вы быстро найдёте кандидатов по индексу и загрузите в оперативку. Если кандидатов будет около 5000 - 10000, то это будет очень очень быстро.
Согласен, пробовал ранее через перцептивный хеш и расстояние Хэмминга, сужал до 12к изображений и работало быстро. смущало только качество поиска. очень приблизительное. и если товар был кропнутый на изображении либо с другого ракурса, то не находило. поэтому стал искать альтернативы
прогнать ещё раз можете?
Обсуждают сегодня