1. HOME
  2. ブログ
  3. 幼児の成長過程における運動協調性の測定方法に関する検討

BLOG

ブログ

幼児の成長過程における運動協調性の測定方法に関する検討

東京大学医学部附属病院 救急・集中治療科
東京大学医学系研究科 外科学専攻 医学博士課程
佐藤拓也

1.はじめに

大学病院で勤務する多くの医師は、そのキャリアの途中、大体医師免許取得後5〜10年目くらいに大学院に進学し博士号を取得することが通例となっています。私もその例に漏れず医師として勤務しながら、現在大学院生として学生生活を送っています。
ただ、学生とはいえ研究を行うことに主眼を置いたカリキュラムのため必要な単位数も多くはないため自由度は高く、他学部の授業を受けることも可能です。ここは総合大学、東京大学のありがたいところです。
研究では統計解析にRやStataといったプログラミングベースの解析ソフトを使っていましたが、機械学習やDeep LearningにはやはりPythonだろうと言うことで、そのような背景があって、以前から興味はありながらも手を出せていなかったPythonを学ぶ授業をいくつか受けています。
医師、学生、研究者の3足の草鞋を履いているとは言え、家に帰れば6歳男児と5歳女児の二児の父。脳の計算領域の大半は子供の対応に占拠されています。2023年度秋学期に受講したデータサイエンス超入門の課題のテーマも子供関連、特に娘の動画を使ったものしか思いつきませんでした。
娘は赤ちゃんの頃からテレビの音楽に合わせてよく踊っている子で、成長に伴いだんだんと上達しているように思ったので、それを定量的に可視化できないかと考えました。

2.手法/結果

娘の動画のダンスと音楽の同調性を測定することとしました。それには、
① 映っている娘の骨格推定
② 動作の変化の検出
③ 音楽の変化の検出
④ ②と③の一致率の測定
というステップに分けて実行しました。
私のiPhone上に記録された9つの動画を、MacBookAir M1, 2020にAir dropして、Jupyter Notebook ver. 6.5.4の環境下でPython 3.11. 5を用いて解析を行いました。

2-1.骨格推定

授業では骨格推定に関してOpenposeというパッケージが紹介されていたのですが、調べてみたところそれのTensorflow版があるとのことで、tf-pose-estimationというパッケージを使用しました。
そもそもここに非常に難渋したのですが、インターネットとChatGPT先生にかなり助けられながらなんとか実装に漕ぎ着けました。

図1 検出された人物と関節の情報 図1 検出された人物と関節の情報

マイクを持って踊ってますね、この後マイクを捨てるパフォーマンスもしていました笑。

2-2.動作の変化の検出

tf-pose-estimationで検出された各関節の座標をテキストファイルに出力するコードも、インターネット上で示されていたのでそれを活用しました。
その後、授業では株価を使って紹介されていた時系列データの異常検知の手法を使用し、動作の変化のタイミングを特定しました。

図 2 右肩関節のx座標の経時変化と全関節における動作の変化点(例) 図 2 右肩関節のx座標の経時変化と全関節における動作の変化点(例)

2-3.音楽の変化の検出

これもドメイン知識が無さすぎて非常に困ったのですが、調べてみると音楽のビートや音を発するタイミングの周期性を検出するためにはNovelty Curveを描出するのがよさそうだと考えました。音声の変調、新しいシグナルの出現のことをNoveltyと呼ぶようです。(もし違っていたらすみません、教えてください。)
LibROSAやlibfmpパッケージを用いることでこの解析を実行し、各動画のNoveltyのピークを検出することができました。

図3 ピーク時点の抽出(例) 図3 ピーク時点の抽出(例)

2-4.動作と音楽の変化の一致率の測定

2-2で得られた動作の変化のタイミングのそれぞれに対して最も近い音楽の変化のタイミングを選び出し、その間の時間間隔が0.05秒未満であるものを同調しているとみなしました。
動作の変化タイミングのリストのうちで音楽と同調していたものの割合を同調性(Synchronicity)としました。
最終的にはこの同調性と、動画撮影日から算出される娘の年齢の関係をグラフにまとめました。

