OGIMOノート

6歳の娘と、4歳の息子(脳性麻痺)を持った父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具の製作記録、勉強記録を残していきます

OpenPoseを使って姿勢検出を試してみた

はじめに

ワークマシンでGPU環境を構築したので、早速いろいろと試してみたくなる。

子供らの遊び相手や息子のリハビリ支援に応用できそうなロボットを作る上で、子供らの姿勢状態を把握する仕組みは欲しいなぁ、と前から思っていたので、今回は姿勢推定(Human pose stimation)として有名どころであるOpenPoseを動かしてみた。

OpenPoseは、カーネギーメロン大学のZhe CaoらによってCVPR2017で発表された「Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields」の有名な実装ライブラリで、人の関節位置合計18点を求めることができるとの事。

news.mynavi.jp

サンプルコード環境があるので、早速動かして動作確認してみた。

環境インストール

・CPU : Intel Core i7-7700
・メモリ : 16GB
GPU : GTX1080
・OS : Ubuntu16.04 LTS

基本的には、CMU-Perceptual-Computing-Labのインストールマニュアルを参照すれば良い。
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md

ただし、先に言っておくと、、、私の場合、Cuda/cudnnバージョン関連で苦労して、なかなかうまくいなかった。

まずは関連パッケージのインストール

sudo apt-get install cmake-qt-gui
sudo apt-get install libviennacl-dev

その後、Git Clone

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

その後、cmake-guiGUI起動する。
・[Where is the source code] → git cloneしてきたディレクトリのパス、[..../openpose/]を指定
・[Where to build the binaries] → [..../openpose/build]を指定
[Configure]ボタンを押して、[Unix Makefile]を選択して、[finish]。
最後に[Generate]ボタンを押して完了

その後、以下のコマンドでビルドをしかける。

cd build/
make -j`nproc`

動作確認(トラブルあり)

動作確認のため、サンプル動画を使って姿勢検出をしてみた。

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

しかし、ここでエラー…

Check failed: status == CUDNN_STATUS_SUCCESS (3 vs. 0) CUDNN_STATUS_BAD_PARAM

むむむ、cudnn関連でエラーがでて、コアダンプしている始末。 ググッて調べていたところ、CUDA/cudnnのバージョンに依存していそうな雰囲気。
なので、バージョンを変更していろいろとトライ。

・CUDA=9.2/ cudnn=7.1  ⇛ NG (同様のエラーメッセージ)
・CUDA=8.0/ cudnn=5.1 ⇛ NG (同様のエラーメッセージ)
・CUDA=8.0/ cudnn=6.0 ⇛ OK!

という事で、無事に姿勢検出できた!
しかし、CUDA/cudnnバージョン依存があるのは厄介だなぁ。。 (CUDA9.0環境でも動いた情報があるので、後日また見てみようと思う)

姿勢検出結果

Webカメラの画像の確認方法は以下のコマンド

./build/examples/openpose/openpose.bin

これを使って、子供たちの姿勢検出ができるかを試してみた。
f:id:motokiinfinity8:20180709233943p:plainf:id:motokiinfinity8:20180709233647p:plain
f:id:motokiinfinity8:20180709234319p:plainf:id:motokiinfinity8:20180709234320p:plain

腕を曲げてもらったり、ズリバイしてもらったりしましたが、それなりの精度で予測している事がよくわかる。
(我が家として、ズリバイでも姿勢を検出できている事が好印象)

最高峰のGPU GTX1080 を持ってしても、8fpsとは、、、なかなか重たい処理やなぁ。
最終的には、本処理をロボット内に搭載しようと考えていたので、最低でもJetson TXシリーズで実用レベルの負荷で動いてほしいところ。そこは慎重に処理削減に取り組む必要がありそう。


ただ、このアルゴリズムを応用すれば、Kinectなどの距離検出カメラをつかわず単眼での距離算出もできるみたい。体の構成から算出した個人同定も目指せそう。
息子がプロンボードやリハビリをしている際に、姿勢が崩れているかを判定できるし、それに応じてモニター画面を変えるなど、いろいろとリハビリ支援に活かせる可能性もありそう。

ソースコード中身に踏み込んだサイトは以下
robonchu.hatenablog.com


姿勢情報の使い方やアプリケーションへの応用方法、ROSなどのロボット本体への組み込みを考えて、これからもう少し中身を見ていきたいと思う。