スポーツをITする（5）OpenPoseを見直す

フォームチェックにおいて、映像から座標をちゃんと取得するために、[前回](https://qiita.com/Chishiki/items/d11906bc19158f23e724)まではtensoleflow.jsを試していましたが、やっぱり少し精度が悪いのか、手ブレが激しいのか、で、ちゃんとしたBone座標が取得出来ず、約１年以上ぶりにオリジナルの[OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)を再度試してみました。

## いろいろ変わっている
１年半前は、インストールするのに、Caffe、CUDA、CUDNNなど、何やらわからないものをゴリゴリとコマンドで打っていった記憶があるのですが、今のバージョン（2018年12月現在）ではShell化されているようで、割と楽にインストール出来ました。
ただ、GPUを積んだPC本体が無いので、今回も割と安い（と思う）「Microsoft Azure」のクラウドGPU環境を利用しました。

## Azure Cloud

アカウントは持っていたので、https://portal.azure.com/ にログインし、左メニューからまず「リソースグループ」を作成します。

- リソースグループ名：適当に。
- サブスクリプション：私の場合は「従量課金」しかないので、致し方なし。
- リソースグループの場所：「米国東部」で。GPU環境はここにしかないもよう。

次に、「リソースの作成」
とりあえず「Ubuntu Server 18.04」を選択して次へ。

- サブスクリプションとリソースグループは、上記で作成したものを選択。
- 仮装マシン名：適当に。
- 地域：「米国東部」で。
- イメージ：ここで、「Ubuntu 16.04」を選択。
- サイズ：「サイズを変更します」をクリックして、「検索ウインドウ」に「NC6」を入力。表示される「NC6」をクリック。
- OSディスクは、「HDD」で。
- あとはデフォルト状態で、「作成」

数分で作成されます。

## 注意！

お金のある人はいいですが、やはり1時間100円、と高額です。
使わない時は、「停止」しましょう。ここ１週間、使っては「停止」を繰り返してますが、「停止中」は課金されないようです。たぶん。
「すべてのリソース」〜「仮想マシン」をクリックし「停止」。使う時は「開始」。停止は10分ほど掛かる場合があります。

## OpenPoseインストール

SSHで接続し、とりあえず/home直下あたりにGit Cloneします。

```
$ git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
```

[こちら](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md#problems-and-errors-installing)を参考にインストール。しかし以下の方法で何とかバイナリが動きました。

```
$ sudo ubuntu/install_cuda.sh
$ nvidia-smi
$ sudo ubuntu/install_cudnn.sh
$ sudo apt-get install libopencv-dev
$ sudo apt-get install libatlas-base-dev
$ bash ./ubuntu_deprecated/install_caffe_and_openpose_if_cuda8.sh
```
廃止予定のshですが、
bash ./ubuntu/install_caffe_and_openpose_JetsonTX2_JetPack3.1.sh
ではエラーで先に進まなかったので・・。

## 作業フォルダの作成
画像や動画を置くフォルダ、Boneを書き出すフォルダ、KeyPointを書き出すフォルダを作成。パーミッションは777で。

```
$ cd ../
$ sudo mkdir work/
$ sudo mkdir input output keypoint
$ sudo chmod 777 input output keypoint
```

## バイナリの実行
work/input フォルダに画像数枚を置いて、以下を実行。

```
$ cd ./openpose
$ ./build/examples/openpose/openpose.bin --image_dir ../work/input/ --write_images ../work/output/ --write_json ../work/keypoint --display 0
```
さすがに早い！数秒。
 --display 0 としないと画面表示しようとしてエラーになるので忘れずに。

![wee_000000000330_rendered.png](https://qiita-image-store.s3.amazonaws.com/0/74852/b4f56d62-abaa-cc06-21ee-f7047bda989a.png)

次は動画。1GPUなので、画面サイズや容量によって、1分〜4分掛かる場合があります。

```
$ ./build/examples/openpose/openpose.bin --video ../work/input/hoge.mp4 --disable_blending 1 --write_images ../work/output/ --write_video ../work/output/hoge.avi --write_json ../work/keypoint --display 0
```
動画は貼り付けられないのでご容赦を。
OpenPoseを触った方ならご存知と思いますが、上記パラメタにすると、Boneを付けた動画（.avi）、動画の１フレームごとにBOne画像とBone座標点のJsonデータ（x, y, 精度）を同時に書き出してくれます。なので、1フォルダ内が一気に1,000ファイル以上になることがあります。これがとても助かります。
--disable_blending 1 とすることで、Boneのみの動画を書き出します。

## あとは・・
アングルが変わるとダメなので、あくまでも同じアングルと思える画像、動画を取得してBone化することが必要。
いろいろな倍率を想定して、JSONから各点の重要と思われる角度を三角関数で算出して、各選手の特徴量をデータ化〜SVMでAIモデル化しようと思っています。

```
POSE_BODY_25_BODY_PARTS {
     {0,  "Nose"},
     {1,  "Neck"},
     {2,  "RShoulder"},
     {3,  "RElbow"},
     {4,  "RWrist"},
     {5,  "LShoulder"},
     {6,  "LElbow"},
     {7,  "LWrist"},
     {8,  "MidHip"},
     {9,  "RHip"},
     {10, "RKnee"},
     {11, "RAnkle"},
     {12, "LHip"},
     {13, "LKnee"},
     {14, "LAnkle"},
     {15, "REye"},
     {16, "LEye"},
     {17, "REar"},
     {18, "LEar"},
     {19, "LBigToe"},
     {20, "LSmallToe"},
     {21, "LHeel"},
     {22, "RBigToe"},
     {23, "RSmallToe"},
     {24, "RHeel"},
     {25, "Background"}
 };
```
あと、実験段階ではありますが、ライセンスに注意しないと。。
GPU版のTensoleFlowも試してみるかな。