YOLO Vision 2026:

Ví dụ khám phá VOC#

Ghi chú cộng đồng ⚠️

Kể từ ultralytics>=8.3.12, Ultralytics Explorer đã bị gỡ 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á dataset tương tự (và mở rộng hơn) hiện có trên Ultralytics Platform.

Ví dụ này hướng dẫn cách sử dụng Explorer API trên tập dữ liệu VOC: xây dựng bảng embeddings, thực hiện tìm kiếm ngữ nghĩa và SQL, đồng thời đặt câu hỏi bằng ngôn ngữ tự nhiên. Các bước tương tự cung cấp năng lượng cho GUI yolo explorer.

Thiết lập#

Cài đặt bản phát hành ultralytics được ghim kèm với các tiện ích bổ sung của Explorer, sau đó kiểm tra phần mềm và phần cứng.

pip install "ultralytics[explorer]==8.3.11" openai
yolo checks

Tì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 dataset cùng với khoảng cách của chúng trong không gian embedding. Chỉ cần tạo một bảng embedding cho cặp dataset-model tương ứng. Việc này chỉ cần thực hiện một lần và sẽ được tự động tái sử dụng.

from ultralytics import Explorer

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

Sau khi bảng embedding đượ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 sau đây:

  • Trên một index/danh sách index cụ thể trong dataset, ví dụ: exp.get_similar(idx=[1, 10], limit=10)
  • Trên bất kỳ hình ảnh hoặc danh sách hình ảnh nào không có trong tập dữ liệu, ví dụ: exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). Trong trường hợp có nhiều đầu vào, tập hợp các embeddings của chúng sẽ được sử dụng.

Bạn nhận được một pandas DataFrame chứa số lượng điểm dữ liệu tương tự nhất với input theo giới hạn đã chỉ định, cùng với khoảng cách của chúng trong không gian embedding. Bạn có thể sử dụng dataset này để thực hiện các bước filtering tiếp theo.

Kết quả tìm kiếm tương đồng của Ultralytics Explorer

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

Bạn cũng có thể trực tiếp plot các sample tương tự bằng util plot_similar

Các image tương tự được tìm thấy bằng tìm kiếm vector

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

Trực quan hóa tìm kiếm tương đồng bằng embedding

Hỏi AI: Tìm kiếm hoặc filtering bằng ngôn ngữ tự nhiên#

Bạn có thể prompt object Explorer bằng loại điểm dữ liệu muốn xem, và object này sẽ cố gắng trả về một DataFrame chứa các kết quả đó. Vì được cung cấp bởi LLMs, kết quả không phải lúc nào cũng chính xác. Trong trường hợp đó, object sẽ trả về None.

Kết quả truy vấn ngôn ngữ tự nhiên Ask AI của Ultralytics Explorer

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

Để plot các kết quả này, bạn có thể sử dụng utility plot_query_result. Ví dụ:

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

Kết quả truy vấn Ask AI hiển thị các image khớp

# 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 dataset của bạn#

Đôi khi bạn có thể muốn kiểm tra một số entry nhất định trong dataset. Để thực hiện việc này, Explorer cho phép bạn chạy các truy vấn SQL. Explorer 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 column. Có thể xem đây là dạng viết tắt của truy vấn.
  • Bạn cũng có thể viết các truy vấn đầy đủ, trong đó chỉ định những column cần chọn.

Bạn có thể sử dụng cách này để kiểm tra hiệu năng 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 image 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 các 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)

Bảng kết quả truy vấn SQL của Explorer

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

Tương tự như tìm kiếm tương đồng, bạn cũng nhận được một util để trực tiếp plot các truy vấn SQL bằng exp.plot_sql_query

Trực quan hóa các image khớp với truy vấn SQL

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 embedding (Nâng cao)#

Bên trong, Explorer hoạt động trên các bảng LanceDB. Bạn có thể truy cập trực tiếp bảng này bằng object Explorer.table và chạy các truy vấn raw, đẩy các bộ lọc trước và sau xuống tầng dữ liệu, v.v.

