😌

姿勢推定で「5回立ち上がりテスト」が変わる?〜動作解析アプリ開発の舞台裏〜

に公開

こんにちは、だいじろうです

現在、動画解析ツールを開発しているのですが、そのモチベーションについて記事を書きました

https://zenn.dev/idoco_daijiro/articles/27144e79124b00

臨床現場では、毎日数え切れないほどの評価を行われています
そのなかでも5回立ち上がりテストは、手軽に実施でき、患者さんの下肢筋力やバランス能力を測るのに重宝されています

椅子から立って、座って、を5回繰り返す
必要なのはストップウォッチと、一般的な座面の高さの椅子だけです

ですが、わたしはずっとモヤモヤしていました

「立ち上がったかどうかの指標を揃えるの、むずくない?」
「せっかく立ち上がり動作をやってもらっているので、秒数だけ記録するの、もったいなくない?」

たとえば、同じ「10秒」で5回立ち上がれたAさんとBさんがいるとします
Aさんは安定したフォームで、一定のリズムでスムーズに立ち上がりました
一方、Bさんは途中でバランスを崩しかけたり、左右に体重がブレたりしながら、なんとかギリギリ10秒で立ち上がりきりました

記録としては、どちらも「10秒」 です
療法士の目から見れば、両者の「動作の質」や「転倒リスク」がまったく違うことは一目瞭然ですよね
ですが、学術的なカットオフ値には「秒数」しか参考にされないのが現状です

そこで今回、わたしは「この熟練の療法士だけが感じ取っている『動作の質』という定性的なデータを、AIの力で定量化(数値化)できないか?」と考えました
単なる「速さ」だけでなく、動作の「滑らかさ」や「ばらつき」「安定性」を可視化するアプリの開発です

そうすることで、患者さんや利用者さんに「5回立ち上がりテスト」をやってもらった際に得られる情報が増えるので、より客観的に評価することができればと考えています

この記事では、現在進行形で開発を進めている「MediaPipe」を使った動画解析アプリの舞台裏と、なぜその指標を選んだのかという技術的なお話を、できるだけわかりやすくお伝えしていきます

タイム計測だけでは見落としてしまう「動作の質」

臨床現場において、数字というのは非常に強力なツールです
「前回は12秒だったのが、今日は10秒になりましたね!」と患者さんに伝えれば、数字の変化がそのままモチベーションの低下を防ぎ、リハビリの効果を証明してくれます

ですが、スピードを追い求めるあまり、患者さんが「とにかく速く立つこと」だけにフォーカスしてしまうという落とし穴があります

体幹を過剰に前傾させ、反動を無理やり使って立ち上がったり、着座のときにドスンと勢いよく落ちるように座ったり
果たしてそれは、わたしたちが本当に引き出したかった 「生活期における安全で、かつ実用的な動作」 なのでしょうか?

わたしたちは、どうしてもカルテに書きやすい「計測タイム」という結果に目を奪われがちです
けれど、本当に重要なのは「そのタイムを叩き出すまでに、どんなプロセスを辿ったのか」という動作へのプロセスそのものです

動作のばらつき、重心の移動の滑らかさ、立ち上がり始めの初速など、人間の目では「なんとなくぎこちない」「ちょっと危なっかしい」としか表現できないものを、目に見える客観的なデータとして取り出したい

これが、今回の動作解析アプリ開発の原点です

姿勢推定AI「MediaPipe」の可能性と限界

では、その動作をどうやって数値化するのか
わたしが選択したのは 「MediaPipe」というPythonの姿勢推定ライブラリ です

MediaPipeでは、画像や動画の左上を「x=0, y=0」、右下を「x=1, y=1」とし、身体の各部位がどの座標にあるかを自動で検出してくれるものです

検出した結果から関節の位置や角度の時系列データを解析したりグラフ化したりすることができます

こちらの画像は肩関節、股関節、膝関節のそれぞれの「x座標とy座標の和」の推移をグラフ化したものです

