Effectuer des recherches par vision avec Milvus et FiftyOne
FiftyOne est un outil open-source permettant de construire des ensembles de données et des modèles de vision par ordinateur de haute qualité. Ce guide vous aide à intégrer les capacités de recherche de similarité de Milvus dans FiftyOne, ce qui vous permet d'effectuer des recherches de vision sur vos propres ensembles de données.
FiftyOne fournit une API pour créer des collections Milvus, télécharger des vecteurs et exécuter des requêtes de similarité, à la fois par programmation en Python et par pointer-cliquer dans l'application. La démonstration sur cette page se concentre sur l'intégration programmatique.
Conditions préalables
Avant de commencer, assurez-vous que vous disposez des éléments suivants :
- Un serveur Milvus en cours d'exécution.
- Un environnement Python avec
pymilvus
etfiftyone
installés. - Un ensemble de données d' images à rechercher.
Installation des conditions requises
Pour cet exemple, nous allons utiliser pymilvus
et fiftyone
. Vous pouvez les installer en exécutant les commandes suivantes :
python3 -m pip install pymilvus fiftyone torch torchvision
Recette de base
Le flux de travail de base pour utiliser Milvus afin de créer un index de similarité sur vos ensembles de données FiftyOne et l'utiliser pour interroger vos données est le suivant :
- Charger un jeu de données dans FiftyOne
- Calculer les embeddings vectoriels pour les échantillons ou les patchs dans votre jeu de données, ou sélectionner un modèle pour utiliser les embeddings générés.
- Utilisez la méthode
compute_similarity()
pour générer un indice de similarité Milvus pour les échantillons ou les patchs d'objets dans un jeu de données en définissant le paramètrebackend="milvus"
et en spécifiant unbrain_key
de votre choix. - Utilisez cet indice de similarité de Milvus pour interroger vos données avec
sort_by_similarity()
. - Si vous le souhaitez, supprimez l'index.
Procédures
L'exemple ci-dessous illustre la procédure décrite ci-dessus.
1. Charger un ensemble de données dans FiftyOne et calculer les embeddings pour les échantillons.
Le code suivant utilise l'échantillon d'images fourni par FiftyOne pour démontrer l'intégration. Vous pouvez préparer votre propre jeu d'images en vous référant à cet article.
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. Effectuer des recherches de similarité de vision
Vous pouvez maintenant utiliser l'index de similarité Milvus pour effectuer des recherches de similarité de vision sur votre ensemble de données.
# 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. Supprimer l'index
Si vous n'avez plus besoin de l'index de similarité Milvus, vous pouvez le supprimer à l'aide du code suivant :
# Step 5: Delete the index
milvus_index.delete()
Utiliser le backend Milvus
Par défaut, l'appel à compute_similarity()
ou sort_by_similarity()
utilise un backend sklearn.
Pour utiliser le backend Milvus, il suffit de définir le paramètre optionnel backend de compute_similarity()
à "milvus"
:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
Alternativement, vous pouvez configurer FiftyOne de manière permanente pour utiliser le backend Milvus en définissant la variable d'environnement suivante :
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
ou en définissant le paramètre default_similarity_backend
de votre configuration brain située à ~/.fiftyone/brain_config.json
:
{
"default_similarity_backend": "milvus"
}
Authentification
Si vous utilisez un serveur Milvus personnalisé, vous pouvez fournir vos informations d'identification de différentes manières.
Variables d'environnement (recommandé)
La manière recommandée de configurer vos identifiants Milvus est de les stocker dans les variables d'environnement montrées ci-dessous, qui sont automatiquement accédées par FiftyOne à chaque fois qu'une connexion à Milvus est établie.
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
Vous pouvez également stocker vos informations d'identification dans votre fichier brain config situé à l'adresse ~/.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"
}
}
}
Notez que ce fichier n'existera pas tant que vous ne l'aurez pas créé.
Arguments de mots-clés
Vous pouvez fournir manuellement vos informations d'identification Milvus en tant qu'arguments de mot-clé chaque fois que vous appelez des méthodes comme compute_similarity()
qui nécessitent des connexions à 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",
)
Notez que, lorsque vous utilisez cette stratégie, vous devez fournir manuellement les informations d'identification lors du chargement ultérieur d'un index via 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",
)
Paramètres de configuration de Milvus
Le backend Milvus prend en charge une variété de paramètres de requête qui peuvent être utilisés pour personnaliser vos requêtes de similarité. Ces paramètres sont les suivants
collection_name(Aucun) : le nom de la collection Milvus à utiliser ou à créer. Si aucun nom n'est fourni, une nouvelle collection sera créée.
metric ("dotproduct"): la métrique de distance d'intégration à utiliser lors de la création d'un nouvel index. Les valeurs supportées sont (
"dotproduct"
,"euclidean"
)consistency_level ("Session"): le niveau de cohérence à utiliser. Les valeurs prises en charge sont (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)
Pour des informations détaillées sur ces paramètres, voir la documentation sur l' authentification Milvus et la documentation sur les niveaux de cohérence Milvus.
Vous pouvez spécifier ces paramètres via l'une des stratégies décrites dans la section précédente. Voici un exemple de configuration de cerveau qui inclut tous les paramètres disponibles :
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
Toutefois, ces paramètres sont généralement transmis directement à compute_similarity()
pour configurer un nouvel index spécifique :
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
Gérer les exécutions des cerveaux
FiftyOne fournit une variété de méthodes que vous pouvez utiliser pour gérer les brain runs.
Par exemple, vous pouvez appeler list_brain_runs()
pour voir les clés cérébrales disponibles sur un jeu de données :
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,
)
Ou, vous pouvez utiliser get_brain_info()
pour récupérer des informations sur la configuration d'un brain run :
info = dataset.get_brain_info(brain_key)
print(info)
Utilisez load_brain_results()
pour charger l'instance SimilarityIndex
pour un brain run.
Vous pouvez utiliser rename_brain_run()
pour renommer la clé de cerveau associée à un cycle de résultats de similarité existant :
dataset.rename_brain_run(brain_key, new_brain_key)
Enfin, vous pouvez utiliser delete_brain_run()
pour supprimer une analyse de cerveau :
dataset.delete_brain_run(brain_key)
L'appel à delete_brain_run()
ne supprime que l'enregistrement de l'analyse cérébrale de votre jeu de données FiftyOne ; il ne supprime pas la collection Milvus associée, ce que vous pouvez faire comme suit :
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Pour un flux de travail commun de recherche vectorielle sur un ensemble de données FiftyOne utilisant le backend Milvus, voir Exemples ici.