Похожие чаты

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

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

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

15 ответов

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

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

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

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

30500 за редактор? )
Владимир
47
any reference of this implementation?
BitBuddha
29
Ⓐrtto, [4/23/24 7:02 PM] Please explain more fully how it is not working exactly, and what are the steps you are taking, and what error messages come or what happens. Ⓐrtto, ...
Ezza Kezza
2
sounds like people have lost their kaspa on tradeogre... does this mean tradeogre not trustworthy?
Ezza Kezza
15
Страшнейшая правда про списки ЦБ. С первых дней жизни P2P сферы, молодые человеки, начитавшись законодательной базы и "внутренних" документов, решили, что им противостоит сер...
Foxcool
3
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
So much speculation in the last week. So much volatility in price. This is because Hedera has a GC that isn't using the network it's governing. Why aren't people asking why a...
Summit Seeker R
9
Anyone else having this error when trying to make transactions?
Datzel
11
Question: How viable is it to use Anvil as the backend infrastructure for managing a TradFi portfolio, while integrating Flexa for instant liquidity and payment solutions? Cou...
Kevin
2
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта