콘텐츠로 건너뛰기

VOC 탐색 예시

Ultralytics Explorer API 노트북에 오신 것을 환영합니다! 이 노트북은 시맨틱 검색을 사용하여 데이터 세트를 탐색하는 데 도움이 되는 다양한 리소스( Ultralytics )를 탐색하기 위한 시작점 역할을 합니다. 벡터 검색이나 SQL 쿼리를 사용해 특정 유형의 레이블을 조사할 수 있는 유틸리티를 바로 사용할 수 있습니다.

시도 yolo explorer 익스플로러 API 기반

간단하게 pip install ultralytics 를 클릭하고 yolo explorer 를 터미널에 추가하여 브라우저 내에서 바로 데이터 세트에 대한 사용자 지정 쿼리와 시맨틱 검색을 실행하세요!

커뮤니티 노트 ⚠️

기준 ultralytics>=8.3.10, Ultralytics 탐색기 지원은 더 이상 사용되지 않습니다. 하지만 걱정하지 마세요! 이제 다음을 통해 유사하거나 더욱 향상된 기능에 액세스할 수 있습니다. Ultralytics HUB는 워크플로우를 간소화하도록 설계된 직관적인 노코드 플랫폼입니다. Ultralytics HUB를 사용하면 코드 한 줄 작성하지 않고도 데이터를 손쉽게 탐색, 시각화, 관리할 수 있습니다. 꼭 확인하시고 강력한 기능을 활용해 보세요!

설정

Pip 설치 ultralytics 그리고 종속성 를 클릭하고 소프트웨어와 하드웨어를 확인하세요.

%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) 입력이 여러 개일 경우, 임베딩된 이미지의 합계를 사용하세요.

입력과 가장 유사한 데이터 포인트의 한계 수와 임베딩 공간에서의 거리가 포함된 판다 데이터 프레임을 얻게 됩니다. 이 데이터 세트를 사용하여 추가 필터링을 수행할 수 있습니다.

유사도 검색 테이블

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

유사한 샘플을 직접 플롯할 수도 있습니다. plot_similar 활용

유사도 검색 이미지 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

AI에게 질문: 자연어로 검색 또는 필터링

탐색기 객체에 보고 싶은 데이터 포인트의 종류를 입력하면 해당 데이터 포인트가 포함된 데이터 프레임을 반환하려고 시도합니다. LLM에 의해 구동되기 때문에 항상 올바르게 반환되는 것은 아닙니다. 이 경우 없음이 반환됩니다.

인공지능 테이블에 질문하기

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 쿼리 실행

데이터 집합에서 특정 유형의 항목을 조사하고 싶을 때가 있습니다. 이 탐색기를 사용하면 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)

임베딩 테이블 작업(고급)

탐색기는 다음에서 작동합니다. LanceDB 테이블을 내부적으로 사용합니다. 다음을 사용하여 이 테이블에 직접 액세스할 수 있습니다. Explorer.table 객체를 사용하여 원시 쿼리를 실행하고, 사전 및 사후 필터를 푸시 다운하는 등의 작업을 수행합니다.

table = exp.table
print(table.schema)

원시 쿼리 실행¶

벡터 검색은 데이터베이스에서 가장 가까운 벡터를 찾습니다. 추천 시스템이나 검색 엔진에서는 검색한 상품과 유사한 상품을 찾을 수 있습니다. LLM 및 기타 AI 애플리케이션에서 각 데이터 포인트는 일부 모델에서 생성된 임베딩으로 표시될 수 있으며, 가장 관련성이 높은 기능을 반환합니다.

고차원 벡터 공간에서의 검색은 쿼리 벡터의 최접근 이웃(KNN)을 찾는 것입니다.

메트릭 LanceDB에서 메트릭은 한 쌍의 벡터 사이의 거리를 설명하는 방식입니다. 현재 다음과 같은 메트릭을 지원합니다:

  • L2
  • 코사인
  • 도트 탐색기의 유사도 검색은 기본적으로 L2를 사용합니다. 테이블에서 직접 쿼리를 실행하거나 Lance 형식을 사용하여 사용자 지정 유틸리티를 구축하여 데이터 집합을 관리할 수 있습니다. 사용 가능한 LanceDB 테이블 작업에 대한 자세한 내용은 문서에서 확인하세요.

원시 쿼리 테이블

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 테이블에서 원시 임베딩에 액세스하여 분석할 수 있습니다. 이미지 임베딩은 열에 저장됩니다. 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()

유사성 지수

다음은 임베딩 테이블로 구동되는 간단한 작업의 예입니다. 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]

다음과 같은 내용이 표시되어야 합니다.

유사성 인덱스 이미지

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images
2개월 전 생성됨 ✏️ 2개월 전 업데이트됨

댓글