OpenPose と 3D再構成 – Part 4: キネマティクスシミュレーション

OpenPose で人の動きを取得し3D再構成するシリーズの第4回です。ここまでで OpenPose の導入(Part 1)、カメラ校正(Part 2)、3D再構成(Part 3)を行いました。今回は、その動きで生体力学モデルを駆動します——OpenSim によるキネマティクスシミュレーションです。

キネマティクスシミュレーションの手順: .trc変換、LSTMマーカー拡張、OpenSimモデルのスケーリング、逆運動学。OpenCapのロゴ
OpenCap を基にした4ステップ。出典: S. D. Uhlrich (2022)(動画内の表示に準拠)。

今回は OpenCap(2台のiOS端末で撮影し、OpenPoseで解析、3D再構成、さらにキネマティクス/キネティクスまで行うオープンソースプロジェクト)を参考に、そのコードを流用します。パイプラインがオープンソースのPythonで、しかも Part 3 で自前の3Dデータが既にあるため、OpenCapの関数を借りてシミュレーション部分から始められます。手順は4つ:

  1. 3D姿勢データを .trc ファイルに変換
  2. LSTMモデルでマーカーを拡張
  3. OpenSimモデルをスケーリング
  4. 逆運動学(Inverse Kinematics)を実行

1. 3Dデータを .trc ファイルに変換

OpenSim はマーカー軌跡を .trc ファイルから読み込みます(数行のヘッダ→各フレームで各マーカーのx/y/z+フレーム番号・時刻)。まず再構成した3Dキーポイントをこの形式にします。(Part 3 のとおり、生データは先にクリーニング: 欠損を線形補間で埋め、残差分析で平滑化します。)

OpenCap のヘルパー関数(writeTRCfrom3DKeypoints)に、3Dデータ・出力パス・フレームレート・回転角(任意。データが回転している場合のみ辞書で指定。ここでは回転済みなので none)を渡すと .trc を書き出します。

動画での率直な補足: 再構成したスクワットは少し傾いて見えます(カメラ校正やOpenPoseの精度が原因と思われる)。ただ動き自体は明確なので、このまま進めています。

2. LSTMモデルによるマーカー拡張

OpenPose の出力には生体力学上2つの弱点があります。(1) 各フレームを独立に検出しフレーム間の関係がないため、滑らかな動きの復元が難しい。(2) 身体キーポイントが25点しかなく、肩や股関節の回転を計算するには不十分。

OpenPoseの25点スケルトンと、追加の解剖学的マーカーを持つ筋骨格モデル
LSTM が OpenPose の25点を、より充実した解剖学的マーカーセットに拡張する。

OpenCap はこれを LSTMモデルで解決します。光学式モーションキャプチャのマーカーセットと、対応する OpenPose の3D出力をペアにして学習させています。LSTM は時系列を扱うため滑らかな動きを復元し、さらに OpenPose には無い解剖学的マーカー(肘周りや股関節の複数点、C7 や ASIS/PSIS など)を拡張します。これらの追加マーカーがあることで、骨盤回転・腕の回転・屈曲/伸展が計算可能になります。

Python: writeTRCfrom3DKeypoints と、体重・身長・LSTMモデルを指定した augmentTRC の呼び出し
.trc を書き出し、体重・身長・LSTMモデル(v0.2)を指定して augmentTRC を呼ぶ。

コードでは augmentTRC に、入力 .trc体重身長・拡張モデルのパス(複数バージョンあり。既定は v0.2)を渡します。内部でデータを正規化→LSTM実行→逆正規化し、拡張済みの新しい .trc を書き出します。テキストエディタで開くと、元の関節点に加えて推定された解剖学的マーカーが入っています。

テキストエディタで開いた拡張済み .trc ファイル。ヘッダ行と、マーカーごとのX/Y/Z列
拡張済み .trc: ヘッダ行の後、マーカーごとのX/Y/Z(Neck・RShoulder・RElbow・RWrist・LShoulder…)。

3. OpenSimモデルのスケーリング

次に、汎用の OpenSim 筋骨格モデルを、体重・身長・静止姿勢(static pose)で被験者に合わせてスケーリングします。まず OpenSim(公式サイト)と、そのPythonパッケージを conda 環境に入れます。スケーリング用の設定XMLとベースモデルはどちらも OpenCap のリポジトリから入手できます。トラッキングデータ・モデル・体重・身長・静止姿勢を含む時間範囲を渡すと、スケーリング済みモデルが書き出されます。

率直な補足: 理想的な静止姿勢はきれいな立位です(OpenCapのドキュメント参照)。著者は撮り忘れたため、スクワット前の立っている最初の約1秒を代用しました。進めるには十分ですが理想的ではなく、後で影響が出ます。

4. 逆運動学(Inverse Kinematics)

最後に逆運動学を実行します。スケーリング済みモデルと拡張済み .trc を OpenSim に渡すと、マーカーに最もよく合う関節角度を解き、.mot(モーション)ファイルに保存します。OpenSim の GUI でモデルとモーションを開けば再生できます。

スケーリング済み筋骨格モデルが再構成したスクワットを行うOpenSimのGUI
最終結果: .mot ファイルで駆動され、再構成したスクワットを行うスケーリング済みOpenSimモデル。

スクワットとして認識できますが、やや不自然で右側が少し沈みます。著者はこれを、不十分な静止姿勢と不完全な再構成データのためと説明し、改善方法(より良いOpenPoseデータ、丁寧な3D再構成、適切な静止姿勢)も率直に述べています。

次回

関節キネマティクスが得られたら、最終回はキネティクスシミュレーション——力・地面反力・筋活動の推定です。見逃さないよう、YouTube のチャンネル登録をぜひ。


著者について

Takashi Fukushima — スポーツ・運動科学 × Human Pose Estimation × Computer Vision × XR を横断して研究・開発しています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール