DataTennis. NET

データテニス ドットネット

AI技術(Openpose)を使ったテニスのサーブフォーム解析

公開日:
最終更新日:2019/08/10

      2019/08/10

こんにちは。

個人でテニスのデータ分析ツールをつくってる@otakoです。

今回はAI技術を用いたOpenposeというツールを使い、サーブのフォーム解析をやってみました。

テニスのフォーム解析にAI技術が使えるか

まずは「姿勢推定技術」について簡単に説明します。
「姿勢推定技術」とは、AI技術(深層学習)を用いて身体の動きを解析するものです。

人間の関節点(肩、肘、手首、腰、膝など)の動きを検出し、関節点をつなぎ合わせた骨格モデルを形成して画像出力します。
↓は自分のサーブ動画を取り込んで、姿勢推定してみた動画です。

従来は、モーションキャプチャーを身体に取り付けるなど、関節点検出のハードルは高かったと思います。
ですが、こちらは特別な機材を必要とせず簡易に関節点検出することができます。

この姿勢推定技術を使ってテニスのフォーム解析ができたら面白いなあ、と前々からこの技術に注目してました。

姿勢推定を行う手法の1つであるOpenPose

姿勢推定を行う手法の1つにOpenPoseというものがあります。論文は「Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields」というタイトルでカーネギーメロン大学から出ていて、オープンソースもGithubで公開されています。

Githubからリポジトリをクローン(ダウンロード)して、テニスのサーブフォーム解析をやってみました。

OpenPose、環境設定や動かし方などははまりがちではあるのですが、本記事では扱いません。
あと、深層学習で計算するのでそれなりにマシンパワー必要です。ちなみに、自分のPCはGPU搭載(geforce 1080ti)です。

XY座標データの出力

骨格モデルの動画は↑に示しましたが、OpenPoseは動画ファイルの出力だけでなく、関節点のXY座標データを出力することができます。
出力ファイルはjsonファイル形式で、pose_keypointsの部分に(x座標, y座標, 信頼度) x 関節数18で、54個の値が出力されます。
こんな感じです。これが各フレーム毎に出力されます。

トロフィーポーズ時の脇と肘の角度を数値化し、理想の角度と比較

トロフィーポーズには肘と脇の角度に理想の角度があるので、その数値を抽出してみました。

サーブは、力をため、次に身体を回転させながら、ラケットを振り上げてボールをインパクトしますが、
トロフィーポーズはこの力をためる動作に該当します。

このトロフィーポーズをうまくつくれないと、そのあとの動作がうまく連動せずパワーをボールに伝えにくくなります。

動作をうまく連動させるには、肘の角度90度、脇の角度90度が理想と言われています。

ということで、OpenPoseの出力結果から、それぞれの角度を抽出してみたのですが、
肘の角度 124度
脇の角度 25度
となりました。

うーん、理想角度からけっこう外れてますね。

まあこの数値をみなくても画像をみれば、自分のトロフィーポーズがいけてないことがわかりますがね。

トロフィーポーズが終わり、身体の回転動作がはじまってから、肘の角度が90度近くになっています。
つまり、身体の回転が理想よりはやく、ラケットの振り上げ動作がうまく連動せず、パワーロスにつながってしまっている可能性があります。

もう一つ気になったのが、右足の動きです。
トロフィーポーズに入るときに右足が身体が開く方向に動いてしまっています。

この分身体の回転量が減ることになり、パワーロスに一因になっているかと思われます。
こちら、OpenPoseの出力結果から特徴を数値化したかったのですが、3次元データでないため難しく。
こちらを見たい場合、カメラの視点を変える必要がありそうです。

いろいろ改善点出てきますね。

今回はOpenPoseの結果をフルに活用した分析はできていませんが、工夫すればフォームの動作解析に使える気がしています。

ラケットやボールの動きも検出できると尚いいですね。

(追記)打点位置を推測するプロトタイプをつくってみました

身体の動きに加えて、打点の高さも測定できるといいなと思い、打点の位置を推測するプロトタイプをつくってみました。

デモはこんな感じです。

マウスクリックで、足元と頭上の間隔=身長(180cm)としてスケール調整して、ボールの打点をクリックすることで打点位置を推測してます。

この場合、
X:277cm
Y:36cm
と下に表示されますが、
これは打点位置を表しており、高さ277cm、身体より36cm手前の位置と推測。

こちら、HTML5のvideoタグでつくりました。

 - blog, スポーツ画像解析, フォーム解析