画像で予測
Pythonから事前学習済みのYOLO26モデルを実行し、結果からクラス、信頼度、ピクセル単位のボックスを読み取り、見逃しの多くを解消する引数を調整します。
棚の商品数のカウント、ぼかし処理のための顔の切り抜き、ボックスのJSON APIへの送信など、検出器を実際に使うときは、まず結果オブジェクトを正しく読み取る必要があります。テンソルを使ってクラス名をインデックス指定するなど、細かな点を1つ間違えるだけで、アプリは最初の画像でクラッシュします。
事前学習済みのYOLO26detectモデルは、すでに80種類のCOCOクラスを認識できます。このレッスンでは、PythonからPredictモードを実行し、結果から役立つフィールドをすべて取り出し、見逃し、重複、小さなオブジェクトに対してどの引数を変更すればよいかを学びます。後で自分で学習したモデルを使う場合も、同じ結果オブジェクトが返されます。
実践的
すべての検出結果を予測して出力する#

ソースを指定してモデルを呼び出すと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_shape | NumPy配列としての入力画像と、その高さ×幅 |
speed | 前処理、推論、後処理にかかった時間(ミリ秒) |
path, save_dir | 入力元と、出力を書き込んだ場所 |
物体検出では、主にバウンディングボックスである boxes を使います。result.summary() は同じ検出結果を通常の辞書のリストとして返すため、そのままJSON APIで使用できます。
予測を調整する#
デフォルト設定はほとんどの画像に適しています。適さない場合は、一度に1つの引数を変更します:
| 確認される問題 | 引数 | デフォルト | 変更内容 |
|---|---|---|---|
| 見逃し: 見えているオブジェクトにボックスが付かない | conf | 0.25 | 値を下げます。例: 0.1 |
| 誤検出: 何もない場所にボックスが表示される | conf | 0.25 | 値を上げます。例: 0.5 |
| 1つのオブジェクトにボックスが2つ付く | iou | 0.7 | 下げる: 重複を統合するためのNMSの重なり(IoU)しきい値 |
| 小さく遠くにあるオブジェクトを見逃す | imgsz | 640 | 値を上げます。例: 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件ずつ返されます。この動画レッスンでは、この動作を詳しく説明しています。
解答を表示
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.59summary() はすでに通常の名前と浮動小数点数を返すため、テンソルを変換する必要はありません。画像のリストは共通の形状にパディングされるため、信頼度は predict.py とわずかに異なります。conf=0.1 では、bus.jpg により止まれの標識が追加されます。