OpenPoseをSingularity上で実行する

# はじめに
- OpenPoseについての話（唐突なのはいつものこと）
    - OpenPose: https://github.com/CMU-Perceptual-Computing-Lab/openpose
- DockerだとGUI表示がめんどくさい（GPU設定も）
- 多分SingularityのほうがDockerの設定よりも楽だと思う
- まだ要検討することもあるが一通り実行できたのでまとめていく
- 一応コードをそのままコピペで実行できるようにしている
- version1.1.0はご愛嬌ということで

# 実行環境
今回試した環境は以下の通りです．
OS: Ubuntu 18.04 LTS
CPU: i3-4130 3.40GHz
メモリ: 16GB
GPU: GeForce GTX 1660 Ti (6GB)

# 1. SingularityとNvidia-Dockerのインストール
Singularityのインストールについては前の記事で触れたので以下の記事を参照してください．
[Singularityのインストールと実行をしてみた](https://qiita.com/Nahuel/items/6c0fac8176340d749bc7)

またnvidia-dockerについてはこちらの記事が分かりやすかったです．
[nvidia-docker 2 を Docker CE (安定版) と共に Ubuntu 18.04 へインストールする](https://qiita.com/dyoshiha/items/e58be9ee5c19bee1a0cd)

インストールまで出来ればおｋです．

# 2. OpenPoseの導入
今回はSingularityのサンドボックスのやり方を説明します．
以下のコードでDockerHubからOpenPoseをダウンロードし、サンドボックス化します．
ダウンロードに時間がかかると思いますが，気長に待っていれば問題ありません．

```
$ sudo singularity build --sandbox openpose_box docker://garyfeng/docker-openpose:latest
```
ここでnvidia-dockerを立ち上げる作業をします．
※理由は後ほどエラー集のところで触れていきます．
立ち上げたらexitしてもらって問題ありません．

```
$ sudo nvidia-docker run -it --rm garyfeng/docker-openpose:latest
$ exit
```

次にサンドボックス化したOpenPoseをSingularityで実行し，以下のディレクトリまで移動します．

```
$ singularity shell --nv openpose_box
$ cd openpose_box/openpose-master
```
ここでOpenPoseを実行すると以下のエラーが発生しますが，Windowが立ち上がると思います．

```
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.
Auto-detecting GPUs... Detected 1 GPU(s), using them all.
Starting thread(s)
Gtk-Message: Failed to load module "gail"
Gtk-Message: Failed to load module "atk-bridge"
Gtk-Message: Failed to load module "canberra-gtk-module"
```

※実行結果の一部（OpenPoseのサンプル動画）
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472706/3961af72-1300-6108-ad7b-50c79f2d6571.gif)


実行時にエラーがあるので以下のコードで対応していきます．

```
$ exit # Singularityから抜け出す
$ sudo singularity shell --writable  openpose_box/ # sudoで書き込み
$ apt-get update
$ apt-get install libatk-adaptor libgail-common
$ apt install libcanberra-gtk-module libcanberra-gtk3-module
$ exit # Singularityから抜け出す

# 以下前の操作と同様
$ singularity shell --nv openpose_box
$ cd openpose_box/openpose-master
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
```
# 2.1 OpenPoseの導入に当たるエラー集
正直いるかいらないかはわかりませんが，自分が出会ったエラーについてまとめていきます．

```:エラーその1
# エラー
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.
Auto-detecting GPUs... Detected 1 GPU(s), using them all.
Starting thread(s)
No protocol specified

(OpenPose 1.1.0:4279): Gtk-WARNING **: cannot open display: :0.0
```
ディスプレイが開けないと言われているので，ホスト側のDISPLAY値を確認をして，Singularity上のDISPLAY値を変更しましょう．

```:ホスト側
$　echo $DISPLAY
:1
```
```:コンテナ側（Singularity）
$　echo $DISPLAY
:0.0
$　export DISPLAY=:1
```
=========================================================

```:エラーその2
# エラー
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.

Error:
Cuda check failed (30 vs. 0): unknown error

Coming from:
- src/openpose/utilities/cuda.cpp:getGpuNumber():47
- src/openpose/utilities/cuda.cpp:cudaCheck():36
- src/openpose/utilities/cuda.cpp:getGpuNumber():57
- ./include/openpose/wrapper/wrapper.hpp:configure():947
terminate called after throwing an instance of 'std::runtime_error'
  what():  
Error:
Cuda check failed (30 vs. 0): unknown error

Coming from:
- src/openpose/utilities/cuda.cpp:getGpuNumber():47
- src/openpose/utilities/cuda.cpp:cudaCheck():36
- src/openpose/utilities/cuda.cpp:getGpuNumber():57
- ./include/openpose/wrapper/wrapper.hpp:configure():947

Aborted
```

この部分がnvidia-dockerを立ち上げる理由になります．
恐らくnvidia-dockerを一度立ち上げないとCudaのチェックができない？ことになっていて，それの回避するための処理となります．
これに関しては私もよく分かっていないのでご教授いただければ幸いです．

# まとめ

- SingularityでOpenPoseを実行した．
- 私はDockerよりも扱いやすかったと感じた．（元々Singularityを触っていた経緯もあるが）
- まだまだ未知の問題があると思うので，さくっと実装したい人はDockerのほうをおすすめする．


# 参考文献
[OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation ](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
[OpenPose - Quick Start](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/quick_start.md)
[garyfeng/docker-openpose](https://hub.docker.com/r/garyfeng/docker-openpose)
[OpenPose1.3.0をDocker上で動かす](https://qiita.com/t5ujiri/items/161dc8ec0f1037bbcf90)
[ubuntu で root 時に cannot open display となる件](https://jimbeam0203.hatenadiary.org/entry/20090815/1250305365)
[Failed to load module “canberra-gtk-module” … but already installed](https://askubuntu.com/questions/342202/failed-to-load-module-canberra-gtk-module-but-already-installed)
[How to install gail and atk-bridge?](https://askubuntu.com/questions/548557/how-to-install-gail-and-atk-bridge)
[Ubuntuで簡単にデスクトップ録画をし、gifに変換してQiitaに投稿する方法](https://qiita.com/v97ug/items/fb9d82383915fee63e45)