Salta para o conteúdo

Ultralytics Explorador API

Introdução

Abre em Colab A API Explorer é uma API Python para explorar os seus conjuntos de dados. Suporta a filtragem e a pesquisa do seu conjunto de dados utilizando consultas SQL, pesquisa de semelhanças vectoriais e pesquisa semântica.



Observa: Ultralytics Visão geral da API do Explorer

Instalação

O Explorer depende de bibliotecas externas para algumas das suas funcionalidades. Estas são instaladas automaticamente aquando da sua utilização. Para instalar manualmente estas dependências, utiliza o seguinte comando:

pip install ultralytics[explorer]

Utilização

from ultralytics import Explorer

# Create an Explorer object
explorer = Explorer(data='coco128.yaml', model='yolov8n.pt')

# Create embeddings for your dataset
explorer.create_embeddings_table()

# Search for similar images to a given image/images
dataframe = explorer.get_similar(img='path/to/image.jpg')

# Or search for similar images to a given index/indices
dataframe = explorer.get_similar(idx=0)

Nota

A tabela de embeddings para um determinado conjunto de dados e par de modelos é criada apenas uma vez e reutilizada. Estes utilizam o LanceDB, que é dimensionado no disco, para que possas criar e reutilizar embeddings para grandes conjuntos de dados como o COCO sem ficar sem memória.

No caso de quereres forçar a atualização da tabela de ligações, podes passar force=True para create_embeddings_table método. Podes aceder diretamente ao objeto de tabela LanceDB para efetuar análises avançadas. Sabe mais sobre isso em Trabalhar com secção de tabela

A pesquisa por semelhança é uma técnica para encontrar imagens semelhantes a uma determinada imagem. Baseia-se na ideia de que as imagens semelhantes terão embeddings semelhantes. Assim que a tabela de embeddings estiver construída, podes executar a pesquisa semântica de qualquer uma das seguintes formas:

  • Num determinado índice ou lista de índices no conjunto de dados: exp.get_similar(idx=[1,10], limit=10)
  • Em qualquer imagem ou 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, é utilizado o agregado das suas incorporações.

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

Pesquisa semântica

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(
                        img=['https://ultralytics.com/images/bus.jpg',
                             'https://ultralytics.com/images/bus.jpg'],
                        limit=10
                        )
