Похожие чаты

Добрый день. Подскажите, пожалуйста, кто имел дело с нейронками для

изображений. Стоит задача находить похожие изображения по базе (Image Search Engine). Использую VGG16 на imagenet, заэкстрактил фичи для 500к изображений (файлы *.npy). все в RAM сервера не помещаются. При расчёте эвклидового расстояния между векторами также порой RAM не хватает, что бы в нём поместился результат вычисления. И без того использую пакетную обработку по 1000 фич гружу в оперативную память, но поиск занимает порой по 10 минут. Пытался предварительно фильтровать по перцептивному хешу изображения. Помогло со скоростью, но точность детекта знатно упала. База фоток в основном состоит из товаров одежды (кроссовки, футболки, шорты, куртки и т.д.).

В ML и DL средний новичёк, много чего пробовал, но боевая задача это первая. Возможно стоит провести кластеризацию датасета и сперва находить ближайший центроид, а уже потом среди изображений в этом кластере находить все расстояния?

15 ответов

3 просмотра
Юрий-Якименко Автор вопроса

Если на более мощном ПК делаю (16 GB RAM), то работает быстрее. Точность устраивает в случае, когда я нахожу все 500к эвклидовых расстояний и сортирую их от самого близкого к дальнему и беру первые 10 результатов, к примеру. Но я понимаю, что искать куртки среди кроссовок - как минимум глупо и неэффективно. подскажите, в каком направлении двигаться?

Юрий-Якименко Автор вопроса
Юрий Якименко
Если на более мощном ПК делаю (16 GB RAM), то рабо...

Уточню, что фичи у меня размера (4096, ), открываю их через np.load('file/path', mmap_mode='r'), эвклидово нахожу через np.linalg.norm(features - query, axis=1)

Юрий-Якименко Автор вопроса
Evgenii Zheltonozhskii🇮🇱
Faiss какой-нибудь

"clustering of dense vectors", скорее всего это оно, спасибо. Сейчас буду пробовать.

Evgenii Zheltonozhskii🇮🇱
Faiss какой-нибудь

Там случаем не тот же самый кластеринг с помощью VQ?

Юрий Якименко
Уточню, что фичи у меня размера (4096, ), открываю...

Из очевидного - можно рассчитывать все 500 к расстояний, но не хранить в памяти все, а просто всегда хранить top-10 ( ключ- значение, где ключ - расстояние). При получении очередного расстояния одной операцией сравнения узнаем, нужно ли что-то добавить. Ещё можно посмотреть в сторону k-means

Юрий-Якименко Автор вопроса
Viktor
Из очевидного - можно рассчитывать все 500 к расст...

благодарю, на Faiss почти написал уже, скоро попробую на реальных данных. добавлю и это для экономии памяти

Юрий Якименко
Уточню, что фичи у меня размера (4096, ), открываю...

можно сделать так: 1. возьми global avg pool за два слоя до 512х7х7 -> 512 выигрыш по памяти в 4 раза. 2. (если нужно точнее) выберешь так (на основе 512 мерных), например, 10000 кандидатов из 500К изображений потом для этих 10000 кандидатов возьмёшь 4096 мерные вектора вычитаешь в оперативку и отсортируешь по евклидову

Юрий-Якименко Автор вопроса
Эм Константинов
можно сделать так: 1. возьми global avg pool за дв...

спасибо, понял, о чем речь, вектора будут занимать меньше RAM, меньше точность, зато вся выборка. попробую так, если с faiss не получится оптимизировать

Юрий-Якименко Автор вопроса
Лис Электронщик
Там случаем не тот же самый кластеринг с помощью V...

как я понял, в аббревиатуре IVFPQ - VQ, как раз то, о чем вы говорили

Юрий-Якименко Автор вопроса
Эм Константинов
можно сделать так: 1. возьми global avg pool за дв...

возможно глупый вопрос. но не имея уже на руках исходников изображений (придётся перекачивать, если необходимо), то из вектора с 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, то это будет очень очень быстро.

Юрий-Якименко Автор вопроса
Эм Константинов
Как я понял, у Вас уже есть 4096 мерные вектора дл...

Согласен, пробовал ранее через перцептивный хеш и расстояние Хэмминга, сужал до 12к изображений и работало быстро. смущало только качество поиска. очень приблизительное. и если товар был кропнутый на изображении либо с другого ракурса, то не находило. поэтому стал искать альтернативы

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

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
I arrived here after a Chico Crypto show highlighted the project & the Team - the fact that the Team had a long history of successfully working with household names gave me e...
Banter is Bullish
1
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Hi I have recently invested in ewt . Any way to stake it ?
K ì V
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
Ну чё, сегодня все в гавно?))
ᅠ🚀
20
Карта сайта