本稿では YOLO26 で姿勢を推定する方法について述べる。
環境
- Date: 2026/10/06
- CPU: Intel Core i5-13400F
- GPU: NVIDIA GeForce RTX 5070Ti
- RAM: 32GB
- OS: Windows 11 Home 25H2 日本語版
- Camera: Logicool C922 Pro Stream Webcam
- uv: 0.12.23
- Python: 3.14
- NVIDIA-SMI: 617.14
- CUDA: 13.2.2
- PyTorch: 2.14.1+cu132
- ultralytics: 8.4.173
導入
- (任意)NVIDIA GPU を使用する場合は CUDA を導入
- 最新の NVIDIA ドライバーをインストール
- NVIDIA App で更新可能
https://www.nvidia.com/ja-jp/software/nvidia-app/
- NVIDIA App で更新可能
- NVIDIA ドライバーの CUDA 対応バージョンを確認
コマンドプロンプト
nvidia-smiNVIDIA バージョン : 617.14出力例+-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 617.14 KMD Version: 617.14 CUDA UMD Version: 13.4 | +-----------------------------------------+------------------------+----------------------+ | GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 5070 Ti WDDM | 00000000:01:00.0 On | N/A | | 32% 40C P0 35W / 300W | 1298MiB / 16303MiB | 1% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+
CUDA 対応バージョン : <=13.4
※ 出力の右上は、ドライバーが対応する CUDA バージョンの 上限 - 後段で導入する PyTorch の CUDA 対応バージョンを確認
https://pytorch.org/get-started/locally/
2026/10/06 : <=13.2 - GPU の CUDA 対応バージョンを確認
https://developer.nvidia.com/cuda/gpus
(参考)Wikipedia もわかりやすい
https://en.wikipedia.org/wiki/CUDA#GPUs_supported- GPU の Compute capability を確認
NVIDIA GeForce RTX 5070Ti : cc 12.0 - Compute capability の CUDA 対応バージョンを確認
cc 12.0 : CUDA 12.8 - 13.3
以上より、今回は CUDA 13.2 を導入する
- GPU の Compute capability を確認
- CUDA 13.2.2 をインストール
https://developer.nvidia.com/cuda-toolkit-archive
- 最新の NVIDIA ドライバーをインストール
- Python (>=3.8) を導入
- uv をインストール
https://github.com/astral-sh/uvPowerShell(Windows)powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - uv を更新
コマンドプロンプト
uv self update - プロジェクトを作成
名前:yolo26(任意)コマンドプロンプトuv init yolo26 - プロジェクトフォルダに移動
コマンドプロンプト
cd yolo26 - Python 3.14 で仮想環境を作成
コマンドプロンプト
uv venv -p 3.14
- uv をインストール
- PyTorch (>=1.8) を導入
- PyTorch 公式サイトでインストールコマンドを確認
https://pytorch.org/get-started/locally/ - uv pip で PyTorch をインストール
コマンドプロンプト(CUDA 13.2 を使用する場合の例)
uv pip install torch torchvision --index-url https://download.pytorch.org/whl/cu132コマンドプロンプト(CPU を使用する場合の例)uv pip install torch torchvision
- PyTorch 公式サイトでインストールコマンドを確認
- ultralytics を導入(YOLO本体)
- uv pip で ultralytics をインストール
コマンドプロンプト
uv pip install ultralytics
- uv pip で ultralytics をインストール
コーディング
プロジェクトフォルダに以下の main.py を配置する。
from ultralytics import YOLO
import cv2
# モデルを準備
model = YOLO("yolo26n-pose.pt")
# カメラを準備
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# メインループ
while True:
# 1フレーム取得
ret, frame = cap.read()
if not ret:
break
# 姿勢を推定
results = model(frame)
# プレビューを描画
preview = results[0].plot()
# プレビューを表示
cv2.imshow("yolo26", preview)
# qキーで終了
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# 終了処理
cap.release()
cv2.destroyAllWindows()
モデルを準備
model = YOLO("yolo26n-pose.pt")
初回実行時、モデルのファイルが自動でダウンロードされる。
使用可能なモデルは以下のとおり。
カメラを準備
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
Webカメラを用いる。
カメラ番号 0 番が何であるかは時と場合による。
たとえば以下のように調べることができる。
uv pip install pygrabber
from pygrabber.dshow_graph import FilterGraph
graph = FilterGraph()
for index, name in enumerate(graph.get_input_devices()):
print(index, name)
uv run scan_camera.py
0 c922 Pro Stream Webcam
1 Live Gamer EXTREME 3
今回はカメラ番号 0 で c922 Pro Stream Webcam が起動することがわかる。
カメラ名でカメラ番号を探索したい場合は以下のように書ける。
from pygrabber.dshow_graph import FilterGraph
def find_camera_index(camera_name: str) -> int:
graph = FilterGraph()
cameras = graph.get_input_devices()
for index, name in enumerate(cameras):
if camera_name.lower() in name.lower():
return index
raise RuntimeError(
f"カメラ \"{camera_name}\" が見つかりません。\n"
f"カメラ一覧: {cameras}"
)
CAMERA_NAME = "C922"
cap = cv2.VideoCapture(find_camera_index(CAMERA_NAME), cv2.CAP_DSHOW)
メインループ / 1フレーム取得
while True:
ret, frame = cap.read()
if not ret:
break
cap.read() で最新の 1 フレームを取得。
ループを回し、連続して処理する。
姿勢を推定
results = model(frame)
1 フレームを姿勢推定器にかける。
numpy.ndarray を渡せるので、そのまま model(frame) と書ける。
結果の詳細は以下のとおり。
たとえば
print(results[0].keypoints.xy)
とすれば、結果の各点の座標を取得できる。
results[0] とは、1枚目の結果である。
今回は 1 フレームを渡しているため、1枚分しかない。
keypoints.xy は [人物][関節][x,y] という構造である。
関節は17点、対応は以下のとおり。
たとえば
left_wrist = results[0].keypoints.xy[0][9]
x = left_wrist[0]
y = left_wrist[1]
とすれば、1人目の左手首の座標を取得できる。
ただし、results[0].keypoints.xy[0][9] は人物が検出されていない場合にエラーとなる。また、どの人を指すか固定できるとは限らない。
プレビューを描画 / 表示
preview = results[0].plot()
cv2.imshow("yolo26", preview)
OpenCV で描画。
ここでの "yolo26" はウィンドウのタイトル。
qキーで終了
if cv2.waitKey(1) & 0xFF == ord("q"):
break
ウィンドウイベントを処理するため waitKey() で毎ループ OpenCV を呼ぶ。基本的にはキーイベントを少なくとも 1ms 待つ。
waitKey() の戻り値は押下キーの情報を含む。下位 8 ビットが「q」の ASCII コードならば、「q」キーが入力されたと判断できる。
ここでは break、すなわちループを抜ける。
終了処理
cap.release()
cv2.destroyAllWindows()
ループ終了後、カメラ占有を解放し、ウィンドウを閉じる。
解放を忘れると他のプログラムが使用できなくなる。
実行
プロジェクトフォルダで以下のコマンドを実行する。
Webカメラが起動する。
起動には少し時間がかかる。
uv run main.py
成功すると姿勢推定結果が表示される。
