【動作分析の基本】時系列波形で“動き”を見える化する|MediaPipe座標をPythonでグラフ化

python

✅ はじめに|動きの“波形”って何がわかるの?

動画から抽出された骨格データ(CSVファイル)を時系列波形のようなグラフに変換することで、
見た目では分からないような「動作の特徴」を視覚化することが可能になります。

今回は、matplotlibというパッケージを使って、

  • 手首のY座標(上下動)を折れ線グラフで描画する。
  • ピクセル座標系での動作の特徴を視覚化してみる。

というシンプルなのですが、これから複雑な解析を行うための基礎になる内容なので、しっかりと抑えておきましょう。


✅ 今回使うCSVの中身(MediaPipe出力)

今回の記事で例として使用するcsvデータについては、以前の記事(http://ktr-project.net/?p=46)で紹介した骨格推定アルゴリズムmediapipeを動画に適用した結果を使用しましょう。列名のヘッダーとはそれに準拠していきます。

もちろん他のcsvデータをダウンロードして、コードを走らせてみても問題ありません。

✅ Pythonコードで波形を描いてみよう!

以下のコードを使えば、CSVから読み込んで折れ線グラフを描画できます!

# 必要なパッケージを適用する
import pandas as pd
import matplotlib.pyplot as plt
#日本語フォントの適用(これがないと文字化けする)
plt.rcParams['font.family'] = 'MS Gothic'
# CSV読み込み
df = pd.read_csv("pose_output_pixel.csv")  # MediaPipeの出力CSV

# 左手首のY座標をプロット
plt.plot(df["frame"], df["y_15_px"], label="左手首Y座標")
#上下判定(ピクセル座標系の都合)
plt.gca().invert_yaxis()
# グラフの設定
plt.title("左手首の動き(Y座標)")
plt.xlabel("フレーム(時間)")
plt.ylabel("Y座標(px)")
plt.grid()
plt.legend()
plt.show()

これらのコードのそれぞれを説明していくと、はじめのブロックでは今回使用するパッケージを使用可能な状態にする処理(import)を行います。使用するパッケージはcsvを読み取ったりデータを抽出したりするための必要なpandasと今回のメインであるmatplotlibをインポートします。

importの続きにあるas ○○ というのは、「以降このパッケージを使う際はこの省略名で書きますよ」という宣言だと思ってくれていいです。いちいちmatplotlibとか長い名前を書くのはさすがに面倒くさいし、コード自体も読みにくくなるのでその処理だと思ってくれればと思います。

その次では、前のスティックピクチャの記事でもあったcsvデータの読み取りです。

最後のpltから始まるコードの部分で、グラフの描画の設定をしています。簡単に説明すると、”matplotlib(ここではpltと省略)の中の○○機能を使います(これを関数といいます)”という感じです(グラフにタイトルをつけるなら.plt.title())。当然これ以外にもたくさんの関数はありますが、使うときに都度紹介していきましょう(ちなみに公式で出している関数のリストはこちら:https://matplotlib.org/stable/api/pyplot_summary.html)。

グラフ描画の関数説明
plt.title()グラフタイトル名
plt.xlabel()横軸のラベル名
plt.ylabel()縦軸のラベル名
plt.grid()グリッド線の描画
plt.legend()凡例の描画
plt.shou()グラフの表示

ここで重要になるのは、これらのコード部分(matplotlibの関数)の括弧の中に入れる文字なのですが、グラフに文字を表示させたい場合には、””もしくは”で表示したい文字を囲いましょう。書き方としては、上のコードの通り、plt.title(“左手首の動き(Y座標)”)みたいな感じになります。

この””とか”については、データ型というのが関係してくるのですが、それはまた別の機会にしましょう。


✅ 他の関節も波形化できる!

当然ながら、他の座標のデータを重ね書きすることも可能です。例えば左右の手関節の座標の動きを比較した場合だと以下のようなコードになります。

 例:左右手首の比較
plt.plot(df["frame"], df["y_15_px"], label="左手首")
plt.plot(df["frame"], df["y_16_px"], label="右手首")
plt.gca().invert_yaxis()
plt.legend()
plt.show()

✅ まとめ|波形は動作分析の第一歩!

ポイント内容
骨格CSVの1列を時系列でプロットするだけpandasを使ったデータの読み込み
時間経過に伴う関節位置座標の変化を描画matplotlibを使った描画
比較・ピーク検出にも応用可能今後の解析パートで詳しく説明予定

✅ 次回予告|骨格を“かたち”で見る3Dスティックピクチャへ!

次の記事では、波形ではなく骨格全体の形(スティックピクチャ)を描く方法を紹介します。以前の記事(http://ktr-project.net/?p=57)で、上肢の動きを視覚化したときに、説明をしていなかった部分を詳しく解説していこうとおもいます。


✅ ご質問・感想は X(@shimitaro_108)まで!

これからの記事では、すこしずつコードの中身の解説だったり、自分でpythonコードを書いていくうえで必要になる知識(データ型)とかの話もちょっとずつまとめていこうと思っています。

コメント

タイトルとURLをコピーしました