リアルタイム人体ポーズ推定システムの構築:YOLOv8-Poseによる実践的手法
コンピュータビジョン分野において、動画や画像から人の姿勢をリアルタイムで正確に抽出する技術は、モーショントラッキング、スポーツ分析、監視システム、バーチャルリアリティなど幅広い応用が期待されています。特に、Ultralytics社が提供するYOLOv8-Poseは、高精度かつ高速なキーポイント検出を実現しており、開発者が短時間でプロダクトに姿勢推定機能を統合できるようになっています。
本記事では、YOLOv8-Poseを活用してゼロからリアルタイム姿勢検出システムを構築するプロセスを解説します。環境設定からカスタムデータセットの作成、モデルの学習、そしてWebカメラを使ったリアルタイム推論まで、一連のワークフローを具体的なコード例とともに紹介します。
1. 開発環境の準備
まず、Python 3.8以上を使用し、仮想環境を用いて依存関係を分離することが推奨されます。以下はcondaを利用した環境構築手順です。
# 仮想環境の作成と有効化
conda create -n pose_estimation python=3.9
conda activate pose_estimation
# CUDA対応PyTorchのインストール(例: CUDA 11.8)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 必要なライブラリのインストール
pip install ultralytics opencv-python matplotlib pandas
GPUが利用可能な環境では、上記のCUDA対応版を推奨します。GPUなしの場合は--index-urlを省略することでCPU版がインストールされます。処理速度には差が出るため、可能であればNVIDIA GPUの使用をおすすめします。
インストール後、以下のスクリプトで動作確認を行います。
from ultralytics import YOLO
import cv2
# プリトレーニング済みの小型モデルを読み込み
detector = YOLO('yolov8n-pose.pt')
# サンプル画像に対する推論
results = detector('https://ultralytics.com/images/person.jpg')
annotated_frame = results[0].plot()
cv2.imwrite('output_pose.jpg', annotated_frame)
print("姿勢推定が完了し、結果が保存されました。")
この数行のコードだけで、人物の境界ボックスと17個のキーポイント(鼻、目、肩、肘、手首、腰、膝、足首など)が可視化された画像が生成されます。
2. カスタムデータセットの作成とアノテーション
特定の用途(例:ヨガのポーズ判定、工場内での作業姿勢監視)にモデルを適応させるには、独自のデータセットでファインチューニングを行う必要があります。YOLOv8-Poseは、YOLO形式のアノテーションを必要とします。
各画像に対応する.txtファイルには、以下のようなフォーマットで情報が記述されます。
0 cx cy w h px1 py1 v1 px2 py2 v2 ... px17 py17 v17
- class_id: クラス番号(人物なら通常
0) - cx, cy, w, h: 境界ボックスの中心座標と幅・高さ(正規化済み)
- px_i, py_i: i番目のキーポイントのx, y座標(正規化済み)
- v_i: 可視性フラグ(
0=非可視、1=遮蔽あり、2=明確に可視)
アノテーションにはLabelImgやRoboflowなどのツールが利用可能です。特にRoboflowは、アノテーションの自動変換、データ拡張、そしてUltralytics形式へのエクスポートをサポートしており、効率的なデータ前処理が可能です。
3. モデルの学習とファインチューニング
データセットが準備できたら、次に学習を実行します。ディレクトリ構造は以下のようになっていると仮定します。
dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
また、data.yamlという設定ファイルを作成し、データセットのパスとクラス情報を定義します。
train: ./dataset/images/train
val: ./dataset/images/val
nc: 1
names: ['person']
この状態で、以下のコマンドまたはPythonスクリプトで学習を開始できます。
from ultralytics import YOLO
# ベースモデルの読み込み
model = YOLO('yolov8n-pose.pt')
# カスタムデータセットで学習
results = model.train(
data='data.yaml',
epochs=50,
imgsz=640,
batch=16,
name='yolov8n-pose-finetune'
)
学習中は、損失値やmAP(平均適合率)がログ出力され、最終的にruns/ディレクトリに訓練済みモデル(best.pt)が保存されます。
4. リアルタイム推論の実装
学習済みモデルを使って、ウェブカメラからの映像に対してリアルタイムで姿勢推定を行うスクリプトを作成します。
import cv2
from ultralytics import YOLO
# 学習済みモデルの読み込み
model = YOLO('runs/pose/yolov8n-pose-finetune/weights/best.pt')
# カメラキャプチャの開始
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 推論の実行
results = model(frame, conf=0.5)
# 結果の描画
annotated_frame = results[0].plot()
# 映像の表示
cv2.imshow('Pose Estimation', annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
このスクリプトにより、カメラ映像に人物の骨格構造がリアルタイムで重ね書きされて表示されます。confパラメータで検出閾値を調整し、誤検出を抑制できます。
5. 性能最適化のヒント
- モデルサイズの選択:
yolov8n-pose(nano)は軽量で高速、yolov8x-poseは高精度だが遅い。用途に応じてバランスを取る。 - 画像サイズ:
imgszを小さくすると速度向上。リアルタイム用途では320~480が妥当。 - バッチ処理: 動画ファイル処理時は複数フレームをまとめて推論することでスループットを改善可能。
- TensorRTやONNXでのエクスポート:
model.export(format='onnx')で他のエンジンへ移行可能。
YOLOv8-Poseは、高度な姿勢認識を迅速にプロトタイピングできる強力なツールです。公式ドキュメントやGitHubリポジトリも充実しているため、カスタマイズやデプロイも比較的容易です。