記事検索

検索ワードを入力してください。
Sky Tech Blog
RTMPoseを​簡単に​使用できる​rtmlibに​ついて

RTMPoseを​簡単に​使用できる​rtmlibに​ついて

高精度・軽量な姿勢推定AIモデル「RTMPose」を、大規模なフレームワークなしで手軽に利用できる推論ライブラリ「rtmlib」を紹介します。rtmlibは依存関係が少なく、Pythonから簡単に骨格推定を実行できます。本記事ではその特徴やAPI構成、Pythonでの具体的な実装例を解説します

はじめに

画像や動画から骨格や姿勢推定ができるAIモデルがあります。 その中の1つにRTMPoseがあります。
RTMPoseで画像から人の骨格を推定することはできますが、通常はMMPoseなどの大規模フレームワークを使う必要があり、導入や環境構築が難しいという課題があります。
そこで便利なのがrtmlibです。

これは、RTMPoseを含む複数のモデルを、軽量で簡単に動かせるライブラリです。

RTMPoseとは?

RTMPoseは、OpenMMLabが公開しているオープンソースの姿勢推定モデルです。
OpenMMLabは、AI研究コミュニティが開発する一連のライブラリ群で、RTMPoseはその中のMMPoseプロジェクトで提供されています。

特徴

  • 高精度で軽量な仕組み
    従来の方法より効率的に座標を計算する仕組みを採用しており、精度と速度のバランスが良い。
  • モデルバリエーション
    軽量なモデルから処理速度は遅いが高精度なモデルまで複数サイズを用意。
  • リアルタイム性能
    PCでは数百FPS、スマホでも70FPS以上の推論速度を達成。

rtmlibとは?

rtmlibは、RTMPoseやRTMO、DWPoseなどの最新姿勢推定モデルを、軽量な依存関係で簡単に動かすための推論ライブラリです。
通常、OpenMMLabのMMPoseを使う場合はMMCVやMMDetなどの大規模依存が必要ですが、rtmlibはそれらを排除し、ONNXモデルを直接扱えるシンプルな設計になっています。

特徴

  • 軽量設計
    必要な依存関係は NumPy、OpenCV-Python、ONNX Runtime程度。
  • 複数モデル対応
    RTMPoseだけでなく、RTMO(ワンステージ)、DWPose、RTMW(Wholebody 133点)、YOLOX、RTMDetもサポート。
  • API構成
    • 高レベルAPI(Solution)
      Wholebody, Body, Hand, PoseTracker, Custom
      → 検出+推論+後処理を一括で実行。
    • 低レベルAPI(Model)
      RTMPose, RTMO, YOLOX, RTMDet
      → モデル単位で柔軟に組み合わせ可能。
  • バックエンド対応
    ONNXRuntime、OpenVINO、OpenCV DNNに対応。
    CPU/GPU/Apple Siliconで動作可能。
  • 可視化機能
    draw_skeleton:キーポイントを線で描画
    draw_bbox:人物検出結果を表示

実装例​(Python)

import cv2

from rtmlib import Wholebody, draw_skeleton

# 利用するデバイスを指定(CPU / CUDA-GPU / Apple Silicon の MPS)
device = 'cpu'  # cpu, cuda, mps

# 推論バックエンド(ONNXRuntime / OpenCV DNN / OpenVINO)を選択
backend = 'onnxruntime'  # opencv, onnxruntime, openvino

# 入力画像を読み込む(BGR形式)
img = cv2.imread('./demo.jpg')

# 骨格のキーの並び(スケルトン仕様)を選択
# True: OpenPose 形式、False: MMPose 形式(モデルにより接続関係が異なる)
openpose_skeleton = False  # True for openpose-style, False for mmpose-style

# Wholebody ソリューションを初期化
#   - to_openpose: 出力のキーポイント順を OpenPose 仕様に変換するか
#   - mode: 速度と精度のトレードオフ('performance' / 'lightweight' / 'balanced')
#   - backend, device: 上で指定したバックエンドとデバイス
wholebody = Wholebody(
    to_openpose=openpose_skeleton,
    mode='balanced',  # 'performance', 'lightweight', 'balanced'. Default: 'balanced'
    backend=backend,
    device=device
)

# 画像 1 枚に対して推論を実行
#   戻り値:
#     - keypoints: 形状 (人数, キーポイント数, 2) の座標(x, y)
#     - scores:    形状 (人数, キーポイント数) の信頼度 [0.0–1.0]
keypoints, scores = wholebody(img)

# --- 可視化(骨格の重畳描画)---

# もし黒背景に描画したい場合は、下記のように空画像を用意する
# (※img_show を先に定義してから draw_skeleton に渡す必要があります)
# if you want to use black background instead of original image,
# img_show = np.zeros(img_show.shape, dtype=np.uint8)

# 骨格を描画する(kpt_thr はキーポイント可視化の最小スコア閾値)
img_show = draw_skeleton(img_show, keypoints, scores, kpt_thr=0.5)

# 画像ウィンドウに表示
cv2.imshow('img', img_show)
cv2.waitKey()

まとめ

今回、rtmlibを初めて触ってみましたが、「初めての姿勢推定にはうってつけ」だと感じました。

私はRTMPose自体を使ったことがなく、MMPoseのような大規模フレームワークは導入が難しそうで敬遠していました。
しかし、rtmlibは依存関係が最小限で、ONNXモデルを直接扱えるため、環境構築のハードルが低く、すぐに試せるのが魅力です。

興味を持った方はぜひ試してみてください。


\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム