コンテンツへスキップ

VOC探査の例

Ultralytics Explorer API ノートブックへようこそ!このノートブックは、Ultralytics を使用して、セマンティック検索の力を使ってデータセットを探索することを始めるのに役立つ、利用可能なさまざまなリソースを探索するための出発点となります。ベクトル検索やSQLクエリを使用して、特定のタイプのラベルを調べることができるユーティリティをすぐに利用できます。

試す yolo explorer エクスプローラAPI

単に pip install ultralytics そして yolo explorer を使えば、ブラウザ上でデータセットのカスタムクエリやセマンティック検索を実行することができます!

コミュニティ・ノート ⚠️

現在 ultralytics>=8.3.10Ultralytics エクスプローラーのサポートは廃止されました。しかしご心配なく!現在では、同様の機能、さらに強化された機能に Ultralytics ハブHUBは、ワークフローを合理化するために設計された、直感的なコード不要のプラットフォームです。Ultralytics HUBを使えば、コードを一行も書くことなく、データの探索、視覚化、管理を楽に続けることができます。ぜひチェックして、その強力な機能をご活用ください🚀。

セットアップ

ピップインストール 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) 複数の入力がある場合、それらの埋め込み値の総和が使われる。

入力と最も類似したデータ点の限界数と、埋め込み空間における距離の pandas dataframe が得られます。このデータセットを使って、さらにフィルタリングを行うことができます。

類似検索テーブル

# 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

Ask AI: 自然言語で検索・フィルタリング

エクスプローラー・オブジェクトに見たいデータ・ポイントの種類を入力すると、それを含むデータ・フレームを返そうとする。エクスプローラーはLLMで動いているため、常に正しく動作するとは限りません。その場合はNoneを返します。

aiテーブルに聞く

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)

aiに聞く 画像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クエリーを実行することができる。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)

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)

エンベッディングを扱う テーブル(上級)

エクスプローラーは ランスDB テーブルを内部的に使用します。このテーブルには Explorer.table オブジェクトを作成し、生のクエリーを実行したり、プリ・フィルターやポスト・フィルターをプッシュダウンしたりすることができます。

table = exp.table
print(table.schema)

生のクエリを実行する¶。

ベクトル検索は、データベースから最も近いベクトルを検索します。推薦システムや検索エンジンでは、検索した商品の類似商品を見つけることができる。LLMや他のAIアプリケーションでは、各データポイントは、いくつかのモデルから生成された埋め込みによって提示することができ、それは最も関連性の高い特徴を返します。

高次元ベクトル空間での検索は、クエリベクトルのK-最近傍(KNN)を見つけることである。

メトリック LanceDB では、メトリックとはベクトルのペア間の距離を表す方法です。現在、以下のメトリックをサポートしています:

  • L2
  • コサイン
  • ドットエクスプローラーの類似検索はデフォルトでL2を使用します。テーブルに対して直接クエリを実行したり、ランスフォーマットを使用してデータセットを管理するカスタムユーティリティを構築することができます。利用可能な 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)

散布図

埋め込みを分析する前段階の1つは、次元削減によって埋め込みを2次元空間にプロットすることです。例として

散布図の例

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

類似性指数

エンベッディングテーブルを使った簡単な操作の例を示します。エクスプローラには similarity_index 操作

  • これは、各データポイントが残りのデータセットとどの程度類似しているかを推定しようとするものである。
  • これは、一度にtop_k個の類似画像を考慮し、生成された埋め込み空間において、現在の画像にmax_distより近い画像埋め込みがいくつあるかを数えることによって行われる。

与えられたデータセットに対して、モデル、 max_dist & top_k を渡すと、一度生成された類似度インデックスが再利用される。データセットが変更された場合、あるいは単に類似度インデックスを再生成する必要がある場合、次のように渡すことができます。 force=True.ベクトル検索やSQL検索と同様に、これも直接プロットするためのutilが付属している。見てみよう。

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


📅作成 4ヶ月前 ✏️更新しました 1ヶ月前

コメント