MacでOpenPose (本家) を動かしてみる

OpenPoseとは,画像もしくは動画像から人体の骨格情報や表情を機械学習的に推定する技術である.

ネットでMacへの導入例を調べてもTensorFlow版についての記事が多く,本家のCaffe版に関する情報があまり見当たらなかったので,ここにまとめてみる.

はじめに

先述の通り,OpenPoseは機械学習技術の一つであり,画像や動画像から人体の骨格情報や表情を獲得可能である.

手法の詳しい説明は今回は割愛するが,特徴点(関節)と特徴方向(骨格)を全て抽出した後,各人を分離するようなBottom-up型モデルになっており,画像内に人がたくさん含まれる場合でも処理が遅くならないという利点があるらしい.

ちなみに,オープンソースではあるが商用利用の場合はそこそこ高いランセンス費用を払う必要があるので注意.

以下は,本家のGitHubで公開されているデモ動画である.

f:id:petit_stella:20181231110007g:plain

複数人の骨格情報が精度良く推定されていることがわかる.

インストール方法

本家のOpenPoseをインストールする.

github.com

ちなみに,Mac用は今のところCPU版しかサポートされていないようだ. CPU版の場合,8GB以上のメモリ,8コア以上のCPUの使用が推奨されている.

一応,MacでのGPU版についての記載もあるため,近々サポートされる可能性はある.

本家のドキュメントでインストール方法は説明されているが,なぜかその通りにやっても上手くいかなかったので,一部の手順において以下の記事を参考にした.

o2mitsu.hatenablog.com

本家のリポジトリのクローン

まず,ターミナルで以下のコマンドを入力し, 本家OpenPoseのリポジトリを任意の作業ディレクトリにクローンする.

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

クローンしたディレクトopenposeに入る.

cd openpose

以下,このディレクトリ内で作業を行う.

各種フレームワークをインストール

次に,CMake, Caffe, OpenCVといった依存するフレームワークをインストールする.

ここからはHomebrewを使ってインストールを行うので,もしまだ導入していない場合は以下のコマンドで入れておく.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewとは,macOS 用パッケージマネージャーである.

CMakeをインストールする.

brew cask install cmake

OpenCV等は以下のコマンドでまとめてインストールできる.

bash 3rdparty/osx/install_deps.sh

CMakeについてきたCaffeを削除し,再インストールする.

brew uninstall caffe
brew brew install caffe

CMakeでビルド設定

フレームワークをインストールできたら,CMakeのGUIを使ってビルド設定を行う. まず,以下のコマンドを入力してCMakeのGUIを開く.

cmake-gui

そして,ソースコードおよびbuildフォルダのパスを指定する.
Where is the source code:にはクローンしてきたopenposeフォルダを指定する.
Where to the binaries:にはopenposeフォルダ内のbuildフォルダを指定する.

私の場合,buildフォルダが見当たらなかったので自分で空のフォルダを作成して指定した.

次に,Add Entryボタンから以下の追加情報を設定する.

Name : BUILD_CAFFE
Type   : bool
Value  : false (チェックボックスのチェックを外す)
Name : Caffe_INCLUDE_DIRS
Type   : PATH
Value  : /usr/local/include/caffe
Name : Caffe_LIBS
Type   : PATH
Value  : /usr/local/lib/libcaffe.dylib

その後,Configureボタンで設定を反映する.
すると以下のようなウィンドウが表示されるので,Specify the generator for this projectUnix Makefileになっていることを確認し,Doneボタンを押す.

画面下のボックスにConfiguring doneと出れば成功らしいが,ここでエラーが出ても問題ないらしい(私は出なかった)

Generateボタンを押せばバイナリの生成が完了する. 成功していればbuildフォルダ内にexampleなどのフォルダが生成されているはずなので,チェックしておく.

ビルド

最後に,OpenPoseをビルドする.

openposeフォルダ内のbuildフォルダに移動する.

cd build

移動したら,以下のコマンドによりビルドを実行する.

make -j`nproc`
sudo make install

以上で,OpenPoseのインストールが完了した.

デモを実行してみる

実際に,OpenPoseを動かしてみよう.

最初からデモプログラムが入っているので,それを実行するだけでOKである. 実際に,exampleフォルダ内にある動画サンプルに対して骨格推定を行ってみた.

./build/examples/openpose/openpose.bin --video examples/media/video.avi

f:id:petit_stella:20190111173537p:plain

おお,ちゃんと骨格が推定できている!!
手元の他の動画像もいくつか試したがそこそこいい感じに骨格推定できていることを確認した.

ちなみに,上記コマンドに--write_video ***.aviを追加すると推定結果を動画として保存可能(***には出力ファイルのパスを入力).
また,--write_json ***/とすると任意のディレクトリに推定した骨格座標の値をjson形式で出力できる.

ただ,推定がなかなかに重い… だいたい0.2 fpsくらいしか出ないので,動画像の1フレームを処理するのに5秒くらいかかる.

どうやらこれがCPU版の限界っぽい(ちなみに精度を犠牲にすれば速度向上は可能).

遊びで動かしたり,短い動画像だけを扱うならば十分かもしれないが,本格的に研究などで使っていくためにはGPU版の導入が必要だろう.

とはいえ,CPU版でもここまで動くのはなかなか驚きである.

最後に,色々なフリー画像に対して推定を行ってみたので以下に列挙してみる.
フリー画像はぱくたそさんから拝借した.

f:id:petit_stella:20190111173608p:plain:w300

f:id:petit_stella:20190111173633p:plain:w300

f:id:petit_stella:20190111173651p:plain:w300

f:id:petit_stella:20190111174302p:plain:w300