VOC 탐색 예제
Ultralytics Explorer API 노트북에 오신 것을 환영합니다! 이 노트북은 Ultralytics를 사용하여 시맨틱 검색 기능을 통해 데이터 세트를 탐색하는 데 도움이 되는 다양한 리소스를 탐색하기 위한 시작점 역할을 합니다. 벡터 검색 또는 SQL 쿼리를 사용하여 특정 유형의 레이블을 검사할 수 있는 즉시 사용 가능한 유틸리티를 사용할 수 있습니다.
시도 yolo explorer
Explorer API로 구동
간단히 pip install ultralytics
실행합니다. yolo explorer
터미널에서 사용자 정의 쿼리를 실행하고 브라우저 내에서 데이터 세트에 대한 시맨틱 검색을 수행합니다!
커뮤니티 참고 ⚠️
다음 시점부터 ultralytics>=8.3.10
, Ultralytics Explorer 지원이 중단되었습니다. 하지만 걱정하지 마세요! 이제 다음을 통해 유사하고 향상된 기능에 액세스할 수 있습니다. Ultralytics HUB워크플로우를 간소화하도록 설계된 직관적인 노코드 플랫폼인 Ultralytics HUB를 사용해 보세요. Ultralytics HUB를 통해 단 한 줄의 코드도 작성하지 않고도 데이터를 손쉽게 탐색, 시각화 및 관리할 수 있습니다. 지금 바로 확인하고 강력한 기능을 활용해 보세요! 🚀
설치
Pip 설치 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) 여러 입력의 경우 임베딩의 집계가 사용됩니다.
입력과 가장 유사한 데이터 포인트의 제한된 수와 임베딩 공간에서의 거리를 포함하는 pandas 데이터프레임을 얻을 수 있습니다. 이 데이터 세트를 사용하여 추가 필터링을 수행할 수 있습니다.
# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()
다음을 사용하여 유사한 샘플을 직접 플롯할 수도 있습니다. plot_similar
util
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
AI에 질문하기: 자연어로 검색 또는 필터링
원하는 데이터 포인트 종류로 Explorer 객체에 프롬프트를 표시하면 해당 데이터프레임을 반환하려고 시도합니다. 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
util 예시:
plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)
# 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명 이상의 사람과 최소 1마리의 개가 있는 포인트를 선택하기 위해 이와 같은 쿼리를 작성할 수 있습니다.
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)
table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)
유사성 검색과 마찬가지로, sql 쿼리를 직접 플롯하는 유틸리티도 제공됩니다. exp.plot_sql_query
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)
Embeddings 테이블 작업 (고급)
Explorer는 다음에서 작동합니다. LanceDB 테이블을 내부적으로 사용합니다. 이 테이블에는 다음을 사용하여 직접 액세스할 수 있습니다. Explorer.table
객체 및 원시 쿼리 실행, 사전 및 사후 필터 푸시다운 등을 수행합니다.
table = exp.table
print(table.schema)
원시 쿼리 실행¶
벡터 검색은 데이터베이스에서 가장 가까운 벡터를 찾습니다. 추천 시스템 또는 검색 엔진에서 검색한 제품과 유사한 제품을 찾을 수 있습니다. LLM 및 기타 AI 애플리케이션에서는 각 데이터 포인트를 일부 모델에서 생성된 임베딩으로 표시할 수 있으며, 가장 관련성이 높은 특징을 반환합니다.
고차원 벡터 공간에서의 검색은 쿼리 벡터의 K-최근접 이웃(KNN)을 찾는 것입니다.
LanceDB에서 메트릭은 벡터 쌍 간의 거리를 설명하는 방법입니다. 현재 다음 메트릭을 지원합니다.
- L2
- Cosine
- Dot Explorer의 유사성 검색은 기본적으로 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()
Embeddings 작업
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