Ultralytics YOLO27:
Get Started

YOLOE: リアルタイムのオープンボキャブラリー検出とセグメンテーション#

Ultralytics YOLOE(あらゆるものをリアルタイムに認識)は、オープンボキャブラリー検出とインスタンスセグメンテーションのモデルです。トレーニング時に固定されたクラスリストを使う代わりに、推論時にテキストプロンプト、視覚的な例、または組み込みの4,585個の名前を持つ語彙から、必要なカテゴリを指定します。UltralyticsのYOLOアーキテクチャ(YOLOv8、YOLO11、YOLO26)を基盤とし、YOLO-Worldに着想を得たYOLOEは、クローズドセットYOLOに近い速度で、ゼロショット精度の最先端を実現します。



視聴: Ultralytics YOLOE-26(新機能)の使い方 | オープンボキャブラリーとリアルタイムのあらゆる対象の認識 🚀

クイックスタート#

必要なクラスを指定して実行するだけです。YOLOE-26は、学習時に一度も見ていないカテゴリのボックスとインスタンスセグメンテーションマスクを返します。

名前を指定できるあらゆる対象を検出
from ultralytics import YOLOE

model = YOLOE("yoloe-26s-seg.pt")

# 「double-decker bus」はCOCOのクラスではありません。YOLOEは単語だけからそれを特定します
model.set_classes(["double-decker bus", "person"])

results = model.predict("https://ultralytics.com/images/bus.jpg")
results[0].show()

最初のset_classes()の呼び出しではテキストエンコーダーがダウンロードされます。ネットワークに接続できないマシンにデプロイする前に、インストールと要件をご確認ください。

プロンプトモードの選択#

YOLOEは3つのプロンプトモードに対応しており、選択したモードによって読み込むチェックポイントとクラスラベルの形式が決まります。推論時に用意できるものに合った行を選んでください。

テキストプロンプト、視覚的プロンプト、プロンプト不要の語彙を使って物体を検出・セグメンテーションするYOLOE

モードチェックポイント指定するもの結果に含まれるクラス名使用する場面
テキストプロンプト*-seg.pt文字列としてのクラス名指定した名前と完全に一致する名前対象を言葉で説明できる場合(一般的な選択肢)
視覚的プロンプト*-seg.pt参照画像上のサンプルボックス汎用のobject0、object1、…特定の部位、ロゴ、欠陥など、対象を言葉で表せない場合
プロンプト不要*-seg-pf.ptなし組み込みの4,585個の名前を持つ語彙からの名前事前に探すものがわからず、カタログ作成や探索を行う場合
よくある2つの注意点
  • 視覚的プロンプトにラベルは引き継がれません。visual_prompts内のクラスIDはサンプルをグループ化するためのもので、モデルはobject0、object1などとして出力します。独自の名前への対応付けは、ご自身で行ってください。
  • プロンプト不要のチェックポイントはset_classes()を受け付けません。*-seg-pf.ptモデルに対して呼び出すと、AssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.が発生します。独自のクラスが必要な場合は、代わりに*-seg.ptチェックポイントを読み込んでください。

インストールと要件#

YOLOEはUltralyticsのメインパッケージに含まれています:

pip install -U ultralytics

テキストプロンプトには、これに加えてテキストエンコーダーが必要です。テキストエンコーダーはインストール時ではなく、初回使用時に取得されます:

  • 最初のset_classes()呼び出しでは、pip(トークナイザーを提供)を使ってGitHubからultralytics/CLIPをインストールし、TorchScriptテキストエンコーダーを現在の作業ディレクトリにダウンロードします。YOLOE-26では約254 MBのmobileclip2_b.tsが、YOLOE-11とYOLOE-v8ではmobileclip_blt.tsがダウンロードされます。ダウンロードは実行するディレクトリから一度だけ行うか、ファイルをそのディレクトリにコピーしてください。そうしないと、再度ダウンロードされます。
  • どちらの手順にもネットワーク接続が必要なため、オフライン環境またはネットワークから隔離されたマシンにデプロイする前に、プロンプトを使った予測を一度実行してください。
  • 視覚的プロンプトとプロンプト不要のチェックポイントには、テキストエンコーダーは一切必要ありません。

YOLOE-26のチェックポイントにはultralytics8.4.0以降が必要です。YOLOE-11とYOLOE-v8の各モデルは、それ以前のリリースでも利用できます。テキストプロンプトを使った予測を一度実行すれば、チェックポイントのダウンロード、CLIPのインストール、テキストエンコーダー、推論という一連の処理を実行できます:

