骨格検出(tf-pose-estimation)をMacBook Proで試してみた

MacBook Proでtf-pose-estimationを用いたリアルタイム骨格検出を試してみたので、その内容を紹介します。

tf-pose-estimation
モデルがCaffe実装であるOpenPoseというリアルタイム骨格検出システムのTensorFlow版です。骨格検出のアルゴリズムはこの論文で発表された内容に基づいているようです。

環境

  • OS: macOS High Sierra
  • CPU: 3.1 GHz Intel Core i5
  • メモリ: 16 GB 2133 MHz LPDDR3
  • Python 3.6.6

事前準備

リポジトリの説明に沿って、tf-pose-estimationを使えるようにします。

まずはリポジトリをクローンします。

git clone https://github.com/ildoonet/tf-openpose

必要なpythonモジュールをpipでインストールします。

cd tf-openpose
pip install -r requirements.txt

pafprocessというc++のライブラリをPythonで使える形にビルドします。
※swigのインストールのために、Homebrewが必要です。

brew install swig

cd tf_pose/pafprocess
swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace

学習済みのモデルをダウンロードします。
モデルには複数のバージョンがあります。今回は、オリジナルであるOpenPoseのCaffeモデルをTensorFlow形式に変換したモデル(cmuと表記)を使用します。その他のモデルについてはこちらをご確認ください。

brew install wget

cd models/graph/cmu
bash download.sh


### pythonのモジュールとしてインストールする
他のディレクトリでも使えるようにpythonのモジュールとしてインストールします。


cd tf-openpose
python setup.py install

骨格検出してみる

画像から骨格検出

簡単に動かせるようにrun.pyというスクリプトが用意されています。
リポジトリ内に用意されているテスト画像を読み込んでみます。

python run.py --model=cmu --resize = 432x368 --image=./images/p1.jpg

骨格検出が出来ました!
左上の画像が結果で、右上が検出対象である各関節の確信度のヒートマップ、下側にある二つの画像が検出した関節同士を繋ぐために求められたベクトルマップです。

不足モジュールのインストール

run.pyを実行するとModuleNotFoundErrorがでる場合は必要なモジュールが足りていないってことです。 run.pyを実行するには、requirements.txtに記されているものに加えてtensorflowとcv2(opencv-python)を使用しているため、それらのモジュールもインストールする必要があります。

pip install opencv-python tensorflow

matplotlibでエラーが出る

モジュールをインストールしても以下のようなエラーが出る場合があります。

ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.

その場合は、以下のページを参考にmatplotlibrcのbackendTkaggに書き換えることで解決しました。

ウェブカメラの映像から骨格検出

macbook付属のウェブカメラを使って撮影した映像からリアルタイムで骨格を検出します。

python run_webcam.py --model=cmu --resize=432x368 --camera=0

約0.2fpsと少々辛くはありますが、足の付け根と手といった感じで骨格の検出が出来ました。

次に、ベースネットワークをMobileNetsに変えたもので試してみます。

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

約2fpsと10倍程度早くなりました。骨格の検出もしっかり出来ていそうです!

さいごに

当エントリではtf-pose-estimationを使った骨格検出について紹介しました。ベースネットワークにMobileNetsを利用したモデルを使うことで、CPUでも約2fps程度の速さで動きました。
今回は試しませんでしたが、このissueによるとtensorflow-gpuをインストールしておけばGPUを優先利用してくれるようなので、より速さが必要な場合にはGPUを利用すると良さそうです。

最後までお読み頂きありがとうございましたー!