Ir para o conteúdo

Exemplo de Exploração VOC

Bem-vindo ao notebook da API Ultralytics Explorer! Este notebook serve como ponto de partida para explorar os vários recursos disponíveis para ajudá-lo a começar a usar o Ultralytics para explorar seus conjuntos de dados com o poder da pesquisa semântica. Pode usar utilitários prontos para uso que permitem examinar tipos específicos de rótulos usando pesquisa vetorial ou até mesmo consultas SQL.

Experimente yolo explorer desenvolvido por Explorer API

Simplesmente pip install ultralytics e execute yolo explorer no seu terminal para executar consultas personalizadas e pesquisa semântica em seus conjuntos de dados diretamente no seu navegador!

Nota da Comunidade ⚠️

A partir de ultralytics>=8.3.10, o suporte ao Ultralytics Explorer foi descontinuado. Mas não se preocupe! Agora você pode acessar funcionalidades semelhantes e até aprimoradas através de Ultralytics HUB, a nossa plataforma intuitiva sem código, projetada para otimizar o seu fluxo de trabalho. Com o Ultralytics HUB, você pode continuar explorando, visualizando e gerenciando seus dados sem esforço, tudo isso sem escrever uma única linha de código. Não deixe de conferir e aproveitar seus recursos poderosos! 🚀

Configuração

Pip install ultralytics e dependências e verifique o software e o hardware.

%pip install ultralytics[explorer] openai
yolo checks

Utilize o poder da busca de similaridade vetorial para encontrar os pontos de dados semelhantes em seu conjunto de dados, juntamente com sua distância no espaço de embedding. Basta criar uma tabela de embeddings para o par conjunto de dados-modelo fornecido. Isso só é necessário uma vez e é reutilizado automaticamente.

exp = Explorer("VOC.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

Depois que a tabela de embeddings é construída, você pode executar a pesquisa semântica de qualquer uma das seguintes maneiras:

  • Em um determinado índice / lista de índices no conjunto de dados, como - exp.get_similar(idx=[1,10], limit=10)
  • Em qualquer imagem/lista de imagens que não estejam no conjunto de dados - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) No caso de múltiplas entradas, o agregado de seus embeddings é usado.

Você obtém um dataframe pandas com o número limite de pontos de dados mais similares à entrada, juntamente com sua distância no espaço de embedding. Você pode usar este conjunto de dados para realizar filtragens adicionais.

Tabela de pesquisa de similaridade

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()

Você também pode plotar as amostras semelhantes diretamente usando o plot_similar util

Imagem 1 da pesquisa de similaridade

exp.plot_similar(idx=6500, limit=20)
exp.plot_similar(idx=[100, 101], limit=10)  # Can also pass list of idxs or imgs

exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False)  # Can also pass external images

Imagem 2 da pesquisa de similaridade

Ask AI: Pesquise ou filtre com Linguagem Natural

Você pode solicitar ao objeto Explorer os tipos de pontos de dados que deseja ver, e ele tentará retornar um dataframe com eles. Como é alimentado por LLMs, nem sempre acerta. Nesse caso, retornará None.

Tabela Ask ai

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)

para plotar esses resultados, você pode usar plot_query_result Exemplo de util:

plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)

Ask ai image 1

# plot
from PIL import Image

from ultralytics.data.explorer import plot_query_result

plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)

Execute consultas SQL em seu Conjunto de Dados

Às vezes, você pode querer investigar um determinado tipo de entradas em seu conjunto de dados. Para isso, o Explorer permite que você execute consultas SQL. Ele aceita qualquer um dos formatos:

  • Consultas que começam com "WHERE" selecionarão automaticamente todas as colunas. Isso pode ser considerado como uma consulta abreviada
  • Você também pode escrever consultas completas onde pode especificar quais colunas selecionar

Isso pode ser usado para investigar o desempenho do modelo e pontos de dados específicos. Por exemplo:

  • Digamos que seu modelo tenha dificuldades com imagens que têm humanos e cachorros. Você pode escrever uma consulta como esta para selecionar os pontos que têm pelo menos 2 humanos E pelo menos um cachorro.