table = exp.table
print(table.schema)

Chạy các truy vấn thô#

Tìm kiếm vector tìm các vector gần nhất từ database. Trong hệ thống recommendation hoặc search engine, bạn có thể tìm các sản phẩm tương tự với sản phẩm đã 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 embedding do một số model tạo ra, từ đó trả về các feature phù hợp nhất.

Tìm kiếm trong không gian vector nhiều chiều là việc tìm K láng giềng gần nhất (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, LanceDB hỗ trợ các metric sau:

  • L2
  • Cosine
  • Tích vô hướng

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êm chi tiết về các thao tác bảng LanceDB có trong tài liệu LanceDB.

Bảng kết quả truy vấn SQL raw của Explorer

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()

Chuyển đổi qua lại giữa 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 embedding#

Bạn có thể truy cập embedding raw từ bảng lancedb và phân tích embedding đó. Các image embedding được lưu trong column vector

import numpy as np

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

Biểu đồ phân tán#

Một trong những bước sơ bộ khi phân tích embedding là plot chúng trong không gian 2D thông qua giảm chiều. Hãy thử một ví dụ

Trực quan hóa biểu đồ phân tán embedding của Explorer

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ỉ số tương đồng#

Dưới đây là một ví dụ đơn giản về thao tác được cung cấp bởi bảng embedding. Explorer đi kèm thao tác similarity_index-

  • Thao tác này cố gắng ước tính mức độ tương đồng của từng điểm dữ liệu với phần còn lại của dataset.
  • Thao tác thực hiện việc này bằng cách đếm số lượng image embedding nằm gần image hiện tại hơn max_dist trong không gian embedding được tạo ra, đồng thời xét top_k image tương tự mỗi lần.

Đối với một dataset, model, max_dist & top_k, chỉ số tương đồng sau khi được tạo sẽ được tái sử dụng. Nếu dataset của bạn đã thay đổi hoặc bạn chỉ đơn giản cần tạo lại chỉ số tương đồng, bạn có thể truyền force=True. Tương tự như tìm kiếm vector và SQL, thao tác này cũng đi kèm một util để trực tiếp plot chỉ số.

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)

Phân tích chỉ số tương đồng của dataset

Trước tiên, hãy xem biểu đồ

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

Bây giờ, hãy xem output của thao tác

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

sim_idx

Hã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à plot các image 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 kết quả tương tự như sau

Trực quan hóa chỉ số tương đồng để phân tích dataset

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

FAQ#

  • Explorer đã bị xóa khỏi gói ultralytics trong phiên bản 8.3.12. Để chạy các ví dụ trên trang này, hãy cài đặt bản phát hành cuối cùng bao gồm tiện ích này bằng pip install "ultralytics[explorer]==8.3.11". Tính năng khám phá tập dữ liệu tương đương và mở rộng được tích hợp sẵn trong Ultralytics Platform.

  • Sau khi xây dựng bảng embeddings một lần với create_embeddings_table(), bạn có thể tìm các hình ảnh có vẻ ngoài tương tự theo chỉ mục hoặc theo hình ảnh bên ngoài, lọc tập dữ liệu bằng các mệnh đề SQL WHERE, đặt câu hỏi bằng ngôn ngữ tự nhiên với ask_ai() và tính toán chỉ mục độ tương đồng để phát hiện các hình ảnh gần như trùng lặp.

  • Explorer lưu giữ các embeddings trong bảng LanceDB trên đĩa, do đó bảng này được tạo một lần cho mỗi cặp tập dữ liệu và model và được sử dụng lại qua các phiên. Truy cập bảng này trực tiếp thông qua exp.table để thực hiện các truy vấn vector thô, bộ lọc trước và sau, cũng như xuất dữ liệu sang pandas hoặc Arrow.

Bình luận