2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ここ最近の 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)を導入することで高速化を実現しています。

Dual-Assignment について

様々なデプロイシナリオに対応できるように2つのアーキテクチャを採用しています。

  • One-to-One Head:1つの物体に対して1つのバウンディングボックスしか出さないため、とにかく速い
  • One-to-Many Head:1つの物体に対して「これも枠かも、あれも枠かも」と複数のバウンディングボックスを出す。見落としが無いようにすることに意図がある

YOLO26 のポーズ推定

Ultralytics のライブラリを使います。YOLO のポーズ推定が標準で出力する17箇所の部位は、国際的な基準(COCOフォーマット)で厳密に固定されています。

  • 顔(5点): 鼻、左目、右目、左耳、右耳

  • 上半身(6点): 左肩、右肩、左肘、右肘、左手首、右手首

  • 下半身(6点): 左股関節、右股関節、左ひざ、右ひざ、左足首、右足首

モデルに動画フレームを入力すると、これら17点の「画面上のX, Y座標」と「その部位がどれくらい確実に写っているかを示す信頼度(Confidence Score)」が、ひとつの配列としてミリ秒単位で一気になだれ込んできます。

タスクごとにモデルを用意しているので、今回は pose を使っていきます。

image.png
Ultralystics のドキュメントより

0. 環境構築

まずは ultralytics パッケージをインストールします。内部で PyTorch を利用しています。

pip install ultralytics

1. 静止画に対する推論

YOLO26 のポーズ推定モデル(yolo26n-pose.pt)は初回実行時に自動でダウンロードされます。n(nano)は最も軽量なモデルサイズで、他に s / m / l / x と精度・速度のバリエーションがあります。

入力はこちら

sample.png

from ultralytics import YOLO

# ポーズ推定用モデルをロード
model = YOLO("yolo26n-pose.pt")

# 画像に対して推論を実行
results = model("sample.png")

# 検出結果に骨格を描画した画像を保存
results[0].save(filename="sample_pose.jpg")

このような結果になりました。

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カメラの可能性もあるので注意してください

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?