VOC探査の例
Ultralytics Explorer API ノートブックへようこそ!このノートブックは、Ultralytics を使用して、セマンティック検索の力を使ってデータセットを探索することを始めるのに役立つ、利用可能なさまざまなリソースを探索するための出発点となります。ベクトル検索やSQLクエリを使用して、特定のタイプのラベルを調べることができるユーティリティをすぐに利用できます。
試す yolo explorer
エクスプローラAPI
単に pip install ultralytics
そして yolo explorer
を使えば、ブラウザ上でデータセットのカスタムクエリやセマンティック検索を実行することができます!
コミュニティ・ノート ⚠️
現在 ultralytics>=8.3.10
Ultralytics エクスプローラーのサポートは廃止されました。しかしご心配なく!現在では、同様の機能、さらに強化された機能に 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
利用
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
Ask AI: 自然言語で検索・フィルタリング
エクスプローラー・オブジェクトに見たいデータ・ポイントの種類を入力すると、それを含むデータ・フレームを返そうとする。エクスプローラーは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
利用例:
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クエリを実行する
データセット内のある種のエントリーを調査したい場合がある。このような場合、エクスプローラーは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)
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)
エンベッディングを扱う テーブル(上級)
エクスプローラーは ランス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