yolo predict model=yoloe-26s-seg.pt source="https://ultralytics.com/images/bus.jpg" classes="person"

推論時のテキストエンコーダーのダウンロードを完全に省くには、プロンプトを一度だけ重みに組み込み、再利用してください。詳しくはプロンプト埋め込みの再利用をご覧ください。

アーキテクチャの概要#

YOLOE Architecture

YOLOEは、特徴抽出用の畳み込みバックボーン、マルチスケール融合用のネック、クラスとボックスを予測するアンカーフリーの分離型ヘッドという標準的なYOLO構造を維持し、各プロンプトモードに対応する3つのモジュールを追加しています:

  • 再パラメーター化可能な領域・テキストアライメント(RepRTA)は、小規模な補助ネットワークを介してCLIPのテキスト埋め込みを調整します。このネットワークはset_classes()の呼び出しごとに一度実行され、エクスポート時に折りたたまれるため、フレームごとのコストはかかりません。すべてのフォワードパスで実行されるのは、保存されたプロンプト埋め込みと領域特徴との比較です。大規模なプロンプトセットで発生するコストについては、制限事項をご覧ください。
  • セマンティック活性化型視覚プロンプトエンコーダー(SAVPE)は、サンプルボックスからセマンティック特徴と活性化特徴をエンコードし、それに似た外観の物体に合わせてモデルを条件付けます。ロゴや特定の部位など、名前を付けにくい対象に適したワンショット方式です。
  • 遅延領域・プロンプト対比(LRPC)は、領域埋め込みを組み込みの4,585個の名前を持つ語彙と照合するため、プロンプト不要のチェックポイントは外部プロンプトもテキストエンコーダーも使わずに物体を認識できます。

インスタンスセグメンテーションはYOLOv8-Segと同様に、検出ヘッドのマスクブランチによって実現され、すべての予測はresults[0].masks上でマスクを保持します。モデルをエクスポートすると、オープンワールドモジュールは標準的なYOLOヘッドに再パラメーター化されるため、エクスポートしたファイルでは通常の検出・セグメンテーション処理が実行されます。

利用可能なモデル#

以下のすべてのチェックポイントはインスタンスセグメンテーションモデルであり、val、predict、export、trackに対応しています。テキストまたは視覚的プロンプトには*-seg.ptファイルを、プロンプト不要の推論には*-seg-pf.ptファイルを読み込んでください。これらは相互に置き換えられません。詳しくはプロンプトモードの選択をご覧ください。trainに対応しているのは*-seg.ptファイルのみです。プロンプト不要のチェックポイントは、トレーニング済みのテキストプロンプトモデルから作成します。詳しくは公式モデルをゼロからトレーニングするをご覧ください。

YOLOEのLVISでの性能#

640ピクセルでのLVIS minivalにおけるゼロショットの結果です。Ultralytics YOLO26の論文に基づいています。

テキストプロンプトと視覚的プロンプト#

精度とパラメーターの各セルはテキストプロンプト/視覚的プロンプトの順で示し、FLOPsは1つの値で示します。パラメーター数とFLOPsは、論文で評価された検出構成の値です。精度は論文のNon-E2E値です。比較対象のすべてのモデルについて論文が報告しているプロトコルはこれだけです。YOLOE-26のエンドツーエンドヘッドは、テキストプロンプトで最大1.1 AP、視覚的プロンプトで最大2.6 AP、この値を下回ります。

モデルmAP50-95mAPrmAPcmAPfパラメーター
(M)
FLOPs
(B)
YOLOE-26n24.7 / 21.920.5 / 17.624.1 / 22.326.1 / 22.43.9 / 3.16.1
YOLOE-26s30.8 / 28.623.9 / 25.129.6 / 27.833.0 / 29.910.7 / 11.021.9
YOLOE-26m35.4 / 33.931.1 / 33.434.7 / 34.036.9 / 33.821.3 / 25.170.6
YOLOE-26l37.8 / 36.335.1 / 37.637.6 / 36.238.5 / 36.125.5 / 29.389.0
YOLOE-26x40.6 / 38.537.4 / 35.340.9 / 38.841.0 / 38.855.2 / 65.2197.7
YOLOE-11s27.5 / 26.321.4 / 22.526.8 / 27.129.3 / 26.410.7 / 10.922.7
YOLOE-11m33.0 / 31.426.9 / 27.132.5 / 31.934.5 / 31.721.0 / 24.870.4
YOLOE-11l35.2 / 33.729.1 / 28.135.0 / 34.636.5 / 33.826.0 / 29.889.5
YOLOE-v8s27.9 / 26.222.3 / 21.327.8 / 27.729.0 / 25.712.3 / 12.629.8
YOLOE-v8m32.6 / 31.026.9 / 27.031.9 / 31.734.4 / 31.126.4 / 28.480.7
YOLOE-v8l35.9 / 34.233.2 / 33.234.8 / 34.637.3 / 34.143.5 / 47.3167.6

