歩行の2次元動作解析(データ計測)【Kinovea】

# はじめに
ケガや病気で身体に障害を負ってしまった患者さんに対して、理学療法士がリハビリの治療プログラムを立案する際、患者さんの運動を分析し力学的に解釈する能力が必要となります。

私は7年間理学療法士として仕事をするなかで、不確かな一面をもつ身体機能をデータ化し分析するのにITが非常に強力なツールになると感じプログラマーに転職しました。

しかし仕事上必要な分野の勉強やJsとPythonが楽しく後回しになっていたため、今年一発目は初志を思い出し 「バイオメカニクス×IT」 のテーマに取り組んでみます。

## やりたい事
セラピストが患者に生じた身体機能の低下を的確に評価する手段の一つとして動作観察・動作分析があります。
しかし私の経験上臨床現場では動作分析は肉眼で行われ、動作をスロー再生したり後で見返すために動画を撮影する事はあっても、そこから運動学的なパラメータを算出する事はせず分析はあくまで主観に留まると感じます。

そこで今回は歩行動画から各ランドマークの座標を取得し、そこからどういった数値を算出できるか検証しながら実際に歩行分析を行っていきたいと思います。

### 使用するツール
- Kinovea：マーカー検出
- Python：パラメーター算出、分析

## 今回の内容
- [x] Kinoveaを使用した映像内マーカーのトラッキング
- [x] カメラ撮影による誤差範囲の把握 
- [x] 角関節角度の算出に必要なランドマークの検討
- [x] 算出パラメータの検討 
- [x] PythonライブラリOpenPoseによる姿勢定位の紹介 

## 測定方法
### 参考文献
計測方法、動画撮影は下記文献を参考に行いました。

>**[矢状面上の歩行解析における二次元動作解析システムを用いた膝関節角度計測の信頼性と妥当性](http://aichi-npopt.jp/dl/info_paper_back/31_02_03.pdf)**
愛知県理学療法学会誌 2019

>**[2次元での簡易的な身体角度計測の信頼性 -臨床普及の観点から-](https://www.jstage.jst.go.jp/article/rika/22/3/22_3_369/_pdf)**
理学療法科学 2007

>**[二次元動作分析を用いた歩行中の体幹前傾角度計測の信頼性と妥当性の検証](https://www.jstage.jst.go.jp/article/pttochigicon/26/0/26_066/_article/-char/ja/)**
栃木県理学療法士会学術大会 2020


### ランドマークの設定
身体の各部位にマーカーを設置し映像内で追跡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/366e25fe-54fd-0150-9ba9-a6a5da0ef260.png)
※当時の私です

### 関節角度
マーカーを結んだ線を使用し以下の関節角度が算出可能です。

| 部位   | 運動方向        | 基本軸と移動軸                                       | 
| :----- | :-------------- | :--------------------------------------------------- | 
| 体幹   | 前傾/後傾       | 肩峰-大転子と平面座標の垂直軸のなす角                | 
| 股関節 | 屈曲/伸展   | 大転子-膝関節と腓骨頭-外踝のなす角                   | 
|        | 外転/内転       | 肩峰-上前腸骨棘と上前腸骨棘-膝蓋骨中央のなす角       | 
| 膝関節 | 屈曲/伸展       | 大転子-大腿骨外側顆と腓骨頭-外踝のなす角             | 
|        | 膝内反角度(FTA) | 上前腸骨棘-膝蓋骨中央と膝蓋骨中央-外内踝中央のなす角 | 
| 足関節 | 底屈/背屈       | 腓骨頭‐大腿骨外側顆と踵骨-第五中足骨のなす角        | 

また時間あたりの関節角度の変化から以下が算出可能です。
- 角速度
- 角加速度

さらに角加速度と身体部位の推定質量、床反力が分かれば以下が算出できます。
※今回は床反力計(めちゃくちゃ高価)と知識不足のため算出できません。
- 関節トルク
- 筋張力

### カメラの計測精度の限界
今回使用する動画は数年前に思い付きで撮影しており、参考文献のようなきちんとした撮影条件が揃えられていないという問題があります。

またカメラによる計測精度の限界として文献では以下が紹介されています。

- 画面の中央と両端での歪曲収差による誤差
- 回旋運動に伴う見かけ上の誤差
- サンプリング能(fps)

例えば、湾曲誤差では被写体を画面中央で捉えるか、画面端で捉えるかで算出される値に誤差が生じます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/bb29d057-647d-6b06-4cd1-1597bec29f58.png)
[※「矢状面上の歩行解析における二次元動作解析システムを用いた膝関節角度計測の信頼性と妥当性」](http://aichi-npopt.jp/dl/info_paper_back/31_02_03.pdf)より引用

## Kinoveaによる映像分析

Kinoveaはこちらからダウンロードできます

https://www.kinovea.org/


### マーカートラッキング
Kinoveaを使用してマーカーをトラッキングすると動画のように映像内のマーカーの位置情報を出力できます。

マーカー周辺の映像情報からマーカーを自動トラッキングしてくれます。

※私です
![walkSide.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/0bc41a01-34ab-1e20-2f11-12afc6059d7e.gif)

Kinoveaが出力するマーカーの位置情報は映像の中心を0としたpx単位のX,Y座標となります。
そのため、ここから距離を算出したい場合は映像内にメジャーの役割を果たす何かを設置する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/076afb0e-b448-55fb-5278-1de632461c59.png)

例えば、私の身長は180cmのためKinoveaで映像内のpxを計測し1pxあたりの距離を算出する事が可能です。

上記では180cm：858.47pxとなっているためこの映像上では1pxあたり0.2096cm程度だと思われます。
ちなみに私の足のサイズは26.2cm程度なのですが、映像上では121.98px × 0.2096cmで25.56cm程度となりやはりズレます。
※私の靴のサイズは28cmです

またもし正確な身長、px数で算出しても私の位置が映像の端の方なのでカメラのレンズが生む歪曲収差により多少ズレる事が予測されます。

**歪曲収差**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/8a2d6c8a-a26b-b4f3-dbab-59a14d764744.png)

