Ví dụ khám phá VOC
中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية
Chào mừng bạn đến với notebook Explorer API của Ultralytics. Notebook này giới thiệu các tài nguyên có sẵn để khám phá tập dữ liệu thông qua tìm kiếm ngữ nghĩa, tìm kiếm vector và truy vấn SQL.
Hãy thử yolo explorer (được cung cấp bởi Explorer API)
Cài đặt ultralytics và chạy yolo explorer trong terminal của bạn để thực hiện các truy vấn tùy chỉnh và tìm kiếm ngữ nghĩa ngay trong trình duyệt.
Kể từ phiên bản ultralytics>=8.3.12, Ultralytics Explorer đã bị loại bỏ. Để sử dụng Explorer, hãy cài đặt pip install ultralytics==8.3.11. Các tính năng khám phá tập dữ liệu tương tự (và mở rộng hơn) hiện có sẵn trong Ultralytics Platform.
Thiết lập
Cài đặt ultralytics cùng với các dependencies cần thiết, sau đó kiểm tra phần mềm và phần cứng.
!uv pip install ultralytics[explorer] openai
yolo checksTìm kiếm tương đồng
Tận dụng sức mạnh của tìm kiếm tương đồng vector để tìm các điểm dữ liệu tương tự trong tập dữ liệu của bạn cùng với khoảng cách của chúng trong không gian embedding. Chỉ cần tạo bảng embeddings cho cặp tập dữ liệu-model đã chọn. Việc này chỉ cần thực hiện một lần và sẽ được tái sử dụng tự động.
exp = Explorer("VOC.yaml", model="yolo26n.pt")
exp.create_embeddings_table()Sau khi bảng embeddings được xây dựng, bạn có thể chạy tìm kiếm ngữ nghĩa theo bất kỳ cách nào dưới đây:
- Trên một index/danh sách các index nhất định trong tập dữ liệu, ví dụ:
exp.get_similar(idx=[1, 10], limit=10) - Trên bất kỳ ảnh/danh sách ảnh nào không nằm trong tập dữ liệu - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). Trong trường hợp có nhiều đầu vào, tổng hợp các embedding của chúng sẽ được sử dụng.
Bạn sẽ nhận được một pandas DataFrame với số lượng data point tương đồng nhất định dựa trên limit, cùng với khoảng cách của chúng trong không gian embedding. Bạn có thể sử dụng tập dữ liệu này để thực hiện các bước lọc sâu hơn.

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()Bạn cũng có thể trực tiếp vẽ biểu đồ các mẫu tương đồng bằng cách sử dụng tiện ích plot_similar

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
Hỏi AI: Tìm kiếm hoặc lọc bằng ngôn ngữ tự nhiên
Bạn có thể đưa ra prompt cho đối tượng Explorer về loại dữ liệu bạn muốn xem, và nó sẽ cố gắng trả về một DataFrame với các kết quả đó. Vì tính năng này được vận hành bởi LLMs, nó không phải lúc nào cũng chính xác. Trong trường hợp đó, nó sẽ trả về None.

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)Để vẽ biểu đồ các kết quả này, bạn có thể sử dụng tiện ích plot_query_result. Ví dụ:
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)Chạy truy vấn SQL trên tập dữ liệu của bạn
Đôi khi bạn có thể muốn điều tra các mục cụ thể trong tập dữ liệu của mình. Đối với việc này, Explorer cho phép bạn thực thi các truy vấn SQL. Nó chấp nhận một trong các định dạng sau:
- Các truy vấn bắt đầu bằng "WHERE" sẽ tự động chọn tất cả các cột. Đây có thể được coi là một cách truy vấn viết tắt.
- Bạn cũng có thể viết các truy vấn đầy đủ, nơi bạn có thể chỉ định cụ thể các cột cần chọn.
Cách này có thể được sử dụng để kiểm tra hiệu suất của model và các điểm dữ liệu cụ thể. Ví dụ:
- giả sử model của bạn gặp khó khăn với các hình ảnh có người và chó. Bạn có thể viết một truy vấn như sau để chọn các điểm có ít nhất 2 người VÀ ít nhất một con chó.
Bạn có thể kết hợp truy vấn SQL và tìm kiếm ngữ nghĩa để lọc xuống loại kết quả cụ thể
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)Cũng giống như tìm kiếm tương đồng, bạn cũng có một tiện ích để trực tiếp vẽ biểu đồ các truy vấn sql bằng exp.plot_sql_query

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)Làm việc với bảng embeddings (Nâng cao)
Explorer hoạt động trên các bảng LanceDB ở bên trong. Bạn có thể truy cập trực tiếp vào bảng này bằng đối tượng Explorer.table và chạy các truy vấn thô, đẩy xuống các bộ lọc trước và sau, v.v.
table = exp.table
print(table.schema)Chạy các truy vấn thô
Tìm kiếm vector giúp tìm các vector gần nhất từ cơ sở dữ liệu. Trong hệ thống đề xuất hoặc công cụ tìm kiếm, bạn có thể tìm thấy các sản phẩm tương tự với sản phẩm bạn đã tìm kiếm. Trong LLM và các ứng dụng AI khác, mỗi điểm dữ liệu có thể được biểu diễn bằng các embeddings được tạo ra từ một số model, nó trả về các đặc trưng liên quan nhất.
Tìm kiếm trong không gian vector đa chiều là tìm K-Nearest-Neighbors (KNN) của vector truy vấn.
Metric: Trong LanceDB, Metric là cách để mô tả khoảng cách giữa một cặp vector. Hiện tại, nó hỗ trợ các metric sau:
- L2
- Cosine
- Dot: Tìm kiếm tương đồng của Explorer sử dụng L2 theo mặc định. Bạn có thể chạy các truy vấn trực tiếp trên bảng hoặc sử dụng định dạng lance để xây dựng các tiện ích tùy chỉnh nhằm quản lý tập dữ liệu. Thông tin chi tiết hơn về các thao tác trên bảng LanceDB có trong tài liệu

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()Chuyển đổi sang các định dạng dữ liệu phổ biến
df = table.to_pandas()
pa_table = table.to_arrow()Làm việc với Embeddings
Bạn có thể truy cập embedding thô từ bảng lancedb và phân tích nó. Các embedding hình ảnh được lưu trữ trong cột vector
import numpy as np
embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)Biểu đồ phân tán (Scatterplot)
Một trong những bước sơ bộ trong việc phân tích embeddings là vẽ chúng trong không gian 2D thông qua giảm chiều dữ liệu. Hãy thử một ví dụ

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()Chỉ mục Tương đồng
Đây là một ví dụ đơn giản về một thao tác được hỗ trợ bởi bảng embeddings. Explorer đi kèm với thao tác similarity_index-
- Nó cố gắng ước tính mỗi điểm dữ liệu tương đồng như thế nào so với phần còn lại của tập dữ liệu.
- It does that by counting how many image embeddings lie closer than max_dist to the current image in the generated embedding space, considering top_k similar images at a time.
Đối với một tập dữ liệu, model, max_dist & top_k nhất định, similarity index sau khi được tạo sẽ được tái sử dụng. Trong trường hợp tập dữ liệu của bạn đã thay đổi hoặc bạn chỉ đơn giản cần tạo lại similarity index, bạn có thể truyền force=True. Tương tự như tìm kiếm vector và SQL, tính năng này cũng đi kèm với một tiện ích để vẽ biểu đồ trực tiếp.
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)
Hãy xem biểu đồ trước
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)Bây giờ hãy xem đầu ra của thao tác
sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)
sim_idxHãy tạo một truy vấn để xem những điểm dữ liệu nào có số lượng tương đồng lớn hơn 30 và vẽ các hình ảnh tương tự với chúng.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]Bạn sẽ thấy một thứ gì đó như thế này

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