プロンプト不要#

プロンプト不要のチェックポイントはプロンプトを指定せず、組み込みの語彙を使って応答します。各精度セルは、論文でYOLOE-26の評価に用いられた2つのプロトコル、エンドツーエンド/Non-E2Eの順で示します。YOLO26のページではNon-E2E列の値を掲載しています。

モデルmAP50-95mAPrmAPcmAPfパラメーター
(M)
FLOPs
(B)
YOLOE-26n-pf16.6 / 17.715.7 / 15.815.3 / 16.417.9 / 19.22.35.3
YOLOE-26s-pf21.4 / 22.616.2 / 20.220.1 / 20.923.5 / 24.59.020.8
YOLOE-26m-pf25.7 / 26.426.7 / 24.524.0 / 25.026.9 / 27.919.468.4
YOLOE-26l-pf27.2 / 28.026.3 / 25.725.7 / 26.828.7 / 29.523.686.8
YOLOE-26x-pf29.9 / 31.127.5 / 28.929.1 / 30.731.1 / 31.753.1194.4

テキストプロンプトとビジュアルプロンプトの両方で、YOLOE-26モデルは、対応するすべてのスケールにおいてmAP50-95でYOLOE-11およびYOLOE-v8の各モデルを上回り、パラメーター数とFLOPsはv8系列を下回ります。同じデータ分割で、論文ではYOLO-Worldv2が24.4(S)、32.4(M)、35.5(L)、Transformerベースの検出器はGLIP-Tが26.0、GDINO-Tが27.4、DetCLIP-Tが34.4と報告されています。各モデルのパラメーター数は155 Mから232 Mです。YOLOEの原論文では、導入されたv8スケールのモデルについて、さらに2つの結果が示されています。LVISでは、YOLOE-v8sがYOLO-Worldv2-Sを3.5 AP上回り、学習コストは3分の1、推論速度は1.4倍です。COCOに転移した場合、YOLOE-v8lはクローズドセットのYOLOv8-Lをbox APで0.6、mask APで0.4上回り、学習時間はほぼ4分の1です。

論文のパラメーター数と公開済みチェックポイント

YOLO26の論文では、検出構成を評価しています。公開されている重みはセグメンテーションチェックポイントで、マスクブランチ、SAVPE、テキスト投影層が追加されているため、読み込んだyoloe-26l-seg.ptは上記の25.5 Mおよび89.0 Bではなく、35.4 Mおよび142.0 Bを報告します。どちらの場合も、FLOPsの数値には領域とテキストの類似度計算が含まれていないため、列の数値は変わらなくても、実際のコストはプロンプトセットの規模に応じて増加します。詳しくは制限事項をご覧ください。

使用例#

以下のYOLOEの例はすべてPython APIから実行できます。テキストプロンプトによる予測、検証、エクスポート、トラッキング、通常の学習はCLIからも実行できます。ファインチューニングのレシピとビジュアルプロンプトでは、トレーナーまたは予測器クラスを引数として渡しますが、これはPython APIでのみサポートされています。

トレーニングの使用方法#

公開済みの*-seg.ptチェックポイントは、どれでも独自のYOLOデータセットでファインチューニングできます。基本的には標準的なYOLOの学習手順に沿いますが、渡すトレーナーが異なります。YOLOEPESegTrainerはクラス名をヘッドに統合してからファインチューニングするため、独自のラベルを使う場合に適しています。デフォルトのトレーナーは、独自のクラス名を対象に学習しません。



視聴: 車の部品セグメンテーションデータセットで YOLOE をトレーニングする方法 | オープンボキャブラリーモデル、予測、エクスポート 🚀
例
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer

model = YOLOE("yoloe-26s-seg.pt")

