コンテンツへスキップ

Ultralytics エクスプローラAPI

はじめに

オープン・イン・コラボ Explorer API は、データセットを探索するためのPython API です。SQLクエリを使ったデータセットのフィルタリングや検索、ベクトル類似度検索、セマンティック検索をサポートしています。



見るんだ: Ultralytics エクスプローラAPIの概要

インストール

エクスプローラーの機能の一部は外部ライブラリに依存しています。これらは使用時に自動的にインストールされる。これらの依存関係を手動でインストールするには、以下のコマンドを使用する:

pip install ultralytics[explorer]

使用方法

from ultralytics import Explorer

# Create an Explorer object
explorer = Explorer(data='coco128.yaml', model='yolov8n.pt')

# Create embeddings for your dataset
explorer.create_embeddings_table()

# Search for similar images to a given image/images
dataframe = explorer.get_similar(img='path/to/image.jpg')

# Or search for similar images to a given index/indices
dataframe = explorer.get_similar(idx=0)

備考

与えられたデータセットとモデルのペアに対する埋め込みテーブルは、一度だけ作成され、再利用されます。これらはオンディスクでスケールするLanceDBを使用しているため、COCOのような大規模なデータセットに対してもメモリ不足になることなくエンベッディングを作成し、再利用することができます。

embeddingsテーブルを強制的に更新したい場合は、次のようにします。 force=True への create_embeddings_table メソッドを使用します。 LanceDB テーブル・オブジェクトに直接アクセスして高度な分析を行うことができます。詳しくは テーブルセクションの操作

類似画像検索は、与えられた画像に類似した画像を見つける技術である。類似画像は類似の埋め込みを持つという考えに基づいています。埋め込みテーブルが構築されると、以下のいずれかの方法でセマンティック検索を実行することができます:

  • データセット中の指定されたインデックス,またはインデックスのリスト. exp.get_similar(idx=[1,10], limit=10)
  • データセットに含まれていない画像または画像のリスト: exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)

複数の入力がある場合は、それらの埋め込み値の合計が使われる。

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

セマンティック検索

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(
                        img=['https://ultralytics.com/images/bus.jpg',
                             'https://ultralytics.com/images/bus.jpg'],
                        limit=10
                        )
print(similar.head())
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(idx=1, limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(idx=[1,10], limit=10)
print(similar.head())

類似画像のプロット

を使って類似画像をプロットすることもできます。 plot_similar メソッドと同じ引数を取る。このメソッドは get_similar で、類似した画像を格子状にプロットする。

類似画像のプロット

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
plt.show()
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(idx=1, limit=10)
plt.show()

2.Ask AI (自然言語クエリ)

これにより、自然言語を使ってデータセットをどのようにフィルタリングしたいかを書くことができる。SQLクエリの記述に習熟する必要はありません。私たちのAIクエリージェネレーターが、自動でクエリーを生成します。例えば、「人が1人、犬が2匹写っている画像を100枚表示してください。他のオブジェクトもあります "と言えば、内部でクエリを生成し、その結果を表示します。 注意:これはLLMを使用しているので、結果は確率的であり、時には間違ってしまうかもしれません。

AIに聞く

from ultralytics import Explorer
from ultralytics.data.explorer import plot_query_result


# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.ask_ai("show me 100 images with exactly one person and 2 dogs. There can be other objects too")
print(df.head())

# plot the results
plt = plot_query_result(df)
plt.show()

3.SQLクエリ

データセットに対して SQL クエリを実行するには sql_query メソッドを使用します。このメソッドは、SQL クエリを入力として受け取り、その結果を pandas データフレームとして返します。

SQLクエリ

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%'")
print(df.head())

SQLクエリの結果をプロットする

SQLクエリの結果をプロットすることもできます。 plot_sql_query メソッドと同じ引数を取る。このメソッドは sql_query そして結果をグリッドにプロットする。

SQLクエリの結果をプロットする

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

# plot the SQL Query
exp.plot_sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%' LIMIT 10")

4.アドバンス - エンベッディングテーブルを使う

embeddingsテーブルを直接操作することもできます。embeddingsテーブルが作成されると、そのテーブルには Explorer.table

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

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

このテーブルでできることの例をいくつか紹介しよう:

生の埋め込みを取得する

例

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

embeddings = table.to_pandas()["vector"]
print(embeddings)

事前・事後フィルタによる高度なクエリ

例

from ultralytics import Explorer

exp = Explorer(model="yolov8n.pt")
exp.create_embeddings_table()
table = exp.table

# Dummy embedding
embedding = [i for i in range(256)]
rs = table.search(embedding).metric("cosine").where("").limit(10)

ベクトル・インデックスの作成

大規模なデータセットを使用する場合は、専用のベクトル・インデックスを作成して、より高速なクエリを実行することもできます。これは create_index メソッドを使用する。

table.create_index(num_partitions=..., num_sub_vectors=...)

利用可能なタイプのベクトル・インデックスとパラメータに関する詳細は、こちらをご覧ください。 将来的には、エクスプローラーAPIから直接ベクトル・インデックスを作成するためのサポートを追加する予定です。

5.埋め込みアプリケーション

埋め込み表を使って、さまざまな探索的分析を行うことができる。以下にいくつかの例を示します:

類似性指数

エクスプローラーには similarity_index オペレーションを行う:

  • これは、各データポイントが残りのデータセットとどの程度類似しているかを推定しようとするものである。
  • よりも近い画像埋め込みがいくつあるかをカウントすることでこれを行う。 max_dist を,生成された埋め込み空間内の現在の画像に適用する。 top_k 同じような画像を一度に見ることができる。

これは、以下のカラムを持つpandasデータフレームを返す:

  • idx:データセット中の画像のインデックス
  • im_file:画像ファイルへのパス
  • count:よりも近いデータセットの画像の数。 max_dist 現在の画像に
  • sim_im_files:へのパスのリスト。 count 類似画像

チップ

与えられたデータセットに対して、モデル、 max_dist & top_k を渡すと、一度生成された類似度インデックスが再利用される。データセットが変更された場合、あるいは単に類似度インデックスを再生成する必要がある場合、次のように渡すことができます。 force=True.

類似性指数

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()

sim_idx = exp.similarity_index()

類似度インデックスを使用して、データセットをフィルタリングするためのカスタム条件を構築することができます。たとえば、データセット内のどの画像とも似ていない画像をフィルタリングするには、次のコードを使います:

import numpy as np

sim_count = np.array(sim_idx["count"])
sim_idx['im_file'][sim_count > 30]

埋め込み空間を可視化する

お好みのプロットツールを使って、埋め込み空間を可視化することもできます。例えば、matplotlibを使った簡単な例です:

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

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

エクスプローラAPIを使用して、独自のCVデータセット調査レポートの作成を開始します。インスピレーションを得るために

Ultralytics Explorerを使用して構築されたアプリ

エクスプローラAPIをベースにしたGUIデモをお試しください。

近日公開

  • [データセットから特定のラベルをマージします。例 - すべてをインポート person COCOと car シティスケープのラベル
  • [指定した閾値よりも高い類似度指数を持つ画像を削除します。
  • [エントリーをマージ/削除した後、新しいデータセットを自動的に永続化する。
  • [高度なデータセット視覚化


作成 2024-01-07 更新 2024-02-11
著者0xSynapse(1),glenn-jocher(6),chr043416@gmail.com(2),AyushExel(2)

コメント