### Kinoveaの歪み補正機能
今回の撮影では設定できていませんが実際の歩行コースのX軸、Y軸に沿って直線を引いておくことで補正する事ができます。

https://www.kinovea.org/help/en/measurement/lensdistortion.html

### 出力データ
前額面(正面)と矢状面(側面)の映像における各マーカーのトラッキングが終了した後、マーカー出力の行うと以下のようなフォーマットでマーカーの位置情報を取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/39688876-2a9d-ba62-f756-27d01d553736.png)
Label：本来マーカーの名前を設定
Time：動画のフレーム率(fps)が29.97フレーム/秒のためおよそ0.03秒単位で出力される
X,Y：映像中央を0としたpx単位

上記データを各マーカー毎に出力します。

## 歩行周期の時間を記録
通常の歩行では身体の各部位はそれぞれ役割をもって周期的に動きます。
マーカーの位置情報だけではそういった歩行周期の詳細なタイミングを判断できないため、映像を確認しながら歩行中に各イベントが発生した時間を記録しておきます。

>[歩行動作の仕組みと歩行周期の立脚期と遊脚期を紹介](https://physioapproach.com/hoko-zyusin-kansetu.html)
(歩行周期：ランチョ・ロス・アミーゴ方式)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/625f9420-5ccf-61e5-c2d7-84f84e89df4c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601137/1f098269-80e6-6844-c2e3-2be82f86be1c.png)
上記の各イベントの時間を映像をもとに記録しておきます。

KinoveaではKey Imagという機能を使用し映像内の特定の時間にラベルを付けマーカー座標と共にCSV出力する事が可能です。

## OpenPoseの紹介
今回私はマーカーを使用した姿勢計測を行おうとしていますが、Pythonには機械学習を使用しマーカーレスで姿勢推定を行うOpenPoseというアルゴリズムがあります。

>Githubリポジトリ

https://github.com/CMU-Perceptual-Computing-Lab/openpose

>関連記事

https://qiita.com/jjjkkkjjj/items/c56085f72d4f508a7570

マーカーを使用せず計測ができれば準備時間や計測条件が改善され臨床現場で実用性の高い分析が可能になると思います。

しかし実際はOpenPoseが定義する身体部位やランドマークがどういったルールに則っているかを理解しなければ、その算出値を正しく扱う事はできなためOpenPoseの算出データとマーカーを利用した方法を比較しながら勉強してみたいと思います。


# 次回へ続く
次回は取得したマーカー座標のCSVデータを読み込み、Pythonの各種ライブラリを使用して目標のパラメータを算出し分析していこうと思います。

余談ですが私は昔左膝を痛めた経験と、両側の偏平足があり歩行時にその影響によるアライメントの崩れがあります。
この記事では最終的にそういった歩行の特徴や因果関係を考察できるような材料が算出できれば面白いと思っています。