YOLOE:リアルタイムな物体検出
はじめに

YOLOE (Real-Time Seeing Anything)は、ゼロショットでプロンプト可能なYOLOモデルの新たな進歩であり、オープンボキャブラリーの検出とセグメンテーションのために設計されています。固定されたカテゴリに限定された以前のYOLOモデルとは異なり、YOLOEはテキスト、画像、または内部ボキャブラリープロンプトを使用し、あらゆるオブジェクトクラスのリアルタイム検出を可能にします。YOLOv10をベースとし、YOLO-Worldに触発されたYOLOEは、速度と精度への影響を最小限に抑えながら、最先端のゼロショットパフォーマンスを実現します。
見る: Ultralytics python パッケージで YOLOE を使用する方法: Open Vocabulary & Real-Time Seeing Anything 🚀
以前のYOLOモデルと比較して、YOLOEは効率と精度を大幅に向上させます。LVISではYOLO-Worldv2よりも+3.5 AP向上し、トレーニングリソースをわずか3分の1に抑え、1.4倍高速な推論速度を実現します。COCOでファインチューニングされたYOLOE-v8-largeは、YOLOv8-Lを0.1 mAP上回り、トレーニング時間をほぼ4分の1に短縮しています。これは、YOLOEの精度、効率、および汎用性の優れたバランスを示しています。以下のセクションでは、YOLOEのアーキテクチャ、ベンチマーク比較、およびUltralyticsフレームワークとの統合について説明します。
アーキテクチャの概要
YOLOEは、標準的なYOLOの構造を保持しています。特徴抽出のための畳み込みバックボーン(例:CSP-Darknet)、マルチスケール融合のためのネック(例:PAN-FPN)、そしてオブジェクトネス、クラス、ボックスを独立して予測するアンカーフリー、デカップルド検出ヘッド(YOLOv8/YOLO11と同様)です。YOLOEは、オープンボキャブラリー検出を可能にする3つの新しいモジュールを導入しています。
再パラメータ化可能な領域-テキストアライメント(RepRTA): 小さな補助ネットワークを介してテキスト埋め込み(例えば、CLIPから)を改良することにより、テキストプロンプトによる検出をサポートします。推論時には、このネットワークはメインモデルに組み込まれ、オーバーヘッドをゼロにします。したがって、YOLOEは、実行時のペナルティなしに、任意のテキストラベル付きオブジェクト(例えば、未知の「交通信号」)を検出します。
セマンティック活性化ビジュアルプロンプトエンコーダー (SAVPE): 軽量な埋め込みブランチを介してビジュアルプロンプト検出を可能にします。参照画像が与えられると、SAVPEはセマンティックおよび活性化特徴をエンコードし、視覚的に類似したオブジェクトを検出するようにモデルを条件付けます。これは、ロゴや特定の部品に役立つワンショット検出機能です。
Lazy Region-Prompt Contrast (LRPC): プロンプトフリーモードでは、YOLOEは、大規模な語彙(LVISおよびObjects365の1200以上のカテゴリ)でトレーニングされた内部埋め込みを使用して、オープンセット認識を実行します。外部プロンプトやエンコーダーなしで、YOLOEは埋め込み類似度検索によってオブジェクトを識別し、推論時に大規模なラベル空間を効率的に処理します。
さらに、YOLOEは、マスク予測ブランチ(YOLACTまたはYOLOv8-Segと同様)で検出ヘッドを拡張することにより、リアルタイムのインスタンスセグメンテーションを統合し、オーバーヘッドを最小限に抑えます。
重要なこととして、YOLOEのオープンワールドモジュールは、通常のクローズドセットYOLOとして使用する場合、推論コストを発生させません。トレーニング後、YOLOEのパラメータは標準のYOLOヘッドに再パラメータ化でき、同一のFLOPと速度を維持します(例えば、YOLO11と完全に一致します)。
利用可能なモデル、サポートされているタスク、および動作モード
このセクションでは、特定の事前学習済み重みを持つ利用可能なモデル、それらがサポートするタスク、および推論、検証、トレーニング、エクスポートなどのさまざまな動作モードとの互換性について詳述します。サポートされているモードは✅、サポートされていないモードは❌で示されます。
テキスト/ビジュアルプロンプトモデル
| モデルの種類 | 事前学習済み重み | サポートされているタスク | 推論 | 検証 | 学習 | エクスポート |
|---|---|---|---|---|---|---|
| YOLOE-11S | yoloe-11s-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-11M | yoloe-11m-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-11L | yoloe-11l-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8S | yoloe-v8s-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8M | yoloe-v8m-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8L | yoloe-v8l-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26N | yoloe-26n-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26S | yoloe-26s-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26M | yoloe-26m-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26L | yoloe-26l-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26X | yoloe-26x-seg.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
プロンプトフリーモデル
| モデルの種類 | 事前学習済み重み | サポートされているタスク | 推論 | 検証 | 学習 | エクスポート |
|---|---|---|---|---|---|---|
| YOLOE-11S-PF | yoloe-11s-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-11M-PF | yoloe-11m-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-11L-PF | yoloe-11l-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8S-PF | yoloe-v8s-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8M-PF | yoloe-v8m-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-v8L-PF | yoloe-v8l-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-26N-PF | yoloe-26n-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-26S-PF | yoloe-26s-セグ-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-26M-PF | yoloe-26m-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| YOLOE-26L-PF | yoloe-26l-seg-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
| ヨローエ-26X-PF | yoloe-26x-セグ-pf.pt | インスタンスセグメンテーション | ✅ | ✅ | ✅ | ✅ |
YOLOE-26 性能
YOLOE-26モデルの詳しい性能ベンチマークについては、YOLO26ドキュメントを参照してください。
使用例
YOLOEモデルは、pythonアプリケーションに簡単に統合できます。Ultralyticsは、開発を効率化するためのユーザーフレンドリーなPython APIとCLIコマンドを提供します。
学習の使用法
カスタムデータセットでのファインチューニング
検出とインスタンスセグメンテーションの両方のタスクにおいて、カスタムYOLOデータセットで事前学習済みのYOLOEモデルをファインチューニングできます。
見る: 自動車部品segmentationデータセットでYOLOEをトレーニングする方法 | オープンボキャブラリーモデル、予測、エクスポート 🚀
例
インスタンスセグメンテーション
YOLOEの事前学習済みチェックポイントのファインチューニングは、ほとんどの場合、 標準的なYOLOトレーニング手順に従います。主な違いは、明示的に以下を渡すことです。 YOLOEPESegTrainer としての trainer パラメータを model.train():
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
model = YOLOE("yoloe-26s-seg.pt")
# Fine-tune on your segmentation dataset
results = model.train(
data="coco128-seg.yaml", # Segmentation dataset
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Important: use segmentation trainer
)
物体検出
すべて 事前学習済みのYOLOEモデル は、デフォルトでインスタンスセグメンテーションを実行します。これらの事前学習済みチェックポイントを検出モデルのトレーニングに使用するには、YAML構成を使用して検出モデルをゼロから初期化し、同じスケールの事前学習済みセグメンテーションチェックポイントをロードします。ここでは、 YOLOEPETrainer の代わりに YOLOEPESegTrainer を使用していることに注意してください。これは、検出モデルをトレーニングしているためです。
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
# Initialize a detection model from a config
model = YOLOE("yoloe-26s.yaml")
# Load weights from a pretrained segmentation checkpoint (same scale)
model.load("yoloe-26s-seg.pt")
# Fine-tune on your detection dataset
results = model.train(
data="coco128.yaml", # Detection dataset
epochs=80,
patience=10,
trainer=YOLOEPETrainer, # <- Important: use detection trainer
)
線形プロービングは、モデルの残りの部分をフリーズしたまま、分類ブランチのみをファインチューニングします。このアプローチは、以前に学習した特徴を活用して分類ヘッドのみを適応させることで、過学習を防ぐため、限られたデータで作業する場合に役立ちます。
インスタンスセグメンテーション
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
# Load a pretrained segmentation model
model = YOLOE("yoloe-26s-seg.pt")
# Identify the head layer index
head_index = len(model.model.model) - 1
# Freeze all backbone and neck layers (i.e., everything before the head)
freeze = [str(i) for i in range(0, head_index)]
# Freeze parts of the segmentation head, keeping only the classification branch trainable
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
# Freeze detection branch components
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
# Train only the classification branch
results = model.train(
data="coco128-seg.yaml", # Segmentation dataset
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Important: use segmentation trainer
freeze=freeze,
)
物体検出
物体検出タスクの場合、トレーニングプロセスは上記のインスタンスセグメンテーションの例とほぼ同じですが、 YOLOEPETrainer の代わりに YOLOEPESegTrainerを使用し、YAMLを使用して物体検出モデルを初期化し、事前学習済みのインスタンスセグメンテーションチェックポイントから重みをロードします。
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
# Initialize a detection model from a config
model = YOLOE("yoloe-26s.yaml")
# Load weights from a pretrained segmentation checkpoint (same scale)
model.load("yoloe-26s-seg.pt")
# Identify the head layer index
head_index = len(model.model.model) - 1
# Freeze all backbone and neck layers (i.e., everything before the head)
freeze = [str(i) for i in range(0, head_index)]
# Freeze parts of the segmentation head, keeping only the classification branch trainable
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
# Freeze detection branch components
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
# Train only the classification branch
results = model.train(
data="coco128.yaml", # Detection dataset
epochs=80,
patience=10,
trainer=YOLOEPETrainer, # <- Important: use detection trainer
freeze=freeze,
)
予測の使用方法
YOLOEは、テキストベースと視覚的なプロンプトの両方をサポートしています。プロンプトの使用は簡単で、単にそれらを介して渡すだけです。 predict メソッドを以下に示します。
例
テキストプロンプトを使用すると、テキスト記述を介して検出したいクラスを指定できます。次のコードは、YOLOEを使用して画像内の人物とバスをdetectする方法を示しています。
from ultralytics import YOLOE
# Initialize a YOLOE model
model = YOLOE("yoloe-26l-seg.pt") # or yoloe-26s/m-seg.pt for different sizes
# Set text prompt to detect person and bus. You only need to do this once after you load the model.
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
# Run detection on the given image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
ビジュアルプロンプトを使用すると、テキストで記述する代わりに、ターゲットクラスのビジュアルな例を示すことでモデルをガイドできます。
The visual_prompts 引数は、次の2つのキーを持つ辞書を取ります。 bboxes および clsの各バウンディングボックスは bboxes モデルにdetectさせたいオブジェクトの例を厳密に囲み、対応するエントリは cls そのボックスのクラスラベルを指定します。この組み合わせは、モデルに「これがクラスXの見え方です。これに似たものをさらに見つけてください」と伝えます。
クラスID(cls) 内。 visual_prompts は、各バウンディングボックスをプロンプト内の特定のカテゴリに関連付けるために使用されます。これらは固定されたラベルではなく、各例に割り当てる一時的な識別子です。唯一の要件は、クラスIDが0から始まる連続した番号でなければならないことです。これにより、モデルは各ボックスをそれぞれのクラスに正しく関連付けることができます。
推論を実行するのと同じ画像内で、視覚的なプロンプトを直接提供できます。例:
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-26l-seg.pt")
# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
bboxes=np.array(
[
[221.52, 405.8, 344.98, 857.54], # Box enclosing person
[120, 425, 160, 445], # Box enclosing glasses
],
),
cls=np.array(
[
0, # ID to be assigned for person
1, # ID to be assigned for glasses
]
),
)
# Run inference on an image, using the provided visual prompts as guidance
results = model.predict(
"ultralytics/assets/bus.jpg",
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
または、を使用して、別の参照画像から例を提供できます。 refer_image 引数を使用します。その場合、 bboxes および cls で visual_prompts 予測対象の画像ではなく、参照画像内のオブジェクトを記述する必要があります。
注
もし source がビデオまたはストリームの場合、モデルは自動的に最初のフレームを refer_imageは、あなたの visual_prompts がその初期フレームに適用され、モデルがビデオの残りの部分で何を探すべきかを理解するのに役立ちます。または、特定のフレームを明示的に refer_image モデルが参照として使用する視覚的な例を制御するには。
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-26l-seg.pt")
# Define visual prompts based on a separate reference image
visual_prompts = dict(
bboxes=np.array([[221.52, 405.8, 344.98, 857.54]]), # Box enclosing person
cls=np.array([0]), # ID to be assigned for person
)
# Run prediction on a different image, using reference image to guide what to look for
results = model.predict(
"ultralytics/assets/zidane.jpg", # Target image for detection
refer_image="ultralytics/assets/bus.jpg", # Reference image used to get visual prompts
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
使用 refer_image また、クラスを永続的に設定するため、同じビジュアルプロンプトを再度提供することなく予測を実行でき、エクスポート後も同じクラスをdetectする機能を保持したままモデルをエクスポートできます。
# After making prediction with `refer_image`, you can run predictions without passing visual_prompts again and still get the same classes back
results = model("ultralytics/assets/bus.jpg")
# Or export it to a different format while retaining the classes
model.export(format="onnx")
複数のターゲット画像を渡して、予測を実行することもできます。
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-26l-seg.pt")
# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
bboxes=[
np.array(
[
[221.52, 405.8, 344.98, 857.54], # Box enclosing person
[120, 425, 160, 445], # Box enclosing glasses
],
),
np.array([[150, 200, 1150, 700]]),
],
cls=[
np.array(
[
0, # ID to be assigned for person
1, # ID to be assigned for glasses
]
),
np.array([0]),
],
)
# Run inference on multiple image, using the provided visual prompts as guidance
results = model.predict(
["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
YOLOEには、組み込みのボキャブラリーを備えたプロンプトフリーのバリアントも含まれています。これらのモデルはプロンプトを必要とせず、従来のYOLOモデルのように機能します。ユーザーが提供するラベルや視覚的な例に依存する代わりに、Recognize Anything Model Plus (RAM++)が使用するタグセットに基づいて、4,585クラスの事前定義されたリストからオブジェクトをdetectします。
from ultralytics import YOLOE
# Initialize a YOLOE model
model = YOLOE("yoloe-26l-seg-pf.pt")
# Run prediction. No prompts required.
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
Val の使用法
データセットに対するモデルの検証は、次のように効率化されています。
例
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-26l-seg.pt") # or yoloe-26s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")
デフォルトでは、提供されたデータセットを使用して各カテゴリの視覚的埋め込みを抽出します。
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-26l-seg.pt") # or yoloe-26s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True)
あるいは、別のデータセットをリファレンスデータセットとして使用し、各カテゴリの視覚的埋め込みを抽出することもできます。このリファレンスデータセットは、提供されたデータセットと完全に同じカテゴリを持つ必要があります。
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-26l-seg.pt") # or select yoloe-26s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True, refer_data="coco.yaml")
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-26l-seg-pf.pt") # or yoloe-26s/m-seg-pf.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", single_cls=True)
エクスポートの使用法
エクスポートのプロセスは他のYOLOモデルと同様ですが、テキストとビジュアルプロンプトを処理できる柔軟性が追加されています。
例
from ultralytics import YOLOE
# Select yoloe-26s/m-seg.pt for different sizes
model = YOLOE("yoloe-26l-seg.pt")
# Configure the set_classes() before exporting the model
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
export_model = model.export(format="onnx")
model = YOLOE(export_model)
# Run detection on the given image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
公式モデルの学習
データセットの準備
注
公式YOLOEモデルのトレーニングには、トレーニングデータ用のsegmentアノテーションが必要です。 公式チームが提供するスクリプト データセットをsegmentアノテーションに変換するもので、 SAM2.1モデルまたは、提供されているものを直接ダウンロードすることもできます。 Processed Segment Annotations 公式チームが提供する以下の表に記載されています。
- 学習データ
| データセット | 種類 | サンプル | ボックス | 生の検出アノテーション | 処理されたセグメントアノテーション |
|---|---|---|---|---|---|
| Objects365v1 | 検出 | 609k | 9621k | objects365_train.json | objects365_train_segm.json |
| GQA | Grounding | 621k | 3681k | final_mixed_train_no_coco.json | final_mixed_train_no_coco_segm.json |
| Flickr30k | Grounding | 149k | 641k | final_flickr_separateGT_train.json | final_flickr_separateGT_train_segm.json |
- Valデータ
| データセット | 種類 | アノテーションファイル |
|---|---|---|
| LVIS minival | 検出 | minival.txt |
トレーニングを最初から開始する
注
Visual Prompt モデルは、十分にトレーニングされたものに基づいて微調整されます Text Prompt モデル。
例
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-26l-seg.yaml")
model.train(
data=data,
batch=128,
epochs=30,
close_mosaic=2,
optimizer="AdamW",
lr0=2e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOESegTrainerFromScratch,
device="0,1,2,3,4,5,6,7",
)
以降 SAVPE モジュールはトレーニング中に更新する必要があります。
トレーニング済みのテキストプロンプトモデルを検出モデルに変換し、トレーニングコストを削減して検出パイプラインを採用します。
このステップはオプションであり、セグメンテーションから直接開始することもできます。
from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load
det_model = YOLOE("yoloe-26l.yaml")
state = torch_load("yoloe-26l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-26l-seg-det.pt")
学習開始:
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegVPTrainer
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-26l-seg.pt")
# replace to yoloe-26l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-26l-seg-det.pt")
# freeze every layer except of the savpe module.
head_index = len(model.model.model) - 1
freeze = list(range(0, head_index))
for name, child in model.model.model[-1].named_children():
if "savpe" not in name:
freeze.append(f"{head_index}.{name}")
model.train(
data=data,
batch=128,
epochs=2,
close_mosaic=2,
optimizer="AdamW",
lr0=16e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOESegVPTrainer, # use YOLOEVPTrainer if converted to detection model
device="0,1,2,3,4,5,6,7",
freeze=freeze,
)
トレーニング後にセグメンテーションモデルに戻します。トレーニング前にセグメンテーションモデルを検出モデルに変換した場合にのみ必要です。
from copy import deepcopy
from ultralytics import YOLOE
model = YOLOE("yoloe-26l-seg.yaml")
model.load("yoloe-26l-seg.pt")
vp_model = YOLOE("yoloe-11l-vp.pt")
model.model.model[-1].savpe = deepcopy(vp_model.model.model[-1].savpe)
model.eval()
model.save("yoloe-26l-seg.pt")
視覚的なプロンプトトレーニングと同様に、プロンプトフリーモデルの場合、トレーニング中に更新する必要があるのは、特殊なプロンプト埋め込みだけです。 トレーニング済みのテキストプロンプトモデルを検出モデルに変換し、トレーニングコストを抑えて検出パイプラインを採用します。 このステップはオプションであり、セグメンテーションから直接開始することもできます。
from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load
det_model = YOLOE("yoloe-26l.yaml")
state = torch_load("yoloe-26l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-26l-seg-det.pt")
from ultralytics import YOLOE
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-26l-seg.pt")
# replace to yoloe-26l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-26l-seg-det.pt")
# freeze layers.
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
model.train(
data=data,
batch=128,
epochs=1,
close_mosaic=1,
optimizer="AdamW",
lr0=2e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOEPEFreeTrainer,
device="0,1,2,3,4,5,6,7",
freeze=freeze,
single_cls=True, # this is needed
)
トレーニング後にセグメンテーションモデルに戻します。トレーニング前にセグメンテーションモデルを検出モデルに変換した場合にのみ必要です。
from copy import deepcopy
from ultralytics import YOLOE
model = YOLOE("yoloe-26l-seg.pt")
model.eval()
pf_model = YOLOE("yoloe-26l-seg-pf.pt")
names = ["object"]
tpe = model.get_text_pe(names)
model.set_classes(names, tpe)
model.model.model[-1].fuse(model.model.pe)
model.model.model[-1].cv3[0][2] = deepcopy(pf_model.model.model[-1].cv3[0][2]).requires_grad_(True)
model.model.model[-1].cv3[1][2] = deepcopy(pf_model.model.model[-1].cv3[1][2]).requires_grad_(True)
model.model.model[-1].cv3[2][2] = deepcopy(pf_model.model.model[-1].cv3[2][2]).requires_grad_(True)
del model.model.pe
model.save("yoloe-26l-seg-pf.pt")
YOLOEの性能比較
YOLOEは、速度やモデルサイズを犠牲にすることなく、COCO 標準ベンチマークにおいて、クローズドセットYOLO 精度に匹敵またはそれを上回ります。以下の表は、YOLOE-L(YOLO11)とYOLOE26-L(YOLO26ベース)を、対応するクローズドセットモデルと比較したものです:
| モデル | COCO mAP50-95 | LVISmAP50-95 | 推論速度(T4) | パラメータ | GFLOPs (640px) |
|---|---|---|---|---|---|
| YOLOv8-L (closed-set) | 52.9% | - | 9.06 ms (110 FPS) | 43.7 M | 165.2 B |
| YOLO11-L (クローズドセット) | 53.5% | - | 6.2ミリ秒(161 FPS) | 26.2 M | 86.9 B |
| YOLOE-L (オープンボキャブラリー) | 52.6% | 35.2% | 6.2ミリ秒(161 FPS) | 26.2 M | 86.9 B† |
| YOLOE26-L(オープンボキャブラリ) | - | 36.8% | 6.2ミリ秒(161 FPS) | 32.3 M | 88.3B† |
†YOLOE-LYOLO11アーキテクチャを共有し、YOLOE26-LはYOLO26-Lのアーキテクチャを共有するため、推論速度とGFLOPsは類似している。
YOLOE26-Lは、3230万パラメータと883億FLOPSで36.8%のLVISmAPを達成し、T4GPU640×640画像を6.2ミリ秒(161 FPS)で処理する。これはYOLOE-Lの35.2% LVISmAPを上回りながら、同等の推論速度を維持している。 重要な点として、YOLOEのオープンボキャブラリモジュールは推論コストを一切発生させず、「ノーフリーランチのトレードオフ」を実現する設計を示している。
ゼロショットタスクにおいて、YOLOE26は既存のオープンボキャブラリ検出器を大幅に上回る性能を発揮する:LVISでは、YOLOE26-Sが29.9%mAPを達成し、YOLO を+11.4AP上回り、YOLOE26-Lは36.8%mAPを達成し、YOLO を+10.0AP上回った。 YOLOE26はT4GPU上で161 FPSという効率的な推論を維持し、リアルタイムのオープンボキャブラリアプリケーションに最適である。
注
ベンチマーク条件: YOLOEの結果は、Objects365、GoldG、LVISで事前学習され、その後COCOでファインチューニングまたは評価されたモデルによるものです。YOLOEがYOLOv8に対してわずかにmAPで優位に立つのは、広範な事前学習によるものです。このオープンボキャブラリー学習がなければ、YOLOEは同サイズのYOLOモデルに匹敵し、性能低下なしにそのSOTA精度とオープンワールドの柔軟性を確証します。
以前のモデルとの比較
YOLOEは、従来のYOLOモデルおよびオープンボキャブラリー検出器に比べて、注目すべき進化を遂げています。
YOLOE vs YOLOv5:YOLOv5は優れた速度と精度のバランスを提供しましたが、新しいクラスには再トレーニングが必要で、アンカーベースのヘッドを使用していました。対照的に、YOLOEはアンカーフリーであり、新しいクラスを動的にdetectします。YOLOv8の改良を基盤とするYOLOEは、より高い精度(COCOでYOLOv5の約50% mAPに対し52.6%)を達成し、YOLOv5とは異なりインスタンスsegmentationを統合しています。
YOLOE vs YOLOv8: YOLOEはYOLOv8の再設計されたアーキテクチャを拡張し、同等またはそれ以上の精度(約26Mパラメータで52.6% mAP、YOLOv8-Lの約44Mパラメータで52.9%)を達成しています。強力な事前学習により、トレーニング時間を大幅に短縮します。主要な進歩は、YOLOEのオープンワールド機能であり、YOLOv8のクローズドセット設計とは異なり、プロンプトを介して未知のオブジェクト(例:「bird scooter」や「peace symbol」)をdetectします。
YOLOE vs YOLO11:YOLO11はYOLOv8を改良し、効率性を向上させ、パラメータ数を削減(約22%減)しています。YOLOEはこれらの利点を直接継承し、YOLO11の推論速度とパラメータ数(約26Mパラメータ)に匹敵しながら、オープンボキャブラリーのdetectとsegmentationを追加しています。クローズドセットシナリオでは、YOLOEはYOLO11と同等ですが、重要なことに、未知のクラスをdetectする適応性を追加し、速度を損なうことなくYOLO11 + オープンワールド機能を実現しています。
YOLOE26 vs YOLOE (YOLO11):YOLOE26はYOLO26のアーキテクチャを基盤とし、NMS推論NMSンドツーエンド設計を継承している。 LVISデータセットにおいて、YOLOE26-Lは36.mAPを達成し、YOLOE-Lの35.mAP。YOLOE26は5段階のモデルサイズ(N/S/M/L/X)を提供し、YOLOEの3段階(S/M/L)と比較して、多様な展開シナリオに対応する柔軟性を提供する。
YOLOE26と従来のオープンボキャブラリ検出器の比較:従来のオープンボキャブラリモデル(GLIP、OWL-ViT、YOLO)はビジョン言語トランスフォーマーに大きく依存していたため、推論速度が遅かった。 LVIS では、YOLOE26-S は29.9%mAP(YOLO より 11.4AP高い) mAP達成し、YOLOE26-L は36.8%mAP(YOLO より 10.0AP高い) mAP達成しながら、T4GPU 上で161 FPSのリアルタイム推論を維持しています。 トランスフォーマーベースの手法(例:GLIP)と比較して、YOLOE26は桁違いに高速な推論を実現し、オープンセット検出における精度と効率のギャップを効果的に埋めている。
要約すると、YOLOEおよびYOLOE26YOLO定評ある高速性と効率YOLO維持しつつ、精度において先行モデルを凌駕し、セグメンテーションを統合し、強力なオープンワールド検出を導入している。YOLOE26はさらに、YOLO26NMS推論を基盤にアーキテクチャを進化させ、リアルタイムのオープンボキャブラリアプリケーションに最適である。
ユースケースと応用
YOLOEのオープンボキャブラリー検出とセグメンテーションは、従来の固定クラスモデルを超えた多様なアプリケーションを可能にします。
オープンワールド物体detect:ロボティクスのような動的なシナリオに最適です。ロボットがプロンプトを使用して以前に見たことのない物体を認識したり、セキュリティシステムが再トレーニングなしで新しい脅威(例:危険物)に迅速に適応したりするような場合です。
Few-ShotおよびOne-Shot detect: 視覚プロンプト (SAVPE) を使用して、YOLOEは単一の参照画像から新しい物体を迅速に学習します。これは産業検査(部品や欠陥を即座に識別)やカスタム監視に最適であり、最小限のセットアップで視覚検索を可能にします。
大規模語彙およびロングテール認識: 1000以上のクラスの語彙を備えたYOLOEは、生物多様性モニタリング(希少種のdetect)、博物館コレクション、小売在庫、またはeコマースのようなタスクで優れており、多数のクラスを、クラスごとの広範なトレーニングなしで確実に識別します。
インタラクティブなdetectとsegmentation: YOLOEは、自然な入力(テキストまたは視覚プロンプト)によって駆動される、検索可能なビデオ/画像検索、拡張現実 (AR)、直感的な画像編集などのリアルタイムインタラクティブアプリケーションをサポートします。ユーザーはsegmentationマスクを使用して、物体を動的に分離、識別、または正確に編集できます。
自動データラベリングとブートストラップ: YOLOEは、初期のバウンディングボックスとsegmentationアノテーションを提供することで、迅速なデータセット作成を促進し、人間によるラベリング作業を大幅に削減します。特に大規模メディアコレクションの分析において価値があり、そこでは存在する物体を自動識別し、より迅速な専門モデルの構築を支援します。
あらゆるオブジェクトのsegmentation: プロンプトを介して任意のオブジェクトへのsegmentation機能を拡張します。これは、医療画像処理、顕微鏡検査、または衛星画像分析に特に有益であり、特殊な事前学習済みモデルなしで構造を自動的に識別し、正確にsegmentします。SAMのようなモデルとは異なり、YOLOEはオブジェクトを自動的に認識しsegmentするため、コンテンツ作成やシーン理解などのタスクに役立ちます。
これらのすべてのユースケースにおいて、YOLOEの主な利点は汎用性であり、動的なシナリオ全体で検出、認識、セグメンテーションのための統一されたモデルを提供します。その効率性により、リソースが限られたデバイス上でのリアルタイムパフォーマンスが保証され、ロボット工学、自動運転、防衛などに最適です。
ヒント
ニーズに基づいてYOLOEのモードを選択してください。
- Closed-set mode: 固定クラスのタスク向け(最高の速度と精度)。
- プロンプトモード: テキストまたはビジュアルプロンプトを介して新しいオブジェクトをすばやく追加します。
- プロンプトフリーのオープンセットモード: 多くのカテゴリにわたる一般的な検出(カタログ作成や発見に最適)。
多くの場合、プロンプトなしの検出に続いてターゲットを絞ったプロンプトを使用するなど、モードを組み合わせることで、YOLOEの可能性を最大限に引き出すことができます。
学習と推論
YOLOEは、他のYOLOモデル(YOLOv8、YOLO-World)と同様に、Ultralytics Python APIおよびCLIとシームレスに統合されます。以下に、すぐに始める方法を示します。
YOLOEによる学習と推論
from ultralytics import YOLO
# Load pretrained YOLOE model and train on custom data
model = YOLO("yoloe-26s-seg.pt")
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
# Run inference using text prompts ("person", "bus")
model.set_classes(["person", "bus"])
results = model.predict(source="test_images/street.jpg")
results[0].save() # save annotated output
ここで、YOLOEはデフォルトでは標準の検出器のように動作しますが、クラスを指定することで、プロンプトによる検出に簡単に切り替えることができます(set_classes)結果には、バウンディングボックス、マスク、およびラベルが含まれます。
# Training YOLOE on custom dataset
yolo train model=yoloe-26s-seg.pt data=path/to/data.yaml epochs=50 imgsz=640
# Inference with text prompts
yolo predict model=yoloe-26s-seg.pt source="test_images/street.jpg" classes="person,bus"
CLI プロンプト (classes)ガイドは、python の YOLOE と同様です set_classes。ビジュアルプロンプト(画像ベースのクエリ)は現在、Python APIが必要です。
その他のサポートされているタスク
- 検証: 精度を容易に評価
model.val()またはyolo val. - エクスポート: YOLOEモデルのエクスポート(
model.export())をONNX、TensorRTなどに変換することで、デプロイメントを容易にします。 - トラッキング: YOLOEは、オブジェクト追跡をサポートしています(
yolo track)を統合すると、動画内でプロンプトされたクラスの追跡に役立ちます。
注
YOLOEは自動的に以下を含みます セグメンテーションマスク 推論結果(results[0].masks)により、個別のモデルを必要とせずに、オブジェクトの抽出や測定などのピクセル単位の精密なタスクを簡素化します。
はじめに
以下の手順に従って、Ultralytics で YOLOE を迅速にセットアップします。
インストール: Ultralyticsパッケージをインストールまたは更新します。
pip install -U ultralyticsYOLOEの重みをダウンロード:事前学習済みのYOLOEモデル(例:YOLOE-v8-S/L、YOLOE-11バリアント)は、YOLOE GitHubリリースから入手可能です。ご希望のモデルをダウンロードするだけです
.ptUltralytics YOLO クラスにロードするファイル。ハードウェア要件:
- 推論: 推奨GPU(NVIDIA製、VRAM 4~8GB以上)。小型モデルは、エッジGPU(例:Jetson)やCPUで低解像度であれば効率的に動作します。コンパクトなワークステーションでの高性能推論については、弊社のNVIDIA DGX Sparkガイドをご覧ください。
- トレーニング:カスタムデータでのYOLOEの微調整には、通常、1つのGPUのみが必要です。作成者が使用した広範なオープンボキャブラリーの事前トレーニング(LVIS/Objects365)には、かなりの計算量(8× RTX 4090 GPU)が必要でした。
構成: YOLOEの設定は、標準のUltralyticsのyamlファイルを使用します。デフォルトの設定(例:
yoloe-26s-seg.yaml)で通常は十分ですが、必要に応じてバックボーン、クラス、または画像サイズを変更できます。YOLOEの実行:
- 迅速な推論 (プロンプト不要):
yolo predict model=yoloe-26s-seg-pf.pt source="image.jpg" プロンプトを使用した検出 (テキストプロンプトの例):
from ultralytics import YOLO model = YOLO("yoloe-26s-seg.pt") names = ["bowl", "apple"] model.set_classes(names, model.get_text_pe(names)) results = model.predict("kitchen.jpg") results[0].save()
- 迅速な推論 (プロンプト不要):
統合のヒント:
- クラス名: デフォルトのYOLOE出力はLVISカテゴリを使用します。以下を使用してください
set_classes()独自のラベルを指定します。 - 速度: YOLOEは、プロンプトを使用しない限りオーバーヘッドはありません。テキストプロンプトの影響は最小限で、ビジュアルプロンプトはわずかに大きくなります。
- バッチ推論: 直接サポート (
model.predict([img1, img2]))画像固有のプロンプトの場合は、画像を個別に実行してください。
- クラス名: デフォルトのYOLOE出力はLVISカテゴリを使用します。以下を使用してください
Ultralyticsドキュメントには、さらに多くのリソースが用意されています。YOLOEを使用すると、使い慣れたYOLOエコシステム内で強力なオープンワールド機能を簡単に探索できます。
ヒント
プロからのアドバイス: YOLOEのzero-shot精度を最大化するには、スクラッチからトレーニングするのではなく、提供されているチェックポイントからファインチューンしてください。検出精度を向上させるために、一般的なトレーニングラベル(LVISカテゴリを参照)に合わせたプロンプトワードを使用してください。
引用と謝辞
YOLOEがあなたの研究またはプロジェクトに貢献した場合、清華大学のAo Wang、Lihao Liu、Hui Chen、Zijia Lin、Jungong Han、Guiguang Dingによる原著論文を引用してください。
@misc{wang2025yoloerealtimeseeing,
title={YOLOE: Real-Time Seeing Anything},
author={Ao Wang and Lihao Liu and Hui Chen and Zijia Lin and Jungong Han and Guiguang Ding},
year={2025},
eprint={2503.07465},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2503.07465},
}
さらに詳しく知りたい場合は、オリジナルのYOLOE論文がarXivで入手できます。プロジェクトのソースコードと追加のリソースは、GitHubリポジトリからアクセスできます。
よくある質問
YOLOEはYOLO-Worldとどう違いますか?
YOLOEとYOLO-Worldはどちらもオープンボキャブラリーdetectを可能にしますが、YOLOEにはいくつかの利点があります。YOLOEはLVISで+3.5 AP高い精度を達成し、YOLO-Worldv2よりもトレーニングリソースを3分の1に削減し、1.4倍高速に動作します。YOLOEは3つのプロンプトモード(テキスト、ビジュアル、内部ボキャブラリー)もサポートしていますが、YOLO-Worldは主にテキストプロンプトに焦点を当てています。さらに、YOLOEにはインスタンスsegmentation機能が組み込まれており、追加のオーバーヘッドなしでdetectされたオブジェクトのピクセル単位のマスクを提供します。
YOLOEを通常のYOLOモデルとして使用できますか?
はい、YOLOEは、パフォーマンスの低下なしに、標準的なYOLOモデルとまったく同じように機能します。クローズドセットモード(プロンプトなし)で使用すると、YOLOEのオープンボキャブラリ モジュールは標準の検出ヘッドに再パラメータ化され、同等のYOLO11モデルと同一の速度と精度が得られます。これにより、YOLOEは非常に汎用性が高くなります。最大の速度を得るために従来の検出器として使用し、必要な場合にのみオープンボキャブラリ モードに切り替えることができます。
YOLOEではどのような種類のプロンプトを使用できますか?
YOLOEは3種類のプロンプトをサポートしています。
- テキストプロンプト: 自然言語を使用してオブジェクトクラスを指定します(例:「人」、「信号」、「鳥のスクーター」)
- ビジュアルプロンプト: detectしたいオブジェクトの参照画像を提供します
- 内部語彙:外部プロンプトなしで、YOLOEの1200以上のカテゴリの組み込み語彙を使用します
この柔軟性により、モデルを再トレーニングすることなく、さまざまなシナリオにYOLOEを適応させることができます。これは、検出要件が頻繁に変化する動的な環境で特に役立ちます。
YOLOEはインスタンスセグメンテーションをどのように処理しますか?
YOLOEは、マスク予測ブランチで検出ヘッドを拡張することにより、インスタンスセグメンテーションをアーキテクチャに直接統合します。このアプローチはYOLOv8-Segに似ていますが、プロンプトされた任意のオブジェクトクラスに対して機能します。セグメンテーションマスクは推論結果に自動的に含まれ、以下を介してアクセスできます。 results[0].masks。この統一されたアプローチにより、個別の検出モデルやセグメンテーションモデルは不要となり、ピクセル単位で正確なオブジェクト境界を必要とするアプリケーションのワークフローを効率化できます。
YOLOEはカスタムプロンプトで推論をどのように処理しますか?
YOLO-Worldと同様に、YOLOEはオフラインボキャブラリーを利用して効率を高める「プロンプト・アンド・detect」戦略をサポートしています。キャプションや特定のオブジェクトカテゴリなどのカスタムプロンプトは、事前にエンコードされ、オフラインボキャブラリー埋め込みとして保存されます。このアプローチにより、再トレーニングを必要とせずにdetectプロセスが効率化されます。モデル内でこれらのプロンプトを動的に設定し、特定のdetectタスクに合わせて調整できます。
from ultralytics import YOLO
# Initialize a YOLOE model
model = YOLO("yoloe-26s-seg.pt")
# Define custom classes
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
# Execute prediction on an image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()