Поиск среди миллиардов изображений с помощью одной строки кода

Слишком много данных. Озера данных и хранилища данных; бескрайние пастбища пикселей и океаны, кишащие текстом. Поиск нужныхданных похож на поиск иголки в стоге сена!

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