Поиск среди миллиардов изображений с помощью одной строки кода
Слишком много данных. Озера данных и хранилища данных; бескрайние пастбища пикселей и океаны, кишащие текстом. Поиск нужныхданных похож на поиск иголки в стоге сена!
Векторные поисковые системы решают эту проблему, преобразовывая сложные данные (необработанные значения пикселей изображения, символы в текстовом документе) в сущности, называемые векторами встраивания. Затем эти числовые векторы индексируются, чтобы можно было эффективно искать необработанные данные. Неудивительно, что векторные поисковые системы, такие как Qdrant, Pinecone, LanceDB и Milvus, стали важными компонентами почти любого нового приложения ИИ.
Если вы работаете с изображениями или видеоданными и хотите включить векторный поиск в свои рабочие процессы, это может привести к значительным накладным расходам:
- Как вы реализуете межмодальный поиск, например поиск изображений с текстом?
- Как вы интегрируете традиционные поисковые фильтры, такие как пороги достоверности или метки классов?
- Как насчет поиска по объектам (людям, кошкам, собакам, автомобилям, велосипедам и т. д.) на изображениях?
Это лишь некоторые из многих проблем, с которыми вы столкнетесь.
Ждать. Останавливаться. Придержи лошадей. Есть лучший способ…
FiftyOne — это интерфейс компьютерного зрения для векторного поиска. Инструментарий с открытым исходным кодом FiftyOne теперь имеет встроенную интеграцию с Qdrant, Pinecone, LanceDB и Milvus, поэтому вы можете использовать предпочитаемую векторную поисковую систему для эффективного поиска ваших визуальных данных в одной строке кода.
Хотите одним щелчком мыши найти 25 изображений, наиболее похожих на второй образец в вашем наборе данных? Хотите найти изображения дорожного движения, на которых есть хотя бы один человек и один велосипед, одним щелчком мыши? Ты можешь!
Как это работает?
1. Загрузите свой набор данных.
В целях иллюстрации мы загрузим подмножество разделения проверки MS COCO.
import fiftyone as fo import fiftyone.brain as fob import fiftyone.zoo as foz from fiftyone import ViewField as F dataset = foz.load_zoo_dataset( "coco-2017", split='validation', max_samples = 1000 ) session = fo.launch_app(dataset)
2. Создайте индекс сходства.
Чтобы выполнить поиск по нашим медиафайлам, нам нужно индексировать данные. В FiftyOne мы можем сделать это с помощью функции compute_similarity()
. Укажите модель, которую вы хотите использовать для создания векторов встраивания, и какую систему поиска векторов вы хотите использовать на сервере. Вы также можете присвоить индексу подобия имя, что полезно, если вы хотите запустить векторный поиск по нескольким индексам.
## setup lancedb pip install lancedb ## generate a similarity index ## with default model embeddings ## using LanceDB backend fob.compute_similarity( dataset, brain_key="lancedb_index", backend="lancedb", ) ## setup milvus ## download and start docker container + pip install pymilvus ## generate a similarity index ## with CLIP model embeddings ## using Milvus backend fob.compute_similarity( dataset, brain_key="milvus_clip_index", backend="milvus", metric="dotproduct" )
3. Поиск по индексу.
Теперь вы можете выполнять поиск изображений по всему набору данных с помощью одной строки кода, используя метод sort_by_similarity()
. Чтобы найти 25 изображений, наиболее похожих на второе изображение в нашем наборе данных, мы можем передать идентификатор образца, количество результатов, которые мы хотим вернуть, и имя индекса, по которому мы хотим выполнить поиск:
## get ID of first sample query = dataset.skip(1).first().id ## find 25 most similar images with LanceDB backend sim_view = dataset.sort_by_similarity( query, k=25, brain_key="lancedb_index" ) ## display results session = fo.launch_app(sim_view)
Вы также можете сделать это полностью через пользовательский интерфейс в FiftyOne App:
Семантический поиск стал проще
Исчезли трудности с обработкой мультимодальных данных. Если вы хотите семантически искать ваши изображения, используя естественный язык, вы можете использовать точно такой же синтаксис! Используйте мультимодальную модель, такую как CLIP, для создания вложений индекса, а затем передайте текстовый запрос вместо идентификатора образца:
## semantic query query = "kites flying in the sky" ## find 30 most similar images with Milvus backend kites_view = dataset.sort_by_similarity( query, k=30, brain_key="milvus_clip_index" ) ## display results session = fo.launch_app(kites_view)
Это может быть особенно полезно при исследовании неструктурированных данных и более глубоком изучении ваших данных, чем это позволяют существующие метки.
Это также можно полностью выполнить в приложении FiftyOne:
Пропустить префильтры
Выполнение векторного поиска по определенным подмножествам ваших данных обычно включает в себя создание сложных предварительных фильтров: фильтров, которые передаются в механизм поиска векторов для применения к набору данных перед векторным поиском.
Интеграция векторного поиска FiftyOne позаботится об этих деталях за вас!
Если вы хотите найти изображения, похожие на «трафик», но хотите, чтобы этот поиск применялся только к изображениям с человеком и велосипедом, вы можете сделать это, вызвав sort_by_similarity()
в отфильтрованном представлении:
## create filtered view view = dataset.match_labels(F("label").is_in(["person", "bicycle"])) ## search against this view traffic_view = view.sort_by_similarity( "traffic", k=25, brain_key="milvus_clip_index" ) session = fo.launch_app(traffic_view)
Приведите свои вещи в порядок
Все вышеупомянутые функции также работают из коробки с патчами обнаружения объектов!
При создании индекса подобия все, что вам нужно сделать, это передать аргумент patches_field
— назвать поле метки, где можно найти «объекты», — и compute_similarity()
сгенерирует векторы встраивания для каждого объекта на всех ваших изображениях. База данных векторов индексирует эти вложения исправлений, чтобы вы могли сортировать эти обнаружения по сходству с эталонным объектом или запросом на естественном языке:
## setup qdrant # pull and start docker container + pip install qdrant-client ## create a similarity index for ground truth patches ## with CLIP model, indexed with Qdrant vector database fob.compute_similarity( dataset, patches_field="ground_truth", model="clip-vit-base32-torch", brain_key="qdrant_gt_index", backend="qdrant" ) ## Search for the object that looks most like a tennis racket tennis_view = dataset.to_patches("ground_truth").sort_by_similarity( "tennis racket", k = 25, brain_key= "qdrant_gt_index" ) session = fo.launch_app(tennis_view)
Заключение
Независимо от того, сколько у вас изображений или видео, вам необходимо использовать векторный поиск. Встроенная интеграция векторного поиска FiftyOne сделает вашу жизнь проще. С FiftyOne поиск по сходству так же прост, как применение более традиционных операций фильтрации и запроса. Смешивайте и сопоставляйте векторные поисковые запросы с запросами метаданных по своему вкусу.
Следующие шаги
Если вы заинтересованы в векторном поиске и компьютерном зрении, приходите на встречу Virtual Computer Vision Meetup 13 июля в 10:00 по тихоокеанскому времени, которая будет полностью посвящена векторному поиску! Вы можете зарегистрироваться здесь.
Подробные руководства по работе с каждым бэкендом векторного поиска см. в документации по интеграции FiftyOne:
Для получения общей информации о векторном поиске в FiftyOne ознакомьтесь с разделом Сортировка по сходству в приложении FiftyOne и Руководство пользователя FiftyOne Brain по сходству.
Если вам нравится библиотека машинного обучения с открытым исходным кодом FiftyOne, продемонстрируйте свою поддержку, поставив проекту ⭐ на GitHub (3900 звезд и их количество продолжает расти!)
Спасибо командам Qdrant и Pinecone за интеграцию в FiftyOne 0.20, а также спасибо Аюшу Чаурасия и команде LanceDB, а также Филипу Халтмайеру и команде Milvus за интеграцию векторной поисковой системы в экосистему FiftyOne в Fiftyone 0.21.3. »!
Первоначально опубликовано на https://voxel51.com 12 июля 2023 г.