Ultralytics YOLO27: ウェイトリストに登録する。
レッスン初級

画像で予測

Pythonから事前学習済みのYOLO26モデルを実行し、結果からクラス、信頼度、ピクセル単位のボックスを読み取り、見逃しの多くを解消する引数を調整します。

棚の商品数のカウント、ぼかし処理のための顔の切り抜き、ボックスのJSON APIへの送信など、検出器を実際に使うときは、まず結果オブジェクトを正しく読み取る必要があります。テンソルを使ってクラス名をインデックス指定するなど、細かな点を1つ間違えるだけで、アプリは最初の画像でクラッシュします。

事前学習済みのYOLO26detectモデルは、すでに80種類のCOCOクラスを認識できます。このレッスンでは、PythonからPredictモードを実行し、結果から役立つフィールドをすべて取り出し、見逃し、重複、小さなオブジェクトに対してどの引数を変更すればよいかを学びます。後で自分で学習したモデルを使う場合も、同じ結果オブジェクトが返されます。

成果

YOLO26を画像に対して実行し、各検出のクラス名、信頼度、ピクセル単位のボックスを出力するPythonスクリプトを作成でき、見逃しの種類ごとにどの引数を調整すればよいかが分かります。

短期集中コース
すでに使い方をご存じの方は、こちらをご覧ください。
  1. 一度だけ読み込みます: model = YOLO('yolo26n.pt')。次に result = model(source)[0] を実行します。

  2. result.boxes をループ処理します。int(box.cls)、float(box.conf)、box.xyxy[0].tolist() で変換します。

  3. result.names[int(box.cls)] を使って、クラスインデックスをクラス名に対応付けます。

  4. 呼び出しごとに conf、iou、imgsz、classes を調整します。

実践的

すべての検出結果を予測して出力する#

ウォーターフロントの遊歩道におけるUltralytics YOLOの検出結果: 人、自転車、犬、車を囲む、信頼度スコア付きのボックス

ソースを指定してモデルを呼び出すとPredictモードが実行され、画像ごとに1つの Results オブジェクトを含むリストが返されます。画像が1枚の場合は、results[0] を読み取ります。

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")

result = results[0]
for box in result.boxes:
    name = result.names[int(box.cls)]
    conf = float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:>8} {conf:.2f}  ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")

result.save("bus_annotated.jpg")

通常のログ行の後に表示される、predict.py の実際の出力:

     bus 0.88  (0, 230) -> (803, 751)
  person 0.87  (49, 398) -> (240, 902)
  person 0.86  (223, 405) -> (345, 861)
  person 0.85  (670, 395) -> (810, 880)
  person 0.65  (0, 553) -> (60, 871)

読み取り方:

  • bus 0.88: クラス名と信頼度です。ボックスは信頼度の高い順に並んでいます。
  • (0, 230) -> (803, 751): 元の810×1080画像における左上と右下の角のピクセル座標です。原点は左上です。これらの座標をそのまま使って切り抜きや描画ができます。
  • (0, 553) における person 0.65: 左端で一部が切れている5人目の人物は、スコアが低くなります。部分的にしか写っていないオブジェクトは、通常スコアが低くなります。

result.save() は注釈付き画像を書き出し、result.show() はその画像をウィンドウで開きます。

結果の内容を把握する#

すべてのタスクで同じ種類の Results が返され、値が設定されるフィールドだけが異なります。全項目についてはPythonの使用ガイドをご覧ください。

属性格納内容
boxes検出結果: ピクセル単位の xyxy、正規化された中心座標形式の xywhn、conf、cls、トラッキング時の id
masks, keypoints, obb, probsセグメンテーション、ポーズ、OBB、分類モデルの出力(detectモデルでは None)
namesクラスインデックスからクラス名への辞書
orig_img, orig_shapeNumPy配列としての入力画像と、その高さ×幅
speed前処理、推論、後処理にかかった時間(ミリ秒)
path, save_dir入力元と、出力を書き込んだ場所

物体検出では、主にバウンディングボックスである boxes を使います。result.summary() は同じ検出結果を通常の辞書のリストとして返すため、そのままJSON APIで使用できます。

