Проводите зрительный поиск с помощью Milvus и FiftyOne
FiftyOne - это инструмент с открытым исходным кодом для создания высококачественных наборов данных и моделей компьютерного зрения. Это руководство поможет вам интегрировать возможности поиска по сходству Milvus в FiftyOne, что позволит вам проводить поиск по сходству в ваших собственных наборах данных.
FiftyOne предоставляет API для создания коллекций Milvus, загрузки векторов и выполнения запросов на поиск сходства, как программно на языке Python, так и с помощью "укажи и щелкни" в приложении. Демонстрация на этой странице посвящена программной интеграции.
Предварительные условия
Перед началом работы убедитесь, что у вас есть все необходимое:
- Работающий сервер Milvus.
- Среда Python с установленными
pymilvus
иfiftyone
. - Набор данных изображений для поиска.
Требования к установке
Для этого примера мы будем использовать pymilvus
и fiftyone
. Вы можете установить их, выполнив следующие команды:
python3 -m pip install pymilvus fiftyone torch torchvision
Основной рецепт
Основная схема работы по использованию Milvus для создания индекса сходства в наборах данных FiftyOne и использования его для запросов к данным выглядит следующим образом:
- Загрузите набор данных в FiftyOne.
- Вычислите векторные вложения для образцов или патчей в вашем наборе данных или выберите модель для использования генерируемых вложений.
- Используйте
compute_similarity()
чтобы сгенерировать индекс сходства Милвуса для образцов или пятен объектов в наборе данных, задав параметрbackend="milvus"
и указавbrain_key
по вашему выбору. - Используйте этот индекс сходства Милвуса для запроса данных с помощью
sort_by_similarity()
. - При желании удалите индекс.
Процедуры
Приведенный ниже пример демонстрирует описанный выше рабочий процесс.
1. Загрузите набор данных в FiftyOne и вычислите вкрапления для образцов.
В приведенном ниже коде для демонстрации интеграции используется набор образцов изображений, предоставленный FiftyOne. Вы можете подготовить свой собственный набор изображений, обратившись к этой статье.
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
# Step 1: Load your data into FiftyOne
dataset = foz.load_zoo_dataset("quickstart")
# Steps 2 and 3: Compute embeddings and create a similarity index
milvus_index = fob.compute_similarity(
dataset,
brain_key="milvus_index",
backend="milvus",
)
2. Проведите поиск сходства по видению
Теперь вы можете использовать индекс сходства Milvus для проведения поиска сходства по зрению в вашем наборе данных.
# Step 4: Query your data
query = dataset.first().id # query by sample ID
view = dataset.sort_by_similarity(
query,
brain_key="milvus_index",
k=10, # limit to 10 most similar samples
)
# Step 5 (optional): Cleanup
# Delete the Milvus collection
milvus_index.cleanup()
# Delete run record from FiftyOne
dataset.delete_brain_run("milvus_index")
3. Удалить индекс
Если индекс сходства Milvus вам больше не нужен, вы можете удалить его с помощью следующего кода:
# Step 5: Delete the index
milvus_index.delete()
Использование бэкэнда Milvus
По умолчанию при вызове compute_similarity()
или sort_by_similarity()
будет использоваться бэкенд sklearn.
Чтобы использовать бэкенд Milvus, просто установите необязательный параметр бэкенда compute_similarity()
"milvus"
:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
Кроме того, вы можете постоянно настраивать FiftyOne на использование бэкенда Milvus, установив следующую переменную окружения:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
или установив параметр default_similarity_backend
в конфиге вашего мозга, расположенном по адресу ~/.fiftyone/brain_config.json
:
{
"default_similarity_backend": "milvus"
}
Аутентификация
Если вы используете собственный сервер Milvus, вы можете предоставить свои учетные данные различными способами.
Переменные окружения (рекомендуется)
Рекомендуемый способ настройки учетных данных Milvus - хранить их в переменных окружения, показанных ниже, к которым FiftyOne автоматически обращается при каждом подключении к Milvus.
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
# also available if necessary
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
FiftyOne Brain config
Вы также можете хранить свои учетные данные в конфигурации мозга, расположенной по адресу ~/.fiftyone/brain_config.json
:
{
"similarity_backends": {
"milvus": {
"uri": "XXXXXX",
"user": "XXXXXX",
"password": "XXXXXX",
# also available if necessary
"secure": true,
"token": "XXXXXX",
"db_name": "XXXXXX",
"client_key_path": "XXXXXX",
"client_pem_path": "XXXXXX",
"ca_pem_path": "XXXXXX",
"server_pem_path": "XXXXXX",
"server_name": "XXXXXX"
}
}
}
Обратите внимание, что этот файл не будет существовать, пока вы его не создадите.
Аргументы ключевых слов
Вы можете вручную указывать свои учетные данные Milvus в качестве аргументов ключевых слов при каждом вызове методов типа compute_similarity()
которые требуют подключения к Milvus:
import fiftyone.brain as fob
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
Обратите внимание, что при использовании этой стратегии вы должны вручную указывать учетные данные при последующей загрузке индекса через load_brain_results()
:
milvus_index = dataset.load_brain_results(
"milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
Параметры конфигурации Milvus
Бэкэнд Milvus поддерживает множество параметров запроса, которые можно использовать для настройки запросов на сходство. К таким параметрам относятся:
имя_коллекции(нет): имя коллекции Milvus, которую нужно использовать или создать. Если имя не указано, будет создана новая коллекция
metric ("dotproduct"): метрика расстояния встраивания, которую следует использовать при создании нового индекса. Поддерживаются следующие значения: (
"dotproduct"
,"euclidean"
)consistency_level ("Session"): используемый уровень согласованности. Поддерживаются следующие значения: (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)
Подробную информацию об этих параметрах см. в документации по аутентификации Milvus и документации по уровням согласованности Milvus.
Вы можете указать эти параметры с помощью любой из стратегий, описанных в предыдущем разделе. Вот пример конфигурации мозга, включающей все доступные параметры:
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
Однако обычно эти параметры напрямую передаются в compute_similarity()
для настройки конкретного нового индекса:
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
Управление прогонами мозга
FiftyOne предоставляет множество методов, которые вы можете использовать для управления мозговыми прогонами.
Например, вы можете вызвать list_brain_runs()
чтобы просмотреть доступные мозговые ключи в наборе данных:
import fiftyone.brain as fob
# List all brain runs
dataset.list_brain_runs()
# Only list similarity runs
dataset.list_brain_runs(type=fob.Similarity)
# Only list specific similarity runs
dataset.list_brain_runs(
type=fob.Similarity,
patches_field="ground_truth",
supports_prompts=True,
)
Или вы можете использовать get_brain_info()
для получения информации о конфигурации мозгового цикла:
info = dataset.get_brain_info(brain_key)
print(info)
Используйте load_brain_results()
для загрузки SimilarityIndex
экземпляра для мозгового цикла.
Вы можете использовать rename_brain_run()
чтобы переименовать ключ мозга, связанный с существующим прогоном результатов сходства:
dataset.rename_brain_run(brain_key, new_brain_key)
Наконец, вы можете использовать delete_brain_run()
для удаления мозгового прогона:
dataset.delete_brain_run(brain_key)
Вызов delete_brain_run()
удаляет только запись о мозговом прогоне из набора данных FiftyOne; при этом не удаляются связанные с ним коллекции Milvus, что можно сделать следующим образом:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Для общего рабочего процесса векторного поиска в наборе данных FiftyOne с использованием бэкенда Milvus см. примеры здесь.