MediaPipe による 3次元人体姿勢推定 Colab プログラムによる実験・研究スキルの基礎
【概要】MediaPipe Poseライブラリを使用して静止画像から人体の33箇所の関節を3次元座標で自動検出し、姿勢を分析するプログラムである。プログラムの利用方法、技術的背景、実験・研究スキルの基礎について解説する。
Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/1mLABILHrBPlMkaEY-ZR8j5cDcHsSyVo5?usp=sharing
【目次】
プログラム利用ガイド
1. このプログラムの利用シーン
人物の写真から関節の位置を自動で検出し、姿勢を分析するためのソフトウェアである。スポーツのフォーム確認、ヨガやフィットネスの動作チェック、人体構造の学習教材、リハビリテーションの記録など、人体の姿勢情報が必要な場面で活用できる。
2. 主な機能
- 33箇所の関節点検出
鼻、目、耳、口、肩、肘、手首、腰、膝、足首など、人体の主要な33箇所の関節を自動で識別する。
- 詳細な数値データの提供
検出された各関節について、以下の情報を表示する。
- 関節の名称(例:LEFT_SHOULDER、RIGHT_KNEE)
- 画像内の位置座標(X座標、Y座標、Z座標)
- 可視性スコア(その関節が画像内で見えている確率)
- 視覚的な姿勢表示
検出結果を元の画像に重ねて表示する。関節は緑色の点で、骨格の繋がりは赤色の線で描画される。
- 処理時間の表示
画像1枚の処理に要した時間を秒単位で表示し、性能を把握できる。
- 結果の保存
検出結果が描画された画像を、自動的にファイルとして保存する。
3. 基本的な使い方
- 環境の準備
Google Colabでプログラムを開く。必要なライブラリのインストールが自動で実行される。
- サンプル画像での動作確認
プログラムを実行すると、まずMediaPipe公式のサンプル画像が自動でダウンロードされ、処理が行われる。処理結果として、関節が描画された画像と、全33個の関節の詳細情報(名称、座標、可視性)がコンソールに表示される。
- 自分の画像を処理する
サンプル画像の処理が完了すると、「ファイルを選択」ボタンが表示される。処理したい画像ファイルを選択してアップロードする。アップロードした画像についても、サンプル画像と同様に処理結果が表示される。
- 結果の確認
処理結果は画面に表示されるほか、outputフォルダに画像ファイルとして保存される。保存先のパスはコンソールに表示される。
Colabのページ(ソースコードと説明): "https://colab.research.google.com/drive/1mLABILHrBPlMkaEY-ZR8j5cDcHsSyVo5?usp=sharing
4. 便利な機能
- 関節の識別番号
各関節には0から32までの識別番号(ID)が割り当てられている。この番号により、プログラム内で特定の関節を参照できる。
- 可視性スコアの活用
可視性スコアが低い関節は、隠れていたり画像の外にあったりする可能性がある。この情報を使って、検出結果の信頼性を判断できる。
- 座標の正規化
X座標とY座標は0.0から1.0の範囲に正規化されている。Z座標は腰の中心を原点とした相対的な深度であり、画像幅と同じスケールで正規化されている。画像サイズに依存せずに関節位置を扱える。
- 複数画像の連続処理
プログラムを再実行することで、異なる画像を次々に処理できる。各処理結果は個別のファイルとして保存される。
プログラムコードの説明
1. 概要
このプログラムは、静止画像から人体の姿勢を推定し、33個の3次元ランドマーク(関節点)を検出する。MediaPipe Poseライブラリを使用して、BlazePoseニューラルネットワークによる2段階処理(人体検出→ランドマーク推定)を実行し、検出結果を視覚化する。
2. 主要技術
MediaPipe Pose
Googleが開発したオンデバイス姿勢推定ソリューションである[1]。画像から33個の3次元ランドマークを推定し、モバイル端末でのリアルタイム処理を実現する。
BlazePose
Bazarevskyらが2020年に発表した軽量畳み込みニューラルネットワークアーキテクチャである[2]。ヒートマップと座標回帰を組み合わせた手法により、モバイルデバイスで30FPS以上の処理速度を達成する。COCOトポロジーの17点を拡張し、手のひらと足の点を含む33点のキーポイントを検出する。
3. 技術的特徴
- 2段階検出パイプライン
検出器(Detector)が画像内の人体領域を特定し、追跡器(Tracker)がその領域から33個のランドマークを推定する。
- 33点ランドマーク構成
顔、胴体、四肢に加えて、手のひらと足の基準点を含む。この拡張トポロジーにより、フィットネスやヨガなどの用途で必要となる肢体のスケールと方向情報を提供する。
- 座標情報と可視性スコア
各ランドマークについて、正規化された3次元座標(X, Y, Z)と可視性スコア(visibility)を出力する。X座標とY座標は画像内の位置、Z座標は腰の中心を原点とした深度を表す。可視性スコアは、そのランドマークが画像内で見えている確率を表す。
- 静止画像モードの設定
このプログラムでは、static_image_mode=Trueを設定することで、各画像を独立した入力として扱い、毎回人体検出を実行する。これは、関連性のない複数の静止画像を処理する場合に適した設定である。
4. 実装の特色
Google Colab環境に特化した設計により、以下の機能を実現する。
- 詳細なランドマーク情報の出力
検出された全33個のランドマークについて、名称、ID、X座標、Y座標、Z座標、可視性スコアをコンソールに出力する。これにより、各関節点の3次元位置と検出信頼度を定量的に把握できる。
- 処理時間の計測
time.perf_counter()を使用して推論処理の実行時間を計測し、性能評価を可能にする。
- 視覚化とファイル保存
検出されたランドマークを緑色の点で、骨格接続を赤色の線で描画する。処理結果はmatplotlibで表示し、同時にoutputディレクトリに画像ファイルとして保存する。
- サンプル画像とユーザー画像の処理
MediaPipe公式のサンプル画像を自動ダウンロードして処理した後、ユーザーが任意の画像をアップロードして処理できる。
- 日本語対応の可視化
japanize_matplotlibライブラリにより、グラフタイトルを日本語で表示する。
5. 参考文献
[1] Google AI. MediaPipe Pose. https://developers.google.com/mediapipe
[2] Bazarevsky, V., Grishchenko, I., Raveendran, K., Zhu, T., Zhang, F., & Grundmann, M. (2020). BlazePose: On-device Real-time Body Pose tracking. arXiv preprint arXiv:2006.10204. Presented at CVPR Workshop on Computer Vision for Augmented and Virtual Reality. https://arxiv.org/abs/2006.10204
実験・研究スキルの基礎:Google Colabで学ぶ姿勢推定実験
1. 実験・研究のスキル構成要素
実験や研究を行うには、以下の5つの構成要素を理解する必要がある。
1.1 実験用データ
このプログラムでは人物が写った画像ファイルが実験用データである。
1.2 実験計画
何を明らかにするために実験を行うのかを定める。
計画例:
- 検出信頼度閾値が検出されるランドマーク数に与える影響を確認する
- 人物の姿勢(直立、しゃがむ、横たわるなど)によってランドマーク検出精度がどう変わるか確認する
- 画像内の人物の大きさ(遠景・近景)が検出精度に与える影響を調べる
- 身体の一部が隠れている場合の可視性スコアの変化を観察する
- 複数人が写っている画像での検出挙動を確認する
1.3 プログラム
実験を実施するためのツールである。このプログラムはMediaPipe PoseライブラリとBlazePoseモデルを使用している。
- プログラムの機能を理解して活用することが基本である
- 基本となるプログラムを出発点として、将来、様々な機能を自分で追加することができる
1.4 プログラムの機能
このプログラムは2つのパラメータで姿勢推定を制御する。
入力パラメータ:
- min_detection_confidence:人体検出の最低信頼度(0.0~1.0、デフォルト0.5)
- min_tracking_confidence:ランドマーク検出の最低信頼度(0.0~1.0、デフォルト0.5)
出力情報:
- 33個のランドマーク座標(X, Y, Z)と各ランドマークの可視性スコア
- ランドマークが描画された画像(関節:緑色の点、骨格接続:赤色の線)
- 処理時間(秒)
- 保存された結果画像のファイルパス
処理の流れ:
- 公式サンプル画像を自動ダウンロードして処理
- ユーザーがアップロードした画像を処理
- 各画像について全ランドマークの詳細情報をコンソールに出力
1.5 検証(結果の確認と考察)
プログラムの実行結果を観察し、姿勢推定の特性を考察する。
基本認識:
- 画像の条件を変えると結果が変わる。その変化を観察することが実験である
- 「良い結果」「悪い結果」は目的によって異なる
観察のポイント:
- 33個のランドマークがすべて検出されているか
- 可視性スコアが低いランドマークはどれか、なぜ低いのか
- 隠れている部位のランドマークはどの程度正確に推定されているか
- ランドマークの位置座標は妥当か(実際の関節位置と一致しているか)
- 処理時間は画像のサイズや内容によって変化するか
2. 間違いの原因と対処方法
2.1 プログラムのミス(人為的エラー)
プログラムがエラーで停止する
- 原因:構文エラー、必要なライブラリがインストールされていない
- 対処方法:エラーメッセージを確認し、提供されたコードと比較する
初回実行に時間がかかる
- 原因:MediaPipeモデルのダウンロードとライブラリのインストールを行っている
- 対処方法:これは正常な動作である。完了するまで待つ
2.2 期待と異なる結果が出る場合
ランドマークが検出されない(全く表示されない)
- 原因:画像に人物が写っていない、または人物が小さすぎる、min_detection_confidenceが高すぎる
- 対処方法:人物が明確に写っている画像を使用する。パラメータを変更する場合はmin_detection_confidenceをxxxx程度まで下げて確認する
一部のランドマークの可視性スコアが極端に低い
- 原因:そのランドマークが画像内で隠れている、または画像の外にある
- 対処方法:これは正常な動作である。可視性スコアが低い部位がなぜ隠れているのか画像を見て確認する。隠れた部位の推定精度を評価する機会である
ランドマークの位置がずれている
- 原因:姿勢が複雑すぎる、身体の一部が重なっている、または画像の解像度が低い
- 対処方法:これはモデルの限界である。どのような姿勢でずれが生じやすいか記録する。より明瞭な画像で試す
複数人が写っているのに1人しか検出されない
- 原因:このプログラムは単一人物検出モード(static_image_mode=True)である
- 対処方法:これは仕様である。MediaPipe Poseは最も顕著な1人を検出する。複数人を検出したい場合は異なる実装が必要である
処理結果が保存されない
- 原因:outputディレクトリの作成に失敗している
- 対処方法:コンソールメッセージを確認する。ファイル書き込み権限があることを確認する
3. 実験レポートのサンプル
姿勢の複雑さがランドマーク検出精度に与える影響
実験目的:
異なる姿勢(直立、座位、しゃがみ姿勢)における33個のランドマークの検出精度と可視性スコアを比較し、姿勢の複雑さが推定精度に与える影響を明らかにする。
実験計画:
min_detection_confidence=xxxx、min_tracking_confidence=xxxxに固定し、3種類の姿勢画像を用意して比較する。
実験方法:
プログラムを実行し、各画像について以下を記録する。
- 検出されたランドマーク数(可視性スコアxxxx以上)
- 可視性スコアの平均値
- 可視性スコアがxxxx未満の低信頼度ランドマーク数
- 位置推定の正確性(目視評価)
実験結果:(以下は架空の値)
| 姿勢 | 検出ランドマーク数 | 可視性平均値 | 低信頼度数 | 処理時間(秒) | 位置精度評価 |
|---|---|---|---|---|---|
| 直立姿勢 | xx / 33 | xxxx | x | xxxx | xxxx |
| 座位 | xx / 33 | xxxx | x | xxxx | xxxx |
| しゃがみ姿勢 | xx / 33 | xxxx | x | xxxx | xxxx |
| 横たわり姿勢 | xx / 33 | xxxx | xx | xxxx | xxxx |
考察:
- 直立姿勢では全33個のランドマークが高い可視性スコアで検出され、位置推定も正確であった。これは身体の各部位が重ならず明瞭に見えているためと考えられる
- 座位では足首周辺のランドマークの可視性スコアが低下した。これは椅子による遮蔽や、足の位置が画像の下端に近いことが原因と推測される
- しゃがみ姿勢では膝と足首が重なり、ランドマークの位置推定精度が低下した。可視性スコアの平均値も低下し、身体の重なりが検出精度に大きく影響することが確認できた
- 横たわり姿勢では最も多くのランドマークで低信頼度が記録された。身体の各部位が重なり合うことで、個々のランドマークの識別が困難になったと考えられる
- 処理時間は姿勢の複雑さに比例してわずかに増加する傾向が見られた。複雑な姿勢ほど推定に時間を要する可能性がある
結論:
姿勢の複雑さは検出精度に大きく影響する。直立姿勢のように身体の各部位が明瞭に見える場合は高精度な検出が期待できるが、しゃがみ姿勢や横たわり姿勢のように身体の各部位が重なり合う場合は検出精度が低下する。実用においては、姿勢の複雑さを考慮した信頼性評価が必要である。