Gerenciar e fazer queries em dados visuais de forma eficiente com o MongoDB Atlas Vector Search e o FiftyOne
Avalie esse Tutorial
A grande maioria dos dados do mundo não é estruturada, estando aninhada em imagens, vídeos, arquivos de áudio e texto. Se você está desenvolvendo soluções de negócios específicas para aplicativos ou tentando treinar um modelo de aprendizado de máquina de última geração, entender e extrair insights de dados não estruturados é mais importante do que nunca.
Sem as ferramentas certas, interpretar recursos em dados não estruturados pode parecer procurar uma aba no palheiro. Felizmente, a integração entre o FiftyOne e o MongoDB Atlas permite o processamento e a análise de dados visuais com eficiência incomparável!
Neste post, mostraremos como usar o FiftyOne e o MongoDB Atlas Vector Search para simplificar seus fluxos de trabalho focados em dados e interagir com seus dados visuais como nunca antes.
O FiftyOne é o principal conjunto deferramentas de código aberto para a curadoria e visualização de dados não estruturados, criado sobre o MongoDB. Ele aproveita a natureza não relacional do MongoDB para fornecer uma interface intuitiva para trabalhar com conjuntos de dados que consistem em imagens, vídeos, cloud, PDFs e muito mais.
Você pode instalar o FiftyOne a partir do PyPi:
1 pip install fiftyone
A estrutura de dados principal do FiftyOne é o Dataset, que consiste em amostras – collection de rótulos, metadados e outros atributos associados a um arquivo de mídia. Você pode acessar, consultar e executar cálculos nesses dados de forma programática, com o kit de desenvolvimento de software FiftyOne Python, ou visualmente por meio do aplicativo FiftyOne.
Como exemplo ilustrativo, trabalharemos com o conjunto de dadosQuickstart, que podemos carregar do FiftyOne Dataset Zoo:
1 import fiftyone as fo 2 import fiftyone.zoo as foz 3 4 ## load dataset from zoo 5 dataset = foz.load_zoo_dataset("quickstart") 6 7 ## launch the app 8 session = fo.launch_app(dataset)
Depois de ter uma instância
fiftyone.Dataset
, você pode criar uma visualização em seu conjunto de dados (DatasetView
) aplicando estágios de visualização. Esses estágios de visualização permitem executar operações comuns como filtragem, correspondência, classificação e seleção usando atributos arbitrários em suas amostras.Para isolar programaticamente todas as predições de alta confiança de um
airplane
, por exemplo, poderíamos executar:1 from fiftyone import ViewField as F 2 3 view = dataset.filter_labels( 4 "predictions", 5 (F("label") == "airplane") & (F("confidence") > 0.8) 6 )
Observe que isso obtém o mesmo resultado que a filtragem baseada em UI no último Gif.
Essa funcionalidade de query é incrivelmente poderosa. Para obter uma lista completa dos estágios de visualização compatíveis, consulte esta folha de dicas de estágiosde visualização. Além disso, essas operações são dimensionadas facilmente para bilhões de amostras. Como? Simplificando, eles são construídos sobre aggregation pipelines do MongoDB!
Ao imprimir o
DatasetView
, você pode visualizar um resumo da aggregation aplicada em "View stages ":1 # view the dataset and summary 2 print(view)
1 Dataset: quickstart 2 Media type: image 3 Num samples: 14 4 Sample fields: 5 id: fiftyone.core.fields.ObjectIdField 6 filepath: fiftyone.core.fields.StringField 7 tags: fiftyone.core.fields.ListField(fiftyone.core.fields.StringField) 8 metadata: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.metadata.ImageMetadata) 9 ground_truth: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Detections) 10 uniqueness: fiftyone.core.fields.FloatField 11 predictions: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Detections) 12 View stages: 13 1. FilterLabels(field='predictions', filter={'$and': [{...}, {...}]}, only_matches=True, trajectories=False)
Podemos obter explicitamente o pipeline de agregação do MongoDB quando criamos diretamente com o método
_pipeline()
:1 ## Inspect the MongoDB agg pipeline 2 print(view._pipeline())
1 [{'$addFields': {'predictions.detections': {'$filter': {'input': '$predictions.detections', 2 'cond': {'$and': [{'$eq': ['$$this.label', 'airplane']}, 3 {'$gt': ['$$this.confidence', 0.8]}]}}}}}, 4 {'$match': {'$expr': {'$gt': [{'$size': {'$ifNull': ['$predictions.detections', 5 []]}}, 6 0]}}}]
Você também pode inspecionar o documento MongoDB subjacente para uma amostra com o método to_mongo().
Você pode até mesmo criar um DatasetView aplicando um pipeline de agregação MongoDB diretamente ao seu conjunto de dados usando o estágio de exibição mongo e o método add_stage():
1 # Sort by the number of objects in the `ground_truth` field 2 3 stage = fo.Mongo([ 4 { 5 "$addFields": { 6 "_sort_field": { 7 "$size": {"$ifNull": ["$ground_truth.detections", []]} 8 } 9 } 10 }, 11 {"$sort": {"_sort_field": -1}}, 12 {"$project": {"_sort_field": False}}, 13 ]) 14 view = dataset.add_stage(stage)
A pesquisa vetorial é uma técnica para indexar dados não estruturados, como texto e imagens, representando-os com vetores numéricos de alta dimensão chamados incorporações, gerados a partir de um modelo de aprendizado de máquina. Isso torna os dados não estruturados pesquisáveis, pois as entradas podem ser comparadas e atribuídas pontuações de similaridade com base no alinhamento entre seus vetores de incorporação. A indexação e a pesquisa desses vetores são realizadas com eficiência por bancos de dados vetoriais criados para fins específicos, como o MongoDB Atlas Vector Search.
A pesquisa vetorial é um ingrediente essencial em pipelines de geração aumentada de recuperação (RAG) para LLMs. Além disso, permite uma infinidade de aplicações visuais e multimodais na compreensão de dados, como encontrar imagens semelhantes, pesquisar objetos dentro de suas imagens e até mesmo pesquisar semanticamente seus dados visuais usando linguagem natural.
Agora, com a integração entre o FiftyOne e o MongoDB Atlas, está mais fácil do que nunca aplicar a pesquisa vetorial aos seus dados visuais! Quando você usa o FiftyOne e o MongoDB Atlas, suas queries tradicionais e queries de pesquisa vetorial são conectadas pela mesma infraestrutura de dados subjacente. Isso simplifica o desenvolvimento, deixando você com menos serviços para gerenciar e menos tempo gasto em tarefas tediosas de ETL. Não menos importante, quando você combina queries tradicionais com queries de pesquisa vetorial, o MongoDB pode otimizar a eficiência em todo o pipeline de agregação.
Para começar, primeiro configure um MongoDB Atlas cluster:
1 export FIFTYONE_DATABASE_NAME=fiftyone 2 export FIFTYONE_DATABASE_URI='mongodb+srv://$USERNAME:$PASSWORD@fiftyone.XXXXXX.mongodb.net/?retryWrites=true&w=majority'
Em seguida, defina o MongoDB Atlas como seu backend de pesquisa vetorial padrão:
1 export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=mongodb
Você pode então criar um índice de similaridadeem seu conjunto de dados (ou visualização do conjunto de dados) usando o método
compute_similarity()
do FiftyOne Cloud . Para fazer isso, você pode fornecer qualquer um dos seguintes:- Uma matriz de embeddings para suas amostras
- O nome de um campo em suas amostras que contém embeddings
- O nome de um modelo do FiftyOne Model Zoo (CLIP, OpenCLIP, DINOv2, etc.), para usar para gerar embeddings
- Uma instância
fiftyone.Model
a ser usada para gerar embeddings
1 import fiftyone.brain as fob 2 fob.compute_similarity( 3 dataset, 4 model="clip-vit-base32-torch", ### Use a CLIP model 5 brain_key="your_key", 6 embeddings='clip_embeddings', 7 )
Ao gerar o índice de similaridade, você também pode passar parâmetros de configuração para o índice do MongoDB Atlas Vector Search: o
index_name
e qual metric
usar para medir a similaridade entre vetores.Depois de executar
compute_similarity()
para gerar o índice, você pode classificar por similaridade usando o mecanismo do MongoDB Atlas Vector Search com o estágio de visualizaçãosort_by_similarity()
. No Python, você pode especificar a amostra (cuja imagem) deseja encontrar as imagens mais semelhantes passando o ID da amostra:1 ## get ID of third sample 2 query = dataset.skip(2).first().id 3 4 ## get 25 most similar images 5 view = dataset.sort_by_similarity(query, k=25, brain_key="your_key") 6 session = fo.launch_app(view)
Se você tiver somente um índice de similaridade no seu conjunto de dados, você não precisará especificar o
brain_key
.Podemos alcançar o mesmo resultado apenas com a interface do usuário selecionando uma imagem e pressionando o botão com o ícone da imagem na barra de menu:
A parte mais legal é que o
sort_by_similarity()
pode ser intercalado com outros estágios de visualização — sem necessidade de escrever scripts personalizados de pré e pós-processamento. Mantenha tudo na mesma linguagem de query e no mesmo modelo de dados subjacente. Veja um exemplo simples, só para ilustrar:1 query = dataset.first().id 2 3 # shuffle, 4 # then vector search against 1st sample, 5 # finally skip top 5 restuls 6 view = dataset.sort_by_similarity(query, k = 20).skip(5)
Mas espere, há muito mais! A integração do FiftyOne e do MongoDB Atlas Vector Search também oferece suporte nativo à pesquisa semanticamente de seus dados com queries de linguagem natural. Desde que o modelo que você especificar possa incorporar texto e imagens - pense em modelos CLIP, OpenCLIP e qualquer um dos modelos de classificação ou detecção de tiro zero da biblioteca de transformadores da Hugging Face - você poderá passar uma string como consulta:
1 query = "animals" 2 3 view = dataset.sort_by_similarity(query, k = 25) 4 session = fo.launch_app(view)
Ou no aplicativo FiftyOne por meio do botão com o ícone da lupa:
Filtrar, consultar e visualizar seus dados não estruturados não precisa ser difícil.
Juntos, o MongoDB e o FiftyOne oferecem uma maneira flexível e poderosa, mas ainda assim extraordinariamente simples e eficiente de aproveitar ao máximo seus dados visuais!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.