results = model.train(
    data="coco128-seg.yaml",
    epochs=80,
    patience=10,
    trainer=YOLOEPESegTrainer,  # <- 重要: デフォルトではなく、ファインチューニング用トレーナーを使います
)
代わりに検出モデルを学習する

公開済みのチェックポイントはすべてセグメンテーションモデルです。検出器を学習するには、対応するYAMLからモデルを構築し、同じスケールのセグメンテーション重みを読み込んで、検出用トレーナーに切り替えます。それ以外は変更ありません。

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer

model = YOLOE("yoloe-26s.yaml").load("yoloe-26s-seg.pt")

results = model.train(data="coco128.yaml", epochs=80, patience=10, trainer=YOLOEPETrainer)

予測の使用方法#

テキストプロンプトの呼び出し方法はクイックスタートに示したとおりです。残りの2つのモードでは、それぞれ追加の引数が必要です。

例

ビジュアルプロンプトでは、対象を説明する代わりに、モデルに例を提示します。visual_promptsには、例示ボックスのbboxes配列と、各ボックスに1つずつ対応するクラスIDのcls配列を渡します。IDは一時的なグループ分けであり、ラベルではありません。0から順番に割り当てる必要があり、結果は任意に指定した名前ではなく、object0、object1、…として返されます。

例示ボックスは、予測対象の画像上に配置できます。

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

# 対象ごとに例示ボックスを1つずつ指定し、それぞれにクラスIDを割り当てます
visual_prompts = {
    "bboxes": np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]),  # 人物、眼鏡
    "cls": np.array([0, 1]),
}

results = model.predict(
    "ultralytics/assets/bus.jpg",
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

または、別の参照画像上に配置し、その画像をrefer_imageとして渡すこともできます。この場合、bboxesとclsは、予測対象ではなく参照画像内のオブジェクトを指定します。

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

visual_prompts = {"bboxes": np.array([[221.52, 405.8, 344.98, 857.54]]), "cls": np.array([0])}  # person

results = model.predict(
    "ultralytics/assets/zidane.jpg",  # 対象画像
    refer_image="ultralytics/assets/bus.jpg",  # 例示ボックスを配置する場所
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

# refer_imageを指定するとクラスも恒久的に設定されるため、以降の呼び出しではプロンプトが不要です
results = model("ultralytics/assets/bus.jpg")
model.export(format="onnx")  # エクスポート後もクラス設定は保持されます
注

sourceが動画またはストリームの場合、最初のフレームが自動的にrefer_imageになります。渡したプロンプトはそのフレームに適用され、動画の残りの部分にも引き継がれます。別のフレームを選ぶには、refer_imageを明示的に渡してください。

sourceとrefer_imageはどちらも、torchテンソルを直接受け取れます。画像が既存のパイプラインから取得される場合に便利です。ボックスはテンソル固有のピクセル座標で指定してください。

import numpy as np
import torch

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-11l-seg.pt")

img_tensor = torch.rand(1, 3, 480, 480)  # [0, 1]の範囲の(1, 3, H, W) floatテンソル
visual_prompts = {"bboxes": np.array([[10, 10, 50, 50]]), "cls": np.array([0])}

results = model.predict(
    img_tensor,
    refer_image=img_tensor,
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
    imgsz=640,
)

複数の画像を一度に予測するには、プロンプトをさらに1段階ネストします。ソース画像ごとにbboxes配列とcls配列を1つずつ用意し、ソース画像と同じ順序にしてください。

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26l-seg.pt")

visual_prompts = {
    "bboxes": [
        np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]),  # bus.jpg: 人物、眼鏡
        np.array([[150, 200, 1150, 700]]),  # zidane.jpg: 人物
    ],
    "cls": [np.array([0, 1]), np.array([0])],
}

