Ultralytics YOLO27: ウェイトリストに登録する。
Get Started
コンピュータービジョンの基礎·タスクを選ぶ·レッスン 2/10
レッスン初級

7つのビジョンタスク

出力の行を分類、検出、インスタンスセグメンテーション、セマンティックセグメンテーション、深度推定、姿勢推定、OBBのいずれかに対応させ、最初に使うYOLO26の重みを選びます。

タスクの選択は、学習前に行う判断の中で最もコストがかかります。ボックスで十分なのにセグメンテーションを選ぶと、ラベル付けの費用が膨らみます。ドローンから見た船に直立ボックスを使うと、ボックスの大部分が水になります。Ultralytics YOLOは1つのAPIで7つのタスクをサポートするため、選択の基準はツールではなく、必要な出力です。

成果

出力の行に一致するタスクとYOLO26の重みファイルを1つ選び、次にコストが高いタスクが不要な理由を1行で説明します。

短期集中コース
すでに使い方をご存じの方は、こちらをご覧ください。
  1. 画像全体に対するラベルが1つ:分類。

  2. 何がどこにあるかを示し、長方形で十分:検出。

  3. 物体ごとの正確な輪郭:インスタンスセグメンテーション。すべてのピクセルにクラスを割り当てる:セマンティックセグメンテーション。

  4. すべてのピクセルの距離:深度推定。

  5. 関節またはランドマーク:姿勢推定。上空から見た斜め向きの物体:OBB。

  6. 7つすべてで同じYOLO() APIを使い、重みファイルだけを変更します。

実践的

7つのタスクの概要#

Ultralytics YOLOの7つのタスク出力:分類された葉、検出された自動車と歩行者、セグメンテーションされた自動車、セマンティックな道路マップ、ランナーの姿勢スケルトン、船の回転ボックス、深度マップ

表は出力の列を基準に確認してください。仕様の出力の行で一致させるのは、この列です。

タスク出力答えられる質問YOLO26の重み
分類画像ごとに1つのラベルと確率「この画像は何ですか?」yolo26n-cls.pt
検出物体ごとのクラス、ボックス、信頼度「何がどこにありますか?」yolo26n.pt
インスタンスセグメンテーションオブジェクトごとのクラスとピクセルマスク「各オブジェクトの正確な形状は?」yolo26n-seg.pt
セマンティックセグメンテーションすべてのピクセルに1つのクラス「各ピクセルはどの種類の領域?」yolo26n-sem.pt
深度推定すべてのピクセルの距離(メートル単位)「各ピクセルはどれくらい離れている?」yolo26n-depth.pt
姿勢推定人またはオブジェクトごとのボックスとキーポイント「体はどのような姿勢?」yolo26n-pose.pt
回転境界ボックスオブジェクトごとの回転ボックス「何がどこにあり、どの角度?」yolo26n-obb.pt

混同しやすい組み合わせが2つあります。インスタンスセグメンテーションとセマンティックセグメンテーション:インスタンスセグメンテーションでは各オブジェクトを個別に分けます(車3台、マスク3つ)。セマンティックセグメンテーションではクラスごとにピクセルを分類するだけです(「車」の領域は1つで、個数は分かりません)。検出とOBB:どちらもオブジェクトごとに1つのボックスを返しますが、OBBはオブジェクトに合わせて回転します。これは上方視点の画像でオブジェクトが斜めに配置されている場合に重要です。

1つのAPI、7種類の出力#

タスクを切り替えても、ツールを切り替える必要はありません。返される内容は重みファイルによって決まり、Resultsオブジェクトには対応する属性が格納されます。

from ultralytics import YOLO

image = "https://ultralytics.com/images/bus.jpg"
outputs = ["probs", "boxes", "masks", "semantic_mask", "depth", "keypoints", "obb"]

for suffix in ["-cls", "", "-seg", "-sem", "-depth", "-pose", "-obb"]:
    weights = f"yolo26n{suffix}.pt"
    model = YOLO(weights)
    result = model(image, verbose=False)[0]
    filled = [name for name in outputs if getattr(result, name) is not None]
    print(f"{weights:18} task={model.task:9} -> {', '.join(filled)}")
yolo26n-cls.pt     task=classify  -> probs
yolo26n.pt         task=detect    -> boxes
yolo26n-seg.pt     task=segment   -> boxes, masks
yolo26n-sem.pt     task=semantic  -> semantic_mask
yolo26n-depth.pt   task=depth     -> depth
yolo26n-pose.pt    task=pose      -> boxes, keypoints
yolo26n-obb.pt     task=obb       -> obb

右側の列を確認してください。セグメンテーションと姿勢推定は、検出にもう1つの出力を加えたものなので、ボックスも返します。一方、セマンティックセグメンテーションと深度推定は、オブジェクトごとの出力を返しません。代わりに、すべてのピクセルを表します。後続のコードではこれらの属性のうち1つだけを読み取るため、仕様の出力欄にはその属性を記載してください。

実際のタスク選び#

