みんなはまだスポーツしてる？自分のテニスフォームとプロのテニスフォームの違いを機械学習を使って自分で分析してみたい（OPENPOSE,姿勢推定)

## 自己紹介
初めまして。社会人になっても週3でテニスを未だに楽しんでる者です。

テニス歴もソフトテニスから合わせると20年近くになります。

スポーツ全般に言えると思いますが、テニスってすごく上達が難しいです。
打ち方もストローク、ボレー、サーブ、スマッシュ・・・覚える打ち方が多いです。
そういう意味では一生上達できるのでいまだに楽しめています。
テニスは生涯スポーツなのでお勧めです。

85歳までテニスする予定なのでテニス歴70年ですっていうのが将来の夢です。
プログラミング歴も50年とかになったらどうなるんでしょうね。そっちも楽しみ。

## どうやってフォームの改善していくのか？
話がそれましたが、
**同じスポーツを20年もやっているとどこに自分の改善点があるかわからなくなってきます。**
今回は自分のフォームのどこに改善点があるのかをプログラミングを用いて検証していきます。

**そもそも、どうやって自分のフォームがどこが悪いか考える必要があります。**
明らかに変な打ち方などあればすぐ改善点がわかりますが・・・

なので、まずは自分のフォームがどうなっているか分析から始めようと考えました。

## どうやって分析する？

グーグル先生に聞いてみました。
『スポーツ　フォーム　分析　プログラミング』っと・・・

引っかかったキーワードが
- openpose 
- opencv 
- 姿勢推定
- Python

ここらへん。
**どうやら専門用語ではスポーツのフォーム分析を姿勢推定とも言えるらしいです。**
あとpythonでできるって。pythonやっててよかった・・・
そしてopenposeっての使えばいいらしい。
非商用で個人であればスポーツ分野でも無料で使えるみたいです。今回はこれでやってみましょう。
![sample_output_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/6a511a40-f9dd-d9ce-d0a3-f6377f075c77.png)
分析のイメージはこんな感じ。
**今回の目的は一言にまとめると動画から姿勢の機械学習されたモデル(openpose)を使って自動で自分の関節の位置を割り出すです。**

## 今回の素材
恥ずかしいですが自分のテニスのサーブ動画を切り抜いてGIFにしました。
![pre_serve_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/8616e9d9-c1a1-abe1-c7c6-035f972adeca.gif)
**我ながらまあまいいフォームやんけ・・・**

冗談はさておき、今回はこれを使っていきましょう。

## 導入で参考にした記事
https://self-development.info/pytorch-openpose%E3%81%AB%E3%82%88%E3%82%8B%E5%8B%95%E7%94%BB%E3%81%AE%E5%A7%BF%E5%8B%A2%E6%8E%A8%E5%AE%9A%E3%80%90python%E3%80%91/

今回はプログラミングをわからない人も読む前提なので詳しいことは割愛
この記事読めばプログラミング半年くらいの人であればいけるはず。
わからなければ聞いてください。

## 実装結果
書き出しは結構時間がかかります。
動画は10秒ですがだいたい10分くらいかかりました。

わくわく。

<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

![output_-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/e21bc322-34a5-24a6-acc6-dd1dffe4e8ec.gif)
**おお？？？？、そうか・・・なるほど・・・**
いい感じになんとかしてくれるでしょ！とか最初思ってましたが世の中、そんな甘くないです。
ギリギリ最後の方だけうまく点が取れてる気はします。


## なぜうまくいかなかったか？
問題点はいろいろとありそうです
###   ①画質が荒い？
撮ってきた動画自体がそもそも画質が荒いです。
1280×720とかだったかな。それかもう一個下の解像度かもしれません。

『4Kとかならどこまで精度が上がるのか？』も気になりますが
最低限一個上のフルHD(1920×1080)で撮影する必要はあるなと感じました。


###   ②撮影したフレームレートが低い
動画は30fps(1秒で30枚の静止画)でした。一般的な動画だと普通ですが
フレームレートが低すぎると特にインパクト前後など腕が消えてます。
![096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/96a1c133-db38-0ec0-9485-ff051a2ca95f.png)
腕の振りが早すぎて右腕が見えてないです。
これだとどんなにモデルの精度が良くても厳しそうです。
### ③撮影した角度が悪い
撮影した動画は最初に右腕が見えてません。
これも姿勢を判別をする上でかなり良くない要素だと考えています。
![024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/58f59aad-a733-bd28-1e97-eb494d6bccfa.png)
###  ④最後だけはちょっとうまくいってる？
ギリギリかろうじてこのフレームだけうまくいってる気はします。
それでも若干左にずれてるのが気になりますが・・・
素材が悪い中でも正面向いたのであればちゃんと読み取ってくれそうです。
![110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624779/b9ed9520-da82-0b54-6fce-c084160edbb0.png)

## 次回への改善点
**改善すべきはまずは動画の撮影方法でした。**
1. 画質を良くする
2. fpsを向上させる
3. 撮る角度を変えてみる

ここらへん意識してまずは認識させやすい動画を撮影する必要がありそうです。

**手元にGoPro6があります。**
1080pの240fpsに対応しているみたいなので1/10再生の24fpsのスローモーション動画で
まずは一回、自分のフォームを撮影して再挑戦したいと思います。

## まとめ
いかがでしたか？

今回、色々と検索する中でopenposeを使う場合、うまくいった記事しかなかったので
実際に使ってみるとこういうパターンもあるんだという記事として見てもらえると嬉しいです。

あとはそもそもプログラミングでこんなこともできるってわかってもらえたならうれしいです。
スポーツも楽しいですが、それと同じくらいプログラミングも楽しいです。

是非、皆さんのスポーツの趣味にも応用できるはずなので次回以降もっと深堀出来ればと思います。
次回もお楽しみに。