OpenPoseを動かしてみた。

#目次
[1.OpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)
[2.OpenPoseチュートリアルのソースコードを読む。](http://qiita.com/nnn112358/items/ccd6330bed1e253d5ef9)
[3.WindowsでOpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/121dc36c3c1752a00276)
[4.OpenPoseのFace Estimationを動かしてみた。](http://qiita.com/nnn112358/items/398765b5a4e5158b9ba2)
[5.OpenPoseのHand Estimationを動かしてみた。](http://qiita.com/nnn112358/items/713b4b8de25318fb1afc)


#背景
CVPR2017で発表された、DeepLearningを使った、単眼カメラでのスケルトン検出アルゴリズムが、OpenPoseという名称でライブラリ化・公開されました。

早速、Ubuntu(1404)で、OpenPoseのPose Estimationを動かしてみたので、手順を解説します。
https://github.com/CMU-Perceptual-Computing-Lab/openpose

![Screenshot from 2017-05-06 23:33:40.png](https://qiita-image-store.s3.amazonaws.com/0/73020/e7cfde10-b2e9-f3d4-cb84-b5a1c26922c1.png)
上記画像ソースは、［ ぱくたそ（www.pakutaso.com）］様のフリー写真素材を使用しました。

#論文
Realtime Multi-Person 2D Human Pose Estimation using Part Affinity Fields, CVPR 2017：
動画：
[Realtime Multi-Person 2D Human Pose Estimation using Part Affinity Fields, CVPR 2017 Oral - YouTube](https://www.youtube.com/watch?v=pW6nZXeWlGM&t=77s)
プレゼン：
[Multi-person pose estimation-CMU](http://image-net.org/challenges/talks/2016/Multi-person%20pose%20estimation-CMU.pdf)
論文：
https://arxiv.org/pdf/1611.08050.pdf


##使用環境

>Description:	Ubuntu 14.04.5(x64) LTS trusty
CUDA Version 8.0.61
NVIDIA-SMI 375.66 / Driver Version: 375.66  / GeForce GTX 1050 
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
OpenPose 1.0.0rc1(Apr 2017)


#ライブラリのインストール
基本的にはdoc/installation.mdを参照してインストールすれば良い。
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md
OpenPoseは、CUDA, cuDNN, OpenCV, Atlas を予めインストールする必要がある。
私の環境はUbuntu1404の為、CUDA8.0とcuDNN5.1をインストールした。

###CUDAのインストール 
https://developer.nvidia.com/cuda-downloads
から、debをダウンロードしてインストール。

```sh
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
```
HOMEの.bashrcに以下を追記。

```bash
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
export PATH=$PATH:${CUDA_HOME}/bin
```

###cuDNNのインストール
https://developer.nvidia.com/rdp/cudnn-download
から、debをダウンロードしてインストール。
ダウンロードにはユーザ登録が必要となる。

ver5.1

```sh
sudo dpkg -i libcudnn5_5.1.10-1+cuda8.0_amd64.deb
sudo dpkg -i libcudnn5-dev_5.1.10-1+cuda8.0_amd64.deb
```

ver6.0

```sh
sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb 
sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb 
```


ここで、私の環境では、
>libEGL.so.1 is not a symbolic link

が出た為、以下のようにリンクを修正。

```sh
sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.39 /usr/lib/nvidia-375/libEGL.so.1
sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.39 /usr/lib32/nvidia-375/libEGL.so.1
```

参考：[linux - libEGL.so.1 is not a symbolic link - Stack Overflow](http://stackoverflow.com/questions/43016255/libegl-so-1-is-not-a-symbolic-link)

###OpenCV ， Atlasのインストール
これはapt-getでインストールすれば良い。

```sh
sudo apt-get install libopencv-dev
sudo apt-get install libatlas-base-dev
```

#openposeのインストール
openpose直下の、下記のファイルを実行すると、付随して必要なライブラリ・学習器のダウンロード・インストールと、サンプルのコンパイルが行われる。

```
 ./ubuntu/install_caffe_and_openpose_if_cuda8.sh 
```


#サンプルを動かしてみる。
####1. サンプル動画で動かしてみる
./build/examples/openpose/openpose.bin --video examples/media/video.avi

####2. Webカメラで動かしてみる
./build/examples/openpose/openpose.bin

####3. サンプル静止画で動かしてみる
./build/examples/openpose/openpose.bin --image_dir examples/media/

#ソースをコンパイルしてみる。
openposeは/example/usercode以下にソースコードを格納すると、openpose直下のMakefileでコンパイルが通るようになっている。最小のサンプルである、"1_extract_from_image"(静止画を読み出し、スケルトン推定を行うサンプル)をusercode以下にコピーし、makeする。

```sh
cp examples/tutorial_pose/1_extract_from_image.cpp examples/user_code/
make
```

makeされた実行ファイルは、./build/examples/user_code/の下に格納されている。
`./build/examples/user_code/1_extract_from_image.bin`

なお、1_extract_from_image.cppは27行目でファイル名を指定している。ここのjpegファイル名を変更すれば、任意の画像を読み出すことができる。

```cpp
DEFINE_string(image_path, "examples/media/COCO_val2014_000000000192.jpg","Process the desired image.");
```


#所感
　RGB-Dカメラでも、ステレオでもない、単眼のWEBカメラでリアルタイムにスケルトン検出ができてるのを見ると、純粋に技術の進歩を感じる。