Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
Pythonchevron-right

Gerenciar e fazer queries em dados visuais de forma eficiente com o MongoDB Atlas Vector Search e o FiftyOne

Jacob Marks5 min read • Published Aug 28, 2024 • Updated Aug 28, 2024
IAPython
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Pesquisa de similaridade de imagem no aplicativo FiftyOne usando o backend do MongoDB Atlas Vector Search.
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 que é o FiftyOne?

Filtrando um conjunto de dados de imagem de demonstração por rótulo de classe e pontuação de confiança de previsão no aplicativo FiftyOne.
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:
1pip 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:
1import fiftyone as fo
2import fiftyone.zoo as foz
3
4## load dataset from zoo
5dataset = foz.load_zoo_dataset("quickstart")
6
7## launch the app
8session = fo.launch_app(dataset)
💡Também é muito fácil carregar seus dados.
Depois de ter uma instânciafiftyone.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:
1from fiftyone import ViewField as F
2
3view = 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
2print(view)
1Dataset: quickstart
2Media type: image
3Num samples: 14
4Sample 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)
12View 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
2print(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
3stage = 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])
14view = dataset.add_stage(stage)

Vector Search com FiftyOne e MongoDB Atlas

Pesquisa de imagens com texto no aplicativo FiftyOne usando incorporações vetoriais multimodais e um backend do MongoDB Atlas Vector Search.
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.

Conectando o FiftyOne e o MongoDB Atlas

Para começar, primeiro configure um MongoDB Atlas cluster:
1export FIFTYONE_DATABASE_NAME=fiftyone
2export 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:
1export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=mongodb

Gerando o índice de similaridade

Você pode então criar um índice de similaridadeem seu conjunto de dados (ou visualização do conjunto de dados) usando o métodocompute_similarity() do FiftyOne Cloud . Para fazer isso, você pode fornecer qualquer um dos seguintes:
  1. Uma matriz de embeddings para suas amostras
  2. O nome de um campo em suas amostras que contém embeddings
  3. O nome de um modelo do FiftyOne Model Zoo (CLIP, OpenCLIP, DINOv2, etc.), para usar para gerar embeddings
  4. Uma instânciafiftyone.Modela ser usada para gerar embeddings
  5. Um modelo de Face Abraços transformers para usar para gerar incorporações
Para obter mais informações sobre essas opções, consulte a documentação de compute_similarity().
1import fiftyone.brain as fob
2fob.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.

Classificação por similaridade

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
2query = dataset.skip(2).first().id
3
4## get 25 most similar images
5view = dataset.sort_by_similarity(query, k=25, brain_key="your_key")
6session = 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:
Pesquisa por similaridade no aplicativo FiftyOne usando incorporações vetoriais e indexação com um backend do MongoDB Atlas Vector Search.
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:
1query = dataset.first().id
2
3# shuffle,
4# then vector search against 1st sample,
5# finally skip top 5 restuls
6view = 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:
1query = "animals"
2
3view = dataset.sort_by_similarity(query, k = 25)
4session = fo.launch_app(view)
Ou no aplicativo FiftyOne por meio do botão com o ícone da lupa:
Ícone da lupa no FiftyOne

Conclusão

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!
👋Experimente FiftyOne gratuitamente em seu navegador em try.fiftyone.ai!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Assine o MongoDB Change Streams via WebSockets


Sep 23, 2022 | 3 min read
Tutorial

Comece a usar o MongoDB Atlas sem servidor, AWS CDK e AWS sem servidor


Aug 09, 2024 | 18 min read
Tutorial

Como usar o PyMongo para conectar o MongoDB Atlas ao AWS Lambda


Apr 02, 2024 | 6 min read
Tutorial

Usando os embeddings mais recentes da OpenAI em um sistema RAG com o MongoDB


Jul 01, 2024 | 15 min read
Sumário
  • O que é o FiftyOne?