むずかしく聞こえるかもしれませんが、簡単に言うと 「各関節(肩、股関節、膝など)を自動で検出して、その座標(位置)を点のデータとして追跡してくれる技術」 です
スマートフォンやiPadなどで撮影した動画を読み込ませるだけで、数秒で全身の骨格を推定してくれます
大掛かりなセンサーを体に貼り付ける必要はありません

実際に計測したものがこちらです
イメージしやすいように肩関節、股関節、膝関節、足関節、踵、つま先部分にマーカーをつけ、それぞれを線で結んでいます

右側の動画に表記される「sitting-phase」は坐位フェイズ、「standing-phase」は立位フェイズ、「up-phase」は立ち上がりフェイズ、「down-phase」は座りフェイズになります(これらは検出されたデータからわたしが設定したものです)

そして、1回目から5回目までの立位をとるまでの所要時間を表記するようにしています

これだけ聞くと「魔法のようなツールだ!」と思うかもしれませんが、「課題」も多々あります

1. 足関節の検出精度が低い

先行研究(doi:10.3390/s25103122)でも指摘されていることですが、MediaPipeにおいて足部や足関節の検出は、肩や股関節に比べて誤差が大きくなりがちです

こちらの動画をみていただいても、肩関節や股関節、膝関節はほぼ正確に検出できている様子が確認できますが、足部・足関節はズレてしまう様子がみてとれます

ファインチューニングという技術を使えば精度を上げることはできますが、今回はまず「正確にデータが取れる部位」である肩、股関節、膝を中心に見ることにしました

詳細は忘れましたが、北海道の療法士の先生がJSNPTでファインチューニングで精度が向上したと報告されていたので、基本的な開発が終わったら着手していきたいと思います

2. 「Z軸(奥行き)」の信頼性に乏しい

このツールは、X軸(横)、Y軸(縦)、Z軸(奥行き)の3次元で座標を取り出そうとします
しかし、動画は2次元なので、どうしても奥行きの精度は落ちてしまいます

そのため、今回は思い切ってZ軸を切り捨て、X軸とY軸(縦横の2次元)のみを参考にする仕様にしました

つまり、MediaPipeを用いた動作解析は、前額面や矢状面、水平面といった運動面上で撮影した動画で、かつそれぞれの運動面上の関節運動でなければ、実用的な測定はむずかしいというのが現状です

立ち上がり・着座判定の指標として「股関節」を選んだ理由

この解析ツールにおいて一番の難所は、「どこからどこまでを『立位』、『坐位』と判断するか」という判定基準をプログラムに組み込むところでした

最初はシンプルに 「関節の角度」 で判定しようと考えました
たとえば、膝が曲がっていたら座っている、膝が伸びたら立っている、というようにです

しかし、前述した通り、足関節の検出精度が低いことから膝の角度もブレて使いものにならなくなるため、この案は却下しました

関節角度を指標とするなら股関節の屈曲・伸展角度となったのですが、立位時には0度に近くなるので指標にできそうでした
ですが、坐位時の屈曲角度をみてみると、90度近い角度になるのですが、それと近い角度を立ち上がり動作や座り動作時にもとってしまっていました
ということは、立ち上がっているとき、座っているときにも「坐位」と判定してしまう可能性があるということです

前述した「どこからどこまでを『立位』、『坐位』と判断するか」という判定基準では
「立位であるときに『立位』と判定し、坐位であるときに『坐位』と判定すること」
だけでなく、
「立位でないときに『立位』と判定しないこと」
「坐位でないときに『坐位』と判定しないこと」
も必須です

そして、それがどんな人の、どんな立ち上がり方に対しても適応できる必要があります

そう考えると、股関節角度を指標にすることも適切ではないと判断しました

次に、「関節の位置(X座標・Y座標)」を使う案を検討しました