results = model.predict(
    ["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)
results[0].show()

検証の使用方法#

セグメンテーションデータセットを使って、他のモデルと同じ方法で検証を実行します。

例
from ultralytics import YOLOE

model = YOLOE("yoloe-26l-seg.pt")  # または、他のサイズにはyoloe-26s/m-seg.ptを使用します

metrics = model.val(data="coco128-seg.yaml")

同じ呼び出し方法の2つのバリエーションで、他のプロンプトモードにも対応できます。

  • ビジュアルプロンプト — model.val(data="coco128-seg.yaml", load_vp=True)はデータセット自体からカテゴリごとのビジュアル埋め込みを抽出します。別のデータセットから埋め込みを取得するにはrefer_data="coco.yaml"を追加します。別のデータセットには、まったく同じカテゴリが含まれている必要があります。
  • プロンプト不要 — *-seg-pf.ptチェックポイントを読み込み、single_cls=Trueを渡します。

エクスポートの使い方#

プロンプト埋め込みは一度保存すれば、ONNX、OpenVINO、TensorRT、CoreML、LiteRT、RKNNなどの静的エクスポートを作成するときに再利用できます。エクスポート前に、元のPyTorchモデルでNPZプロファイルを読み込みます。NPZプロファイルは追加のランタイム入力ではなく、エクスポート済みモデルもNPZファイルを必要としません。

エクスポート済みモデルは静的です

set_classes()で設定したクラス(ビジュアルプロンプトの場合はrefer_imageで設定したクラス)は、エクスポート済みの重みに組み込まれます。エクスポート後は新しいプロンプトを受け付けなくなります。読み込んだエクスポートに対してset_classes()を呼び出したり、predict()にvisual_prompts=...を渡したりすると、エラーになります。検出クラスを変更するには、新しいプロンプトを設定して元の.ptチェックポイントから再エクスポートしてください。エクスポート済みファイルは標準的なYOLOモデルと同様に動作し、YOLOE()の代わりにYOLO()で読み込むこともできます。

プロンプト埋め込みの再利用
from ultralytics import YOLOE

model = YOLOE("yoloe-26n-seg.pt")
model.set_classes(["person", "bus"])
model.save_prompt_embeddings("person-bus.npz")

# プロファイルは元のチェックポイントに紐付けられており、後続のエクスポートでも再利用できます。
model = YOLOE("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="onnx")

同じプロンプトプロファイルを使って、対応するYOLOEアーキテクチャから検出専用モデルを構成することもできます。これにより、プロンプトで指定したクラスを保持しながら、マスクブランチを取り除けます。

from ultralytics import YOLOE

model = YOLOE("yoloe-26n.yaml").load("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="rknn", name="rk3588", quantize=16)

トラッキングの使用方法#

プロンプトで指定したクラスはそのままトラッキングに引き継がれるため、トラッカーが学習したことのないオブジェクトも追跡できます。

例
from ultralytics import YOLOE

model = YOLOE("yoloe-26s-seg.pt")
model.set_classes(["forklift", "pallet"])

# persist=Trueを設定すると、フレーム間でトラックIDが安定します
for result in model.track("path/to/video.mp4", stream=True, persist=True):
    print(result.boxes.id)

YOLOEの比較#

YOLOEは、クローズドセット検出器と大規模なオープンボキャブラリーモデルの中間に位置します。適切な選択肢かどうかは、次の3つの比較で判断できます。

  • クローズドセットのYOLOとの比較。 プロンプトを設定すると、YOLOEは通常の検出/セグメンテーションの経路で予測し、他のモデルと同様にエクスポートできます。推論時に再学習せずクラスリストを変更できる一方、ゼロショット精度は独自のクラスで学習したモデルを大きく下回ります。
  • 以前のYOLOEシリーズとの比較。 YOLOE-26はYOLO26のNMSフリーなエンドツーエンドヘッドを継承し、従来の3スケール(s/m/l)に対して5スケール(n/s/m/l/x)に対応します。また、性能では、対応するすべてのスケールで従来モデルを上回ります。
  • Transformerベースのオープンボキャブラリー検出器との比較。 GLIPとOWL-ViTは推論時にビジョン・ランゲージTransformerを実行します。YOLOEはプロンプトを一度だけエンコードし、その後、畳み込みヘッド内で領域特徴と比較します。

最も近い代替モデルはいずれもテキストプロンプトを受け取りますが、マスクを返すのはYOLOEとSAM 3だけです。また、3つのモデルはそれぞれ異なる問いに答えます。

YOLOESAM 3YOLO-World
用途名称指定クラスのリアルタイム検出とセグメンテーション概念セグメンテーションとプロンプト可能なトラッキングリアルタイムのオープンボキャブラリー検出
マスクはい。*-seg.ptチェックポイントで対応はいいいえ。ボックスのみ
ビジュアルプロンプトはい(SAVPE)はいいいえ
プロンプト不要モードはい。4,585個の名称を含む語彙いいえいいえ
選択する状況スループットが必要で、クラス名を指定できる場合最高レベルの概念セグメンテーションが必要で、計算コストを許容できる場合すでに使用中の場合 — 以下の移行に関する注意をご覧ください

YOLO-Worldから移行する場合: APIの構成は同じです。YOLOWorldをYOLOEに置き換え、*-seg.ptチェックポイントを読み込み、set_classes()の呼び出しはそのまま使います。マスクとビジュアルプロンプトが使えるようになります。クラスが固定される点については、エクスポートに関する注意がどちらにも当てはまります。

ユースケースと応用#

オープンボキャブラリー検出により、クラスごとに再学習する手順を省けます。特に、対象リストを事前に把握できない場合に有効です。

  • オープンワールド検出 — 学習時に列挙されていないオブジェクトに遭遇するロボティクスやセキュリティシステム。
  • 例を使ったワンショット検出 — ビジュアルプロンプトを使うと、1つの参照ボックスから特定の部品、ロゴ、欠陥を検出できます。産業検査で役立ちます。
  • ロングテールのカタログ化 — 組み込みの4,585名称の語彙は、生物多様性モニタリングや小売在庫の調査にも十分な広さがあります。
  • データセットのブートストラップ — 画像にボックスとマスクを事前ラベル付けして人手で確認し、その結果を使って高速なクローズドセットモデルを学習します。
  • 任意の対象のセグメンテーション — 公開済みの*-seg.ptチェックポイントは予測ごとにマスクを返すため、医用画像処理や衛星画像解析で、別のモデルを使わずにピクセル単位の精度で出力できます。

よく使われる方法は、2つのモードを組み合わせることです。まずプロンプト不要モードで対象を検出し、次に重要なカテゴリにテキストプロンプトを使います。

制限事項#

YOLOEは、推論時にクラスを変更できる代わりに精度を犠牲にします。導入前に把握しておきたい影響は次のとおりです。

  • ゼロショット精度は、独自のクラスで学習したモデルを大きく下回ります。 プロンプト対応チェックポイントのLVIS minivalにおける性能は、おおむね22~40 mAPです。独自データで学習したクローズドセットYOLOは、これらのクラスでその精度を上回ります。YOLOEは学習できないクラスをカバーするために使い、学習の代替としては使わないでください。
  • 希少カテゴリは弱点です。 性能のmAPr列は、LVISの希少クラスに対する精度を示します。テキストプロンプトを使うと、すべての行で一般的なクラスや頻出クラスの列を下回ります。対象が珍しい場合は、全体のmAPではなく、この値を確認してください。
  • プロンプトで指定できるのは外観であり、関係性ではありません。 検出では、領域特徴をプロンプト埋め込みと比較します。そのため、状態、文脈、比較に依存する「損傷した」「最も左にある」「運ばれているもの」といったプロンプトには、照合できる信頼性の高い手がかりがありません。一般的なカテゴリ名に近い表現を使ってください。
  • プロンプトセットが大きいほどレイテンシーが増加します。 プロンプト埋め込みは一度だけ計算されますが、各フォワードパスで領域特徴と比較されます。yoloe-26s-seg.ptを使ってCPUで測定した場合、クラス数を80から1,203に増やすとフォワードパスは約19%遅くなり、4,585名称の全語彙では約89%遅くなります。領域とテキストの類似度計算が含まれないため、報告されるFLOPsはまったく変わらず、プロファイルにも警告は表示されません。
  • プロンプトを設定するまでは、クラス名は仮のものです。 読み込んだばかりの*-seg.ptチェックポイントは、数値の名称("0"、"1"、…)を使うnc=80を返すため、ラベルを読み取る前にset_classes()を呼び出してください。プロンプト不要のチェックポイントには、語彙全体がすでに設定されています。

デプロイに関する注意#

  • ハードウェア。 推論には4~8 GBのVRAMを備えたNVIDIA GPUが必要です。nおよびsのスケールは、JetsonなどのエッジGPU、または解像度を下げたCPUでも実行できます。ファインチューニングにはGPUが1基必要です。
  • NMSはデフォルトでクラス非依存です。 YOLOEはagnostic_nms=Trueで予測します。デフォルトでは、同じクラス内だけでなく異なるクラス間でも、スコアの低い重複ボックスを抑制します。これにより、1つのオブジェクトが複数のカテゴリに一致する場合の重複を防ぎます。nms=Falseでは、YOLOE-26はIoUによる抑制を行いません。クラス非依存モードでは、1つのアンカーから複数のクラスラベルを出力する代わりに、そのアンカーで最もスコアの高いクラスを1つだけ保持します。上書きするにはagnostic_nms=Falseを渡してください。
  • バッチ処理。 バッチ推論をそのまま使えます。また、同じ呼び出し内で画像ごとに異なるビジュアルプロンプトを指定できます。

公式モデルをスクラッチから学習する#

ほとんどの読者には必要ありません。Objects365、GQA、Flickr30kから公開済みのオープンボキャブラリーチェックポイントを再現する手順です。8台のRTX 4090を使い、約140万件のサンプルで学習します。独自データのファインチューニングとは関係なく、その手順は上記の学習方法で説明しています。

警告

YOLOETrainerを継承するすべてのトレーナーはcompile=Trueを拒否します。これには、デフォルトのYOLOESegTrainerと、以下のスクラッチ学習用トレーナーがすべて含まれます。compile=False(デフォルト)を渡してください。上記で使用した2つのファインチューニング用トレーナー、YOLOEPESegTrainerとYOLOEPETrainerには、この制限はありません。

学習にはセグメントアノテーションが必要です。以下の処理済みファイルをダウンロードするか、公式チームが提供するスクリプトを使って独自に生成してください。このスクリプトはSAM 2.1を利用します。検証にはLVIS minivalを使用します。

データセット種類サンプル数ボックス処理済みセグメントアノテーション
Objects365v1検出609k9621kobjects365_train_segm.json
GQAグラウンディング621k3681kfinal_mixed_train_no_coco_segm.json
Flickr30kグラウンディング149k641kfinal_flickr_separateGT_train_segm.json

最初にテキストプロンプトモデルを学習し、残り2つのプロンプトモードはそのモデルを調整して作成します。

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch

data = {
    "train": {
        "yolo_data": ["Objects365.yaml"],
        "grounding_data": [
            {
                "img_path": "flickr/full_images/",
                "json_file": "flickr/annotations/final_flickr_separateGT_train_segm.json",
            },
            {
                "img_path": "mixed_grounding/gqa/images",
                "json_file": "mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            },
        ],
    },
    "val": {"yolo_data": ["lvis.yaml"]},
}

model = YOLOE("yoloe-26l-seg.yaml")
model.train(
    data=data,  # または、同じ構造を持つYAMLファイルへのパス
    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",
)

visual-prompt用とprompt-free用のチェックポイントは、学習済みのtext-promptモデルをベースに、それぞれ1つのモジュールを更新します。YOLOESegVPTrainerはvisual-prompt用のレシピ、YOLOEPEFreeTrainerはprompt-free用のレシピですが、どちらのクラスも単独では何も凍結しません。選択的な学習は、併せて渡すfreezeリストによって行われます。このリストにはsavpe以外のすべてのヘッド子要素(それぞれ、すべての分類タワー)が指定されます。また、prompt-freeの実行にはsingle_cls=Trueも必要です。上流のYOLOEリポジトリには、v8スケールのモデル向けの完全なレシピが用意されています。

prompt-freeの学習が完了すると、get_vocabとset_vocabを使って再パラメーター化され、推論時にpromptなしでクラス名を返すチェックポイントになります。

from ultralytics import YOLOE

# prompt-freeの実行と、その実行のベースとなったtext-promptの実行で書き込まれた重み。各
# 再実行するたびに新しいディレクトリ(train-2、train-3、...)が作成されるため、各実行で出力されたパスを使用してください。
model = YOLOE("runs/segment/train-2/weights/best.pt")  # prompt-freeの実行では、ヘッドはすでに融合されています
text_model = YOLOE("runs/segment/train/weights/best.pt")  # text-promptの実行では、ヘッドはまだ融合されていません

names = list(YOLOE("yoloe-26l-seg-pf.pt").model.names.values())  # 4,585個の名前からなる語彙、または独自のリスト
vocab = text_model.get_vocab(names)

model.set_vocab(vocab, names)
model.save("yoloe-26l-seg-pf-custom.pt")  # 公開済みのチェックポイントを上書きしないでください

get_vocabは、モデルのend2endフラグで選択されるブランチを返し、set_vocabはそのブランチを再パラメーター化します。公開されているYOLOE-26のファイルには、各ブランチの語彙が含まれており、これによってnmsでブランチを選択できます。text-promptモデルの別コピーから2つ目の語彙を取得すると、同じ動作を再現できます。YOLOE-11とYOLOE-v8にはブランチが1つしかないため、上記の呼び出しをそのまま使用できます。

one2one_model = YOLOE("runs/segment/train/weights/best.pt")  # get_vocabは読み込んだヘッドを融合するため、2つ目のコピーを読み込んでください
one2one_model.model.end2end = True  # NMS-freeブランチを読み込む

model.set_vocab(vocab, names, one2one_vocab=one2one_model.get_vocab(names))

引用と謝辞#

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リポジトリから入手できます。

よくある質問#

  • Ultralytics YOLOEには、YOLO-Worldにはない2つの機能があります。クラス名の代わりにサンプルボックスを使うvisual promptと、promptなしで組み込みの4,585個の名前から判定するprompt-freeチェックポイントです。公開されている*-seg.ptチェックポイントでは、すべての予測にインスタンスセグメンテーションのマスクも含まれます。精度については、YOLOEの原著論文によると、YOLOE-v8sはLVISでYOLO-Worldv2-Sを3.5 AP上回り、学習コストは3分の1、推論速度は1.4倍です。移行に必要な変更は1行です。詳しくはYOLOEの比較をご覧ください。

  • Ultralytics YOLOEは3種類のprompt方式に対応しています。text promptは、*-seg.ptチェックポイントに文字列でクラス名を指定する方式で、一般的に使用されます。visual promptは、言葉で表しにくい対象に対して、参照画像上の1つ以上のサンプルボックスを使う方式です。prompt-free推論では、何も指定せず、組み込みの4,585個の名前から判定する別の*-seg-pf.ptチェックポイントを使用します。text promptとvisual promptでは同じチェックポイントを使用しますが、prompt-free用は別ファイルであり、set_classes()を受け付けません。詳しい比較については、Prompt方式の選択をご覧ください。

  • まずはyoloe-26s-seg.ptから始めてください。YOLOE-26ファミリーは同じスケールのYOLOE-11やYOLOE-v8をすべて上回り、sスケールはLVIS minivalで30 mAPを超える最小モデルです。レイテンシよりも希少カテゴリの精度を重視する場合は、m、l、またはxに切り替えてください。比較する指標は性能のmAPr列です。エッジデプロイの場合に限り、nに切り替えてください。独自のクラス名ではなく組み込みの語彙を使う場合は、同じスケールの*-seg-pf.ptファイルを読み込んでください。

  • object0やobject1のようなラベルは、予測がvisual promptから生成されたことを示します。この場合、サンプルボックスは指定した名前を引き継がず、一時的な番号付きクラスにまとめられます。visual_prompts["cls"]で渡すクラスIDは、このグループ化にのみ使われます。モデルは割り当てたIDの順にobject0、object1などとして返すため、結果上で独自のラベルに対応付けてください。出力に独自の名前を表示するには、代わりにtext promptを使用してください。

  • prompt-freeチェックポイント(*-seg-pf.pt)は、独自の組み込み語彙からクラスを判定するため、AssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.による外部promptを受け付けません。独自のクラスリストを使用する場合は、*-seg.ptチェックポイントを読み込んでください。詳しくはPrompt方式の選択をご覧ください。

  • 最初のtext promptを実行すると、Ultralytics YOLOEはGitHubからpipを使用してultralytics/CLIPをインストールし、TorchScriptのテキストエンコーダーを現在の作業ディレクトリにダウンロードします。YOLOE-26の場合、サイズは約254 MBです。各モデルファミリーで必要となる正確なアセットについては、インストールと要件をご覧ください。visual promptとprompt-freeのチェックポイントでは、どちらもこれらは必要ありません。対象マシンでのダウンロードを避けるには、promptを一度設定してsave_prompt_embeddings()で保存するか、クラスを設定済みの状態でモデルをエクスポートしてください。

  • いいえ。YOLOEはエクスポート時にpromptで指定したクラスを重みに組み込むため、読み込んだエクスポート済みモデルはset_classes()とvisual_prompts=の両方を受け付けません。新しいpromptを設定し、元の.ptチェックポイントから再エクスポートしてください。エクスポートしたファイルは標準的なYOLOモデルとして動作し、YOLO()とYOLOE()の両方で読み込めます。

  • リアルタイム処理が必要でクラス名を指定できる場合はYOLOEを、速度よりも概念のセグメンテーション品質を重視する場合はSAM 3を使用してください。どちらもvisual exampleに対応していますが、prompt-freeモードを備えているのはYOLOEだけです。詳しい比較については、YOLOEの比較をご覧ください。

コメント