1回の予測で何を表す必要があるかを起点にして、判断に必要な情報を得られる最も低コストのタスクを選びます。

  1. 画像全体に1つのラベル → 分類。
  2. オブジェクトを個別に分ける必要はなく、すべてのピクセルにクラスが必要 → セマンティックセグメンテーション。
  3. すべてのピクセルの距離が必要 → 深度推定。
  4. 各オブジェクトについて知りたい場合:
    • 数を数える、位置を特定する、またはフィルタリングするために位置を知りたい → 検出(フレーム間で同一性を追跡するにはトラッキングを追加)。
    • 正確な形状、境界、または面積を知りたい → インスタンスセグメンテーション。
    • 姿勢を知りたい → 姿勢推定。
    • 上方視点の画像での回転を知りたい → OBB。

2つのタスクがどちらも適している場合は、ラベル付けと実行のコストが低いほうを選びます。ほとんどの製品では検出が標準です。ボックスはすばやく描画して確認でき、トラッキングを組み合わせれば、次の高速道路の映像のように、カウント、エリアアラート、交通量分析にも活用できます。

Ultralytics YOLOで追跡した高速道路の交通。すべての車、バス、トラックに永続的なIDと移動軌跡が表示されています

深度:「どれくらい離れているか」に答えるタスク#

深度推定は、画像と同じサイズのマップを返し、各ピクセルについて距離をメートル単位で示します。クラスもボックスもありません。距離が判断の基準になる場合に使用します。たとえば、障害物を避けるロボット、近くに物体があると減速する車両、積み上げた物の大まかな体積推定などです。

from ultralytics import YOLO

model = YOLO("yolo26n-depth.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]

depth = result.depth.data  # meters, one value per pixel
print(f"depth map {tuple(depth.shape)}, nearest {float(depth.min()):.1f} m, farthest {float(depth.max()):.1f} m")
depth map (1080, 810), nearest 2.0 m, farthest 14.9 m

単眼カメラは、遠近感や物体の大きさなど、学習で得た手掛かりから深度を推定するため、安全性が重要な距離に使用する前に、実際のシーンで誤差を測定してください。深度推定は検出と組み合わせると効果的です。まず物体を検出し、そのボックス内の深度マップを読み取ります。

よくある落とし穴#

混同例症状より適した選択
ボックスで十分なのにセグメンテーションを使用後続のコードでマスクを読み取ることがない検出
上方視点の画像に直立ボックスを使用ボックスの大部分が背景になり、隣接オブジェクト同士が互いに抑制されるOBB
複数のオブジェクトがあるシーンに分類を使用ラベルが小さな1つのオブジェクトによって決まる検出とルール
個数が必要なのにセマンティックセグメンテーションを使用接触しているオブジェクトが1つの領域に統合されるインスタンスセグメンテーション
距離の代用としてボックスのサイズを使用オブジェクトのサイズが変わるとルールが機能しなくなる深度推定、または検出と深度推定の組み合わせ
存在確認に姿勢推定を使用キーポイントを一度も読み取らない検出
使わない出力に費用をかけない

出力が詳細になるほど、あらゆる段階でコストが増えます。マスクやキーポイントは描画にもレビューにも時間がかかり、より厳密なラベル付けルールも必要です。意思決定ルールに答えられる最も低コストのタスクから始め、実際に利用する側が追加の詳細を必要とする場合に限ってアップグレードします。

試してみる

レッスン1の仕様にある出力欄を取り出し、上記の手順に沿って検討してください。タスク、最初に使うYOLO26の重みファイル、コードで読み取るResults属性、そして次に高コストのタスクが不要な理由を1行で書き出します。まだプロジェクトがない場合は、フォークリフトの仕様を使ってください。

完了条件
以下のすべてを満たすと、レッスンは完了です。
  • タスク、YOLO26の重みファイル、コードで読み取るResults属性を1つずつ指定できました。

  • 次に高コストのタスクが不要な理由を1行で説明できました。

  • プロジェクトにインスタンスセグメンテーション、セマンティックセグメンテーション、深度推定のいずれかが必要か、またはどれも不要かを、その理由とともに説明できます。

解答を表示

フォークリフトの仕様の場合、答えはyolo26n.ptを使用した検出で、result.boxesから読み取ります。

判断に必要なのは、フォークリフトと人がどこにいるかです。これにより、コードで両者の距離がどれくらい近いかを判定できます。ボックスで十分です。インスタンスセグメンテーションを使ってもアラートは変わらず、ラベル付けのコストが増えるだけです。ボックスの下端から地面上の位置がすでに分かるためです。姿勢は判断に関係しないので、姿勢推定は不要です。深度推定を使えば画像上の位置をメートル単位に変換しやすくなりますが、固定カメラをキャリブレーションすれば、深度推定なしでも床面をマッピングできます。カメラが真下を向いていて、フォークリフトが急な斜め角度で映る場合に限り、OBBを試す価値があります。

次のステップ

次は検出を詳しく見ていきます。検出は主力となるタスクであり、ほとんどの製品が最初に採用するタスクです。