図4 同調性と年齢の関係 図4 同調性と年齢の関係

3.まとめ

割とこの最終結果を得るまでに時間がかかり、本当は研究とか色々なことをやるつもりだった年末年始の時間を丸々捧げることになったので、最後のグラフが描出された時にはある程度の達成感はあったのですが、それと同時にこの微妙なグラフに脱力感も覚えました。正直、めっちゃ微妙です。多分、この傾きが優位かどうかの統計解析を行っていないのも気力が尽きたのだと思われます。
この要因としては、
・サンプル数:
今回は9つの動画の解析としました。また、特に骨格検出の解析の時間短縮のために、本当は分単位だった動画のうち10秒程度を抽出しました。動作の変化、音楽の変化が少なかった可能性があります。
・骨格検出の精度:
tf-pose-estimationの中でも精度の高いCMUというモデルを用いて骨格検出を行いました。比較的よく娘の骨格を検出しているようには見えましたが、後ろや横を向いているフレームも多く追従しきれていないシーンも多数存在しました。
・動作の変化の定義:
動作の変化を検出するのに、各関節の座標の移動平均と移動標準偏差を使いましたが、この方法で十分に動作の変化を捉えられているのかの検証が不十分です。
・音声データの質:
今回使用した動画には、音楽だけでなく背景音声も含まれていました。人間の耳にはほとんど音楽が聞き取れないようなものもありました。
・同調性の定義
ダンスと音楽の同調性として「動作の変化と音楽の変化のタイミングが近い」、という定義にしていましたがValidateされていません。プロのダンス動画などで事前検証が必要だったかもしれません。

このような課題と、結果の微妙さはありますが、この課題によりPythonによるデータ解析の勉強に大変なりました。Tensorflowの導入という高度なものだけでなく、動画の撮影日の取得や、iPhoneで撮影されたMOVファイルをmp4ファイルに変換するといった基本的な作業もイチから調べながらではありましたが、「Pythonでできる」ということが分かったことが今後に活かせるなと考えています。

今回は、このようなプログラミングの素人が四苦八苦しながら付け焼き刃で動画の解析を行うレポートでしたが賞をいただけることになり大変光栄です。誰かの参考になれば幸いです。

参考文献
[tf-pose-estimation] OpenPoseで骨格推定 Tensorflow 2.x版(M1 Mac/Intel Mac/Windows11/Ubuntu対応) | 竹のしんのテック日記 (take6shin-tech-diary.com)
Apple Silicon(M1) Mac+tensorflow-macosでディープラーニングする (zenn.dev)
GitHub – karaage0703/tf-pose-estimation: Deep Pose Estimation implemented using Tensorflow with Custom Architecture for fast inference. (前述のサイトの所有者が公開しているtf-pose-estimationのコードを今回使用した。)
[音声解析] Pythonで楽曲のリズム・テンポ分析: Novelty Curve (楽曲変化検知曲線) – Wizard Notes (wizard-notes.com)
C6S1_NoveltySpectral (audiolabs-erlangen.de)
C6S1_PeakPicking (audiolabs-erlangen.de)
[FFmpeg] FFmpegを使って動画ファイルの撮影日時を取得する方法 – tech-hint (hatenablog.com)
FFmpegによる動画ファイル分析入門 | (oscasierra.net)
[その他] Pythonのdatetimeで日付や時間と文字列を変換(strftime, strptime) | note.nkmk.me (日時データの取り扱い方法)
【Pandas基礎】dataframeの並べ替えの基本 #Python – Qiita (データフレームの取り扱い方法)
Pythonでlistのlistを引き算したかった – 行けたら行く (ted027.com) (リストの要素の引き算。フォルダ内に解析対象のmp4ファイルと、骨格検出結果を表示したmp4ファイルが混在したため、前者のみをリスト化する際に使用。)
[ChatGPT] https://chat.openai.com/

スーパーデータサイエンスアワード2023年度春学期
スーパーデータサイエンスアワード2023年度秋学期

ブログ