Condurre ricerche di visione con Milvus e FiftyOne
FiftyOne è uno strumento open-source per la creazione di insiemi di dati e modelli di computer vision di alta qualità. Questa guida aiuta a integrare le funzionalità di ricerca per similarità di Milvus in FiftyOne, consentendo di condurre ricerche di visione sui propri set di dati.
FiftyOne fornisce un'API per creare collezioni Milvus, caricare vettori ed eseguire query di somiglianza, sia in modo programmatico in Python che tramite point-and-click nell'applicazione. La dimostrazione in questa pagina si concentra sull'integrazione programmatica.
Prerequisiti
Prima di iniziare, assicurarsi di disporre di quanto segue:
- Un server Milvus funzionante.
- Un ambiente Python con
pymilvus
efiftyone
installati. - Un set di immagini da ricercare.
Installazione dei requisiti
Per questo esempio, utilizzeremo pymilvus
e fiftyone
. È possibile installarli eseguendo i seguenti comandi:
python3 -m pip install pymilvus fiftyone torch torchvision
Ricetta di base
Il flusso di lavoro di base per usare Milvus per creare un indice di similarità sui dataset di FiftyOne e usarlo per interrogare i dati è il seguente:
- Caricare un set di dati in FiftyOne
- Calcolare le incorporazioni vettoriali per i campioni o le patch del dataset, oppure selezionare un modello da utilizzare per generare le incorporazioni.
- Utilizzare il metodo
compute_similarity()
per generare un indice di somiglianza Milvus per i campioni o le patch di oggetti in un set di dati, impostando il parametrobackend="milvus"
e specificando unbrain_key
a scelta. - Utilizzare questo indice di somiglianza Milvus per interrogare i dati con
sort_by_similarity()
. - Se si desidera, cancellare l'indice.
Procedure
L'esempio seguente illustra il flusso di lavoro sopra descritto.
1. Caricare un set di dati in FiftyOne e calcolare le incorporazioni per i campioni.
Il codice seguente utilizza il set di immagini campione fornito da FiftyOne per dimostrare l'integrazione. È possibile preparare il proprio set di immagini facendo riferimento a questo articolo.
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. Eseguire ricerche di somiglianza della visione
È ora possibile utilizzare l'indice di similarità Milvus per effettuare ricerche di similarità visiva sul set di dati.
# 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. Cancellare l'indice
Se non si ha più bisogno dell'indice di similarità Milvus, è possibile eliminarlo utilizzando il codice seguente:
# Step 5: Delete the index
milvus_index.delete()
Utilizzare il backend di Milvus
Per impostazione predefinita, chiamando compute_similarity()
o sort_by_similarity()
utilizza un backend sklearn.
Per utilizzare il backend Milvus, è sufficiente impostare il parametro opzionale backend di compute_similarity()
a "milvus"
:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
In alternativa, è possibile configurare in modo permanente FiftyOne per utilizzare il backend Milvus impostando la seguente variabile d'ambiente:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
o impostando il parametro default_similarity_backend
della configurazione del cervello che si trova all'indirizzo ~/.fiftyone/brain_config.json
:
{
"default_similarity_backend": "milvus"
}
Autenticazione
Se si utilizza un server Milvus personalizzato, è possibile fornire le proprie credenziali in vari modi.
Variabili d'ambiente (consigliate)
Il modo consigliato per configurare le credenziali di Milvus è quello di memorizzarle nelle variabili d'ambiente mostrate di seguito, alle quali FiftyOne accede automaticamente ogni volta che viene effettuata una connessione a 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
Configurazione del cervello di FiftyOne
È anche possibile memorizzare le credenziali nella configurazione del cervello all'indirizzo ~/.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"
}
}
}
Si noti che questo file non esiste finché non lo si crea.
Argomenti delle parole chiave
È possibile fornire manualmente le proprie credenziali Milvus come argomenti di parole chiave ogni volta che si chiamano metodi come compute_similarity()
che richiedono connessioni a 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",
)
Si noti che, quando si utilizza questa strategia, è necessario fornire manualmente le credenziali quando si carica un indice in un secondo momento tramite 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",
)
Parametri di configurazione di Milvus
Il backend Milvus supporta una serie di parametri di query che possono essere utilizzati per personalizzare le query di similarità. Questi parametri includono:
nome_raccolta(Nessuno): il nome della raccolta Milvus da utilizzare o creare. Se non viene fornito nulla, verrà creata una nuova collezione.
metrica ("dotproduct"): la metrica della distanza di incorporazione da usare quando si crea un nuovo indice. I valori supportati sono (
"dotproduct"
,"euclidean"
)consistency_level ("Session"): il livello di coerenza da utilizzare. I valori supportati sono (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)
Per informazioni dettagliate su questi parametri, consultare la documentazione sull'autenticazione Milvus e la documentazione sui livelli di coerenza Milvus.
È possibile specificare questi parametri tramite una qualsiasi delle strategie descritte nella sezione precedente. Ecco un esempio di configurazione del cervello che include tutti i parametri disponibili:
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
Tuttavia, in genere questi parametri vengono passati direttamente a compute_similarity()
per configurare un nuovo indice specifico:
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
Gestire le esecuzioni del cervello
FiftyOne offre una serie di metodi che possono essere utilizzati per gestire le esecuzioni del cervello.
Ad esempio, è possibile chiamare list_brain_runs()
per vedere le chiavi cerebrali disponibili su un set di dati:
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,
)
Oppure, si può usare get_brain_info()
per recuperare informazioni sulla configurazione di un'esecuzione cerebrale:
info = dataset.get_brain_info(brain_key)
print(info)
Usare load_brain_results()
per caricare l'istanza SimilarityIndex
per un'esecuzione cerebrale.
Si può usare rename_brain_run()
per rinominare la chiave cerebrale associata a un'esecuzione di risultati di somiglianza esistente:
dataset.rename_brain_run(brain_key, new_brain_key)
Infine, si può usare delete_brain_run()
per eliminare un'esecuzione cerebrale:
dataset.delete_brain_run(brain_key)
La chiamata delete_brain_run()
elimina solo il record della corsa cerebrale dal dataset FiftyOne; non elimina la collezione Milvus associata, che può essere eseguita come segue:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Per un comune flusso di lavoro di ricerca vettoriale su un set di dati FiftyOne utilizzando il backend Milvus, vedere Esempi qui.