OpenPoseのFace Estimationを動かしてみた。

#目次
[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)
##目的
OpenPose 1.0.0rc3(Jun 2017)で、Pose Estimationに加えて、Face Estimationが実装された。OpenPoseのFace Estimationを動かしてみた。
[github OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)

![smartphone_Mika_Rika_22_rendered.png](https://qiita-image-store.s3.amazonaws.com/0/73020/af2da8d1-546f-7b1a-fdc9-7b058482dfab.png)
フリー素材アイドルmika☆rika様の素材画像を使用しました。 http://mika-rika-free.jp/

##使用環境

>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.0rc3(Jun 2017)

###OpenPoseのインストール
[OpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)を参照。

```
$ mkdir ~/development
$ cd ~/development
$ git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
$ cd openpose
$ chmod +x install_caffe_and_openpose.sh
$ ./install_caffe_and_openpose.sh
```

##ソースコードの修正

###renderer.hppの修正

>./include/openpose/core/renderer.hpp:24:84: error: ‘atomic’ is not a member of ‘std’

とコンパイルエラーが起きた場合、ソースの先端に#include <atomic> を追加。
https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/64


###openpose.cppの修正
サンプルのソース、openpose.cppを修正する。

./example/openpose/openpose.cpp

####face keypoint detectionを有効にする。

```
   82:DEFINE_bool(face, false, "Enables face keypoint detection. It will share some parameters from the body pose, e.g. `model_folder`.");
→  82:DEFINE_bool(face, true , "Enables face keypoint detection. It will share some parameters from the body pose, e.g. `model_folder`.");
```

####net_resolution・face_net_resolutionをGPUのメモリにあわせて調整する。
net_resolutionの値は、16の倍数(16,32,48...)とする。net_resolutionをあげるほど検出精度があがるが、処理速度が遅くなる。net_resolutionを下げると処理速度があがるが、検出精度が落ちる。例えば、下記の値とすると、GPUメモリが1.5GB消費される。


```

  71:DEFINE_string(net_resolution,"656x368","Multiples of 16. If it is increased, the accuracy usually increases. If it is decreased, the speed increases.");

→ 71:DEFINE_string(net_resolution,"320x160","Multiples of 16. If it is increased, the accuracy usually increases. If it is decreased, the speed increases.");
```

```
  83:DEFINE_string(face_net_resolution,"328x328","Multiples of 16. Analogous to `net_resolution` but applied to the face keypoint detector. 320x320 usually works fine while giving a substantial speed up when multiple faces on the image.");

→ 83:DEFINE_string(face_net_resolution,"160x160","Multiples of 16. Analogous to `net_resolution` but applied to the face keypoint detector. 320x320 usually works fine while giving a substantial speed up when multiple faces on the image.");

```

##openposeを動かしてみる。
####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/


###エラーが発生する場合、

下記のエラーが発生する場合、GPUのメモリーをオーバーフローしている。net_resolutionを調整する。
> Check failed: error == cudaSuccess (2 vs. 0)  out of memory

参考：
https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/58


##後書き
~~hand estimationの公開も近い。公開次第、試す予定。~~
~~>Multi-person 2x21-keypoint hand estimation and rendering. Note: In this initial version, running time linearly depends on the number of people on the image. Coming soon (in around 1-5 weeks)!~~
OpenPose v1.0公開に伴い、[hand estimationが実装されました](http://qiita.com/nnn112358/items/713b4b8de25318fb1afc)。