print(similar.head())
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(idx=1, limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(idx=[1,10], limit=10)
print(similar.head())

Traçar imagens semelhantes

Também podes desenhar as imagens semelhantes utilizando o plot_similar método. Este método recebe os mesmos argumentos que o método get_similar e plota as imagens semelhantes numa grelha.

Traçar imagens semelhantes

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
plt.show()
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(idx=1, limit=10)
plt.show()

2. Pergunta à IA (consulta de linguagem natural)

Isto permite-te escrever como queres filtrar o teu conjunto de dados utilizando linguagem natural. Não precisas de saber escrever consultas SQL. O nosso gerador de consultas com IA faz isso automaticamente. Por exemplo, podes dizer - "mostra-me 100 imagens com exatamente uma pessoa e 2 cães. Pode haver outros objectos também" e ele vai gerar internamente a consulta e mostrar-te os resultados. Nota: Isto funciona usando LLMs, por isso os resultados são probabilísticos e podem errar algumas vezes

Pergunta à IA

from ultralytics import Explorer
from ultralytics.data.explorer import plot_query_result


# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.ask_ai("show me 100 images with exactly one person and 2 dogs. There can be other objects too")
print(df.head())

# plot the results
plt = plot_query_result(df)
plt.show()

3. Consulta SQL

Podes executar consultas SQL no teu conjunto de dados utilizando a função sql_query método. Este método recebe uma consulta SQL como entrada e devolve um quadro de dados pandas com os resultados.

Consulta SQL

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%'")
print(df.head())

Representação gráfica dos resultados de consultas SQL

Também podes desenhar os resultados de uma consulta SQL utilizando a função plot_sql_query método. Este método recebe os mesmos argumentos que o método sql_query e traça os resultados numa grelha.

Representação gráfica dos resultados de consultas SQL

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

# plot the SQL Query
exp.plot_sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%' LIMIT 10")

4. Avançado - Trabalhar com a tabela Embeddings

Também podes trabalhar diretamente com a tabela de objectos incorporados. Uma vez criada a tabela de embeddings, podes aceder-lhe utilizando o comando Explorer.table

O Explorer funciona em LanceDB internamente. Podes aceder a esta tabela diretamente, utilizando Explorer.table e executa consultas não processadas, envia pré e pós-filtros, etc.

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

Aqui estão alguns exemplos do que podes fazer com a tabela:

Obtém Embeddings em bruto

Exemplo

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

embeddings = table.to_pandas()["vector"]
print(embeddings)

Consulta avançada com filtros pré e pós

Exemplo

from ultralytics import Explorer

exp = Explorer(model="yolov8n.pt")
exp.create_embeddings_table()
table = exp.table

# Dummy embedding
embedding = [i for i in range(256)]
rs = table.search(embedding).metric("cosine").where("").limit(10)

Criar índice vetorial

Quando utilizas grandes conjuntos de dados, também podes criar um índice vetorial dedicado para uma consulta mais rápida. Isso é feito usando o create_index na tabela LanceDB.

table.create_index(num_partitions=..., num_sub_vectors=...)

Encontra mais detalhes sobre os tipos de índices vectoriais disponíveis e os parâmetros aqui No futuro, adicionaremos suporte para a criação de índices vectoriais diretamente a partir da API Explorer.

5. Aplicações de embeddings

Podes utilizar a tabela de embeddings para efetuar uma variedade de análises exploratórias. Aqui estão alguns exemplos:

Índice de semelhança

O Explorer vem com um similarity_index operação:

  • Tenta estimar a semelhança entre cada ponto de dados e o resto do conjunto de dados.
  • Faz isso contando quantos embeddings de imagem estão mais próximos do que max_dist para a imagem atual no espaço de incorporação gerado, considerando top_k imagens semelhantes de cada vez.

Devolve um quadro de dados pandas com as seguintes colunas:

  • idx: Índice da imagem no conjunto de dados
  • im_file: Caminho para o ficheiro de imagem
  • count: Número de imagens no conjunto de dados que estão mais próximas do que max_dist para a imagem atual
  • sim_im_files: Lista de caminhos para o count imagens semelhantes

Dica

Para um determinado conjunto de dados, modela, max_dist & top_k o índice de similaridade, uma vez gerado, será reutilizado. Caso o teu conjunto de dados tenha mudado, ou simplesmente precises de gerar novamente o índice de similaridade, podes passar force=True.

Índice de semelhança

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()

sim_idx = exp.similarity_index()

Podes utilizar o índice de semelhança para criar condições personalizadas para filtrar o conjunto de dados. Por exemplo, podes filtrar imagens que não são semelhantes a qualquer outra imagem no conjunto de dados utilizando o seguinte código:

import numpy as np

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

Visualiza o espaço de incorporação

Também podes visualizar o espaço de incorporação utilizando a ferramenta de plotagem da tua escolha. Por exemplo, aqui tens um exemplo simples utilizando o matplotlib:

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 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 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()

Começa a criar os teus próprios relatórios de exploração de conjuntos de dados CV utilizando a API Explorer. Para te inspirares, consulta o

Aplicações criadas com o Ultralytics Explorer

Experimenta a nossa demonstração GUI baseada na API Explorer

Em breve

  • [Une etiquetas específicas de conjuntos de dados. Exemplo - Importar tudo person etiquetas da COCO e car Etiquetas de Cityscapes
  • [Remove as imagens que têm um índice de semelhança superior ao limiar dado
  • [Mantém automaticamente os novos conjuntos de dados após a fusão/remoção de entradas
  • [Visualizações avançadas de conjuntos de dados


Criado em 2024-01-07, Atualizado em 2024-02-11
Autores: 0xSynapse (1), glenn-jocher (6), chr043416@gmail.com (2), AyushExel (2)

Comentários