Перейти к содержанию

Пример исследования VOC

Добро пожаловать в блокнот Ultralytics API. В этом блокноте представлены ресурсы, доступные для изучения наборов данных с помощью семантического поиска, векторного поиска и SQL-запросов.

Попробовать yolo explorer (на базе Explorer API)

Установите ultralytics и запустите yolo explorer в терминале, чтобы запускать пользовательские запросы и семантический поиск в браузере.

Примечание сообщества ⚠️

По состоянию на ultralytics>=8.3.10, поддержка Ultralytics больше не поддерживается. Аналогичные (и расширенные) функции исследования наборов данных доступны в Ultralytics HUB.

Настройка

Установите ultralytics и требуемое зависимости, затем проверьте программное обеспечение и оборудование.

!uv pip install ultralytics[explorer] openai
yolo checks

Используйте возможности поиска векторного сходства, чтобы найти похожие точки данных в вашем наборе данных вместе с их расстоянием в пространстве вложений. Просто создайте таблицу вложений для данной пары набор данных-модель. Это нужно сделать только один раз, и она будет использоваться повторно автоматически.

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

После создания таблицы встраиваний вы можете запустить семантический поиск любым из следующих способов:

  • По заданному индексу/списку индексов в наборе данных, например, exp.get_similar(idx=[1, 10], limit=10)
  • На любом изображении/списке изображений, отсутствующих в наборе данных - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). В случае нескольких входных данных используется агрегированное представление их эмбеддингов.

Вы получаете DataFrame pandas с ограниченным количеством наиболее похожих точек данных к входу, а также их расстоянием в пространстве вложения. Вы можете использовать этот набор данных для дальнейшей фильтрации.

Таблица поиска по сходству

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

Вы также можете построить график похожих образцов непосредственно с помощью plot_similar util

Изображение 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

Изображение 2 для поиска по сходству

Спросите ИИ: поиск или фильтрация с помощью естественного языка

Вы можете запросить у объекта Explorer тип данных, которые хотите увидеть, и он попытается вернуть DataFrame с этими результатами. Поскольку он работает на основе LLM, он не всегда дает правильный результат. В этом случае он вернет None.

Таблица «Спроси ИИ»

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

Для построения графика этих результатов можно использовать plot_query_result утилита. Пример:

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

Спросите ИИ изображение 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)

Запуск SQL-запросов на вашем наборе данных

Иногда может возникнуть необходимость изучить определенные записи в наборе данных. Для этого Explorer позволяет выполнять SQL-запросы. Он принимает любой из следующих форматов:

  • Запросы, начинающиеся с «WHERE», автоматически выбирают все столбцы. Это можно рассматривать как сокращенный запрос.
  • Вы также можете писать полные запросы, в которых можно указать, какие столбцы выбрать.

Это можно использовать для исследования производительности модели и конкретных точек данных. Например:

  • предположим, что ваша модель плохо работает с изображениями, на которых есть люди и собаки. Вы можете написать запрос, подобный этому, чтобы выбрать точки, в которых есть как минимум 2 человека И как минимум одна собака.

Вы можете объединить SQL-запрос и семантический поиск, чтобы отфильтровать результаты до определенного типа

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)

Таблица SQL-запросов

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

Как и в случае поиска по сходству, вы также получаете утилиту для непосредственного построения графиков SQL-запросов с использованием exp.plot_sql_query

SQL-запросы к изображению 1

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

Таблица для работы с эмбеддингами (Продвинутый уровень)

Explorer работает на LanceDB таблицы внутри. Вы можете получить прямой доступ к этой таблице, используя Explorer.table объект и выполнять необработанные запросы, передавать предварительные и постобработочные фильтры и т. д.

table = exp.table
print(table.schema)

Выполнение необработанных запросов¶

Vector Search находит ближайшие векторы из базы данных. В системе рекомендаций или поисковой системе вы можете найти похожие продукты на тот, который вы искали. В LLM и других приложениях ИИ каждая точка данных может быть представлена внедрениями, сгенерированными некоторыми моделями, она возвращает наиболее релевантные функции.

Поиск в многомерном векторном пространстве заключается в нахождении K-ближайших соседей (KNN) для вектора запроса.

Метрика. В LanceDB метрика — это способ описания расстояния между парой векторов. В настоящее время поддерживаются следующие метрики:

  • L2
  • Косинус
  • Поиск схожести в Dot Explorer по умолчанию использует L2. Вы можете выполнять запросы непосредственно к таблицам или использовать формат lance для создания пользовательских утилит для управления наборами данных. Более подробная информация о доступных операциях с таблицами LanceDB находится в документации.

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

Работа с эмбеддингами

Вы можете получить доступ к необработанным внедрениям из lancedb Table и проанализировать их. Внедрения изображений хранятся в столбце vector

import numpy as np

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

Диаграмма рассеяния

Одним из предварительных шагов в анализе вложений является их построение в 2D-пространстве посредством уменьшения размерности. Давайте попробуем пример

Пример диаграммы рассеяния

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

Индекс сходства

Вот простой пример операции, основанной на таблице embeddings. Explorer поставляется с similarity_index операция-

  • Он пытается оценить, насколько схож каждый элемент данных с остальным набором данных.
  • Это происходит путем подсчета количества вложений изображений, которые находятся ближе, чем max_dist к текущему изображению в сгенерированном пространстве вложений, учитывая top_k похожих изображений за раз.

Для данного набора данных, модели, max_dist & top_k сгенерированный индекс подобия будет использоваться повторно. Если ваш набор данных изменился или вам просто необходимо повторно сгенерировать индекс подобия, вы можете передать force=True. Как и в случае с векторным и SQL-поиском, здесь также есть утилита для непосредственного построения графика. Давайте посмотрим

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)

Индекс сходства

сначала на графике

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

Теперь давайте посмотрим на результат операции.

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

sim_idx

Давайте создадим запрос, чтобы увидеть, какие точки данных имеют количество сходств более 30, и построим изображения, похожие на них.

import numpy as np

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

Вы должны увидеть что-то вроде этого

similarity-index-image

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


📅 Создано 11 месяцев назад ✏️ Обновлено 1 день назад
glenn-jocherRizwanMunawarpderrengermiles-deans-ultralyticsonuralpszrpicsalex

Комментарии