Realice búsquedas de visión con Milvus y FiftyOne
FiftyOne es una herramienta de código abierto para construir conjuntos de datos de alta calidad y modelos de visión por ordenador. Esta guía le ayuda a integrar las capacidades de búsqueda de similitud de Milvus en FiftyOne, permitiéndole realizar búsquedas de visión en sus propios conjuntos de datos.
FiftyOne proporciona una API para crear colecciones Milvus, cargar vectores y ejecutar consultas de similitud, tanto mediante programación en Python como a través de apuntar y hacer clic en la aplicación. La demostración en esta página se centra en la integración programática.
Requisitos previos
Antes de comenzar, asegúrese de tener lo siguiente:
- Un servidor Milvus en ejecución.
- Un entorno Python con
pymilvus
yfiftyone
instalados. - Un conjunto de datos de imágenes para buscar.
Requisitos de instalación
Para este ejemplo, vamos a utilizar pymilvus
y fiftyone
. Puede instalarlos ejecutando los siguientes comandos:
python3 -m pip install pymilvus fiftyone torch torchvision
Receta básica
El flujo de trabajo básico para utilizar Milvus para crear un índice de similitud en sus conjuntos de datos FiftyOne y utilizarlo para consultar sus datos es el siguiente:
- Cargar un conjunto de datos en FiftyOne
- Calcule incrustaciones vectoriales para muestras o parches en su conjunto de datos, o seleccione un modelo para utilizar la generación de incrustaciones.
- Utilice el método
compute_similarity()
para generar un índice de similitud Milvus para las muestras o los parches de objetos de un conjunto de datos estableciendo el parámetrobackend="milvus"
y especificando unbrain_key
de su elección. - Utilice este índice de similitud Milvus para consultar sus datos con
sort_by_similarity()
. - Si lo desea, elimine el índice.
Procedimientos
El siguiente ejemplo muestra el flujo de trabajo anterior.
1. Cargar un conjunto de datos en FiftyOne y calcular las incrustaciones de las muestras.
El siguiente código utiliza el conjunto de imágenes de muestra proporcionado por FiftyOne para demostrar la integración. Puede preparar su propio conjunto de imágenes consultando este artículo.
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. Realizar búsquedas de similitud de visión
Ahora puede utilizar el índice de similitud de Milvus para realizar búsquedas de similitud de visión en su conjunto de datos.
# 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. Eliminar el índice
Si ya no necesita el índice de similitud de Milvus, puede eliminarlo utilizando el siguiente código:
# Step 5: Delete the index
milvus_index.delete()
Utilizar el backend de Milvus
Por defecto, al llamar a compute_similarity()
o sort_by_similarity()
utilizará un backend sklearn.
Para utilizar el backend Milvus, basta con establecer el parámetro opcional backend de compute_similarity()
a "milvus"
:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
Alternativamente, puede configurar permanentemente FiftyOne para utilizar el backend Milvus estableciendo la siguiente variable de entorno:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
o estableciendo el parámetro default_similarity_backend
de su brain config ubicado en ~/.fiftyone/brain_config.json
:
{
"default_similarity_backend": "milvus"
}
Autenticación
Si está utilizando un servidor Milvus personalizado, puede proporcionar sus credenciales de varias maneras.
Variables de entorno (recomendado)
La forma recomendada de configurar sus credenciales Milvus es almacenarlas en las variables de entorno que se muestran a continuación, a las que FiftyOne accede automáticamente cada vez que se establece una conexión con 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
Configuración de FiftyOne Brain
También puede almacenar sus credenciales en la configuración de su cerebro en ~/.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"
}
}
}
Tenga en cuenta que este archivo no existirá hasta que usted lo cree.
Argumentos de palabras clave
Puede proporcionar manualmente sus credenciales de Milvus como argumentos de palabra clave cada vez que llame a métodos como compute_similarity()
que requieren conexiones 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",
)
Tenga en cuenta que, cuando utilice esta estrategia, deberá proporcionar manualmente las credenciales cuando cargue un índice posteriormente a través de 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",
)
Parámetros de configuración de Milvus
El backend de Milvus admite una variedad de parámetros de consulta que pueden utilizarse para personalizar sus consultas de similitud. Estos parámetros incluyen:
collection_name(None): el nombre de la colección Milvus a utilizar o crear. Si no se proporciona ninguno, se creará una nueva colección
métrica ("dotproduct"): la métrica de distancia de incrustación que se utilizará al crear un nuevo índice. Los valores admitidos son (
"dotproduct"
,"euclidean"
)consistency_level ("Sesión"): el nivel de consistencia a utilizar. Los valores admitidos son (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)
Para obtener información detallada sobre estos parámetros, consulte la documentación sobre autenticación de Milvus y la documentación sobre niveles de consistencia de Milvus.
Puede especificar estos parámetros mediante cualquiera de las estrategias descritas en la sección anterior. Aquí hay un ejemplo de una configuración de cerebro que incluye todos los parámetros disponibles:
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
Sin embargo, normalmente estos parámetros se pasan directamente a compute_similarity()
para configurar un nuevo índice específico:
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
Gestionar ejecuciones del cerebro
FiftyOne proporciona una variedad de métodos que puede utilizar para gestionar las ejecuciones del cerebro.
Por ejemplo, puede llamar a list_brain_runs()
para ver las claves de cerebro disponibles en un conjunto de datos:
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,
)
O puede utilizar get_brain_info()
para recuperar información sobre la configuración de una ejecución del cerebro:
info = dataset.get_brain_info(brain_key)
print(info)
Utilice load_brain_results()
para cargar la instancia SimilarityIndex
instancia de una ejecución cerebral.
Puede utilizar rename_brain_run()
para renombrar la clave de cerebro asociada a una ejecución de resultados de similitud existente:
dataset.rename_brain_run(brain_key, new_brain_key)
Por último, puede utilizar delete_brain_run()
para eliminar una ejecución del cerebro:
dataset.delete_brain_run(brain_key)
Si llama a delete_brain_run()
sólo borra el registro de la ejecución cerebral de su conjunto de datos FiftyOne; no borrará ninguna colección Milvus asociada, lo que puede hacer como sigue:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Para un flujo de trabajo de búsqueda vectorial común en un conjunto de datos FiftyOne utilizando el backend Milvus, vea Ejemplos aquí.