姿勢分析:写真と動画から姿勢と関節角度を測る

姿勢分析:写真と動画から姿勢と関節角度を測る

人が体をどう置いているかは、課題について多くを語ります。姿勢を見れば、作業環境が体に合っているか、セッション中にどれだけ動いているか、参加者が身を乗り出しているのか背を向けているのかが分かります。これを測るには、これまでモーションキャプチャースーツや何時間もの手作業のアノテーションが必要でした。多くの問いには、カメラ 1 台と姿勢推定モデルで十分です。ただし、2 次元の推定で何が言えて何が言えないかを分かったうえで使う必要があります。

Neutropic は pose_estimate ツールで写真や動画から身体の姿勢を、face_expression ツールで頭の向きを推定します。この記事では、これらが何を計算し、何が返ってくるか、限界はどこかを説明します。スクリーンショットは、全身写真と人物写真を計測した新しいチャット 1 件から撮りました。

アップロードできるもの

  • 写真。 PNG、JPG、WebP、BMP。
  • 動画。 MP4、MOV、WebM、AVI、MKV、M4V。アプリ内のプレビューはブラウザのプレーヤーを使うので、動画を見るなら H.264 の MP4 がいちばん確実です。解析はどの形式でもサーバー側でデコードします。
text
/analyze pose_yoga.jpg の身体の姿勢を推定してください。関節角度、姿勢、ランドマークのオーバーレイを求め、数値を簡潔にまとめてください。

計測の仕組み

ツールは MediaPipe PoseLandmarker(lite モデル)を実行し、鼻や耳から肩、肘、手首、腰、膝、足首、足まで、身体ランドマーク 33 点を検出します。各ランドマークには可視性スコアがあり、0.3 未満のものは推測せずに捨てます。残りから次の値を求めます。

  • 8 つの関節角度(度):左右の肘・膝・股関節と、左右の肩の外転(上腕と体幹の間の角度)。
  • 姿勢。 膝と股関節がどちらもほぼ伸びていれば(150° 以上)standing、どちらもはっきり曲がっていれば sitting/squatting、その中間は bent/transitional、脚が見えなければ unknown です。
  • 腕の位置。 肩の外転から raised、extended sideways、down at sides を判定します。
  • 体幹の傾き。 腰の中点から肩の中点へ引いた線の傾き(度)です。
  • 向き。 体幹の長さに対する肩幅の比から frontal、oblique、sideways/turned を判定します。

動画は既定で 1 秒あたり 5 フレームを抽出します。フレームごとの値に加えて、姿勢や腕の位置ごとの時間の割合、平均の関節角度、フレーム間のランドマークの平均移動量が得られます。移動量は、その人がどれだけ動いているかを見る大まかな指標です。

頭の向きは顔のツールから得られます。face_expression は顔が映っているフレームごとにヨー、ピッチ、ロール(度)を返します。このチャットの人物写真では −5.7°、−8.5°、−1.5° で、カメラからわずかにずれた向きでした。表情分析も参照してください。

返ってくるもの

  • オーバーレイ画像(*_pose_overlay.png):人が検出された最初のフレームにランドマークと骨格を描いたもの。モデルが正しい体を捉えたかがひと目で分かります。
  • 表(*_pose.csv):画像や抽出フレームごとに 1 行で、姿勢、腕、体幹の傾き、向き、8 つの角度が入ります。
  • 要約値:チャットとレポートに載り、どの値もツール呼び出しまでたどれます。
ポーズのオーバーレイを開いた新しいチャット。全身写真の上にランドマーク 33 点と骨格が描かれています。
ポーズのオーバーレイを開いた新しいチャット。全身写真の上にランドマーク 33 点と骨格が描かれています。
チャットの要約はツールの数値をそのまま引用しています。直立、腕は体の横、正面向き、体幹の傾き 0.2°、肘 176.4°/177.4°、膝 177.8°/178.1°、股関節 168.7°/171.2°。
チャットの要約はツールの数値をそのまま引用しています。直立、腕は体の横、正面向き、体幹の傾き 0.2°、肘 176.4°/177.4°、膝 177.8°/178.1°、股関節 168.7°/171.2°。
1 行だけの姿勢の表。姿勢、腕、体幹の傾き、向き、各関節角度が列になっています。
1 行だけの姿勢の表。姿勢、腕、体幹の傾き、向き、各関節角度が列になっています。

