OpenPose(Caffe版)をMacBookで動かしてみる

# OpenPose(Caffe版)をMacBookで動かしてみる

## はじめに
* 画像から人体の骨格情報を取得できるOpenPoseを手持ちのMacBookで使ってみたかったが，ビルドする時に若干詰まったので備忘も兼ねてメモを残してみた．
* OpenPoseにはCPU版とGPU版があり，高い精度の認識結果を早く取得したい場合はGPU版が推奨される．
	* 手持ちのMacBookにはGPUがついていなかったためCPU版を入れることにした．

## OpenPoseとは？

* DeepLearningを使って画像から体や顔・手足を認識して人体の骨格情報を取得することができる．
	* 通常のカメラで撮影した画像・動画から取得できるため，MicrosoftのKinectやIntelのRealSenseの様な機材の準備が不要．

* 本家大元GitHubのREADMEに実際に認識させた例が掲載されている．
	* [OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation](https://github.com/CMU-Perceptual-Computing-Lab/openpose)

* Caffe版とTensorFlow版の2種類のバージョンがあり，今回は上記GitHubのCaffe版を使ってみた．

## 環境

* モデル: MacBook Pro (Late 2016)
* OS: macOS Catalina (バージョン10.15.4)
* CPU: Intel Core i5-6287U CPU @ 3.10GHz
* メモリ: 16GB
* OpenPoseのバージョン: v1.6.0

## 導入方法

### 1. GitHubリポジトリからclone

* OpenPoseのGitHubリポジトリからcloneする．

```
$ git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git
```

### 2. cloneしたリポジトリに入る

* cloneしたディレクトリにcdする．(基本はこのディレクトリで作業)

```
$ cd openpose
```

### 3. Homebrewを入れる(未導入の場合)

* OpenPoseを動かすのに必要なパッケージのインストールにmacOS用パッケージ管理システムである[Homebrew](https://brew.sh/index_ja)が必要となるため，事前にインストールしておく．
	* TOPページ記載のスクリプトをターミナルで実行する．

### 4. CMakeをインストール

* Homebrewを使いビルドに使用するCMakeをインストールする．

```
$ brew cask install cmake
```

### 5. 依存関係のあるパッケージをインストール

* cloneしたディレクトリ内に依存関係のあるパッケージをインストールするシェルスクリプトが同梱されているため，それを実行する．

```
$ bash ./scripts/osx/install_deps.sh
```

### 6. ビルド先のフォルダを作成

* CMakeでビルドした物を入れるため，「build」フォルダを作成する．

```
$ mkdir build
```

### 7. Caffeをcloneする

* OpenPoseのビルドにはCaffeが必要となるため，OpenPoseのディレクトリ内にCaffeをcloneする．

```
$ cd 3rdparty
$ git clone https://github.com/CMU-Perceptual-Computing-Lab/caffe.git
```

* Caffeのcloneが完了したらOpenPoseのルートディレクトリに戻る．

```
$ cd ../
```

### 8. CMake起動

* OpenPoseのビルドを設定するため，CMakeを起動する．

```
$ cmake-gui
```

### 9. ビルド設定

* 画面上部の「Where is the source code:」にソースコードのディレクトリを，「Where to build the binaries:」にはビルド先のディレクトリを入力する．
	* ソースコードはcloneしたopenposeディレクトリを，ビルド先は6.で作成した「build」フォルダを指定する．

* 「Add Entry」ボタンをクリックし，下記情報を追記する．
	* Name: BUILD_CAFFE
	* Type: BOOL
	* Value: True (チェックボックスを入れる)

### 10. Configureを実行＆Makefileを作成

* ビルド設定を行ったら「Configure」ボタンをクリックする．
	* 画面下部のコンソールに「Configuring done」が表示されたら成功．

* Configureができたら「Generate」ボタンをクリックする．
	* コンソールに「Generating done」が表示されたらMakefileの作成完了．
	* 「build」フォルダにMakefileが作成されていることを確認する．	

### 11. ビルドする

* 「build」フォルダに移動し，makeを実行＆インストールする．

```
$ cd build
$ make -j `nproc`
$ sudo make install
```

## OpenPoseを使ってみる

### 画像を認識させる

* 画像を読み込ませて認識させ，認識結果の画像ファイルや骨格座標データのJSONファイルを出力することができる．

```
$ ./build/examples/openpose/openpose.bin --image_dir <画像ファイルのフォルダパス> --write-images <認識結果の画像ファイル出力先パス> --write-json <骨格座標データのJSONファイル出力先パス>
```

* 認識結果
	* before  
<img width="543" alt="before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/30203e45-6e86-2e6d-c7d8-d73e91a17abe.png">

	* after  
<img width="543" alt="before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/154b54a7-9fb3-b4b1-1b71-3792ecfb167e.png">


	* 「[いらすとや](https://www.irasutoya.com/)」から引用させていただいた画像も認識させることができた．

### 動画を認識させる

* 動画も認識させることができる．ただしCPU版だと1フレームの処理に時間がかかるため，時間の長い動画等を認識させたい場合はGPU版を使用した方が良いかもしれない．

```
$ ./build/examples/openpose/openpose.bin --video <動画ファイルのパス> --write-video <認識結果の動画ファイル出力先パス> --write-json <認識した骨格座標データのJSONファイル出力先パス>
```

# 参考ページ

* [OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
* [MacでOpenPose (本家) を動かしてみる](https://stella-log.hatenablog.com/entry/2019/01/11/174950)
* [【Mac】【macOS Mojave】OpenPoseを使ってみよう（Caffe版）](https://ogijunchang.hatenablog.com/entry/2019/10/24/213324)
* [question about installation on MacOS #764](https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/764)
    * ビルドの際Caffe関連でエラーが発生したため，上記のissueを参考にさせていただいた．