OpenPoseは人物の骨格などを、モーションキャプチャなしで簡単に表示できるツールです.
macbookユーザは内蔵カメラがあるので,リアルタイム動画描写もできます.
ここではOpenPoseによるボーンの推定を導入から実行までわかりやすくend-to-endで説明することを心がけています.
##環境
・macOS Mojave version 10.14.2 (18C54)
・MacBook(Retina, 12-inch , 2017)
・anaconda3
・python3.6
##導入 ・ インストール
###仮想環境の作成
まず,仮想環境を作る際に使うanacondaをインストールしましょう.
以下のリンクの記事を参考にインストールしてみて下さい.
リンク:(https://weblabo.oscasierra.net/python-anaconda-install-macos/)
インストールが完了したら早速仮想環境を作っていきます.
以下のようにpython3.6でposeという仮想環境を作ります.
$ conda create -n pose python=3.6 anaconda
Proceed ([y]|n)?と聞かれるのでyを押します.
###仮想環境の確認
作った仮想環境の一覧をみてみましょう.
$ 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
$ git clone https://github.com/ildoonet/tf-pose-estimation
上記のコマンドでローカルの好きなディレクトリにクローンして持ってきましょう.(結構時間かかります.)
$ cd tf-openpose
で、ダウンロードされたファイルに移動して
$ pip install -r requirements.txt
$ pip install matplotlib
$ brew install swig
$ pip install tensorflow
$ 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のサイトで,"Command Line Tools (macOS 10.13) for Xcode 9.4.1"のdmgファイルをダウンロードしてインストールしたところrun.pyの実行がうまくいきました.
※10.14に対して10.13でOSのバージョンが合ってませんがうまくいきます.
run.pyの実行の際,matplotlibのimportエラーが出ましたので,「Pythonでmatplotlibをimportするとエラーが出る場合の対処策(Mac)」に従って対処しました.
##実行
お疲れ様でした.
早速実行していきましょう.
まずはフォルダを移動して,
cd ../../..
cd tf-openpose/src
実行していきます.
###静止画像についての実行
$ python run.py --model=mobilenet_thin --resize=432x368 --image=images/p1.jpg
上記のコマンドで,以下のWindowが出力されれば完了です.
###MacBook内蔵カメラを使ったリアルタイム映像での実行
$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0
内蔵カメラが起動され,リアルタイムで動き始めます.
終了する際はターミナルをcontrol+C
で抜けてください.
##おまけ
実行画面で出てくるopencvのwindowはサイズが可変でなく固定で最大化もできないと思います.
これを変えたい場合はrun_webcam_backup.py
のコードの下部のほうを以下のように書き換えましょう.
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のフォローお待ちしています!
##参考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