Saltar para o conteúdo

Exemplo de exploração de COV

Bem-vindo ao caderno da API do Ultralytics Explorer! Este bloco de notas serve como ponto de partida para explorar os vários recursos disponíveis para o ajudar a começar a utilizar Ultralytics para explorar os seus conjuntos de dados utilizando o poder da pesquisa semântica. Pode utilizar utilitários prontos a usar que lhe permitem examinar tipos específicos de etiquetas utilizando a pesquisa vetorial ou mesmo consultas SQL.

Tentar yolo explorer alimentado pela API Explorer

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

Nota da Comunidade ⚠️

A partir de ultralytics>=8.3.10, o suporte do Ultralytics explorer foi descontinuado. Mas não se preocupe! Pode agora aceder a funcionalidades semelhantes e até melhoradas através do Ultralytics HUBA nossa plataforma intuitiva sem código foi concebida para otimizar o seu fluxo de trabalho. Com o Ultralytics HUB, pode continuar a explorar, visualizar e gerir os seus dados sem esforço, tudo sem escrever uma única linha de código. Não deixe de conferir e tirar proveito de seus poderosos recursos!

Configuração

Instalação do pip ultralytics e dependências e verificar o software e o hardware.

%pip install ultralytics[explorer] openai
yolo checks

Utilize o poder da pesquisa de semelhança de vectores para encontrar os pontos de dados semelhantes no seu conjunto de dados juntamente com a sua distância no espaço de incorporação. Basta criar uma tabela de incorporação para um determinado par de modelo e conjunto de dados. Ela só é necessária uma vez e é reutilizada automaticamente.

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

Uma vez criada a tabela de ligações, pode executar a pesquisa semântica de uma das seguintes formas:

  • Num 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 esteja no conjunto de dados - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) No caso de múltiplas entradas, é utilizado o agregado das suas incorporações.

Obtém um dataframe pandas com o número limite de pontos de dados mais semelhantes à entrada, juntamente com a sua distância no espaço de incorporação. Pode utilizar este conjunto de dados para efetuar mais filtragem

Tabela de pesquisa de semelhanças

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

Pode utilizar o também traçar as amostras semelhantes diretamente utilizando o plot_similar util

Pesquisa de similaridade imagem 1

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

Pesquisa de similaridade imagem 2

Ask AI: pesquisar ou filtrar com linguagem natural

Pode solicitar ao objeto Explorer o tipo de pontos de dados que pretende ver, e este tentará devolver um quadro de dados com esses pontos. Como ele é alimentado por LLMs, nem sempre acerta. Nesse caso, ele retornará None.

Perguntar a uma mesa

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

para desenhar estes resultados, pode utilizar plot_query_result Exemplo de utilização:

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

Ask ai imagem 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)

Executar consultas SQL no seu conjunto de dados

Por vezes, pode querer investigar um determinado tipo de entradas no seu conjunto de dados. Para isso, o Explorer permite-lhe executar consultas SQL. Aceita qualquer um dos formatos:

  • As consultas que começam com "WHERE" selecionam automaticamente todas as colunas. Isto pode ser considerado como uma consulta abreviada
  • Também é possível escrever consultas completas onde se pode especificar quais as colunas a selecionar

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

  • Digamos que o seu modelo se esforça em imagens que têm humanos e cães. Pode escrever uma consulta como esta para selecionar os pontos que têm pelo menos 2 humanos E pelo menos um cão.

Pode combinar a consulta SQL e a pesquisa semântica para filtrar 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)

Tal como a pesquisa por semelhança, também tem um utilitário para traçar diretamente as consultas sql utilizando 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)

Trabalhar com embeddings Tabela (Avançado)

O Explorer funciona em LanceDB internamente. É possível aceder a esta tabela diretamente, utilizando Explorer.table e executar consultas não processadas, enviar pré e pós-filtros, etc.

table = exp.table
print(table.schema)

Executar queries¶ em bruto

A Pesquisa Vetorial encontra os vectores mais próximos da base de dados. Num sistema de recomendação ou num motor de busca, é possível encontrar produtos semelhantes aos que foram pesquisados. No LLM e noutras aplicações de IA, cada ponto de dados pode ser apresentado pelos embeddings gerados a partir de alguns modelos, devolvendo as caraterísticas mais relevantes.

Uma pesquisa num espaço vetorial de elevada dimensão consiste em encontrar os K-vizinhos mais próximos (KNN) do vetor de consulta.

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

  • L2
  • Cosseno
  • A pesquisa de similaridade do Dot Explorer utiliza o L2 por defeito. Você pode executar consultas em tabelas diretamente, ou usar o formato lance para construir utilitários personalizados para gerenciar conjuntos de dados. Mais detalhes sobre as operações de tabela disponíveis no LanceDB na documentação

Tabela de consultas brutas

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

Pode aceder ao embedding em bruto a partir 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

Um dos passos preliminares na análise de embeddings é traçá-los no espaço 2D através da redução da dimensionalidade. Vamos tentar um exemplo

Exemplo de diagrama 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 incorporações. O Explorer vem com um similarity_index funcionamento-

  • Tenta estimar a semelhança entre cada ponto de dados e o resto do conjunto de dados.
  • Para isso, conta quantas imagens incorporadas estão mais próximas do que max_dist da imagem atual no espaço de incorporação gerado, considerando top_k imagens semelhantes de cada vez.

Para um determinado conjunto de dados, modelo, max_dist & top_k o índice de similaridade, uma vez gerado, será reutilizado. No caso de o conjunto de dados ter mudado, ou se simplesmente precisar de gerar novamente o índice de similaridade, pode passar force=True. À semelhança da pesquisa vetorial e da pesquisa SQL, esta também inclui um utilitário que permite desenhá-la diretamente. Vejamos

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

na trama primeiro

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

Agora vamos ver o resultado 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 que pontos de dados têm uma contagem de semelhança superior a 30 e traçar imagens semelhantes a eles.

import numpy as np

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

Deverá ver algo como isto

similaridade-índice-imagem

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images
📅C riado há 2 meses ✏️ Atualizado há 2 meses

Comentários