レポートは同じ値を表にまとめ、文には pose_estimate のステップを指す [n] 引用が付きます。

レポートの姿勢の表。姿勢の分類、腕の状態、向き、体幹の傾き、8 つの関節角度が並びます。
レポートの姿勢の表。姿勢の分類、腕の状態、向き、体幹の傾き、8 つの関節角度が並びます。

どう確かめたか

社内のチェックでは、上の全身写真は直立、腕は下、正面向きと判定され、写真と一致しました。以前のバージョンは向きを肩幅の絶対値で判断していましたが、全身が画面に収まるとこの値は必ず小さくなるため、全身写真が横を向いているように判定されていました。いまは体幹の長さに対する肩幅の比で判断しています。

正直に失敗することも同じくらい大切です。顔だけが映った動画では、ツールは体をでっち上げず "no person detected" と報告しました。カメラの構図が合っていないときに望ましいのは、まさにこの振る舞いです。

研究での使いどころ

  • 人間工学・作業環境の研究。 座っている時間と立っている時間、体幹の前傾、手を伸ばすときの肩の外転を、机の構成ごとに比べます。
  • 動きと活動量。 ランドマークの平均移動量を、課題の段階ごとの活動量の大まかな指標にします。たとえば退屈なブロックと集中するブロックでのそわそわした動きを比べます。
  • 社会的・非言語的な行動。 相手や画面への体と頭の向き。
  • リハビリ・スポーツの予備研究。 決まったカメラ配置で膝や肘の角度を見ます。ラボ用のシステムを使う前の最初の検討に向いています。

参加者ごとの要約は、ほかの表と同じように統計ツールに渡せます。

text
/stats posture_by_setup.csv には参加者と机の構成(standard、sit-stand)ごとに、座っていた時間の割合と平均の体幹の傾きが 1 行ずつあります。構成間で比べ、前提を確認して効果量を報告してください。

限界をはっきりと

  • 2 次元の角度。 角度は 3 次元ではなく、カメラ画像の平面上で測ります。カメラのほうを向いた手足は短く見え、角度がゆがみます。関心のある平面に対してカメラを垂直に置いてください(膝の屈曲は横から、肩の外転は正面から)。
  • 1 人だけ。 モデルは 1 人だけを追跡します。複数人が映る場面は先に切り出してください。
  • 大まかな姿勢ラベル。 standing や sitting といったラベルは、固定の角度しきい値で付きます。ラベルだけでなく、オーバーレイと角度も確認してください。
  • 可視性。 ゆったりした服、遮蔽、珍しい姿勢はランドマークの可視性を下げます。可視性の低いランドマークは捨てるので、一部の角度は間違うというより欠けることがあります。
  • 抽出間隔。 毎秒 5 フレームでは速い動きを取りこぼします。動きの解析では高いレートを指定してください。
  • 臨床用の歩行解析やモーションキャプチャーではありません。 値は研究用の測定として扱い、精度が重要なら一部のサンプルを基準機器と照らし合わせてください。

このチャットのレポートも、2 次元投影を含む自らの限界を書いています。

レポートの計測上の制限事項。関節角度はカメラ平面への 2 次元投影であり、AU の値はブレンドシェイプからの近似だと書かれています。
レポートの計測上の制限事項。関節角度はカメラ平面への 2 次元投影であり、AU の値はブレンドシェイプからの近似だと書かれています。

参加者を撮影するとき:同意とプライバシー

全身の動画は、顔が隠れていても個人を特定できます。最初のアップロードの前に、Neutropic は 研究データをアップロードする前に という案内を表示します。データの処理に必要な権利、同意、承認(IRB や倫理委員会など)がそろっていることを確認する手順です。参加者には、動きが自動で解析されることを伝えてください。計測は Neutropic のサーバーで動き、アップロードは削除するまで非公開のワークスペースに残り、学習には使われません(プライバシーポリシーを参照)。できれば動画ではなく、派生した姿勢の表を共有してください。

あわせて読みたい