【TensorFlow版】MacBookで行うOpenPose （osx Mojave対応）

OpenPoseは人物の骨格などを、モーションキャプチャなしで簡単に表示できるツールです．
macbookユーザは内蔵カメラがあるので，リアルタイム動画描写もできます．

ここではOpenPoseによるボーンの推定を導入から実行までわかりやすくend-to-endで説明することを心がけています．
![OpenPose](http://tecsingularity.com/wp-content/uploads/2018/10/COCO_val2014_000000000328_000000000000_rendered.png)


##環境
・macOS Mojave version 10.14.2 (18C54)
・MacBook(Retina, 12-inch , 2017)
・anaconda3
・python3.6
![Mojave](https://dotstud.io/img/blog/224/00_eyecatch.png)


##導入 ・ インストール
###仮想環境の作成
まず，仮想環境を作る際に使うanacondaをインストールしましょう．
以下のリンクの記事を参考にインストールしてみて下さい．
リンク：（https://weblabo.oscasierra.net/python-anaconda-install-macos/）

インストールが完了したら早速仮想環境を作っていきます．


以下のようにpython3.6でposeという仮想環境を作ります．

```:仮想環境の作成
$ conda create -n pose python=3.6 anaconda
```

Proceed ([y]|n)?と聞かれるのでｙを押します．

###仮想環境の確認

作った仮想環境の一覧をみてみましょう．

```:仮想環境の一覧
$ conda info -e

# conda environments:
#
base                  *  /home/user/anaconda3
chainer                  /home/user/anaconda3/envs/chainer
pose                     /home/user/anaconda3/envs/pose
py27                     /home/user/anaconda3/envs/py27
py35                     /home/user/anaconda3/envs/py35
```


###仮想環境に入る

```:仮想環境に入る
$ source activate pose
```

上記のコマンドで仮想環境に入れます．

```:仮想環境に入れているかの確認
(pose) 現在のディレクトリまでのパス $ 
```

のように左端に`(pose)`と出ていれば仮想環境に入れてます．
再び仮想環境の一覧をみてみると

```:仮想環境の一覧
$ conda info -e

# conda environments:
#
base                     /home/user/anaconda3
chainer                  /home/user/anaconda3/envs/chainer
pose                  *  /home/user/anaconda3/envs/pose
py27                     /home/user/anaconda3/envs/py27
py35                     /home/user/anaconda3/envs/py35
```

`pose`に`*`がついてますね．この`*`をみることでも現在使用している仮想環境がわかります．
現在の仮想環境から抜ける場合は，

```:現在の仮想環境から抜ける
$ source deactivate
```

で抜けれます．terminal左側の`(pose)`がなくなると思います．
※抜けた人は上記手順でもう一度仮想環境に入ってください．

###OpenPoseのgithubリポジトリをローカルにクローンする
https://github.com/ildoonet/tf-pose-estimation

```:OpenPoseのパックをクローン
$ git clone https://github.com/ildoonet/tf-pose-estimation
```

上記のコマンドでローカルの好きなディレクトリにクローンして持ってきましょう．(結構時間かかります．)


`$ cd tf-openpose`で、ダウンロードされたファイルに移動して


```:必要なモジュールのインストール
$ pip install -r requirements.txt
```

```:matplotlibのインストール
$ pip install matplotlib
```

```:swigのインストール
$ brew install swig
```

```:tensorflowのダウンロード
$ pip install tensorflow
```

```:opencvのバージョンアップ
$ pip install opencv-python==3.4.0.14
```


これらのインストール・ダウンロード・バージョンアップを行ってください．



さらに　`cd models/graph/cmu`　でcmuという階層に移動して

```:必要ファイルのインストール
$ bash download.sh
```
上記コマンドで必要なファイルをインストールします．（そこそこ時間かかります．）

加えて　`~/tf-pose-estimation/tf_pose/pafprocess/`へチェンジディレクトリして，

```
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
```
を実行してください．

そしてここで，以下のようなエラーが出る方がいると思います．
（出なかった場合は飛ばして結構です．）

```
pafprocess $ sudo python setup.py build_ext --inplace
running build_ext
building '_pafprocess' extension
swigging pafprocess.i to pafprocess_wrap.cpp
swig -python -c++ -o pafprocess_wrap.cpp pafprocess.i
g++ -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/anaconda3/include -arch x86_64 -I/anaconda3/include -arch x86_64 -I/anaconda3/lib/python3.6/site-packages/numpy/core/include -I. -I/anaconda3/include/python3.6m -c pafprocess.cpp -o build/temp.macosx-10.7-x86_64-3.6/pafprocess.o
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++
standard library instead [-Wstdlibcxx-not-found]
pafprocess.cpp:1:10: fatal error: 'iostream' file not found
#include 
^~~~~~~~~~
1 warning and 1 error generated.
error: command 'g++' failed with exit status 1
```


ここでエラーが出た方は，XcodeのCommand Line Tools のバージョンに問題があります．
Mojaveにアップデートした際に，XcodeのCommand Line Toolsもアップデートした方は"Command Line Tools (macOS 10.14) for Xcode 10.1"もしくは "Command Line Tools (macOS 10.14) for Xcode 10"の状態になっており，これが原因で上記のエラーが出ています．

Xcode 10以降のバージョンが対応していないため，Xcode 9以前を追加でインストールします．

私の場合は[More Downloads for Apple Developers](https://developer.apple.com/download/more/)のサイトで，"Command Line Tools (macOS 10.13) for Xcode 9.4.1"のdmgファイルをダウンロードしてインストールしたところrun.pyの実行がうまくいきました．
※10.14に対して10.13でOSのバージョンが合ってませんがうまくいきます．

<img width="1168" alt="スクリーンショット 2018-12-22 1.47.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/191313/cdbd9c36-ebe7-f9a5-c1f6-d8c561b6fea6.png">
（+をクリックすると右側にdmgファイルが現れるのでそこからダウンロードします．）



run.pyの実行の際，matplotlibのimportエラーが出ましたので，[「Pythonでmatplotlibをimportするとエラーが出る場合の対処策（Mac）」](https://qiita.com/Gen6/items/78d83d117ef67e0d53c2)に従って対処しました．



##実行
お疲れ様でした．
早速実行していきましょう．

まずはフォルダを移動して，

```:tf-openpose/srcの階層に移動
cd ../../..
cd tf-openpose/src
```

実行していきます．

###静止画像についての実行
```
$ python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
```
上記のコマンドで，以下のWindowが出力されれば完了です．
![result](https://camo.qiitausercontent.com/a23a1633593ce3a4dde57eaf11595649120e944e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3139323838372f32303231356632642d366662352d663162332d336532332d3562316464616538323638312e706e67)

###MacBook内蔵カメラを使ったリアルタイム映像での実行

```
$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0
```

内蔵カメラが起動され，リアルタイムで動き始めます．
終了する際はターミナルを`control+C`で抜けてください．


##おまけ
実行画面で出てくるopencvのwindowはサイズが可変でなく固定で最大化もできないと思います．
これを変えたい場合は`run_webcam_backup.py`のコードの下部のほうを以下のように書き換えましょう．

```python:一行を追加
cv2.putText(image,
            "FPS: %f" % (1.0 / (time.time() - fps_time)),
            (10, 10),  cv2.FONT_HERSHEY_SIMPLEX, 0.5,
            (0, 255, 0), 2)
cv2.namedWindow("tf-pose-estimation result", cv2.WINDOW_NORMAL) #追記 ウィンドウサイズを可変に
cv2.imshow('tf-pose-estimation result', image)
```


`cv2.namedWindow("tf-pose-estimation result", cv2.WINDOW_NORMAL)`という一行を追加しただけです．



###P.S.
機械学習，画像認識、自動運転の情報を発信していくのでQiitaと [twitterのフォロー](https://twitter.com/cv_carnavi)お待ちしています！


##参考URL
https://qiita.com/ume1126/items/cc2ae610418296e6db22
https://github.com/ildoonet/tf-pose-estimation/issues/361
https://stackoverflow.com/questions/52441952/os-x-ld-library-not-found-for-lstdc