まず肩関節の位置ですが、ここには「体幹の前傾具合」が強く反映されます
立ち上がる際のお辞儀の深さは人によって大きく異なることが確認されたため、肩の位置だけを指標にすることは基準と統一をするのがむずかしいと判断しました

また、膝関節の位置についても検討しましたが、立ち上がり動作の中で膝は前後に動くものの、その軌跡は個人差が大きく、「立位」や「坐位」といった状態を明確に判別する特徴量としては不適切だと判断しました

そこで試行錯誤の末、「股関節の移動量(x座標とy座標の和)」 という指標にたどり着きました

股関節の移動は「左下」から「右上」へ向かう

改めて動画をみていただきたいですが、座っている状態から立ち上がる際、股関節はどのように動くでしょうか?

右側から撮影した場合、股関節は左下から右上へ向かいます
他の利用者さんのデータを見ても、この「左下から右上へ向かう」動きは非常に安定的に観察できました

そこで、X座標とY座標を合算した数値を指標とし、その数値が最小になった瞬間を「坐位」、最大になった瞬間を「立位」として判定することにしました

ただ、最小値、最大値を指標とするのは検出誤差を踏まえると微妙な気がしたので、最小値を0%、最大値を100%とし、最小値+10%までを「坐位」と判定し、最大値-10%までを「立位」と判定することにしました
この基準に関しては、先行研究などを見つけきれていないので今後の検討課題ではありますが、いずれにしろ「立位」の判定基準が統一できるのは有用かなと考えています

人によって異なる波形の「ギザギザ」こそが宝の山

実際にプログラム上で股関節の動きをグラフの波形にして出力してみると、非常におもしろいことが分かりました

Aさんは、毎回の動作の波形が一定で、比較的綺麗なカーブを描きます

一方、Bさんの膝関節の波形を見てみると、波の途中に無数の「ギザギザ」が入っています
これは、関節運動が滑らかに行えていないことが示唆されます

また、回数を重ねるごとに波形の「高さ」が右肩下がりに落ちていくケースもあれば、右肩上がりに上がっているケースもありました

これまでの5回立ち上がりテストでは、全体で「何秒かかったか」しか見えませんでした
しかし、この波形データを見ることで
「この患者さんは2回目の立ち上がりで一番グラグラしている」
「後半にかけて明らかにフォームが崩れている」
という定性的な特徴が、目に見える客観的なデータとして分かるようになったということです

この「これまで見えなかったものや療法士の暗黙知として扱われていたものを、客観的なデータとして検出できるようになった」ということは、非常に魅力的ではありますが、これに本当に価値や意義があるかは検証が必要です

たとえば、5回立ち上がりテストの秒数は転倒リスクの指標の一つとして用いられますが、これらの客観的なデータを加えることでより精度高く転倒リスクを予測できれば、価値や意義があるものになります
ですが、秒数だけで予測する場合と比べて同程度の精度であれば、それほど価値や意義のあるものとは言えません

転倒リスクに限らず、さまざまなアウトカムとの関連性を検証していき、この動画解析ツールの価値や意義を確認していきたいと思います

おわりに

患者さんから頂く、たった30秒ほどの5回立ち上がりテストの時間
その貴重な時間から、これまでのわたしたちは「秒数」という結果しか得てきませんでした

ですが、本当はもっとたくさんの情報やデータが隠されています
動作の途中に隠れた不安定さや、目に見えないフォームの崩れ
それをAIの力で可視化できるようになれば、転倒リスクのより正確な予測や、「あなたの今の課題は筋力よりも、立ち上がる瞬間のバランスです」という、より解像度の高いアセスメントへとつながっていきます

どんなデータが臨床に生きるかは、まだ検証段階かもしれません
ですが、「数字」と「テクノロジー」、そして「療法士の目」を掛け合わせることで、明日のリハビリはもっと質の高いものへと変わっていくと信じています(信じたいです)

今後も、このアプリを使った検証結果や発見があれば、どんどん共有していきたいと思います!
ぜひ、みなさんのご意見やアイデアもお聞かせください

Discussion