Você pode combinar consulta SQL e pesquisa semântica para filtrar para um tipo específico de resultados

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

Tabela de consultas SQL

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)

Assim como a pesquisa de similaridade, você também obtém um utilitário para plotar diretamente as consultas SQL usando exp.plot_sql_query

Consultas SQL imagem 1

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

Tabela de trabalho com embeddings (Avançado)

O Explorer funciona em LanceDB tabelas internamente. Você pode acessar esta tabela diretamente, usando Explorer.table objetos e executar consultas brutas, efetuar push down de pré e pós-filtros, etc.

table = exp.table
print(table.schema)

Executar consultas brutas¶

A Pesquisa Vetorial encontra os vetores mais próximos do banco de dados. Em um sistema de recomendação ou mecanismo de busca, você pode encontrar produtos semelhantes ao que você pesquisou. Em LLM e outras aplicações de IA, cada ponto de dados pode ser apresentado pelas incorporações geradas a partir de alguns modelos, ele retorna os recursos mais relevantes.

Uma busca no espaço vetorial de alta dimensão, é encontrar os K-Vizinhos Mais Próximos (KNN) do vetor de consulta.

Métrica. No LanceDB, uma Métrica é a forma de descrever a distância entre um par de vetores. Atualmente, ele suporta as seguintes métricas:

  • L2
  • Coseno
  • A pesquisa de similaridade do Dot Explorer usa L2 por padrão. Você pode executar consultas diretamente nas tabelas ou usar o formato lance para criar utilitários personalizados para gerenciar conjuntos de dados. Mais detalhes sobre as operações de tabela LanceDB disponíveis nos documentos.

Raw-queries-table

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()
df = table.to_pandas()
pa_table = table.to_arrow()

Trabalhar com Embeddings

Você pode acessar o embedding bruto da Tabela lancedb e analisá-lo. Os embeddings de imagem são armazenados na coluna vector

import numpy as np

embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)

Gráfico de dispersão

Uma das etapas preliminares na análise de embeddings é plotá-los em espaço 2D por meio da redução de dimensionalidade. Vamos tentar um exemplo

Exemplo de Gráfico de Dispersão

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA  # pip install scikit-learn

# Reduce dimensions using PCA to 3 components for visualization in 3D
pca = PCA(n_components=3)
reduced_data = pca.fit_transform(embeddings)

# Create a 3D scatter plot using Matplotlib's Axes3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")

# Scatter plot
ax.scatter(reduced_data[:, 0], reduced_data[:, 1], reduced_data[:, 2], alpha=0.5)
ax.set_title("3D Scatter Plot of Reduced 256-Dimensional Data (PCA)")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
ax.set_zlabel("Component 3")

plt.show()

Índice de Similaridade

Aqui está um exemplo simples de uma operação alimentada pela tabela de embeddings. O Explorer vem com um similarity_index operação-

  • Ele tenta estimar o quão similar cada ponto de dados é com o resto do conjunto de dados.
  • Ele faz isso contando quantos embeddings de imagem estão mais próximos do que max_dist da imagem atual no espaço de embedding gerado, considerando top_k imagens semelhantes por vez.

Para um determinado dataset, modelo, max_dist & top_k o índice de similaridade, uma vez gerado, será reutilizado. Caso seu conjunto de dados tenha sido alterado ou você simplesmente precise regenerar o índice de similaridade, você pode passar force=True. Semelhante à pesquisa vetorial e SQL, isto também vem com um utilitário para plotá-lo diretamente. Vamos olhar

sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01)
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

Índice de Similaridade

no plot primeiro

exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

Agora vamos dar uma olhada na saída da operação

sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)

sim_idx

Vamos criar uma consulta para ver quais pontos de dados têm uma contagem de similaridade de mais de 30 e plotar imagens semelhantes a eles.

import numpy as np

sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]

Você deverá ver algo parecido com isto

similarity-index-image

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images


📅 Criado há 6 meses ✏️ Atualizado há 25 dias

Comentários