OpenPoseで姿勢解析環境のセットアップ Ubuntu18.04LTS

# TL;DR

* AWS EC2上のVM( g3s.xlarge, Ubuntu 18.04LTS )で，姿勢解析システム[Openpose]( https://github.com/CMU-Perceptual-Computing-Lab/openpose )を作り，実験する手順(2019年03月03日時点)を紹介します．
  * nvidiaのGPUを持っていないので，Amazon AWSのg3インスタンスを使いますが，ローカルのGPUでもほぼ同様の方法が使えるはずです．

# EC2 g3インスタンスの作成

AWS EC2 Management Consoleで，仮想マシンを作成します．
留意点は以下の通りです．

* インスタンスタイプはGPU(cuda)が使用できるg2またはg3のものを選びます(g3s.xlargeなど)．
   * 初期状態では，インスタンスタイプの作成制限によって，g3タイプのインスタンスが作れない場合があります．その場合は，[上限緩和申請フォーム](http://aws.amazon.com/contact-us/ec2-request) から，上限緩和申請をしてください
* マシンイメージは「 **Ubuntu Server 18.04 LTS (HVM), SSD Volume Type** 」を使用します
* 動画を解析対象にする場合は，ストレージ（EBS）を大きめに確保しておいたほうが良いです
   * 動画サイズにもよるが，解析結果をデフォルトのaviファイル形式で出力すると，サイズが大きく膨らみます
   * この実験では，100GBで作成しました
* 費用はそれほど安くないので，使用していない時間はVMのシャットダウン，EBSの削除をしましょう（1敗）．数時間の使用ならば500円もかかりません．
   * VMがUSD 1.04/hour (g3s xlarge，東京リージョンの場合)
   * EBSでUSD 0.12/GB/月
   * データアウト通信 USD 0.114/GB

# Openposeのセットアップ

## cmakeのインストール

Openposeのビルドに必要なcmakeをインストールします( cmake-3.13.4を使用しました )．
パッケージでは古いバージョンがインストールされるので，ソースからコンパイルします．

```bash
sudo apt-get install \
     qtbase5-dev \
     build-essential \
     gdebi \
     libopencv-dev
wget https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4.tar.gz
tar xzvf cmake-3.13.4.tar.gz
cd cmake-3.13.4
./configure --qt-gui
./bootstrap
make -j6
sudo make install
```

## GPGPU環境のセットアップ

### NVIDIAドライバ，ツールキット，ライブラリのインストール

* 一般的なCUDA環境のインストールです．
* [CUDA Toolkit 10](https://developer.nvidia.com/cuda-downloads)から，当該のツールキットをダウンロード
   * [Linux][Ubuntu][18.04][x86_64]を選ぶ
   * OpenPoseのビルドでコケた気がするので，バージョン10.1以降の方が望ましい
* [NVIDIA cuDNN](https://developer.nvidia.com/cudnn)をダウンロード
   * debファイルでlibcudnn7, libcudnn7-devをダウンロードする

```bash
wget https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_418.39_linux.run
sudo sh cuda_10.1.105_418.39_linux.run

# いくつか聞かれたとおりに答える
# (ライセンス条項にAcceptするとか，
#  /usr/local/cudaにシンボリックリンクを張るとか．
#  X driverは入れなくて良いかも)

sudo gdebi libcudnn7_7.5.0.56-1+cuda10.0_amd64.deb
sudo gdebi libcudnn7-dev_7.5.0.56-1+cuda10.0_amd64.deb
```

### PATHの設定

.bashrc, .zshrcなどに以下の行を追加して，NVIDIAツールに対するパスを通します．

```bash
export PATH=/usr/local/cuda/bin:$PATH
```

## Openposeのビルド

```bash
mkdir -p ~/local/src && cd ~/local/src
git clone \
  https://github.com/CMU-Perceptual-Computing-Lab/openpose
cd openpose
sudo bash ./scripts/ubuntu/install_deps.sh

mkdir -p openpose/build
cd openpose/build
cmake ..
make -j4
sudo make install
```

上記手順で，`~/local/src/openpose/build/examples/openpose/openpose.bin`が作られ，利用できるようになります．

# OpenPoseで姿勢解析

## 動画ファイル対象でポーズ情報をJSON形式で出力して解析結果の動画も作る

```bash
~/local/src/openpose/build/examples/openpose/openpose.bin \
   --write_json outputJSON/ \
   --display 0 \
   --model_folder ~/local/src/openpose/models \
   --video "./inputVideo.mp4" \
   --write_video outputVideo.avi

Starting OpenPose demo...
Configuring OpenPose...
Starting thread(s)...
Auto-detecting all available GPUs... Detected 1 GPU(s), using 1 of them starting at GPU 0.
OpenPose demo successfully finished. Total time: 264.185226 seconds.
```

* openpose.binのオプションは以下の通り [OpenPose - コマンド一覧(Qiita)](https://qiita.com/wada-n/items/e9e6653effc1e3d0c566)が詳しい
   * `--write_json` : 時刻ごとの姿勢情報(JSON形式)が出力されるディレクトリ
   * `--display 0` : 姿勢推定結果を表示しない( AWSのVMなので途中結果の表示は不要 )
   * `--model_folder` : 使用する学習モデルも格納位置の指定
   * `--video` : 解析対象となる動画ファイル
   * `--write_video` : 解析結果を含んだ動画のファイル

## 手と顔の検出も含めた解析

`--face`，`--hand`，`--part_candidates`のオプションを追加すると，顔，手の検出も行えます．計算時間もかなり（5倍〜10倍）増えるのが注意点です．

```bash
~/local/src/openpose/build/examples/openpose/openpose.bin \
   --face --hand --part_candidates 
   --write_json outputJSON/ \
   --display 0 \
   --model_folder ~/local/src/openpose/models \
   --video "./inputVideo.mp4" \
   --write_video outputVideo.avi
```

# 画像解析

動画ではなく，静止画も解析対象にできます．

* 写真は，フリー素材ぱくたそ( www.pakutaso.com )から，「空前絶後の肉まんを食べる男性 ［モデル：大川竜弥］」(https://www.pakutaso.com/20181221337post-18843.html) を使用させてもらいました
   * オプション(--image_dirおよび--write_images)を，画像用（入出力のフォルダ指定）に変更するだけです

```bash
~/local/src/openpose/build/examples/openpose/openpose.bin \
    --face --hand --part_candidates \
    --write_json ./output_json \
    --display 0 \
    --model_folder ~/local/src/openpose/models
    --image_dir ./image \
    --write_images ./output_image \
```

* 計算結果
   * ![image-20190303060216817.png](https://qiita-image-store.s3.amazonaws.com/0/309617/f777c493-c63f-e36f-9996-b70600157e7f.png)

# 参考

* [OpenPose本家](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
* [OpenPose - コマンド一覧(Qiita)](https://qiita.com/wada-n/items/e9e6653effc1e3d0c566)
* [PAKUTASO](https://www.pakutaso.com)