予測を調整する#

デフォルト設定はほとんどの画像に適しています。適さない場合は、一度に1つの引数を変更します:

確認される問題引数デフォルト変更内容
見逃し: 見えているオブジェクトにボックスが付かないconf0.25値を下げます。例: 0.1
誤検出: 何もない場所にボックスが表示されるconf0.25値を上げます。例: 0.5
1つのオブジェクトにボックスが2つ付くiou0.7下げる: 重複を統合するためのNMSの重なり(IoU)しきい値
小さく遠くにあるオブジェクトを見逃すimgsz640値を上げます。例: 1280(32の倍数に丸められます)
一部のクラスだけが必要classesすべて人物の場合は classes=[0] など
ハードウェアが違うdevice自動cpu、mps、または 0 のようなGPUインデックス

信頼度を変えると、検出数だけでなく結果そのものが変わります。同じバスの画像の場合:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0])  # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1)  # 人物5人、バス1台、止まれの標識1つ

conf=0.1 では、モデルが確信を持てなかった止まれの標識も報告されます。conf を下げると、モデルが「見つけかけた」対象をすばやく確認できます。その他の引数については、設定リファレンスをご覧ください。

予測結果が空の場合は、次の手順に沿って確認します:

複数の画像を実行する#

リスト、フォルダー、または "photos/*.jpg" のようなglobを渡します。Predictのデフォルトは batch=1 です。batch を設定すると、複数の画像を一度にモデルに渡せるため、GPUでは大幅に高速化します:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
    print(result.path, len(result.boxes), result.verbose())
image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,

次の間違いに注意する#

テンソルで名前をインデックスする

症状: KeyError: tensor([5.])。原因: box.clsとbox.confはPyTorchテンソルで、result.namesはintをキーとする辞書です。対処法: 先に変換します: result.names[int(box.cls)]、float(box.conf)、box.xyxy[0].tolist()。

呼び出しのたびにモデルを読み込む

関数内でYOLO("yolo26n.pt")を呼び出すヘルパーは、実行に時間がかかります。ノートPCのCPUでは、画像ごとに再読み込みすると71ミリ秒かかったのに対し、モデルを一度だけ読み込むと25ミリ秒でした。対処法: 起動時にモデルを一度だけ作成し、すべての画像で再利用します。

画像が数百枚、または動画なら、ストリームとして処理する

model(list_or_folder) は返却前にすべての Results オブジェクトをメモリに格納します。大きなフォルダーやすべての動画では、stream=True を渡してループしてください。結果は1件ずつ返されます。この動画レッスンでは、この動作を詳しく説明しています。

試してみる

top3.py を作成します: yolo26n.pt を一度だけ読み込み、bus.jpg、zidane.jpg、自分で用意した写真1枚に対して実行し、各画像の検出数と信頼度上位3つのクラスを出力します。次に、検出数が最も少なかった画像を conf=0.1 で再実行し、表示された内容を1文で記述します。

完了条件
以下のすべてを満たすと、レッスンは完了です。
  • スクリプトは、KeyError を使わずに、すべての画像について検出数と信頼度付きの上位3クラスを出力します。

  • conf=0.25 と conf=0.1 で1枚の画像を比較し、変化した点を記録しました。

  • 見逃し、重複したボックス、小さなオブジェクトに対して、どの引数を変更すればよいかを説明できます。

解答を表示
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]

for result in model(images, verbose=False):
    top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
    print(f"{result.path}: {len(result.boxes)} detections")
    for d in top3:
        print(f"  {d['name']:>8} {d['confidence']:.2f}")
image0.jpg: 5 detections
       bus 0.90
    person 0.85
    person 0.85
image1.jpg: 3 detections
    person 0.89
    person 0.79
       tie 0.59

summary() はすでに通常の名前と浮動小数点数を返すため、テンソルを変換する必要はありません。画像のリストは共通の形状にパディングされるため、信頼度は predict.py とわずかに異なります。conf=0.1 では、bus.jpg により止まれの標識が追加されます。

次のステップ

最小サイズのモデルを使いました。次に、プロジェクトで実際に学習・デプロイするYOLO26のサイズを決めましょう。