ここ最近の YOLO は何が違うの?
簡潔に言えば、精度の向上ももちろん進めつつ、エッジデバイスでの高速処理を狙った改良を進めていると考えられます。
| リリース時期 | バージョン | 主な特徴 |
|---|---|---|
| 2023年1月 | YOLOv8 | ポーズ推定(Pose)やセグメンテーションが標準で統合され、単一モデルでマルチタスクをこなす。 |
| 2024年9月 | YOLO11 | YOLOv8(m)よりも22%少ないパラメータを使用しながら、COCOデータセットでより高い平均適合率(mAP)を達成。処理速度と精度がさらに向上し、エッジデバイスへの最適化も進んだ |
| 2025年2月 | YOLO12 | CNNからアテンション中心のアーキテクチャへ移行。コミュニティ主導のリリースであり、Ultralyticsはプロダクションワークロードに対して YOLO11 か YOLO26 を推奨。精度向上とスピード低下のトレードオフがある |
| 2026年1月 | YOLO26 | NMS(非最大値抑制)を排除したエンドツーエンドモデル。YOLO11と比べて最大43%高速なCPU推論が可能 |
YOLO26は「NMSを排除したらむしろ性能が悪くなるのでは?」と思うかもしれませんが、NMSを使わなくても正確に1つの物体に1つの枠だけを出力できる仕組み(Dual-Assignment)を導入することで高速化を実現しています。
YOLO26 のポーズ推定
Ultralytics のライブラリを使います。YOLO のポーズ推定が標準で出力する17箇所の部位は、国際的な基準(COCOフォーマット)で厳密に固定されています。
-
顔(5点): 鼻、左目、右目、左耳、右耳
-
上半身(6点): 左肩、右肩、左肘、右肘、左手首、右手首
-
下半身(6点): 左股関節、右股関節、左ひざ、右ひざ、左足首、右足首
モデルに動画フレームを入力すると、これら17点の「画面上のX, Y座標」と「その部位がどれくらい確実に写っているかを示す信頼度(Confidence Score)」が、ひとつの配列としてミリ秒単位で一気になだれ込んできます。
タスクごとにモデルを用意しているので、今回は pose を使っていきます。
0. 環境構築
まずは ultralytics パッケージをインストールします。内部で PyTorch を利用しています。
pip install ultralytics
1. 静止画に対する推論
YOLO26 のポーズ推定モデル(yolo26n-pose.pt)は初回実行時に自動でダウンロードされます。n(nano)は最も軽量なモデルサイズで、他に s / m / l / x と精度・速度のバリエーションがあります。
入力はこちら
from ultralytics import YOLO
# ポーズ推定用モデルをロード
model = YOLO("yolo26n-pose.pt")
# 画像に対して推論を実行
results = model("sample.png")
# 検出結果に骨格を描画した画像を保存
results[0].save(filename="sample_pose.jpg")
このような結果になりました。
2. キーポイントの数値データを取得する
results には各人物の17点分の座標と信頼度が格納されています。数値として扱いたい場合は keypoints プロパティから取得できます。
COCO_KEYPOINT_NAMES = [
"nose", "left_eye", "right_eye", "left_ear", "right_ear",
"left_shoulder", "right_shoulder", "left_elbow", "right_elbow",
"left_wrist", "right_wrist", "left_hip", "right_hip",
"left_knee", "right_knee", "left_ankle", "right_ankle",
]
for result in results:
keypoints = result.keypoints
xy = keypoints.xy # shape: (人数, 17, 2) -> X, Y座標
conf = keypoints.conf # shape: (人数, 17) -> 信頼度
for person_idx, person_kpts in enumerate(xy):
print(f"--- 人物 {person_idx + 1} ---")
for name, (x, y), score in zip(COCO_KEYPOINT_NAMES, person_kpts, conf[person_idx]):
print(f" {name:15s}: X={x:6.1f}, Y={y:6.1f}, 信頼度={score:.2f}")
このような結果が得られました。
Speed: 1.8ms preprocess, 127.8ms inference, 0.7ms postprocess per image at shape (1, 3, 384, 640)
--- 人物 1 ---
nose : X=1375.8, Y= 280.0, 信頼度=1.00
left_eye : X=1398.2, Y= 254.2, 信頼度=1.00
right_eye : X=1349.1, Y= 260.9, 信頼度=1.00
left_ear : X=1439.6, Y= 264.1, 信頼度=0.94
right_ear : X=1318.9, Y= 280.7, 信頼度=0.87
left_shoulder : X=1519.3, Y= 435.3, 信頼度=1.00
right_shoulder : X=1274.1, Y= 437.3, 信頼度=1.00
left_elbow : X=1555.4, Y= 641.7, 信頼度=0.99
right_elbow : X=1227.2, Y= 643.4, 信頼度=0.99
left_wrist : X=1549.7, Y= 826.3, 信頼度=0.99
right_wrist : X=1216.9, Y= 828.3, 信頼度=0.99
left_hip : X=1459.8, Y= 832.5, 信頼度=1.00
right_hip : X=1303.6, Y= 831.3, 信頼度=1.00
left_knee : X=1439.9, Y=1123.7, 信頼度=1.00
right_knee : X=1306.1, Y=1120.7, 信頼度=1.00
left_ankle : X=1422.1, Y=1413.2, 信頼度=0.99
right_ankle : X=1326.3, Y=1407.8, 信頼度=0.99
3. Webカメラでリアルタイム推論する
動画やWebカメラのフレームを1枚ずつモデルに渡すことで、リアルタイムにポーズ推定ができます。
import os
import cv2
from ultralytics import YOLO
os.environ["OPENCV_VIDEOIO_PRIORITY_MSMF"] = "0"
model = YOLO("yolo26n-pose.pt")
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 該当する番号を選んでください
if not cap.isOpened():
raise RuntimeError("カメラを開けませんでした。他のアプリがカメラを使用していないか確認してください。")
try:
while True:
success, frame = cap.read()
if not success:
print("フレームの取得に失敗しました")
break
results = model(frame, verbose=False)
annotated_frame = results[0].plot() # 骨格・信頼度を描画したフレーム
cv2.imshow("YOLO26 Pose Estimation", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
finally:
# カメラを解放する
cap.release()
cv2.destroyAllWindows()
こちらは結果の動画は貼りませんが上記のコードで問題なくキャプチャーできました。
index はIRカメラの可能性もあるので注意してください


